Tryton
------

Développement d'application pour entreprise
...........................................

Qu'est-ce que Tryton ?
----------------------

Plate-forme applicative pour entreprise
.......................................
d'architecture trois tiers
..........................

Qu'est-ce que Tryton ? (suite)
------------------------------

- Client PyGTK

- Serveur Python

- PostgreSQL (SQLite, MySQL)

- GPL-3

- Fork d'OpenERP

Qu'est-ce que Tryton ? (suite)
------------------------------

- Achat / Vente

- Contacts

- Stock

- Comptabilité financière et analytique

- Projets

- Calendrier


Pourquoi "forker" OpenERP
-------------------------

- Modifications non-acceptées

- Ajout vs redesign

- Qualité du code

- Mauvaise gestion des sources

Objectifs de Tryton
-------------------

- Consistances

- Migration

- Modularité

- Approche "Framework spécialisé"

- easy_install

- Code review

Release process
---------------

- Trunk "releasable"

- Cycle de 6 mois

- 3 releases maintenues

- Serveur de tests

Client
------

- PyGTK :

    - Léger (sans logique métier)

    - Multi-plateforme : X, Windows, MacOS X

- WebDAV

- CalDAV/CardDAV :

    - Thunderbird - Ligthning (SOGo)

    - iPhone

- XML-RPC

- JSON-RPC (futur GWT client)


Serveur - Noyau
---------------

- ORM :

    - Création du schéma

    - Migration automatique

- Moteur de workflow

- Moteur de rapports (relatorio)

- Multi-langues


Serveur - Noyau (suite)
-----------------------

- Sécurité :

    - SSL

    - Authentification

    - Règles d'accès :

        - par modèle

        - par enregistrement

Serveur - Modules
-----------------

- Modèles

- Wizard 

- Vues

- Rapports

- Workflow

- Extension d'autres modules


Neso
----

- Version standalone

- SQLite

- Process unique

Exemple de développement
------------------------

- Modèle

- Champs

- Valeurs par défaut

- Search-Create-Write-Delete

- Browse

- Vues

- États

Modèles
-------

.. code-block:: python
 :linenos:

    from trytond.model import ModelSQL

    class Opportunity(ModelSQL):
        'Opportunity'
        _description = __doc__
        _name = 'training.opportunity'

    Opportunity()

Champs
------

.. code-block:: python
 :linenos:

    class Opportunity(ModelSQL, ModelView):
        'Opportunity'
        _description = __doc__
        _name = 'training.opportunity'
        _rec_name = 'description'

        description = fields.Char('Description', required=True)
        start_date = fields.Date('Start Date', required=True)
        end_date = fields.Date('End Date')
        party = fields.Many2One('party.party', 'Party', required=True)
        comment = fields.Text('Comment')

    Opportunity()

Valeurs par défaut
------------------

.. code-block:: python
 :linenos:

    class Opportunity(ModelSQL, ModelView):

        start_date = fields.Date('Start Date', required=True)

        def default_start_date(self):
            return datetime.date.today()

    Opportunity()

Search-Create-Write-Delete
--------------------------

.. code-block:: python
 :linenos:

    party_id = party_obj.search([
        ('name', '=', 'Bob'),
        ])

    opportunity_id = opportunity_obj.create({
        'description': 'Bigdil',
        'party': party_id,
        })

    opportunity_obj.write(opportunity_id, {
        'comment': 'Resto pas terrible',
        })

    opportunity_obj.delete(opportunity_id)

Browse
------

.. code-block:: python
 :linenos:

    >>> opportunity = opportunity_obj.browse(opportunity_id)

    >>> print opportunity.start_date
    datetime.date(2010, 8, 27)    

    >>> for address in opportunity.party.addresses:
    ...     print address.street
    Rue de Rotterdam
    Chaussée de Namur

Vue liste
---------

.. code-block:: xml
 :linenos:

    <record model="ir.ui.view" id="opportunity_view_tree">
        <field name="model">training.opportunity</field>
        <field name="type">tree</field>
        <field name="arch" type="xml">
            <![CDATA[
            <tree string="Opportunities">
                <field name="party" select="1"/>
                <field name="description" select="1"/>
                <field name="start_date" select="1"/>
                <field name="end_date" select="2"/>
            </tree>
            ]]>
        </field>
    </record>

.. image:: list.png
    :width: 11cm

Vue formulaire
--------------

.. code-block:: xml
 :linenos:

    <record model="ir.ui.view" id="opportunity_view_form">
        <field name="model">training.opportunity</field>
        <field name="type">form</field>
        <field name="arch" type="xml">
            <![CDATA[
            <form string="Opportunity">
                <label name="party"/>
                <field name="party"/>
                <separator name="comment" colspan="4"/>
                <field name="comment" colspan="4"/>
            </form>
            ]]>
        </field>
    </record>

.. image:: form.png
    :width: 10cm

États
-----

.. code-block:: python
 :linenos:

    from trytond.pyson import Not, Equal, Eval, In

    class Opportunity(ModelSQL, ModelView):

        state = fields.Selection([
                ('opportunity', 'Opportunity'),
                ('converted', 'Converted'),
                ('lost', 'Lost'),
            ], 'State', required=True, readonly=True, sort=False)

        description = fields.Char('Description', required=True, states={
            'readonly': Not(Equal(Eval('state'), 'opportunity')),
            }, depends=['state'])

Proteus
-------

- CLI Python

- Active record

- Local et réseau

Futur
-----

- Process vs Thread

- namedtuple vs dict

- IMAP

- Gantt chart

- Widget de recherche


Futur (suite)
-------------

.. code-block:: python
 :linenos:

    class Opportunity(ModelSQL, ModelView):

        @classmethod
        def create(cls, values, **kwargs):
            pass

        @classmethod
        def default_start_date(cls):
            return datetime.date.today()

    opportunity = Opportunity(opportunity_id)
    isinstance(opportunity, Opportunity)

More
----

- Website: http://www.tryton.org/

- IRC: #tryton on irc.freenode.net

.. code-block:: irc

    22:57 < zodman> dudes tryton development is easy !!!!
    22:57 < zodman> xD
    22:57 < zodman> good work!

.. footer::

   © 2010 Cédric Krier - Bertrand Chenal
   CC-by-SA-2.0

..  LocalWords:  Process Thread namedtuple dict IMAP Gantt chart code-block
..  LocalWords:  linenos class Opportunity
