.. _ref-pyson:
.. module:: trytond.pyson

PYSON
=====

PYSON is the Python Statement and Object Notation.

There is also a more :ref:`practical introduction into
PYSON statements <topics-pyson>`.

.. class:: PYSON

   Base class of any PYSON statement.
   It is never used directly.

Instance methods:

.. method:: PYSON.pyson()

   Return the internal dictionary representation of the statement.

.. method:: PYSON.types()

   Return a set of all possible types which the statement can become when
   evaluated.

Class methods:

.. classmethod:: PYSON.eval(dct, context)

   Return the evaluation of the statement given in ``dct`` within the
   ``context``.

   ``dct`` contains a dictionary which is the internal representation of a
   PYSON statement.

   ``context`` contains a dictionary with contextual values.


Encoder and Decoder
-------------------

.. class:: PYSONEncoder()

   Encoder for PYSON statements into string representations.

Instance methods:

.. method:: PYSONEncoder.encode(object)

   Return a string representation of a given PYSON statement.

   ``object`` contains a PYSON statement.


.. class:: PYSONDecoder([context[, noeval]])

   Decoder for string into the evaluated or not PYSON statement.

Instance methods:

.. method:: PYSONDecoder.decode(object)

   Return a PYSON statement evaluated or not of a given string.

   ``object`` contains a string.

Statements
----------

The following classes can be used as :class:`PYSON` statement:

.. contents::
   :local:
   :backlinks: entry
   :depth: 1

Eval
^^^^

.. class:: Eval(value[, default])

   Represent the PYSON statement for evaluations.

   When evaluated, it returns the value of the statement named by ``value``, if
   defined in the evaluation context, otherwise the ``default`` value (empty
   string by default).

   .. note::

      The default value determines the type of the statement.

   .. note::

      If the ``value`` includes dots the value will be dereferenced.
      For example::

         Eval('_parent_sale.number')

      The ``number`` value of the ``_parent_sale`` key of the evaluation
      context will be returned.


Not
^^^

.. class:: Not(value)

   Represent the PYSON statement for logical negations.

   When evaluated, returns the boolean negation of the value of the statement
   named by ``value``, if defined in the evaluation context.
   Returns an instance of itself.

Bool
^^^^

.. class:: Bool(value)

   Represent the PYSON statement for boolean evaluations.

   Returns the boolean representation of the value of the statement named by
   ``value``.

And
^^^

.. class:: And(\*statements)

   Represent the PYSON statement for logical *and* operations.

   Returns the result of the logical conjunction of two or more values named by
   the statements in the ``statements`` tuple.

Or
^^

.. class:: Or(\*statements)

   Represent the PYSON statement for logical *or* operations.

   Returns the result of the logical disjunction of two or more values named by
   the statements in the ``statements`` tuple.

Equal
^^^^^

.. class:: Equal(statement1, statement2)

   Represent the PYSON statement for equation comparisons.

   Returns ``True`` when a value of a statement named by ``statement1`` and the
   value of a statement named by ``statement2`` are equal, otherwise returns
   ``False``.

Greater
^^^^^^^

.. class:: Greater(statement1, statement2[, equal])

   Represent the PYSON statement for *greater-than* comparisons.

   Returns ``True`` when the value of the statement named by ``statement1`` is
   strictly greater than the value of the statement named by ``statement2``,
   otherwise returns false.
   Is the value of the variable named by ``equal`` is ``True``, then returns
   also ``True`` when both values of statements named by ``statement1`` and
   ``statement2`` are equal.
   In this case :class:`Greater` works as a *greater-than or equal* operator.

   .. note::

      ``None`` value is replaced by ``0`` for the comparison.

Less
^^^^

.. class:: Less(statement1, statement2[, equal])

   Represent the PYSON statement for *less-than* comparisons.

   Returns ``True`` when the value of the statement named by ``statement1`` is
   strictly less than the value of the statement named by ``statement2``,
   otherwise returns ``False``.
   Is the value of the variable named ``equal`` is true, then returns also true
   when both values of the statements named by ``statement1`` and
   ``statement2`` are equal.
   In this case :class:`Less`  works as a *less-than or equal* operator.

   .. note::

      ``None`` value is replaced by ``0`` for the comparison.

If
^^

.. class:: If(condition, then_statement, else_statement)

   Represent the PYSON statement for conditional flow control operations.

   Returns the value of the statement named by ``then_statement`` when the
   value of the statement named by ``condition`` evaluates true.
   Otherwise returns the value of the statement named by ``else_statement``.

Get
^^^

.. class:: Get(obj, key[, default])

   Represent the PYSON statement for dictionary look-up operations and
   evaluation.

   Look up and returns the value of a key named by ``key`` in an object named
   by ``obj`` if defined.
   Otherwise returns the value of the variable named by ``default``.

In
^^

.. class:: In(key, obj)

   Represent the PYSON statement for look-up dictionary or integer objects.

   Returns true when a list (or dictionary) object named by ``obj`` contains
   the value of the variable (or key) named by ``key``.
   Otherwise returns false.

Date
^^^^

.. class:: Date([year[, month[, day[, delta_years[, delta_month[, delta_days[, start]]]]]]])

   Represent the PYSON statement for date related conversions and basic
   calculations.

   Returns a date object which represents the values of arguments named by the
   *variables* explained below.
   Missing values of arguments named by ``year`` or ``month`` or ``day`` take
   their defaults from ``start`` or the actual date. When values of arguments
   named by ``delta_*`` are given, they are added to the values of the
   appropriate arguments in a date and time preserving manner.

   Arguments:

   ``year``
      A PYSON statement of type int or long.

   ``month``
      A PYSON statement of type int or long.

   ``day``
      A PYSON statement of type int or long.

   ``delta_years``
      A PYSON statement of type int or long.

   ``delta_month``
      A PYSON statement of type int or long.

   ``delta_days``
      A PYSON statement of type int or long.

   ``start``
      A PYSON statement of type date.

DateTime
^^^^^^^^

.. class:: DateTime([year[, month[, day[, hour[, minute[, second[, microsecond[, delta_years[, delta_months[, delta_days[, delta_hours[, delta_minutes[, delta_seconds[, delta_microseconds[, start]]]]]]]]]]]]]]])

   Represent the PYSON statement for date and time related conversions and
   calculations.

   Returns a date time object which represents the values of variables named by
   the *arguments* explained below.
   Missing values of arguments named by  ``year``, ``month``, ``day``,
   ``hour``, ``minute``, ``second``, ``microseconds`` take their defaults from
   ``start`` or the actual date and time in `UTC`_.
   When values of arguments named by ``delta_*`` are given, these are added  to
   the appropriate attributes in a date and time preserving manner.

   Arguments:

   ``year``
       A PYSON statement of type int or long.

   ``month``
       A PYSON statement of type int or long.

   ``day``
       A PYSON statement of type int or long.

   ``hour``
       A PYSON statement of type int or long.

   ``minute``
       A PYSON statement of type int or long.

   ``second``
       A PYSON statement of type int or long.

   ``microsecond``
       A PYSON statement of type int or long.

   ``delta_years``
       A PYSON statement of type int or long.

   ``delta_month``
       A PYSON statement of type int or long.

   ``delta_days``
       A PYSON statement of type int or long.

   ``delta_hours``
       A PYSON statement of type int or long.

   ``delta_minutes``
       A PYSON statement of type int or long.

   ``delta_seconds``
       A PYSON statement of type int or long.

   ``delta_microseconds``
       A PYSON statement of type int or long.

   ``start``
       A PYSON statement of type datetime.

.. _`UTC`: https://en.wikipedia.org/wiki/Coordinated_Universal_Time

Len
^^^

.. class:: Len(value)

   Represent the PYSON statement for length of a dictionary, list or string.

   Returns the number of items in ``value``.

Id
^^

.. class:: Id(module, fs_id)

   Represent the PYSON statement for filesystem id evaluations.

   When converted into the internal dictionary, it returns the database id
   stored in ``ir.model.data``.