¿Qué hay de malo en seguir el código en Python?

Estaba intentando implementar una restricción para un campo, pero en lugar de causar una validación de restricción, permite que el registro se guarde sin mostrar ningún mensaje de restricción

def _check_contact_number(self, cr, uid, ids, context=None): for rec in self.browse(cr, uid, ids, context=context): if rec.contact_number: size=len(str(rec.contact_number)) if size<10: return False if not contact_number: return {} contact_number = rec.contact_number.replace('.','') #removes any '.' from the string contact_number = rec.contact_number.replace(' ','') #removes space from the string if not contact_number.isdigit(): return False return {} _constraints = [ (_check_contact_number, 'Enter valid phone number...!', ['contact_number']), ] 

Amablemente alguien me corrige. Muchas gracias

Este código tiene unos guiones feos. Tal vez esta es la razón. Los identes idóneos se ven así:

 def _check_contact_number(self, cr, uid, ids, context=None): for rec in self.browse(cr, uid, ids, context=context): if rec.contact_number: size=len(str(rec.contact_number)) if size<10: return False if not contact_number: return {} contact_number = rec.contact_number.replace('.','') #removes any '.' from the string contact_number = rec.contact_number.replace(' ','') #removes space from the string if not contact_number.isdigit(): return False return {} _constraints = [ (_check_contact_number, 'Enter valid phone number...!', ['contact_number']), ] 

Asumiendo

 _constraints = [ (_check_contact_number, 'Enter valid phone number...!', ['contact_number']), ] 

es la syntax correcta, y tiene una sangría adecuada, este debe ser su código;

 def _check_contact_number(self, cr, uid, ids, context=None): for rec in self.browse(cr, uid, ids, context=context): contact_number = rec.contact_number.replace('.','') #removes any '.' from the string contact_number = rec.contact_number.replace(' ','') #removes space from the string contact_number = rec.contact_number.replace('-','') #removes any hyphens in the string if rec.contact_number: size=len(str(rec.contact_number)) if size<10: return False if not contact_number: return {} if not contact_number.isdigit(): return False return {} _constraints = [ (_check_contact_number, 'Enter valid phone number...!', ['contact_number']), ] 

- Si eso no funciona, necesitaremos ver a toda la class para corregir esto.

Asumo

 _constraints = [ (_check_contact_number, 'Enter valid phone number...!', ['contact_number']), ] 

También se coloca incorrectamente, posiblemente causando el colapso completo.

Aquí hay un código más optimizado para la restricción. asegúrese de reiniciar el servidor y actualizar el módulo personalizado para que surta efecto.

 def _check_contact_number(self, cr, uid, ids, context=None): for rec in self.browse(cr, uid, ids, context=context): if rec.contact_number: if len(str(rec.contact_number))<10: return False contact_number = str(rec.contact_number).replace('.','').replace(' ','') if not contact_number.isdigit(): return False return True _constraints = [ (_check_contact_number, 'Enter valid phone number...!', ['contact_number']), ] 

Algunas de las otras respuestas parecen razonables, aquí está mi bash de usar la nueva API ORM de Odoo:

 @api.one @api.constrains('contact_number') def _check_contact_number(self): contact_number = self.contact_number.replace('.','').replace(' ','') if len(contact_number) < 10: raise exceptions.ValidationError( "Phone number has to contain at least 10 digits!" ) if not contact_number.isdigit(): raise exceptions.ValidationError( "Phone number can only contain digits, spaces and dots!" ) 

La API actual para definir restricciones es mucho mejor. Realmente deberías aprenderlo. La API antigua que está utilizando está en desuso y, finalmente, se eliminará.

La sugerencia de Atul Arvind acerca de recordar reiniciar el servidor y actualizar el módulo en particular también es muy importante.