Práctica: Módulo viajes. Parte 2
Añadimos el modelo viajes.viaje y seis formas de visualizar sus registros. Conserva el modelo y vistas de vehículos.
1. Modelo e importación #
Fichero models/viaje.py:
1from odoo import fields, models 2 3 4class Viaje(models.Model): 5 _name = 'viajes.viaje' 6 _description = 'Viaje' 7 _rec_name = 'titulo' 8 9 titulo = fields.Char(required=True) 10 fecha_inicio = fields.Date(default=fields.Date.context_today) 11 duracion = fields.Integer(default=0, help='Duración en días enteros') 12 plazas = fields.Integer(default=0, string='Capacidad de pasajeros') 13 estado = fields.Selection([ 14 ('planeado', 'Planeado'), ('en_curso', 'En curso'), 15 ('finalizado', 'Finalizado'), 16 ], default='planeado', required=True)
Fichero models/__init__.py:
1from . import vehiculo 2from . import viaje
La duración se expresa en días enteros porque trabajamos con fechas sin hora. plazas es la capacidad total para pasajeros, no las plazas libres. En la parte 5 añadiremos cálculos y validaciones de capacidad.
2. Accesos y manifiesto #
Añade esta fila al CSV, conservando la de vehículos:
1access_viajes_viaje,Manage viaje,viajes.viaje,base.group_user,crud,
Añade views/viaje.xml a data justo antes de views/menus.xml; conserva todas las demás entradas.
3. Vistas de viaje #
Fichero views/viaje.xml:
1<odoo> 2<record id="viaje_form_view" model="ir.ui.view"> 3 <field name="name">viaje.form</field> 4 <field name="model">viajes.viaje</field> 5 <field name="arch" type="xml"> 6 <form string="Viaje"> 7 <sheet> 8 <group name="general"> 9 <field name="titulo"/><field name="estado"/> 10 </group> 11 <group name="calendario"> 12 <field name="fecha_inicio"/><field name="duracion"/><field name="plazas"/> 13 </group> 14 </sheet> 15 </form> 16 </field> 17 </record> 18 <record id="viaje_list_view" model="ir.ui.view"> 19 <field name="name">viaje.list</field> 20 <field name="model">viajes.viaje</field> 21 <field name="arch" type="xml"> 22 <list><field name="titulo"/><field name="duracion"/><field name="estado"/></list> 23 </field> 24 </record> 25 <record id="viaje_search_view" model="ir.ui.view"> 26 <field name="name">viaje.search</field> 27 <field name="model">viajes.viaje</field> 28 <field name="arch" type="xml"> 29 <search><field name="titulo"/></search> 30 </field> 31 </record> 32 <record id="viaje_calendar_view" model="ir.ui.view"> 33 <field name="name">viaje.calendar</field> 34 <field name="model">viajes.viaje</field> 35 <field name="arch" type="xml"> 36 <calendar date_start="fecha_inicio" color="estado"><field name="titulo"/></calendar> 37 </field> 38 </record> 39 <record id="viaje_graph_view" model="ir.ui.view"> 40 <field name="name">viaje.graph</field> 41 <field name="model">viajes.viaje</field> 42 <field name="arch" type="xml"> 43 <graph type="bar"><field name="estado"/></graph> 44 </field> 45 </record> 46 <record id="viaje_pivot_view" model="ir.ui.view"> 47 <field name="name">viaje.pivot</field> 48 <field name="model">viajes.viaje</field> 49 <field name="arch" type="xml"> 50 <pivot><field name="fecha_inicio" type="row"/><field name="duracion" type="measure"/></pivot> 51 </field> 52 </record> 53 <record id="viaje_kanban_view" model="ir.ui.view"> 54 <field name="name">viaje.kanban</field> 55 <field name="model">viajes.viaje</field> 56 <field name="arch" type="xml"> 57 <kanban default_group_by="estado"> 58 <field name="titulo"/><field name="fecha_inicio"/> 59 <templates><t t-name="card"> 60 <strong><field name="titulo"/></strong> 61 <div><field name="fecha_inicio"/></div> 62 </t></templates> 63 </kanban> 64 </field> 65 </record> 66 <record id="viaje_list_action" model="ir.actions.act_window"> 67 <field name="name">Viajes</field> 68 <field name="res_model">viajes.viaje</field> 69 <field name="view_mode">list,form,calendar,graph,pivot,kanban</field> 70 <field name="search_view_id" ref="viaje_search_view"/> 71 </record> 72</odoo>
Formulario edita un registro; lista muestra varios. Calendario usa fecha_inicio; gráfica cuenta viajes por estado; pivot suma duración. Kanban agrupa por estado y usa la plantilla raíz card de Odoo 20. La vista de búsqueda se enlaza mediante search_view_id, nunca como modo de la acción.
4. Menú y comprobación #
Añade dentro de <odoo> en views/menus.xml, después del menú padre:
1<menuitem id="viaje_menu" name="Viajes" parent="viajes_menu" action="viaje_list_action"/>
Actualiza viajes. Crea un viaje con fecha de hoy y comprueba todas las vistas. Si necesitas fechas y horas o fracciones de día, otro diseño usaría Datetime; no mezcles ese diseño con esta práctica.