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