diff --git a/INSTALL b/INSTALL deleted file mode 100644 index 65beaa5e39..0000000000 --- a/INSTALL +++ /dev/null @@ -1,27 +0,0 @@ -Installing proteus -================== - -Prerequisites -------------- - - * Python 3.4 or later (http://www.python.org/) - * python-dateutil (http://labix.org/python-dateutil) - * Optional: trytond (http://www.tryton.org/) - -Installation ------------- - -Once you've downloaded and unpacked the proteus source release, enter the -directory where the archive was unpacked, and run: - - python setup.py install - -Note that you may need administrator/root privileges for this step, as -this command will by default attempt to install module to the Python -site-packages directory on your system. - -For advanced options, please refer to the easy_install and/or the distutils -documentation: - - http://setuptools.readthedocs.io/en/latest/easy_install.html - http://docs.python.org/inst/inst.html diff --git a/MANIFEST.in b/MANIFEST.in index e10911832e..e88b2348a3 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,5 @@ -include LICENSE -include COPYRIGHT -include README -include INSTALL include CHANGELOG +include COPYRIGHT +include LICENSE +include README.rst +include doc/* diff --git a/README b/README deleted file mode 100644 index 20c21d303a..0000000000 --- a/README +++ /dev/null @@ -1,152 +0,0 @@ -proteus -======= - -A library to access Tryton's models like a client. - -Installing ----------- - -See INSTALL - -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:') - -Installing 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 instanciate 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(zip='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(zip='69') - >>> party.save() - >>> address = party.addresses.new(zip='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 - -Support -------- - -If you encounter any problems with Tryton, please don't hesitate to ask -questions on the Tryton forum or IRC channel: - - http://www.tryton.org/forum - -License -------- - -See LICENSE - -Copyright ---------- - -See COPYRIGHT - - -For more information please visit the Tryton web site: - - http://www.tryton.org/ diff --git a/README.rst b/README.rst new file mode 120000 index 0000000000..176d9c2695 --- /dev/null +++ b/README.rst @@ -0,0 +1 @@ +doc/index.rst \ No newline at end of file diff --git a/doc/index.rst b/doc/index.rst index 201da93fd8..0f999cc34d 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1 +1,125 @@ -.. include:: ../README +======================= +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:') + +Installing 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 instanciate 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(zip='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(zip='69') + >>> party.save() + >>> address = party.addresses.new(zip='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 diff --git a/setup.py b/setup.py index 84a6fc9418..32ab0369c0 100755 --- a/setup.py +++ b/setup.py @@ -48,11 +48,17 @@ if minor_version % 2: setup(name=name, version=version, description='Library to access Tryton server as a client', - long_description=read('README'), + long_description=read('README.rst'), author='Tryton', author_email='bugs@tryton.org', url='http://www.tryton.org/', download_url=download_url, + project_urls={ + "Bug Tracker": 'https://bugs.tryton.org/', + "Documentation": 'https://docs.tryton.org/', + "Forum": 'https://www.tryton.org/forum', + "Source Code": 'https://hg.tryton.org/proteus', + }, keywords='tryton library cli', packages=find_packages(), classifiers=[