Práctica: Módulo viajes. Parte 4
Extendemos res.partner para distinguir conductores y consultar su historial. La herencia modifica el modelo existente y añade las columnas necesarias al actualizar el addon.
1. Herencia e importación #
Fichero models/partner.py:
1from odoo import fields, models 2 3 4class Partner(models.Model): 5 _inherit = 'res.partner' 6 7 conductor = fields.Boolean(default=False) 8 viaje_ids = fields.Many2many( 9 'viajes.viaje', 'viajes_pasajero_rel', 'partner_id', 'viaje_id', 10 string='Viajes como pasajero', readonly=True, 11 ) 12 viajes_conducidos_ids = fields.One2many( 13 'viajes.viaje', 'conductor_id', string='Viajes como conductor', readonly=True, 14 )
Añade from . import partner en models/__init__.py. viaje_ids reutiliza la misma tabla de pasajeros con las columnas invertidas. Los viajes conducidos son otra relación, inversa de conductor_id: no confundas ambos historiales. readonly=True controla la edición del campo en el cliente; no sustituye permisos de acceso.
2. Vista de contactos y acción #
Fichero views/partner.xml:
1<odoo> 2<record id="partner_conductor_form_view" model="ir.ui.view"> 3 <field name="name">partner.conductor</field> 4 <field name="model">res.partner</field> 5 <field name="inherit_id" ref="base.view_partner_form"/> 6 <field name="arch" type="xml"> 7 <xpath expr="//notebook" position="inside"> 8 <page string="Viajes"> 9 <group><field name="conductor"/></group> 10 <group string="Como pasajero"><field name="viaje_ids"/></group> 11 <group string="Como conductor"><field name="viajes_conducidos_ids"/></group> 12 </page> 13 </xpath> 14 </field> 15 </record> 16 <record id="contact_list_action" model="ir.actions.act_window"> 17 <field name="name">Viajeros</field> 18 <field name="res_model">res.partner</field> 19 <field name="view_mode">list,form</field> 20 </record> 21</odoo>
Añade el archivo al manifiesto antes de los menús. Añade estas entradas a views/menus.xml:
1<menuitem id="configuration_menu" name="Configuración" parent="main_viajes_menu"/> 2<menuitem id="contact_menu" name="Viajeros" parent="configuration_menu" action="contact_list_action"/>
La acción sigue respetando los permisos estándar de contactos. Para modificar contactos, el usuario debe disponer del rol correspondiente de Odoo; los permisos de viajes no conceden administración de contactos.
3. Actualizar sin perder datos #
Una columna inexistente suele indicar que el código se ha cargado sin actualizar el esquema. Comprueba nombre del archivo, importación y manifiesto; detén el servidor, actualiza el módulo y vuelve a arrancarlo:
1docker compose stop web 2docker compose run --rm web odoo -d curso_odoo -u viajes --stop-after-init --no-http 3docker compose up -d web
No comentes modelos para desinstalar el addon ni reinstales como reparación habitual: podrías perder registros. En una base importante trabaja primero sobre una copia de seguridad restaurada.
Marca un contacto como conductor y comprueba sus dos historiales. La parte 5 añadirá el dominio de selección y la restricción que impide que el conductor sea pasajero del mismo viaje.