13. Desarrollando con Odoo (8). Restricciones de campos y de BD. La funcion subrayado "_"

1. Restriciones de formato de campo(en el modelo)

Para generar restricciones se utiliza el decorador @api.constrains('campo') que se aplica sobre la función que valida dicho campo.

Es bastante útil utilizar regex. Para ello hay que hacer:

import re 

Veamos nuestro ejemplo concreto

regex = re.compile('^[0-9]{8}[a-z]', re.I)

Siendo:

  1. '^' indica que comienza por lo que viene
  2. [0-9] indica que el siguiente caràcter es un dígito
  3. {8} indica que la condición anterior se repite 8 veces (o sea admite solo 8 dígitos)
  4. [a-z] indica una letra en minúscula
  5. re.I indica que ignore el caso (admite tanto mayúsculas como minúsculas)
O sea quiere que haya 8 dígitos y despues letras ya sean mayúsculas o minúsculas

Veamos pues el modelo

  access_code = fields.Char()

  @api.constrains('access_code')
  def _check_access_code(self):
    regex = re.compile('^[0-9]{8}[a-z]', re.I)
    for record in self:
      if len(record.access_code) <10:
        raise ValidationError ('Longitud código de acceso incorrecta')
      elif not regex.match(record.access_code):
            raise ValidationError (_('Formato código de acceso incorrecto'))
            else:    
                _logger.info ('Código de acceso generado correctamente')


Obvservar la función subrayado "_" dentro del ValidationError. En cierta manera se utiliza para internacionalizar (i18n) los mensajes.

2. Restriciones de BD (en el modelo)

Las restricciones de BD se incluyen en el modelo y se realizan sobre la variable _sql_constraints que es una lista de tuplas (las listas son modificables pero las tuplas no)  

El formato de la tupla que contiene 3 campos es:

  1. Nombre que aplicamos nosotros a la restricción
  2. Definición normalizada de la restricción
  3. Mensaje de error si no se verifica

En este caso vamos a crear una restricción que quiere que el valor del campo access_code sea único

#                     nombre_restricción    restricción           Mensaje si no se cumple
_sql_constraints = [('access_code_unique', 'unique(access_code)', 'Access Code ya existe.')]




Comentarios

Entradas populares de este blog

20. Desarrollando con Odoo (15). Permisos y grupos. Crear usuarios de la aplicación. Restringir permisos a usuarios

2. El Modo desarrollador

8. Desarrollando con Odoo (6). Herencia de clase en modelos. Herencia de vistas. Operaciones numeradas en Odoo ??