Práctica: Módulo viajes. Parte 1
Construiremos un módulo independiente llamado viajes, sobre el entorno Odoo 20 de la instalación. Cada lección amplía el módulo anterior. Sustituye los ejemplos del scaffold; no conserves importaciones de archivos eliminados.
1. Crear el addon #
1docker compose exec web odoo scaffold viajes /mnt/extra-addons 2code extra-addons/viajes
Fichero __init__.py:
1from . import models
Fichero models/__init__.py:
1from . import vehiculo
Fichero models/vehiculo.py:
1from odoo import api, fields, models 2 3 4class Vehiculo(models.Model): 5 _name = 'viajes.vehiculo' 6 _description = 'Vehículo' 7 _rec_name = 'modelo' 8 9 modelo = fields.Char(required=True) 10 marca = fields.Char() 11 descripcion = fields.Text()
_name es el identificador técnico y _rec_name el campo utilizado como nombre visible. modelo es obligatorio; marca y descripción son opcionales.
2. Permisos y manifiesto #
Concedemos acceso a usuarios internos, mediante base.group_user. No usamos un grupo vacío como concesión; en Odoo 20 representa una restricción.
Fichero security/ir.access.csv:
1id,name,model_id,group_id/id,operation,domain 2access_viajes_vehiculo,Manage vehiculo,viajes.vehiculo,base.group_user,crud,
Fichero __manifest__.py:
1{'name': 'Viajes', 2 'version': '20.0.1.0.0', 3 'license': 'LGPL-3', 4 'depends': ['base'], 5 'data': ['security/ir.access.csv', 'views/vehiculo.xml', 'views/menus.xml'], 6 'demo': ['demo/vehiculos.xml'], 7 'installable': True, 8 'application': True}
Carga vistas y acciones antes que menús. Los archivos demo solo se cargan si la instalación permite datos de demostración; no son datos obligatorios de negocio.
Fichero demo/vehiculos.xml:
1<odoo> 2<record id="vehiculo_panda" model="viajes.vehiculo"> 3 <field name="modelo">Panda</field><field name="marca">Seat</field> 4 </record> 5 <record id="vehiculo_tesla" model="viajes.vehiculo"> 6 <field name="modelo">Model S</field><field name="marca">Tesla</field> 7 </record> 8</odoo>
3. Vistas de formulario, lista y búsqueda #
Fichero views/vehiculo.xml:
1<odoo> 2<record id="vehiculo_form_view" model="ir.ui.view"> 3 <field name="name">vehiculo.form</field> 4 <field name="model">viajes.vehiculo</field> 5 <field name="arch" type="xml"> 6 <form string="Vehículo"> 7 <sheet> 8 <group><field name="modelo"/><field name="marca"/></group> 9 <notebook> 10 <page string="Descripción"><field name="descripcion"/></page> 11 <page string="Acerca de"><p>Gestión de vehículos del curso Odoo 20.</p></page> 12 </notebook> 13 </sheet> 14 </form> 15 </field> 16 </record> 17 <record id="vehiculo_list_view" model="ir.ui.view"> 18 <field name="name">vehiculo.list</field> 19 <field name="model">viajes.vehiculo</field> 20 <field name="arch" type="xml"> 21 <list><field name="modelo"/><field name="marca"/></list> 22 </field> 23 </record> 24 <record id="vehiculo_search_view" model="ir.ui.view"> 25 <field name="name">vehiculo.search</field> 26 <field name="model">viajes.vehiculo</field> 27 <field name="arch" type="xml"> 28 <search><field name="modelo"/><field name="marca"/><field name="descripcion"/></search> 29 </field> 30 </record> 31 <record id="vehiculo_list_action" model="ir.actions.act_window"> 32 <field name="name">Vehículos</field> 33 <field name="res_model">viajes.vehiculo</field> 34 <field name="view_mode">list,form</field> 35 <field name="search_view_id" ref="vehiculo_search_view"/> 36 </record> 37</odoo>
Fichero views/menus.xml:
1<odoo> 2<menuitem id="main_viajes_menu" name="Viajes"/> 3 <menuitem id="viajes_menu" name="Elementos" parent="main_viajes_menu"/> 4 <menuitem id="vehiculo_menu" name="Vehículos" parent="viajes_menu" action="vehiculo_list_action"/> 5</odoo>
list,form configura los modos de la acción; search_view_id configura la búsqueda. notebook crea pestañas y sus hijos page contienen los campos.
4. Instalar y comprobar #
1docker compose stop web 2docker compose run --rm web odoo -d curso_odoo -i viajes --stop-after-init --no-http 3docker compose up -d web
Activa el modo desarrollador desde Ajustes para inspeccionar vistas y actualizar la lista de aplicaciones. No necesitas la variante de assets de pruebas. Abre Viajes → Elementos → Vehículos, crea un vehículo y comprueba formulario y búsqueda.
Después de cambiar Python reinicia el servicio; para campos, permisos y XML actualiza el módulo con -u viajes en lugar de -i viajes. El reinicio por sí solo no modifica el esquema ni recarga las vistas almacenadas.