Package: proteus
A library to access Tryton’s models like a client.Example of usage>>> from proteus import config, Model, Wizard, ReportConfigurationConfiguration to connect to a sqlite memory database using trytond as module.>>> config = config.set_trytond('sqlite:///:memory:')There is also theconfig.set_xmlrpcmethod which can be used to connect
using a URL, and theconfig.set_xmlrpc_sessionmethod (when used as a
context manager) which connects for a session.Activating a moduleFind 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 partyFirst instantiate a new Party:>>> Party = Model.get('party.party')
>>> party = Party()
>>> party.id < 0
TrueFill the fields:>>> party.name = 'ham'Save the instance into the server:>>> party.save()
>>> party.name
'ham'
>>> party.id > 0
TrueSetting the language of the partyThe language on party is aMany2Onerelation field. So it requires to get aModelinstance 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 partyAddresses are store on party with aOne2Manyfield.
So the new address just needs to be appended to the listaddresses.>>> address = party.addresses.new(postal_code='42')
>>> party.save()
>>> party.addresses #doctest: +ELLIPSIS
[proteus.Model.get('party.address')(...)]Adding category to the partyCategories are linked to party with aMany2Manyfield.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 labelThere is a label report onParty.>>> 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 orderAddresses are ordered by sequence which means they can be stored following a
specific order.
Theset_sequencemethod 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
TrueSetting contextMake 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'