#Odoo - Herencia por Delegación
Debo registrar la información de las personas que se activan con mi organización, pero estos se diferencias en tres roles:
- Participante
- Voluntario
- Brigadista
Entre estos 3 roles existen un 90% de similitud en los atributos, pero justo en ese 10% es donde radica mi próblema. Las dos soluciones frecuntes son:
- Crear tres clases distintas, (repitiendo así los atributos en cada clase)
- Crear una sola clase pero incluir los campos adicionales de cada rol, diferenciando cada rol mediante un campo (desperdiciando campos de mi clase)
Siempre me había parecido más correcto utilizar herencias, ya que los tres roles pertenecen a una clase superior
que podríamos llamar persona
. Ahora bien, el rol participante es exactamente el mismo de persona, debido a que solo
define los atributos más básicos.
Hasta ahora solo había implementado la herencia de clase y de prototipo, dejando siempre la incertidumbre de para qué serviría la herencia por delegación.
Justament esta última me permite resolver el problema planteado anteriormente.
Lo que haremos es definir una clase persona
de la cual se heredarán sus atributos hacia la clase voluntario
.
class persona(models.Model):
_name = 'persona'
nombres = fields.Char('Nombres', help='Nombres de la persona')
apellidos = fields.Char('Apellidos', help='Apellidos de la persona')
cedula = fields.Char('Cédula', size=8, help='Cédula de la persona')
nacionalidad_id = fields.Many2one('nacionalidad','Nacionalidad')
fecha_nacimiento = fields.Date('Fecha de Nacimiento')
sexo = fields.Selection([('masculino','Masculino'),('femenino','Femenino')], 'Sexo')
class ma_voluntario(models.Model):
_name = 'ma.voluntario'
_inherits = {'ma.persona':'persona_id'}
persona_id = fields.Many2one('ma.persona','Persona')
actividad_ids = fields.Many2many('ma.conf.actividad', 'ma_voluntario_actividad_rel', 'voluntario_id', 'actividad_id', string='Actividades', help='Actividades en la cual quiere participar el voluntario o voluntaria')
dias_actividad_id = fields.Many2one('dias_actividad', 'Días de activación')
Nótese el atributo _inherits
el cual recibe un diccionario con:
1. El nombre de la clase de donde hereda
2. Un campo m2o en la clase voluntario que almacena el id del padre
- Al crear un voluntario se crea una persona
- Al crear una persona NO se crea un voluntario
- Todos los campos que muestres en el formulario de
voluntario
funcionarán como related hacia el modelopersona
Es probable que luego de crear una persona quieras pasarlo a voluntario. Para eso:
- activa el campo
persona_id
en el formulario de voluntario - Hazlo
required="False"
en la vista - Indica mediante un atributo
help
que este campo debe ser usado solo en caso de que ya exista la persona y/o ocúltalo en alguna pestaña.
En los casos en que el campo esté vación, odoo creará la nueva persona en simultáneo con el nuevo voluntario.
por que el ma. en _name = 'ma.persona' ?
hasta ahora he visto herencias tipo
class ma_voluntario(models.Model):
_name = 'ma.voluntario'
_inherits = 'persona'