Files
tryton/proteus
Cédric Krier 98cbb23f58 Improve setup.py
get_required_version does not need to use .dev0 suffix anymore.
The download URL must be empty for development version.
Source Code must point to Heptapod repository.
Foundation email is used as author email.
2022-12-24 13:45:10 +01:00
..
2022-12-16 14:49:00 +01:00
2022-12-16 14:49:00 +01:00
2022-12-16 14:49:00 +01:00
2022-12-16 14:49:00 +01:00
2022-12-16 14:49:00 +01:00
2022-12-16 14:49:00 +01:00
2022-12-24 13:45:10 +01:00
2022-12-16 23:16:08 +01:00

=======================
Tryton Scripting Client
=======================

A library to access Tryton's models like a client.

Example of usage
----------------

    >>> from proteus import config, Model, Wizard, Report

Configuration
~~~~~~~~~~~~~

Configuration to connect to a sqlite memory database using trytond as module.

    >>> config = config.set_trytond('sqlite:///:memory:')

There is also the ``config.set_xmlrpc`` method which can be used to connect
using a URL, and the ``config.set_xmlrpc_session`` method (when used as a
context manager) which connects for a session.

Activating a module
~~~~~~~~~~~~~~~~~~~

Find the module, call the activate button and run the upgrade wizard.

    >>> Module = Model.get('ir.module')
    >>> party_module, = Module.find([('name', '=', 'party')])
    >>> party_module.click('activate')
    >>> Wizard('ir.module.activate_upgrade').execute('upgrade')

Creating a party
~~~~~~~~~~~~~~~~

First instantiate a new Party:

    >>> Party = Model.get('party.party')
    >>> party = Party()
    >>> party.id < 0
    True

Fill the fields:

    >>> party.name = 'ham'

Save the instance into the server:

    >>> party.save()
    >>> party.name
    'ham'
    >>> party.id > 0
    True

Setting the language of the party
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The language on party is a ``Many2One`` relation field. So it requires to get a
``Model`` instance as value.

    >>> Lang = Model.get('ir.lang')
    >>> en, = Lang.find([('code', '=', 'en')])
    >>> party.lang = en
    >>> party.save()
    >>> party.lang.code
    'en'

Creating an address for the party
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Addresses are store on party with a ``One2Many`` field.
So the new address just needs to be appended to the list ``addresses``.

    >>> address = party.addresses.new(postal_code='42')
    >>> party.save()
    >>> party.addresses #doctest: +ELLIPSIS
    [proteus.Model.get('party.address')(...)]

Adding category to the party
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Categories are linked to party with a ``Many2Many`` field.

So first create a category

    >>> Category = Model.get('party.category')
    >>> category = Category()
    >>> category.name = 'spam'
    >>> category.save()

Append it to categories of the party

    >>> party.categories.append(category)
    >>> party.save()
    >>> party.categories #doctest: +ELLIPSIS
    [proteus.Model.get('party.category')(...)]

Print party label
~~~~~~~~~~~~~~~~~

There is a label report on ``Party``.

    >>> label = Report('party.label')

The report is executed with a list of records and some extra data.

    >>> type_, data, print_, name = label.execute([party], {})

Sorting addresses and register order
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Addresses are ordered by sequence which means they can be stored following a
specific order.
The ``set_sequence`` method stores the current order.

    >>> address = party.addresses.new(postal_code='69')
    >>> party.save()
    >>> address = party.addresses.new(postal_code='23')
    >>> party.save()

Now changing the order.

    >>> reversed_addresses = list(reversed(party.addresses))
    >>> while party.addresses:
    ...     _ = party.addresses.pop()
    >>> party.addresses.extend(reversed_addresses)
    >>> party.addresses.set_sequence()
    >>> party.save()
    >>> party.addresses == reversed_addresses
    True

Setting context
~~~~~~~~~~~~~~~

Make French translatable:

    >>> Language = Model.get('ir.lang')
    >>> french, = Language.find([('code', '=', 'fr')])
    >>> french.translatable = True
    >>> french.save()

Create a category in English:

    >>> Category = Model.get('party.category')
    >>> with config.set_context(language='en'):
    ...     category = Category(name="Category")
    ...     category.save()

Translate in French:

    >>> with config.set_context(language='fr'):
    ...     category_fr = Category(category.id)
    ...     category_fr.name = "Categorie"
    ...     category_fr.save()

Read in English:

    >>> category.reload()
    >>> category.name
    'Category'

Read in French:

    >>> category_fr.reload()
    >>> category_fr.name
    'Categorie'

.. toctree::
   :maxdepth: 2

   releases