Práctica: Módulo viajes. Ejercicio 2
Añade un historial de revisiones al vehículo. Cada revisión debe tener vehículo, fecha, título y resultado. Intenta resolverlo con Many2one y su inverso antes de consultar la solución.
1. Modelos #
Fichero models/revision.py:
1from odoo import fields, models 2 3 4class Revision(models.Model): 5 _name = 'viajes.revision' 6 _description = 'Revisión de vehículo' 7 _rec_name = 'titulo' 8 9 titulo = fields.Char(required=True) 10 descripcion = fields.Text() 11 fecha = fields.Date(default=fields.Date.context_today) 12 superada = fields.Boolean(default=False) 13 vehiculo_id = fields.Many2one('viajes.vehiculo', required=True, 14 ondelete='cascade', index=True) 15 16 17class VehiculoRevisiones(models.Model): 18 _inherit = 'viajes.vehiculo' 19 20 revision_ids = fields.One2many('viajes.revision', 'vehiculo_id')
Añade from . import revision a models/__init__.py. La clase de ampliación conserva los campos y relaciones existentes de vehículo.
2. Vistas #
Fichero views/revision.xml:
1<odoo> 2<record id="revision_form_view" model="ir.ui.view"> 3 <field name="name">revision.form</field> 4 <field name="model">viajes.revision</field> 5 <field name="arch" type="xml"> 6 <form><sheet><group> 7 <field name="titulo"/><field name="fecha"/><field name="superada"/> 8 <field name="vehiculo_id"/><field name="descripcion"/> 9 </group></sheet></form> 10 </field> 11 </record> 12 <record id="revision_list_view" model="ir.ui.view"> 13 <field name="name">revision.list</field> 14 <field name="model">viajes.revision</field> 15 <field name="arch" type="xml"> 16 <list><field name="titulo"/><field name="fecha"/><field name="superada"/></list> 17 </field> 18 </record> 19 <record id="revision_list_action" model="ir.actions.act_window"> 20 <field name="name">Revisiones</field> 21 <field name="res_model">viajes.revision</field> 22 <field name="view_mode">list,form</field> 23 </record> 24 <record id="vehiculo_revisiones_form" model="ir.ui.view"> 25 <field name="name">vehiculo.revisiones.form</field> 26 <field name="model">viajes.vehiculo</field> 27 <field name="inherit_id" ref="vehiculo_form_view"/> 28 <field name="arch" type="xml"> 29 <xpath expr="//notebook" position="inside"> 30 <page string="Revisiones"><field name="revision_ids"> 31 <list><field name="titulo"/><field name="fecha"/><field name="superada"/></list> 32 </field></page> 33 </xpath> 34 </field> 35 </record> 36</odoo>
Añade views/revision.xml al manifiesto antes de menús, esta fila al CSV de accesos:
1access_viajes_revision,Manage revision,viajes.revision,base.group_user,crud,
Y esta entrada dentro de <odoo> en menús:
1<menuitem id="revision_menu" name="Revisiones" parent="viajes_menu" action="revision_list_action"/>
Actualiza viajes. No añadas todavía matricula: se define en la parte 5. Comprueba que la nueva pestaña convive con descripción y viajes y que solo muestra revisiones del vehículo elegido.
ondelete='cascade' hace que las revisiones dependan del vehículo; borrar el vehículo las elimina si no existen otras referencias que impidan el borrado. Un vehículo con viajes sigue protegido por restrict. Decide las políticas de archivo y conservación antes de adaptar el ejemplo a datos reales.