Declaración de campos, validaciones y valores por defecto - leninsvg/Odoo GitHub Wiki

Las validaciones son funciones que se realizan antes del metodo create() de una clase en odoo.

Existen dos tipos de validaciones:

_sql_constraints

@api.constrains

_sql_constraints

Como su nombre lo indica permiten ocupar métodos de SQL para realizar validaciones a nuestro código. A continuación se realiza una validación en la cual se impide el acceso de registros duplicados.

_sql_constraints = [('unique_name',
                     'unique(name)',
                     'El tipo de identificación registrado con ese nombre ya existe, ingrese uno nuevo'),]

La sintaxis para realizar una validación es la siguiente:

   _sql_constraints = [('Name','operation(fieldName)','Mesage'),]

Name= se especifica el nombre que se quiera dar a la validación.

Operation= se especifica la operación que en el caso del ejemplo es unique con el caul vamos a validar que no se inserten registros duplicados.

fielName= campo a ser validado

Mesage= Mensage en caso del error

@api.constrains

para realizar estas validaciones se necesitara los siguiente:

Importar la siguiente libreria:

from openerp.exceptions import ValidationError

Utilizar el los decoradores

@api.one
@api.constrains('identificationNumber')

En el siguiente ejemplo se podrá visualizar de una manera mas clara su uso:

@api.one
@api.constrains('identificationNumber')
def ValidateIdentification(self):        
    identificationTypeService=GolIdentificationTypeService()

    if(identificationTypeService.ValidateIdentificationSize(self.env['gol.identification.type'],
                                                        int(self.identificationType.id),
                                                        str(self.identificationNumber)) == False):
        raise ValidationError('La longitud ingresada en el número de identificación es incorrecta')

    if(identificationTypeService.ValidateIdentificationType(self.env['gol.identification.type'],
                                                        int(self.identificationType.id),
                                                        str(self.identificationNumber)) == False):
        raise ValidationError('Verifique el número de identificación ingrezado. Contiene Números o Caracteres')

Por medio del decorador @api.constrains('fieldName','fieldName1') se especifica los campos a ser validados.

En la función se especifica las operaciones de la validacion, por ejemplo:

@api.one
@api.constrains('fecha_publicacion','fecha_compra')
def _check_fechas(self):
    present = datetime.now()
    if self.fecha_compra and self.fecha_compra > present:
        raise ValidationError("Fecha de compra incorrecta")
    if self.fecha_publicacion and self.fecha_publicacion > present:
        raise ValidationError("Fecha de publicación incorrecta")

Por medio del raise ValidationError('mesage') se da el mensage de la validacion.

Valores por defecto

@api.model
def _def_currency(self):
	«  » » Search for Currency TND by default
	«  » »
	currency_obj= self.env['res.company']
	currency = currency_obj.search([('currency_id','=','TND')], limit=1)
	if currency:
	return currency[0].id
	return False


    def on_change_cours_id(self,cr, uid, ids,examen_id,salle_de_classe_id,cours_id,aca_id,context=None):
	context=context or {}
	note_ids = []
	value = {}
    	if ids:
		old_note_ids = self.pool.get('schoolem.note_evaluation').search(cr, uid,[('evaluation_id','in',ids)])
		self.pool.get('schoolem.note_evaluation').unlink(cr, uid, old_note_ids)
        etudiant_ids = []
        #search for etudiant_ids with the conditions examen_id,salle_de_classe_id,cours_id,aca_id etc
        for etud_id in etudiant_ids:
		note_ids.append((0,0,{'name':0,'etudiant_id':etud_id}))
	value.update(note_ids=note_ids)
	return {'value':value}

Valores por defecto

http://odootechnical.com/overriding-default_get-method-in-odoo-8/

En el siguiente ejemplo se muestra como poner valores por defecto a un campo. Para esto se utiliza el decorador @api.model En el siguiente ejemplo muestro un ejemplo:

from openerp import models,api
class res_partner(models.Model):
_inherit = 'res.partner'

@api.model
def default_get(self, vals):
    res = super(res_partner, self).default_get(vals) 
    res.update({
               'country_id':'New Value', # Many2one field
               'city': 'Gandhinagar',
               'website': 'www.odootechnical.com',
               'email' : '[email protected]'
              })
    return res

Para poder seterar valores por defecto es nesesario pasar dos parametro en la funcion def default_get(self, vals):

La siguiente linea indica que los valores por defecto van ser asignados a los valores del objeto actual. Para esto se utiliza la palabra reservada super('Nombre de la clase actual',self)

  res = super(res_partner, self).default_get(vals) 

Una ves que se idicamos el objeto a que tendra los valores por defecto es nesesario poner los valores nuevos.

            res.update({
               'country_id':'New Value', # Many2one field
               'city': 'Gandhinagar',
               'website': 'www.odootechnical.com',
               'email' : '[email protected]'
              })

Finalmente como paso final retornamos el resultado o los valores actualizados.

      return res

https://github.com/idu-bogota/curso-taller-openerp/tree/odoo-v8/lecciones/04