Skip to content

Instantly share code, notes, and snippets.

@vijoin
Last active July 25, 2019 18:00
Show Gist options
  • Save vijoin/a4193983eabf4e3eed2c3f3b16e256ae to your computer and use it in GitHub Desktop.
Save vijoin/a4193983eabf4e3eed2c3f3b16e256ae to your computer and use it in GitHub Desktop.
Explico como hacer herencias por deleganción y algunas utilidades

#Odoo - Herencia por Delegación

El Problema:

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:

  1. Crear tres clases distintas, (repitiendo así los atributos en cada clase)
  2. 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.

Herencias de Clase con Odoo

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

El comportamiento en la acción

  • 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 modelo persona

Sugerencia

Es probable que luego de crear una persona quieras pasarlo a voluntario. Para eso:

  1. activa el campo persona_id en el formulario de voluntario
  2. Hazlo required="False" en la vista
  3. 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.

@lualcontre01
Copy link

lualcontre01 commented Jul 25, 2019

por que el ma. en _name = 'ma.persona' ?

hasta ahora he visto herencias tipo

class ma_voluntario(models.Model):
_name = 'ma.voluntario'
_inherits = 'persona'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment