Saltar al contenido principal
Versión: Tryton 6.0 (LTS)

6. Dominios, PYSON y seguridad

Tryton 6.0 · curso práctico versionado

Objetivos

  • leer y componer dominios
  • usar PYSON para estados de interfaz
  • separar restricciones de usabilidad y reglas de acceso

Modelo mental

Este concepto debe entenderse como parte de un sistema transaccional: la interfaz ayuda al usuario, el servidor conserva las reglas y la base persiste el resultado. Un dominio describe candidatos o una búsqueda. PYSON hace que una declaración dependa del registro o contexto. Los permisos y reglas de registros siguen siendo la frontera de seguridad.

Práctica guiada

  1. Escriba la restricción empresarial en lenguaje natural.
  2. Tradúzcala a un dominio y pruebe registros representativos.
  3. Use Eval y Bool únicamente para presentación del cliente.
  4. Añada permisos del modelo y reglas de registros para autorización.
  5. Pruebe llamadas directas con usuarios permitidos y denegados.

Ejemplo mínimo

from trytond.model import fields
from trytond.pyson import Eval

author = fields.Many2One(
'library.author', "Author",
domain=[('active', '=', True)],
states={
'readonly': Eval('state') != 'draft',
'required': Eval('state') == 'draft',
},
depends=['state'])

# Search examples
Book.search([('author.name', 'ilike', 'Ada%')])
Book.search(['OR', ('price', '=', None), ('price', '>=', 0)])

Cómo leer el ejemplo

Los dominios atraviesan relaciones Many2One. Manténgalos comprensibles: documente expresiones profundas y cúbralas con pruebas de tabla de verdad.

Ejercicio

Restrinja autores por compañía y estado activo; demuestre luego que un contexto falsificado no permite leer registros protegidos de otra compañía.

Realice el ejercicio primero con un caso mínimo, después agregue un caso inválido y convierta ambos en pruebas repetibles.

Resultado verificable

El selector ayuda en la interfaz y el servidor rechaza independientemente todo acceso no autorizado.

Errores frecuentes

  • usar estados o dominios como autorización
  • olvidar casos nulos
  • no declarar en depends un campo usado
  • construir dominios desde cadenas no confiables

Criterio para avanzar

  • Puedo explicar la diferencia entre los conceptos sin mirar el código.
  • El caso válido y el inválido tienen pruebas.
  • Probé con un usuario sin privilegios administrativos.
  • Sé cómo actualizar y cómo recuperar la base de entrenamiento.

Versión y referencias

La serie 6.0 requiere como mínimo Python 3.6 según los metadatos oficiales. Esta rama oficial todavía conserva metadatos históricos en setup.py; mantenga compatibilidad con la serie, pero prepare sus paquetes personalizados para la construcción estándar mediante python -m build. No confunda ese mínimo histórico con la versión de Python que haya certificado su organización.

Esta edición fija ejemplos y dependencias en la serie 6.0. Consulte el tutorial oficial 6.0, la API del servidor y el código de esa rama antes de trasladar el patrón a producción.