[DOC] batch of UI, Https, linter corrections
This commit is contained in:
+18
-18
@@ -85,8 +85,8 @@ Running the server
|
||||
|
||||
.. option:: --max-cron-threads <count>
|
||||
|
||||
number of workers dedicated to cron jobs. Defaults to 2. The workers are
|
||||
threads in multi-threading mode and processes in multi-processing mode.
|
||||
number of workers dedicated to :ref:`cron <reference/actions/cron>` jobs. Defaults to 2.
|
||||
The workers are threads in multi-threading mode and processes in multi-processing mode.
|
||||
|
||||
For multi-processing mode, this is in addition to the HTTP worker
|
||||
processes.
|
||||
@@ -175,10 +175,10 @@ database
|
||||
listen by using the --database parameter and specifying a comma-separated
|
||||
list of databases
|
||||
|
||||
When combining the two parameters, db-filter superseed the comma-separated
|
||||
When combining the two parameters, db-filter supersedes the comma-separated
|
||||
database list for restricting database list, while the comma-separated list
|
||||
is used for performing requested operations like upgrade of modules.
|
||||
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
odoo-bin --db-filter ^11.*$
|
||||
@@ -190,7 +190,7 @@ database
|
||||
odoo-bin --database 11firstdatabase,11seconddatabase
|
||||
|
||||
Restrict access to only two databases, 11firstdatabase and 11seconddatabase
|
||||
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
odoo-bin --database 11firstdatabase,11seconddatabase -u base
|
||||
@@ -199,16 +199,16 @@ database
|
||||
and update base module on one database: 11firstdatabase
|
||||
If database 11seconddatabase doesn't exist, the database is created and base modules
|
||||
is installed
|
||||
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
odoo-bin --db-filter ^11.*$ --database 11firstdatabase,11seconddatabase -u base
|
||||
|
||||
|
||||
Restrict access to databases whose name starts with 11,
|
||||
and update base module on one database: 11firstdatabase
|
||||
If database 11seconddatabase doesn't exist, the database is created and base modules
|
||||
is installed
|
||||
|
||||
|
||||
.. option:: --db-template <template>
|
||||
|
||||
when creating new databases from the database-management screens, use the
|
||||
@@ -223,7 +223,7 @@ database
|
||||
.. option:: --no-database-list
|
||||
|
||||
Suppresses the ability to list databases available on the system
|
||||
|
||||
|
||||
.. option:: --db_sslmode
|
||||
|
||||
Control the SSL security of the connection between Odoo and PostgreSQL.
|
||||
@@ -275,7 +275,7 @@ built-in HTTP
|
||||
|
||||
.. option:: --no-http
|
||||
|
||||
do not start the HTTP or long-polling workers (may still start cron
|
||||
do not start the HTTP or long-polling workers (may still start :ref:`cron <reference/actions/cron>`
|
||||
workers)
|
||||
|
||||
.. warning:: has no effect if :option:`--test-enable` is set, as tests
|
||||
@@ -307,13 +307,13 @@ customize the amount of logging output
|
||||
|
||||
sends logging output to the specified file instead of stdout. On Unix, the
|
||||
file `can be managed by external log rotation programs
|
||||
<https://docs.python.org/2/library/logging.handlers.html#watchedfilehandler>`_
|
||||
<https://docs.python.org/3/library/logging.handlers.html#watchedfilehandler>`_
|
||||
and will automatically be reopened when replaced
|
||||
|
||||
.. option:: --syslog
|
||||
|
||||
logs to the system's event logger: `syslog on unices <https://docs.python.org/2/library/logging.handlers.html#sysloghandler>`_
|
||||
and `the Event Log on Windows <https://docs.python.org/2/library/logging.handlers.html#nteventloghandler>`_.
|
||||
logs to the system's event logger: `syslog on unices <https://docs.python.org/3/library/logging.handlers.html#sysloghandler>`_
|
||||
and `the Event Log on Windows <https://docs.python.org/3/library/logging.handlers.html#nteventloghandler>`_.
|
||||
|
||||
Neither is configurable
|
||||
|
||||
@@ -473,15 +473,15 @@ can be overridden using :option:`--config <odoo-bin -c>`. Specifying
|
||||
to that file.
|
||||
|
||||
.. _jinja2: http://jinja.pocoo.org
|
||||
.. _regular expression: https://docs.python.org/2/library/re.html
|
||||
.. _regular expression: https://docs.python.org/3/library/re.html
|
||||
.. _password authentication:
|
||||
http://www.postgresql.org/docs/9.3/static/auth-methods.html#AUTH-PASSWORD
|
||||
https://www.postgresql.org/docs/9.3/static/auth-methods.html#AUTH-PASSWORD
|
||||
.. _template database:
|
||||
http://www.postgresql.org/docs/9.3/static/manage-ag-templatedbs.html
|
||||
https://www.postgresql.org/docs/9.3/static/manage-ag-templatedbs.html
|
||||
.. _level:
|
||||
https://docs.python.org/2/library/logging.html#logging.Logger.setLevel
|
||||
https://docs.python.org/3/library/logging.html#logging.Logger.setLevel
|
||||
.. _a PostgreSQL URI:
|
||||
http://www.postgresql.org/docs/9.2/static/libpq-connect.html#AEN38208
|
||||
https://www.postgresql.org/docs/9.2/static/libpq-connect.html#AEN38208
|
||||
.. _Werkzeug's proxy support:
|
||||
http://werkzeug.pocoo.org/docs/contrib/fixers/#werkzeug.contrib.fixers.ProxyFix
|
||||
.. _pyinotify: https://github.com/seb-m/pyinotify/wiki
|
||||
|
||||
@@ -154,6 +154,8 @@ values).
|
||||
|
||||
.. ignored assert
|
||||
|
||||
.. _reference/data/shortcuts:
|
||||
|
||||
Shortcuts
|
||||
=========
|
||||
|
||||
@@ -263,5 +265,5 @@ For each row (record):
|
||||
* the third column is the ``name`` field for ``res.country.state``
|
||||
* the fourth column is the ``code`` field for ``res.country.state``
|
||||
|
||||
.. _base64: http://tools.ietf.org/html/rfc3548.html#section-3
|
||||
.. _csv: http://en.wikipedia.org/wiki/Comma-separated_values
|
||||
.. _base64: https://tools.ietf.org/html/rfc3548.html#section-3
|
||||
.. _csv: https://en.wikipedia.org/wiki/Comma-separated_values
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
.. default-domain:: js
|
||||
|
||||
.. _api/js:
|
||||
|
||||
==============
|
||||
Javascript API
|
||||
==============
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
:banner: banners/javascript.jpg
|
||||
|
||||
.. _reference/jscs:
|
||||
|
||||
=====================
|
||||
Javascript Cheatsheet
|
||||
=====================
|
||||
@@ -280,6 +282,7 @@ using the view in the kanban arch (a specific example is the helpdesk dashboard)
|
||||
|
||||
Promises and asynchronous code
|
||||
===============================
|
||||
|
||||
For a very good and complete introduction to promises, please read this excellent article https://github.com/getify/You-Dont-Know-JS/blob/master/async%20%26%20performance/ch3.md
|
||||
|
||||
Creating new Promises
|
||||
@@ -418,6 +421,7 @@ Waiting for Promises
|
||||
|
||||
Error handling
|
||||
--------------
|
||||
|
||||
- in general in promises
|
||||
The general idea is that a promise should not be rejected for control flow, but should only be rejected for errors.
|
||||
When that is the case, you would have multiple resolutions of your promise with, for instance status codes that you would have to check in the `then` handlers and a single `catch` handler at the end of the promise chain.
|
||||
@@ -540,4 +544,4 @@ Testing asynchronous code
|
||||
});
|
||||
});
|
||||
|
||||
as you can see, the nicer form is to use `async/await` as it is clearer and shorter to write.
|
||||
as you can see, the nicer form is to use `async/await` as it is clearer and shorter to write.
|
||||
|
||||
@@ -15,13 +15,8 @@ description into a live application, able to interact with every model and
|
||||
records in the database. It is even possible to use the web client to modify
|
||||
the interface of the web client.
|
||||
|
||||
.. note:: An html version of all docstrings in Odoo is available at:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
javascript_api
|
||||
|
||||
.. note:: An html version of all js docstrings in Odoo is available at:
|
||||
:ref:`JS API <api/js>`
|
||||
|
||||
Overview
|
||||
=========
|
||||
@@ -1421,7 +1416,7 @@ the AbstractView, AbstractController, AbstractRenderer and AbstractModel classes
|
||||
.. raw:: html
|
||||
|
||||
<svg width="550" height="173">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<!-- Created with Method Draw - https://github.com/duopixel/Method-Draw/ -->
|
||||
<path id="svg_1" d="m147.42498,79.79206c0.09944,-8.18859 -0.06363,-16.38812 0.81774,-24.5623c21.65679,2.68895 43.05815,7.08874 64.35,11.04543c1.14304,-4.01519 0.60504,-7.34585 1.59817,-11.05817c13.67878,7.81176 27.23421,15.73476 40.23409,24.03505c-12.47212,9.41539 -26.77809,17.592 -40.82272,25.96494c-0.4548,-3.89916 -0.90967,-7.79828 -1.36448,-11.69744c-20.69972,3.77225 -42.59036,7.6724 -63.42391,11.12096c-1.41678,-7.95741 -1.37514,-16.62327 -1.38888,-24.84846z" stroke-width="1.5" stroke="#000" fill="#fff"/>
|
||||
<rect id="svg_3" height="41" width="110" y="57.5" x="7" fill-opacity="null" stroke-opacity="null" stroke-width="1.5" stroke="#000" fill="#fff"/>
|
||||
<rect stroke="#000" id="svg_5" height="41" width="135" y="20.5" x="328" fill-opacity="null" stroke-opacity="null" stroke-width="1.5" fill="#fff"/>
|
||||
@@ -1467,6 +1462,8 @@ the AbstractView, AbstractController, AbstractRenderer and AbstractModel classes
|
||||
context of a view manager/action manager. They could be used in a client action,
|
||||
or, they could be displayed in the public website (with some work on the assets).
|
||||
|
||||
.. _reference/js/widgets:
|
||||
|
||||
Field Widgets
|
||||
=============
|
||||
|
||||
@@ -1909,7 +1906,6 @@ order.
|
||||
|
||||
Options:
|
||||
|
||||
- title: title of the bar, displayed on top of the bar options
|
||||
- editable: boolean if value is editable
|
||||
- current_value: get the current_value from the field that must be present in the view
|
||||
- max_value: get the max_value from the field that must be present in the view
|
||||
@@ -2264,18 +2260,18 @@ do that, several steps should be done.
|
||||
For more information, look into the *control_panel.js* file.
|
||||
|
||||
.. _.appendTo():
|
||||
http://api.jquery.com/appendTo/
|
||||
https://api.jquery.com/appendTo/
|
||||
|
||||
.. _.prependTo():
|
||||
http://api.jquery.com/prependTo/
|
||||
https://api.jquery.com/prependTo/
|
||||
|
||||
.. _.insertAfter():
|
||||
http://api.jquery.com/insertAfter/
|
||||
https://api.jquery.com/insertAfter/
|
||||
|
||||
.. _.insertBefore():
|
||||
http://api.jquery.com/insertBefore/
|
||||
https://api.jquery.com/insertBefore/
|
||||
|
||||
.. _event delegation:
|
||||
http://api.jquery.com/delegate/
|
||||
https://api.jquery.com/delegate/
|
||||
|
||||
.. _datepicker: https://github.com/Eonasdan/bootstrap-datetimepicker
|
||||
|
||||
+77
-78
@@ -39,11 +39,11 @@ widgets) to your form view will get you up and running in no time.
|
||||
_name = 'business.trip'
|
||||
_inherit = ['mail.thread']
|
||||
_description = 'Business Trip'
|
||||
|
||||
|
||||
name = fields.Char()
|
||||
partner_id = fields.Many2one('res.partner', 'Responsible')
|
||||
guest_ids = fields.Many2many('res.partner', 'Participants')
|
||||
|
||||
|
||||
In the form view:
|
||||
|
||||
.. code-block:: xml
|
||||
@@ -78,10 +78,10 @@ to manage followers on your record:
|
||||
.. rubric:: Posting messages
|
||||
|
||||
.. method:: message_post(self, body='', subject=None, message_type='notification', subtype=None, parent_id=False, attachments=None, **kwargs)
|
||||
|
||||
|
||||
Post a new message in an existing thread, returning the new
|
||||
mail.message ID.
|
||||
|
||||
|
||||
:param str body: body of the message, usually raw HTML that will
|
||||
be sanitized
|
||||
:param str message_type: see mail_message.message_type field
|
||||
@@ -95,20 +95,20 @@ to manage followers on your record:
|
||||
:rtype: int
|
||||
|
||||
.. method:: message_post_with_view(views_or_xmlid, **kwargs):
|
||||
|
||||
|
||||
Helper method to send a mail / post a message using a view_id to
|
||||
render using the ir.qweb engine. This method is stand alone, because
|
||||
there is nothing in template and composer that allows to handle
|
||||
views in batch. This method will probably disappear when templates
|
||||
handle ir ui views.
|
||||
|
||||
|
||||
:param str or ``ir.ui.view`` record: external id or record of the view that
|
||||
should be sent
|
||||
|
||||
.. method:: message_post_with_template(template_id, **kwargs)
|
||||
|
||||
|
||||
Helper method to send a mail with a template
|
||||
|
||||
|
||||
:param template_id: the id of the template to render to create the body of the message
|
||||
:param `\**kwargs`: parameter to create a mail.compose.message wizzard (which inherit from mail.message)
|
||||
|
||||
@@ -121,7 +121,7 @@ on the thread's record depending on some values from the email itself (i.e. upda
|
||||
a date or an e-mail address, add CC's addresses as followers, etc.).
|
||||
|
||||
.. method:: message_new(msg_dict, custom_values=None)
|
||||
|
||||
|
||||
Called by ``message_process`` when a new message is received
|
||||
for a given thread model, if the message did not belong to
|
||||
an existing thread.
|
||||
@@ -129,7 +129,7 @@ a date or an e-mail address, add CC's addresses as followers, etc.).
|
||||
The default behavior is to create a new record of the corresponding
|
||||
model (based on some very basic info extracted from the message).
|
||||
Additional behavior may be implemented by overriding this method.
|
||||
|
||||
|
||||
:param dict msg_dict: a map containing the email details and
|
||||
attachments. See ``message_process`` and ``mail.message.parse`` for details
|
||||
:param dict custom_values: optional dictionary of additional
|
||||
@@ -140,14 +140,14 @@ a date or an e-mail address, add CC's addresses as followers, etc.).
|
||||
:return: the id of the newly created thread object
|
||||
|
||||
.. method:: message_update(msg_dict, update_vals=None)
|
||||
|
||||
|
||||
Called by ``message_process`` when a new message is received
|
||||
for an existing thread. The default behavior is to update the record
|
||||
with ``update_vals`` taken from the incoming email.
|
||||
|
||||
|
||||
Additional behavior may be implemented by overriding this
|
||||
method.
|
||||
|
||||
|
||||
:param dict msg_dict: a map containing the email details and attachments;
|
||||
see ``message_process`` and ``mail.message.parse()`` for details.
|
||||
:param dict update_vals: a dict containing values to update records given
|
||||
@@ -159,7 +159,7 @@ a date or an e-mail address, add CC's addresses as followers, etc.).
|
||||
.. method:: message_subscribe(partner_ids=None, channel_ids=None, subtype_ids=None, force=True)
|
||||
|
||||
Add partners to the records followers.
|
||||
|
||||
|
||||
:param list(int) partner_ids: IDs of the partners that will be subscribed
|
||||
to the record
|
||||
:param list(int) channel_ids: IDs of the channels that will be subscribed
|
||||
@@ -175,7 +175,7 @@ a date or an e-mail address, add CC's addresses as followers, etc.).
|
||||
.. method:: message_unsubscribe(partner_ids=None, channel_ids=None)
|
||||
|
||||
Remove partners from the record's followers.
|
||||
|
||||
|
||||
:param list(int) partner_ids: IDs of the partners that will be subscribed
|
||||
to the record
|
||||
:param list(int) channel_ids: IDs of the channels that will be subscribed
|
||||
@@ -211,12 +211,12 @@ to a field, simple set the tracking attribute to True.
|
||||
_name = 'business.trip'
|
||||
_inherit = ['mail.thread']
|
||||
_description = 'Business Trip'
|
||||
|
||||
|
||||
name = fields.Char(tracking=True)
|
||||
partner_id = fields.Many2one('res.partner', 'Responsible',
|
||||
tracking=True)
|
||||
guest_ids = fields.Many2many('res.partner', 'Participants')
|
||||
|
||||
|
||||
From now on, every change to a trip's name or responsible will log a note
|
||||
on the record. The ``name`` field will be displayed in the notification as
|
||||
well to give more context about the notification (even if the name did not
|
||||
@@ -232,32 +232,32 @@ subtype of notifications they wish to receive.
|
||||
|
||||
Subtypes are created as data in your module; the model has the following fields:
|
||||
|
||||
``name`` (mandatory) - :class:`~odoo.fields.Char`
|
||||
``name`` (mandatory) - :class:`~odoo.fields.Char`
|
||||
name of the subtype, will be displayed in the notification customization
|
||||
popup
|
||||
``description`` - :class:`~odoo.fields.Char`
|
||||
``description`` - :class:`~odoo.fields.Char`
|
||||
description that will be added in the message posted for this
|
||||
subtype. If void, the name will be added instead
|
||||
``internal`` - :class:`~odoo.fields.Boolean`
|
||||
``internal`` - :class:`~odoo.fields.Boolean`
|
||||
messages with internal subtypes will be visible only by employees,
|
||||
aka members of the ``base.group_user`` group
|
||||
``parent_id`` - :class:`~odoo.fields.Many2one`
|
||||
``parent_id`` - :class:`~odoo.fields.Many2one`
|
||||
link subtypes for automatic subscription; for example project subtypes are
|
||||
linked to task subtypes through this link. When someone is subscribed to
|
||||
a project, he will be subscribed to all tasks of this project with
|
||||
subtypes found using the parent subtype
|
||||
``relation_field`` - :class:`~odoo.fields.Char`
|
||||
``relation_field`` - :class:`~odoo.fields.Char`
|
||||
as an example, when linking project and tasks subtypes, the relation
|
||||
field is the project_id field of tasks
|
||||
``res_model`` - :class:`~odoo.fields.Char`
|
||||
``res_model`` - :class:`~odoo.fields.Char`
|
||||
model the subtype applies to; if False, this subtype applies to all models
|
||||
``default`` - :class:`~odoo.fields.Boolean`
|
||||
``default`` - :class:`~odoo.fields.Boolean`
|
||||
wether the subtype is activated by default when subscribing
|
||||
``sequence`` - :class:`~odoo.fields.Integer`
|
||||
``sequence`` - :class:`~odoo.fields.Integer`
|
||||
used to order subtypes in the notification customization popup
|
||||
``hidden`` - :class:`~odoo.fields.Boolean`
|
||||
``hidden`` - :class:`~odoo.fields.Boolean`
|
||||
wether the subtype is hidden in the notification customization popup
|
||||
|
||||
|
||||
|
||||
Interfacing subtypes with field tracking allows to subscribe to different kind
|
||||
of notifications depending on what might interest users. To do this, you
|
||||
@@ -301,7 +301,7 @@ can override the ``_track_subtype()`` function:
|
||||
_name = 'business.trip'
|
||||
_inherit = ['mail.thread']
|
||||
_description = 'Business Trip'
|
||||
|
||||
|
||||
name = fields.Char(tracking=True)
|
||||
partner_id = fields.Many2one('res.partner', 'Responsible',
|
||||
tracking=True)
|
||||
@@ -392,7 +392,7 @@ yourself by overriding the function ``_notification_recipients``.
|
||||
:returns: a subtype's full external id or False if no subtype is triggered
|
||||
|
||||
|
||||
The urls in the actions list can be generated automatically by calling the
|
||||
The urls in the actions list can be generated automatically by calling the
|
||||
``_notification_link_helper()`` function:
|
||||
|
||||
|
||||
@@ -402,7 +402,7 @@ The urls in the actions list can be generated automatically by calling the
|
||||
record if the kwargs ``model`` and ``res_id`` are set).
|
||||
|
||||
:param str link_type: link type to be generated; can be any of these values:
|
||||
|
||||
|
||||
``view``
|
||||
link to form view of the record
|
||||
``assign``
|
||||
@@ -418,8 +418,8 @@ The urls in the actions list can be generated automatically by calling the
|
||||
``new``
|
||||
open an empty form view for a new record; you can specify
|
||||
a specific action by providing its id (database id or fully resolved
|
||||
external id) in the kwarg ``action_id``
|
||||
|
||||
external id) in the kwarg ``action_id``
|
||||
|
||||
:returns: link of the type selected for the record
|
||||
:rtype: str
|
||||
|
||||
@@ -428,7 +428,7 @@ The urls in the actions list can be generated automatically by calling the
|
||||
Let's add a custom button to the Business Trip state change notification;
|
||||
this button will reset the state to Draft and will be only visible to a member
|
||||
of the (imaginary) group Travel Manager (``business.group_trip_manager``)
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class BusinessTrip(models.Model):
|
||||
@@ -437,10 +437,10 @@ The urls in the actions list can be generated automatically by calling the
|
||||
_description = 'Business Trip'
|
||||
|
||||
# Pevious code goes here
|
||||
|
||||
|
||||
def action_cancel(self):
|
||||
self.write({'state': 'draft'})
|
||||
|
||||
|
||||
def _notification_recipients(self, message, groups):
|
||||
""" Handle Trip Manager recipients that can cancel the trip at the last
|
||||
minute and kill all the fun. """
|
||||
@@ -451,7 +451,7 @@ The urls in the actions list can be generated automatically by calling the
|
||||
app_action = self._notification_link_helper('method',
|
||||
method='action_cancel')
|
||||
trip_actions = [{'url': app_action, 'title': _('Cancel')}]
|
||||
|
||||
|
||||
new_group = (
|
||||
'group_trip_manager',
|
||||
lambda partner: bool(partner.user_ids) and
|
||||
@@ -462,11 +462,11 @@ The urls in the actions list can be generated automatically by calling the
|
||||
})
|
||||
|
||||
return [new_group] + groups
|
||||
|
||||
|
||||
Note that that I could have defined my evaluation function outside of this
|
||||
|
||||
Note that that I could have defined my evaluation function outside of this
|
||||
method and define a global function to do it instead of a lambda, but for
|
||||
the sake of being more brief and less verbose in these documentation files
|
||||
the sake of being more brief and less verbose in these documentation files
|
||||
that can sometimes be boring, I choose the former instead of the latter.
|
||||
|
||||
Overriding defaults
|
||||
@@ -483,7 +483,7 @@ Context keys:
|
||||
These context keys can be used to somewhat control ``mail.thread`` features
|
||||
like auto-subscription or field tracking during calls to ``create()`` or
|
||||
``write()`` (or any other method where it may be useful).
|
||||
|
||||
|
||||
- ``mail_create_nosubscribe``: at create or message_post, do not subscribe
|
||||
the current user to the record thread
|
||||
- ``mail_create_nolog``: at create, do not log the automatic '<Document>
|
||||
@@ -496,7 +496,7 @@ Context keys:
|
||||
- ``mail_notify_force_send``: if less than 50 email notifications to send,
|
||||
send them directly instead of using the queue; True by default
|
||||
- ``mail_notify_user_signature``: add the current user signature in
|
||||
email notifications; True by default
|
||||
email notifications; True by default
|
||||
|
||||
|
||||
.. _reference/mixins/mail/alias:
|
||||
@@ -540,14 +540,14 @@ or issues, Sales Team have aliases to generate Leads.
|
||||
|
||||
.. note:: The model that will be created by the alias **must** inherit the
|
||||
``mail_thread`` model.
|
||||
|
||||
|
||||
Alias support is added by inheriting ``mail.alias.mixin``; this mixin will
|
||||
generate a new ``mail.alias`` record for each record of the parent class that
|
||||
gets created (for example, every ``project.project`` record having its ``mail.alias``
|
||||
record initialized on creation).
|
||||
|
||||
.. note:: Aliases can also be created manually and supported by a simple
|
||||
:class:`~odoo.fields.Many2one` field. This guide assumes you wish a
|
||||
:class:`~odoo.fields.Many2one` field. This guide assumes you wish a
|
||||
more complete integration with automatic creation of the alias, record-specific
|
||||
default values, etc.
|
||||
|
||||
@@ -557,25 +557,25 @@ of the created alias, like the kind of record it must create and possibly
|
||||
some default values these records may have depending on the parent object:
|
||||
|
||||
.. method:: get_alias_model_name(vals)
|
||||
|
||||
|
||||
Return the model name for the alias. Incoming emails that are not
|
||||
replies to existing records will cause the creation of a new record
|
||||
of this alias model. The value may depend on ``vals``, the dict of
|
||||
values passed to ``create`` when a record of this model is created.
|
||||
|
||||
|
||||
:param vals dict: values of the newly created record that will holding
|
||||
the alias
|
||||
:return: model name
|
||||
:rtype: str
|
||||
|
||||
.. method:: get_alias_values()
|
||||
|
||||
|
||||
Return values to create an alias, or to write on the alias after its
|
||||
creation. While not completely mandatory, it is usually required to make
|
||||
sure that newly created records will be linked to the alias' parent (i.e.
|
||||
tasks getting created in the right project) by setting a dictionary of
|
||||
default values in the alias' ``alias_defaults`` field.
|
||||
|
||||
|
||||
:return: dictionnary of values that will be written to the new alias
|
||||
:rtype: dict
|
||||
|
||||
@@ -583,24 +583,24 @@ The ``get_alias_values()`` override is particularly interesting as it allows you
|
||||
to modify the behaviour of your aliases easily. Among the fields that can be set
|
||||
on the alias, the following are of particular interest:
|
||||
|
||||
``alias_name`` - :class:`~odoo.fields.Char`
|
||||
``alias_name`` - :class:`~odoo.fields.Char`
|
||||
name of the email alias, e.g. 'jobs' if you want to catch emails for
|
||||
<jobs@example.odoo.com>
|
||||
``alias_user_id`` - :class:`~odoo.fields.Many2one` (``res.users``)
|
||||
``alias_user_id`` - :class:`~odoo.fields.Many2one` (``res.users``)
|
||||
owner of records created upon receiving emails on this alias;
|
||||
if this field is not set the system will attempt to find the right owner
|
||||
based on the sender (From) address, or will use the Administrator account
|
||||
if no system user is found for that address
|
||||
``alias_defaults`` - :class:`~odoo.fields.Text`
|
||||
``alias_defaults`` - :class:`~odoo.fields.Text`
|
||||
Python dictionary that will be evaluated to provide
|
||||
default values when creating new records for this alias
|
||||
``alias_force_thread_id`` - :class:`~odoo.fields.Integer`
|
||||
``alias_force_thread_id`` - :class:`~odoo.fields.Integer`
|
||||
optional ID of a thread (record) to which all incoming messages will be
|
||||
attached, even if they did not reply to it; if set, this will disable the
|
||||
creation of new records completely
|
||||
``alias_contact`` - :class:`~odoo.fields.Selection`
|
||||
``alias_contact`` - :class:`~odoo.fields.Selection`
|
||||
Policy to post a message on the document using the mailgateway
|
||||
|
||||
|
||||
- *everyone*: everyone can post
|
||||
- *partners*: only authenticated partners
|
||||
- *followers*: only followers of the related document or members of following channels
|
||||
@@ -631,7 +631,7 @@ you to make your alias easily configurable from the record's form view.
|
||||
expense_ids = fields.One2many('business.expense', 'trip_id', 'Expenses')
|
||||
alias_id = fields.Many2one('mail.alias', string='Alias', ondelete="restrict",
|
||||
required=True)
|
||||
|
||||
|
||||
def get_alias_model_name(self, vals):
|
||||
""" Specify the model that will get created when the alias receives a message """
|
||||
return 'business.expense'
|
||||
@@ -641,7 +641,7 @@ you to make your alias easily configurable from the record's form view.
|
||||
values = super(BusinessTrip, self).get_alias_values()
|
||||
# alias_defaults holds a dictionnary that will be written
|
||||
# to all records created by this alias
|
||||
#
|
||||
#
|
||||
# in this case, we want all expense records sent to a trip alias
|
||||
# to be linked to the corresponding business trip
|
||||
values['alias_defaults'] = {'trip_id': self.id}
|
||||
@@ -649,7 +649,7 @@ you to make your alias easily configurable from the record's form view.
|
||||
# by default
|
||||
values['alias_contact'] = 'followers'
|
||||
return values
|
||||
|
||||
|
||||
class BusinessExpense(models.Model):
|
||||
_name = 'business.expense'
|
||||
_inherit = ['mail.thread']
|
||||
@@ -662,9 +662,9 @@ you to make your alias easily configurable from the record's form view.
|
||||
|
||||
We would like our alias to be easily configurable from the form view of our
|
||||
business trips, so let's add the following to our form view:
|
||||
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
|
||||
<page string="Emails">
|
||||
<group name="group_alias">
|
||||
<label for="alias_name" string="Email Alias"/>
|
||||
@@ -684,7 +684,7 @@ you to make your alias easily configurable from the record's form view.
|
||||
string="Accept Emails From"/>
|
||||
</group>
|
||||
</page>
|
||||
|
||||
|
||||
Now we can change the alias address directly from the form view and change
|
||||
who can send e-mails to the alias.
|
||||
|
||||
@@ -696,12 +696,12 @@ you to make your alias easily configurable from the record's form view.
|
||||
class BusinessExpense(models.Model):
|
||||
# Previous code goes here
|
||||
# ...
|
||||
|
||||
|
||||
def message_new(self, msg, custom_values=None):
|
||||
""" Override to set values according to the email.
|
||||
|
||||
""" Override to set values according to the email.
|
||||
|
||||
In this simple example, we simply use the email title as the name
|
||||
of the expense, try to find a partner with this email address and
|
||||
of the expense, try to find a partner with this email address and
|
||||
do a regex match to find the amount of the expense."""
|
||||
name = msg_dict.get('subject', 'New Expense')
|
||||
# Match the last occurence of a float in the string
|
||||
@@ -728,7 +728,7 @@ Activities tracking
|
||||
-------------------
|
||||
|
||||
Activities are actions users have to take on a document like making a phone call
|
||||
or organizing a meeting. Activities come with the mail module as they are
|
||||
or organizing a meeting. Activities come with the mail module as they are
|
||||
integrated in the Chatter but are *not bundled with mail.thread*. Activities
|
||||
are records of the ``mail.activity`` class, which have a type (``mail.activity.type``),
|
||||
name, description, scheduled time (among others). Pending activities are visible
|
||||
@@ -798,16 +798,16 @@ campaigns through arguments in links to specified resources. The mixin adds
|
||||
|
||||
* ``campaign_id``: :class:`~odoo.fields.Many2one` field to a ``utm.campaign``
|
||||
object (i.e. Christmas_Special, Fall_Collection, etc.)
|
||||
* ``source_id``: :class:`~odoo.fields.Many2one` field to a ``utm.source``
|
||||
* ``source_id``: :class:`~odoo.fields.Many2one` field to a ``utm.source``
|
||||
object (i.e. Search Engine, mailing list, etc.)
|
||||
* ``medium_id``: :class:`~odoo.fields.Many2one` field to a ``utm.medium``
|
||||
* ``medium_id``: :class:`~odoo.fields.Many2one` field to a ``utm.medium``
|
||||
object (i.e. Snail Mail, e-Mail, social network update, etc.)
|
||||
|
||||
These models have a single field ``name`` (i.e. they are simply there to
|
||||
distinguish campaigns but don't have any specific behaviour).
|
||||
|
||||
Once a customer visits your website with these parameters set in the url
|
||||
(i.e. http://www.odoo.com/?campaign_id=mixin_talk&source_id=www.odoo.com&medium_id=website),
|
||||
(i.e. https://www.odoo.com/?campaign_id=mixin_talk&source_id=www.odoo.com&medium_id=website),
|
||||
three cookies are set in the visitor's website for these parameters.
|
||||
Once a object that inherits the utm.mixin is created from the website (i.e. lead
|
||||
form, job application, etc.), the utm.mixin code kicks in and fetches the values
|
||||
@@ -834,7 +834,7 @@ model should support the *quick create* (i.e. call to ``create()`` with a single
|
||||
_description = 'My Tracked Object'
|
||||
|
||||
my_field = fields.Many2one('my_module.my_track', 'My Field')
|
||||
|
||||
|
||||
@api.model
|
||||
def tracking_fields(self):
|
||||
result = super(MyModel, self).tracking_fields()
|
||||
@@ -884,7 +884,7 @@ This mixin adds 2 fields on your model:
|
||||
the status of the publication
|
||||
* ``website_url``: :class:`~odoo.fields.Char` field which represents
|
||||
the URL through which the object is accessed
|
||||
|
||||
|
||||
Note that this last field is a computed field and must be implemented for your class:
|
||||
|
||||
.. code-block:: python
|
||||
@@ -918,13 +918,13 @@ buttons to website visitors:
|
||||
</t>
|
||||
</div>
|
||||
|
||||
Note that you must pass your object as the variable ``object`` to the template;
|
||||
Note that you must pass your object as the variable ``object`` to the template;
|
||||
in this example, the ``blog.post`` record was passed as the ``blog_post`` variable
|
||||
to the ``qweb`` rendering engine, it is necessary to specify this to the publish
|
||||
management template. The ``publish_edit`` variable allow the frontend
|
||||
button to link to the backend (allowing you to switch from frontend to backend
|
||||
and vice-versa easily); if set, you must specify the full external id of the action
|
||||
you want to call in the backend in the ``action`` variable (note that a Form View
|
||||
you want to call in the backend in the ``action`` variable (note that a Form View
|
||||
must exist for the model).
|
||||
|
||||
The action ``website_publish_button`` is defined in the mixin and adapts its
|
||||
@@ -987,7 +987,7 @@ To add rating support, simply inherit the ``rating.mixin`` model:
|
||||
class MyModel(models.Models):
|
||||
_name = 'my_module.my_model'
|
||||
_inherit = ['rating.mixin', 'mail.thread']
|
||||
|
||||
|
||||
user_id = fields.Many2one('res.users', 'Responsible')
|
||||
partner_id = fields.Many2one('res.partner', 'Customer')
|
||||
|
||||
@@ -995,18 +995,18 @@ The behaviour of the mixin adapts to your model:
|
||||
|
||||
* The ``rating.rating`` record will be linked to the ``partner_id`` field of your
|
||||
model (if the field is present).
|
||||
|
||||
|
||||
- this behaviour can be overriden with the function ``rating_get_partner_id()``
|
||||
if you use another field than ``partner_id``
|
||||
|
||||
|
||||
* The ``rating.rating`` record will be linked to the partner of the ``user_id``
|
||||
field of your model (if the field is present) (i.e. the partner who is rated)
|
||||
|
||||
|
||||
- this behaviour can be overriden with the function ``rating_get_rated_partner_id()``
|
||||
if you use another field than ``user_id`` (note that the function must return a
|
||||
``res.partner``, for ``user_id`` the system automatically fetches the partner
|
||||
of the user)
|
||||
|
||||
|
||||
* The chatter history will display the rating event (if your model inherits from
|
||||
``mail.thread``)
|
||||
|
||||
@@ -1036,7 +1036,7 @@ links to the rating object. A very basic email template could look like this:
|
||||
</ul>
|
||||
]]></field>
|
||||
</record>
|
||||
|
||||
|
||||
Your customer will then receive an e-mail with links to a simple webpage allowing
|
||||
them to provide a feedback on their interaction with your users (including a free-text
|
||||
feedback message).
|
||||
@@ -1074,4 +1074,3 @@ You can find concrete examples of integration in the following models:
|
||||
|
||||
* ``project.task`` in the Project (*rating_project*) Application
|
||||
* ``helpdesk.ticket`` in the Helpdesk (*helpdesk* - Odoo Enterprise only) Application
|
||||
|
||||
|
||||
@@ -128,6 +128,6 @@ Available manifest fields are:
|
||||
These hooks should only be used when setup/cleanup required for this module
|
||||
is either extremely difficult or impossible through the api.
|
||||
|
||||
.. _semantic versioning: http://semver.org
|
||||
.. _semantic versioning: https://semver.org
|
||||
.. _existing categories:
|
||||
https://github.com/odoo/odoo/blob/12.0/odoo/addons/base/data/ir_module_category_data.xml
|
||||
|
||||
+14
-12
@@ -42,7 +42,7 @@ will result in::
|
||||
|
||||
.. _reference/qweb/output:
|
||||
|
||||
data output
|
||||
Data output
|
||||
===========
|
||||
|
||||
QWeb has a primary output directive which automatically HTML-escape its
|
||||
@@ -63,7 +63,7 @@ sanitized user-provided markup.
|
||||
|
||||
.. _reference/qweb/conditionals:
|
||||
|
||||
conditionals
|
||||
Conditionals
|
||||
============
|
||||
|
||||
QWeb has a conditional directive ``if``, which evaluates an expression given
|
||||
@@ -107,7 +107,7 @@ available::
|
||||
|
||||
.. _reference/qweb/loops:
|
||||
|
||||
loops
|
||||
Loops
|
||||
=====
|
||||
|
||||
QWeb has an iteration directive ``foreach`` which take an expression returning
|
||||
@@ -334,7 +334,7 @@ Python
|
||||
Exclusive directives
|
||||
--------------------
|
||||
|
||||
asset bundles
|
||||
Asset bundles
|
||||
'''''''''''''
|
||||
|
||||
.. todo:: have fme write these up because I've no idea how they work
|
||||
@@ -350,7 +350,7 @@ website's rich text edition.
|
||||
``t-options`` can be used to customize fields, the most common option
|
||||
is ``widget``, other options are field- or widget-dependent.
|
||||
|
||||
debugging
|
||||
Debugging
|
||||
---------
|
||||
|
||||
``t-debug``
|
||||
@@ -551,6 +551,8 @@ Helpers
|
||||
:js:func:`core.qweb.render <QWeb2.Engine.render>` can be used to
|
||||
easily render basic module templates
|
||||
|
||||
.. _reference/qweb/api:
|
||||
|
||||
API
|
||||
---
|
||||
|
||||
@@ -637,13 +639,13 @@ API
|
||||
use case. Odoo 9.0 still depends on Jinja_ and Mako_.
|
||||
|
||||
.. _templating:
|
||||
http://en.wikipedia.org/wiki/Template_processor
|
||||
https://en.wikipedia.org/wiki/Template_processor
|
||||
|
||||
.. _Jinja: http://jinja.pocoo.org
|
||||
.. _Mako: http://www.makotemplates.org
|
||||
.. _Genshi: http://genshi.edgewall.org
|
||||
.. _XML namespaces: http://en.wikipedia.org/wiki/XML_namespace
|
||||
.. _HTML: http://en.wikipedia.org/wiki/HTML
|
||||
.. _XSS: http://en.wikipedia.org/wiki/Cross-site_scripting
|
||||
.. _Mako: https://www.makotemplates.org
|
||||
.. _Genshi: https://genshi.edgewall.org
|
||||
.. _XML namespaces: https://en.wikipedia.org/wiki/XML_namespace
|
||||
.. _HTML: https://en.wikipedia.org/wiki/HTML
|
||||
.. _XSS: https://en.wikipedia.org/wiki/Cross-site_scripting
|
||||
.. _JSON: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
|
||||
.. _CSS selector: http://api.jquery.com/category/selectors/
|
||||
.. _CSS selector: https://api.jquery.com/category/selectors/
|
||||
|
||||
@@ -129,13 +129,13 @@ you need to define two templates:
|
||||
* The main report template
|
||||
* The translatable document
|
||||
|
||||
You can then call the translatable document from your main template with the attribute
|
||||
You can then call the translatable document from your main template with the attribute
|
||||
``t-lang`` set to a language code (for example ``fr`` or ``en_US``) or to a record field.
|
||||
You will also need to re-browse the related records with the proper context if you use
|
||||
fields that are translatable (like country names, sales conditions, etc.)
|
||||
|
||||
.. warning::
|
||||
|
||||
|
||||
If your report template does not use translatable record fields, re-browsing the record
|
||||
in another language is *not* necessary and will impact performances.
|
||||
|
||||
@@ -169,10 +169,10 @@ For example, let's look at the Sale Order report from the Sale module::
|
||||
</template>
|
||||
|
||||
|
||||
The main template calls the translatable template with ``doc.partner_id.lang`` as a
|
||||
``t-lang`` parameter, so it will be rendered in the language of the partner. This way,
|
||||
each Sale Order will be printed in the language of the corresponding customer. If you wish
|
||||
to translate only the body of the document, but keep the header and footer in a default
|
||||
The main template calls the translatable template with ``doc.partner_id.lang`` as a
|
||||
``t-lang`` parameter, so it will be rendered in the language of the partner. This way,
|
||||
each Sale Order will be printed in the language of the corresponding customer. If you wish
|
||||
to translate only the body of the document, but keep the header and footer in a default
|
||||
language, you could call the report's external layout this way::
|
||||
|
||||
<t t-call="web.external_layout" t-lang="en_US">
|
||||
@@ -180,7 +180,7 @@ language, you could call the report's external layout this way::
|
||||
.. tip::
|
||||
|
||||
Please take note that this works only when calling external templates, you will not be
|
||||
able to translate part of a document by setting a ``t-lang`` attribute on an xml node other
|
||||
able to translate part of a document by setting a ``t-lang`` attribute on an xml node other
|
||||
than ``t-call``. If you wish to translate part of a template, you can create an external
|
||||
template with this partial template and call it from the main one with the ``t-lang``
|
||||
attribute.
|
||||
@@ -345,4 +345,4 @@ For example, you can access a Sale Order report in html mode by going to
|
||||
Or you can access the pdf version at
|
||||
\http://<server-address>/report/pdf/sale.report_saleorder/38
|
||||
|
||||
.. _wkhtmltopdf: http://wkhtmltopdf.org
|
||||
.. _wkhtmltopdf: https://wkhtmltopdf.org
|
||||
|
||||
@@ -43,12 +43,6 @@ and ``__init__.py`` contains::
|
||||
test modules which are not imported from ``tests/__init__.py`` will not be
|
||||
run
|
||||
|
||||
.. versionchanged:: 8.0
|
||||
|
||||
previously, the test runner would only run modules added to two lists
|
||||
``fast_suite`` and ``checks`` in ``tests/__init__.py``. In 8.0 it will
|
||||
run all imported modules
|
||||
|
||||
The test runner will simply run any test case, as described in the official
|
||||
`unittest documentation`_, but Odoo provides a number of utilities and helpers
|
||||
related to testing Odoo content (modules, mainly):
|
||||
@@ -108,10 +102,7 @@ Tests are automatically run when installing or updating modules if
|
||||
:option:`--test-enable <odoo-bin --test-enable>` was enabled when starting the
|
||||
Odoo server.
|
||||
|
||||
As of Odoo 8, running tests outside of the install/update cycle is not
|
||||
supported.
|
||||
|
||||
.. _unittest documentation: https://docs.python.org/2/library/unittest.html
|
||||
.. _unittest documentation: https://docs.python.org/3/library/unittest.html
|
||||
|
||||
Test selection
|
||||
--------------
|
||||
@@ -514,7 +505,7 @@ test runner will then create a phantom_js browser, point it to the proper url
|
||||
and simulate the click and inputs, according to the scenario.
|
||||
|
||||
|
||||
.. _qunit: http://qunitjs.com/
|
||||
.. _qunit: https://qunitjs.com/
|
||||
.. _qunit_config.js: https://github.com/odoo/odoo/blob/51ee0c3cb59810449a60dae0b086b49b1ed6f946/addons/web/static/tests/helpers/qunit_config.js#L49
|
||||
.. _web.js_tests_assets: https://github.com/odoo/odoo/blob/51ee0c3cb59810449a60dae0b086b49b1ed6f946/addons/web/views/webclient_templates.xml#L427
|
||||
.. _web.qunit_suite: https://github.com/odoo/odoo/blob/51ee0c3cb59810449a60dae0b086b49b1ed6f946/addons/web/views/webclient_templates.xml#L509
|
||||
@@ -523,4 +514,4 @@ and simulate the click and inputs, according to the scenario.
|
||||
.. _test_utils.js: https://github.com/odoo/odoo/blob/51ee0c3cb59810449a60dae0b086b49b1ed6f946/addons/web/static/tests/helpers/test_utils.js
|
||||
.. _mock server: https://github.com/odoo/odoo/blob/51ee0c3cb59810449a60dae0b086b49b1ed6f946/addons/web/static/tests/helpers/mock_server.js
|
||||
.. _qunit assertions: https://github.com/odoo/odoo/blob/51ee0c3cb59810449a60dae0b086b49b1ed6f946/addons/web/static/tests/helpers/qunit_asserts.js
|
||||
.. _createView: https://github.com/odoo/odoo/blob/51ee0c3cb59810449a60dae0b086b49b1ed6f946/addons/web/static/tests/helpers/test_utils_create.js#L267
|
||||
.. _createView: https://github.com/odoo/odoo/blob/51ee0c3cb59810449a60dae0b086b49b1ed6f946/addons/web/static/tests/helpers/test_utils_create.js#L267
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
Translating Modules
|
||||
===================
|
||||
|
||||
This section explains how to provide translation abilities to your module.
|
||||
|
||||
.. note:: If you want to contribute to the translation of Odoo itself, please refer to the
|
||||
`Odoo Wiki page <https://github.com/odoo/odoo/wiki/Translations>`_.
|
||||
|
||||
Exporting translatable term
|
||||
===========================
|
||||
|
||||
@@ -184,6 +189,6 @@ Read vs Run Time
|
||||
};
|
||||
|
||||
|
||||
.. _PO File: http://en.wikipedia.org/wiki/Gettext#Translating
|
||||
.. _msginit: http://www.gnu.org/software/gettext/manual/gettext.html#Creating
|
||||
.. _POEdit: http://poedit.net/
|
||||
.. _PO File: https://en.wikipedia.org/wiki/Gettext#Translating
|
||||
.. _msginit: https://www.gnu.org/software/gettext/manual/gettext.html#Creating
|
||||
.. _POEdit: https://poedit.net/
|
||||
|
||||
@@ -550,6 +550,7 @@ care how they are implemented.
|
||||
pending transactions/existing holds).
|
||||
|
||||
.. exception:: odoo.exceptions.AccessError
|
||||
:noindex:
|
||||
|
||||
Raised by:
|
||||
|
||||
@@ -557,8 +558,9 @@ care how they are implemented.
|
||||
* any failure in an inter-server call. (typically, in :func:`~odoo.addons.iap.jsonrpc`).
|
||||
|
||||
.. exception:: odoo.exceptions.UserError
|
||||
:noindex:
|
||||
|
||||
Raised by any unexpeted behaviour at the discretion of the App developer (*you*).
|
||||
Raised by any unexpected behaviour at the discretion of the App developer (*you*).
|
||||
|
||||
|
||||
Test the API
|
||||
|
||||
Reference in New Issue
Block a user