Tryton Tips

Record

insertar un registro en base algún modelo previamente definido.

<record model="mimodulo.mi_name_model" id="miunicoid">
  <field name="miatributo1">Valor 1</field>
  <field name="miatributo2">Valor 2</field>
</record>

si el modelo tiene algun referencia a otro modelo many2one, many2many creado desde los archivos xml se puede hacer referencia por medio del atributo ref

<record model="mimodulo.mi_name_model" id="miunicoid">
....
  <field name="categoria" ref="miunicoid_categoria_1">
</record>

Control de acceso

en tryton la gestión de control se puede limitar a: * modelos * grupos

Modelos

lo primero sería un grupo para segmentar el ACL.

<record model="res.group" id="migrupo1">
  <field name="name">MiGrupo</field>
</record>

y luego podemos indicar los permisos read, write, create, delete

<record model="ir.model.access" id="miacceso1">
 <field name="model" search="[('model','=', 'mimodulo.mimodelo')]"/>
 <field name="perm_read" eval="True"/>
 <field name="perm_write" eval="True"/>
 <field name="perm_create" eval="True"/>
 <field name="perm_delete" eval="False"/>
</record>

Reglas para registros

como en el ACL para modelos, debemos primero crear el grupo para segmentar el ACL.

<record model="ir.rule.group" id="mimodelgrupo1">
<field name="name">Mi Filtro 1</field>
  <field name="model" search="[('model','=', 'mimodulo.mimodelo')]"/>
  <!--  -->
  <field name="global_p" eval="False"/>
  <!--para todos los usuarios creados asignado automaticamente indicar como True-->
  <field name="default_p" eval="False"/>
  <field name="perm_read" eval="True"/>
  <field name="perm_write" eval="True"/>
  <field name="perm_create" eval="True"/>
  <field name="perm_delete" eval="True"/>
</record>

ahora se puede indicar una o más reglas, si alguna se asume como verdadera se aplican los permisos. debemos tener presente el atributo eval que es el domain que se evaluaria y el atributo pyson = 1 si necesitamos usar pyson en la evaluación del domain, adicionalmente tenemos acceso al modelo del usuario logeado através de la clave user del cuál podemos consultar sus atributos -id,name,party,etc...- ejemplo: Get(Eval('user',{}),'id', -1)

<record model="ir.rule" id="miregla1">
  <field name="domain"
      eval="[('id', '=', 1)]"
      pyson="1"/>
  <!-- referenciamos el ingreso del ir.rule.group anterior atraves del **id** -->
  <field name="rule_group" ref="mimodelgrupo1"/>
</record>

Modelos

ModelSingleton

nos facilita tener un único registro, por ejemplo tener un modelo de parametrización o configuraciones, veamos un ejemplo:

from trytond.model import ModelSingleton,ModelSQL, ModelView, fields


class Configuracion(ModelSingleton, ModelSQL, ModelView):
  "mis configuraciones"
  __name__ = "mimodulo.configuracion"
  
  min_age = fields.Integer("Edad minima")
  rooms = fields.Integer("Habitaciones")

el ModelSingleton nos garantiza úna unica instancia y un único registro, podemos luego utilizarlo por medio de Pool y obtener los parametros de configuración.

#en algún método no muy lejano...
def ....():
  Configuracion = Pool().get('mimodulo.configuracion')
  configuracion = Configuracion(1)
  if configuracion.min_age > 10:
    ......

Relaciónes

One2Many

algunos ejemplos de atributos

filter

el atributo filter al definir una declaración One2Many permite filtrar los registros pero no condicionarlos, por medio de un domain, veamos un ejemplo

from trytond.model import ModelSingleton,ModelSQL, ModelView, fields

class Mascota(ModelSQL, ModelView):
  __name__ = "mimodulo.mascota"
  
  name = fields.Char("name")
  inlive = fields.Boolean("live")
  
class Casa(ModelSQL, ModelView):
  __name__ = "mimodulo.casa"
  
  #con *filter* filtramos los registros a los que cumplan el domain
  #se debe tener en cuenta que esto es a nivel de python no base de datos
  mascotas = fields.One2Many("mimodulo.mascota", "Mascotas", filter=[('inlive','=',True)])