[IMP] developer: add sections on pyjs and domains
closes odoo/documentation#1248 Signed-off-by: Géry Debongnie (ged) <ged@openerp.com>
This commit is contained in:
parent
f206233ebc
commit
da4dae597e
@ -316,6 +316,182 @@ and its context will be extended with the `default_period_id` value. This is a
|
|||||||
very important usecase that lets developers combine actions together by providing
|
very important usecase that lets developers combine actions together by providing
|
||||||
some information to the next action.
|
some information to the next action.
|
||||||
|
|
||||||
|
.. _javascript/pyjs:
|
||||||
|
|
||||||
|
Python Interpreter
|
||||||
|
==================
|
||||||
|
|
||||||
|
The Odoo framework features a built-in small python interpreter. Its purpose
|
||||||
|
is to evaluate small python expressions. This is important, because views in
|
||||||
|
Odoo have modifiers written in python, but they need to be evaluated by the
|
||||||
|
browser.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: js
|
||||||
|
|
||||||
|
import { evaluateExpr } from "@web/core/py_js/py";
|
||||||
|
|
||||||
|
evaluateExpr("1 + 2*{'a': 1}.get('b', 54) + v", { v: 33 }); // returns 142
|
||||||
|
|
||||||
|
|
||||||
|
The ``py`` javascript code exports 5 functions:
|
||||||
|
|
||||||
|
.. js:function:: tokenize(expr)
|
||||||
|
|
||||||
|
:param string expr: the expression to tokenize
|
||||||
|
:returns: Token[] a list of token
|
||||||
|
|
||||||
|
.. js:function:: parse(tokens)
|
||||||
|
|
||||||
|
:param Token[] tokens: a list of tokens
|
||||||
|
:returns: AST an abstract syntax tree structure representing the expression
|
||||||
|
|
||||||
|
.. js:function:: parseExpr(expr)
|
||||||
|
|
||||||
|
:param string expr: a string representing a valid python expression
|
||||||
|
:returns: AST an abstract syntax tree structure representing the expression
|
||||||
|
|
||||||
|
.. js:function:: evaluate(ast[, context])
|
||||||
|
|
||||||
|
:param AST ast: a AST structure that represents an expression
|
||||||
|
:param Object context: an object that provides an additional evaluation context
|
||||||
|
:returns: any the resulting value of the expression, with respect to the context
|
||||||
|
|
||||||
|
.. js:function:: evaluateExpr(expr[, context])
|
||||||
|
|
||||||
|
:param string expr: a string representing a valid python expression
|
||||||
|
:param Object context: an object that provides an additional evaluation context
|
||||||
|
:returns: any the resulting value of the expression, with respect to the context
|
||||||
|
|
||||||
|
.. _javascript/domains:
|
||||||
|
|
||||||
|
Domains
|
||||||
|
=======
|
||||||
|
|
||||||
|
Broadly speaking, domains in Odoo represent a set of records that matches some
|
||||||
|
specified conditions. In javascript, they are usually represented either as a
|
||||||
|
list of conditions (or of operators: `|`, `&` or `!` in prefix notation), or as string
|
||||||
|
expressions. They don't have to be normalized (the `&` operator is implied if
|
||||||
|
necessary). For example:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
// list of conditions
|
||||||
|
[]
|
||||||
|
[["a", "=", 3]]
|
||||||
|
[["a", "=", 1], ["b", "=", 2], ["c", "=", 3]]
|
||||||
|
["&", "&", ["a", "=", 1], ["b", "=", 2], ["c", "=", 3]]
|
||||||
|
["&", "!", ["a", "=", 1], "|", ["a", "=", 2], ["a", "=", 3]]
|
||||||
|
|
||||||
|
// string expressions
|
||||||
|
"[('some_file', '>', a)]"
|
||||||
|
"[('date','>=', (context_today() - datetime.timedelta(days=30)).strftime('%Y-%m-%d'))]"
|
||||||
|
"[('date', '!=', False)]"
|
||||||
|
|
||||||
|
String expressions are more powerful than list expressions: they can contain
|
||||||
|
python expressions and unevaluated values, that depends on some evaluation context.
|
||||||
|
However, manipulating string expressions is more difficult.
|
||||||
|
|
||||||
|
Since domains are quite important in the web client, Odoo provides a `Domain`
|
||||||
|
class:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
new Domain([["a", "=", 3]]).contains({ a: 3 }) // true
|
||||||
|
|
||||||
|
const domain = new Domain(["&", "&", ["a", "=", 1], ["b", "=", 2], ["c", "=", 3]]);
|
||||||
|
domain.contains({ a: 1, b: 2, c: 3 }); // true
|
||||||
|
domain.contains({ a: -1, b: 2, c: 3 }); // false
|
||||||
|
|
||||||
|
// next expression returns ["|", ("a", "=", 1), ("b", "<=", 3)]
|
||||||
|
Domain.or([[["a", "=", 1]], "[('b', '<=', 3)]"]).toString();
|
||||||
|
|
||||||
|
Here is the `Domain` class description:
|
||||||
|
|
||||||
|
.. js:class:: Domain([descr])
|
||||||
|
|
||||||
|
:param descr: a domain description
|
||||||
|
:type descr: string | any[] | Domain
|
||||||
|
|
||||||
|
.. js:method:: contains(record)
|
||||||
|
|
||||||
|
:param Object record: a record object
|
||||||
|
:returns: boolean
|
||||||
|
|
||||||
|
Returns true if the record matches all the condition specified by the domain
|
||||||
|
|
||||||
|
.. js:method:: toString()
|
||||||
|
|
||||||
|
:returns: string
|
||||||
|
|
||||||
|
Returns a string description for the domain
|
||||||
|
|
||||||
|
.. js:method:: toList([context])
|
||||||
|
|
||||||
|
:param Object context: evaluation context
|
||||||
|
:returns: any[]
|
||||||
|
|
||||||
|
Returns a list description for the domain. Note that this method takes an
|
||||||
|
optional `context` object that will be used to replace all free variables.
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
new Domain(`[('a', '>', b)]`).toList({ b:3 }); // [['a', '>', 3]]
|
||||||
|
|
||||||
|
The `Domain` class also provides 4 useful static methods to combine domains:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
// ["&", ("a", "=", 1), ("uid", "<=", uid)]
|
||||||
|
Domain.and([[["a", "=", 1]], "[('uid', '<=', uid)]"]).toString();
|
||||||
|
|
||||||
|
// ["|", ("a", "=", 1), ("uid", "<=", uid)]
|
||||||
|
Domain.or([[["a", "=", 1]], "[('uid', '<=', uid)]"]).toString();
|
||||||
|
|
||||||
|
// ["!", ("a", "=", 1)]
|
||||||
|
Domain.not([["a", "=", 1]]).toString();
|
||||||
|
|
||||||
|
// ["&", ("a", "=", 1), ("uid", "<=", uid)]
|
||||||
|
Domain.combine([[["a", "=", 1]], "[('uid', '<=', uid)]"], "AND").toString();
|
||||||
|
|
||||||
|
|
||||||
|
.. staticmethod:: Domain.and(domains)
|
||||||
|
|
||||||
|
:param domains: a list of domain representations
|
||||||
|
:type domains: string[] | any[][] | Domain[]
|
||||||
|
:returns: Domain
|
||||||
|
|
||||||
|
Returns a domain representing the intersection of all domains.
|
||||||
|
|
||||||
|
.. staticmethod:: Domain.or(domains)
|
||||||
|
|
||||||
|
:param domains: a list of domain representations
|
||||||
|
:type domains: string[] | any[][] | Domain[]
|
||||||
|
:returns: Domain
|
||||||
|
|
||||||
|
Returns a domain representing the union of all domains.
|
||||||
|
|
||||||
|
.. staticmethod:: Domain.not(domain)
|
||||||
|
|
||||||
|
:param domain: a domain representation
|
||||||
|
:type domain: string | any[] | Domain
|
||||||
|
:returns: Domain
|
||||||
|
|
||||||
|
Returns a domain representing the negation of the domain argument
|
||||||
|
|
||||||
|
.. staticmethod:: Domain.combine(domains, operator)
|
||||||
|
|
||||||
|
:param domains: a list of domain representations
|
||||||
|
:type domains: string[] | any[][] | Domain[]
|
||||||
|
:param operator: an operator
|
||||||
|
:type operator: 'AND' or 'OR'
|
||||||
|
|
||||||
|
:returns: Domain
|
||||||
|
|
||||||
|
Returns a domain representing either the intersection or the union of all the
|
||||||
|
domains, depending on the value of the operator argument.
|
||||||
|
|
||||||
.. _javascript/bus:
|
.. _javascript/bus:
|
||||||
|
|
||||||
Bus
|
Bus
|
||||||
|
Loading…
Reference in New Issue
Block a user