Post on 25-Jan-2017
● Es una plataforma de aplicaciones de propósito general de alto nivel
● Publicada bajo la licencia GPL-3● Escrita en Python● Utiliza PostgreSQL como motor de base de datos.● Es la base fundamental de una solución empresarial
completa que proporciona modularidad, escalabilidad y seguridad.
¿Qué es Tryton?
Arquitectura cliente – servidor de 3 niveles
¿Qué es Tryton?
Cliente escritorioGtk
Navegador web
Servidor Tryton
PostgreSQL
gUnicorn
SAO
nombre_del_modulo
|_ doc
|_ locale
|_ tests
|_ view
party_form.xml
party_tree.xml
__init__.py
party.py
party.xml
tryton.cfg
Estructura básica de un módulo
Contenido estándar del fichero tryton.cfg
[tryton]
version=3.8.0
depends:
ir
res
xml:
party.xml
Estructura básica de un módulo
Modelo: Modelos Tryton
Clases Python mapeadas a tablas PostgreSQL
Creación/actualización automática tablas
Los campos se definen como atributos de la clase
Arquitectura Modelo, Vista, Controlador
Modelo: Modelos Trytonfrom trytond.model import ModelView, ModelSQL, fields
__all__ = ['Party']
class Party(ModelSQL, ModelView):
"Party"
__name__ = "party.party"
name = fields.Char('Name')
code = fields.Char('Code')
Fichero python (party.py)
Arquitectura Modelo, Vista, Controlador
Modelo: Modelos Trytonfrom trytond.pool import Pool
from .party import *
def register():
Pool.register(
Party,
module='party', type_='model')
La clase se debe registrar en el pool.
Fichero __init__.py
Arquitectura Modelo, Vista, Controlador
Modelo: Campos Tryton• Booleano
• Entero, flotante, numérico
• Carácter, texto, selección
• Fecha, fecha y hora, hora
• Referencia, muchos a uno, uno a muchos, uno a
uno, muchos a muchos
• Funcionales, propiedades, diccionario, binario
Arquitectura Modelo, Vista, Controlador
Modelo: Herencia• Tryton permite realizar herencia de clases para
ampliar las funcionalidades básicas de los modelos
estandard
•
Arquitectura Modelo, Vista, Controlador
Modelo: Herenciafrom trytond.model import fieldsfrom trytond.pool import Poolmetafrom trytond.pyson import Eval
__all__ = ['Party']
class Party: __metaclass__ = PoolMeta __name__ = "party.party" active = fields.Boolean('Active', select=True) addresses = fields.One2Many('party.address', 'party', 'Addresses', states={ 'readonly': ~Eval('active', True), }, depends=['active'])
Arquitectura Modelo, Vista, Controlador
Vista: Archivos XML
Las vistas se utilizan para mostrar los registros a los
usuarios.
Existen diferentes tipos de vistas: listas, árboles,
formularios, gráficos, calendario,...
Las vistas se abren mediante acciones, y se guardan
en archivos XML dentro del directorio view
Arquitectura Modelo, Vista, Controlador
Vista: Archivos XML
Las vistas se definen en archivos XML junto con las
acciones, los menús, los permisos, datos, etc.
(fichero party.xml)
<record model="ir.ui.view" id="party_view_form">
<field name="model">party.party</field>
<field name="type">form</field>
<field name="name">party_form</field>
</record>
Arquitectura Modelo, Vista, Controlador
Vista: Archivos XMLVista de tipo formulario (fichero party_form.xml en el directorio view)
<form string="Party"> <label name="name"/> <field name="name"/> <notebook colspan="6"> <page string="General"> <label name="code"/> <field name="code"/> </page> </notebook></form>
Arquitectura Modelo, Vista, Controlador
Vista: Archivos XMLVista de tipo lista (fichero party_tree.xml en el directorio view)
<tree string="Taxes" sequence="sequence"> <field name="name"/> <field name="code"/></tree>
Arquitectura Modelo, Vista, Controlador
Vista: extensión de las vistas
Las vistas pueden extenderse mediante herencia
<record model="ir.ui.view" id="party_view_form">
<field name="model">party.party</field>
<field name="inherit" ref="party.party_view_form"/>
<field name="name">party_form</field>
</record>
Arquitectura Modelo, Vista, Controlador
Vista: extensión de las vistas<data> <xpath expr="/form/notebook/page/field[@name='code']" position="after"> <label name="active"/> <field name="active"/> <label name="addresses"/> <field name="addresses"/> </xpath></data>
Arquitectura Modelo, Vista, Controlador
Controlador: Código Python● Lógica: Validación de datos, cálculos, …● Flujos de trabajo: Estados, transiciones, roles, …● Asistentes: Para instalar módulos, realizar
acciones, informes, ...
Arquitectura Modelo, Vista, Controlador
Controlador: Métodos estáticosMétodos que se aplican a todos los registros del modelo.@staticmethoddef default_active(): return True
Arquitectura Modelo, Vista, Controlador
Controlador: Métodos de claseMétodos que se aplican a un conjunto de registros del modelo.@classmethoddef copy(cls, parties, default=None): if default is None: default = {} default = default.copy() default['code'] = None return super(Party, cls).copy(parties, default=default)
Arquitectura Modelo, Vista, Controlador
Controlador: Métodos de instanciaMétodos que se aplican a un único registro del modelo.
def get_rec_name(self, name): code = self.code if code: return u"[%s] %s" % (code, self.name) return self.name
Arquitectura Modelo, Vista, Controlador