Curso odoo (Módulos)
Se pide que incorpores la información de las paradas que se realizan en el viaje. Un viaje puede tener multiples paradas, y cada parada esta asociada a un viaje.
Crea:
- El modelo correspondiente
- Las vistas necesarias en los viajes para poder visualizar las paradas asociadas a él.
- Las vistas para poder visualizar las paradas.
- Vista de lista
- Vista de formulario
- Vista de búsqueda
- Vista de calendario
- Un menú para acceder a las paradas desde el menú principal.
## Solución
Crea el fichero
models/paradaModel.py
1from odoo import fields, models, api 2 3class Parada(models.Model): 4 _name = "viajes.parada" 5 _description = "Paradas de los Viajes" 6 7 titulo = fields.Char(string="Titulo", required=True) 8 descripcion = fields.Text(string="Descripción") 9 fecha = fields.Date(string="Fecha", default=fields.Date.today) 10 duracion = fields.Float(digits=(5, 2), help="Duración en horas") 11 localizacion = fields.Char(string="Localización") 12 13 viaje_id = fields.Many2one('viajes.viaje', ondelete='cascade', string="Viaje", required=True) 14 completada = fields.Boolean(string="Parada completada", default=False) 15 16 @api.depends('completada') 17 def marcar_completada(self): 18 for record in self: 19 record.completada = not record.completada 20 21 mapa_embed = fields.Html(string="Mapa", compute="_compute_mapa_embed", sanitize=False) 22 23 @api.depends('localizacion') 24 def _compute_mapa_embed(self): 25 for record in self: 26 if record.localizacion: 27 record.mapa_embed = f""" 28 <iframe width="100%" height="300" loading="lazy" 29 src="https://www.google.com/maps?q={record.localizacion}&output=embed"> 30 </iframe> 31 """ 32 else: 33 record.mapa_embed = "<p>Ubicación no disponible</p>"
Modifica el fichero
models/viajeModel.py
1...... 2 3 paradas_ids = fields.One2many('viajes.parada', 'viaje_id', 4 string="Paradas del viaje") 5 6 @api.depends('titulo') 7 def _compute_display_name(self): 8 for r in self: 9 r.display_name = r.titulo
Modifica el fichero
models/__init__.py
1# -*- coding: utf-8 -*- 2 3from . import VehiculoModel 4from . import ViajeModel 5from . import PartnerModel 6from . import ParadaModel
Modifica el fichero
security/ir.model.access.csv
1id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 2access_viajes_vehiculo,viajes.vehiculo,model_viajes_vehiculo,,1,1,1,1 3access_viajes_viaje,viajes.viaje,model_viajes_viaje,,1,1,1,1 4access_viajes_parada,viajes.parada,model_viajes_parada,,1,1,1,1
Crea el fichero
views/parada.xml
1<odoo> 2 <data> 3 4 <record model="ir.ui.view" id="parada_calendar_view"> 5 <field name="name">parada.calendar</field> 6 <field name="model">viajes.parada</field> 7 <field name="arch" type="xml"> 8 <calendar date_start="fecha"> 9 <field name="titulo" /> 10 </calendar> 11 </field> 12 </record> 13 14 <record model="ir.ui.view" id="parada_search_view"> 15 <field name="name">parada.search</field> 16 <field name="model">viajes.parada</field> 17 <field name="arch" type="xml"> 18 <search> 19 <field name="titulo" /> 20 <field name="descripcion" /> 21 </search> 22 </field> 23 </record> 24 25 26 <record model="ir.ui.view" id="parada_form_view"> 27 <field name="name">parada.form</field> 28 <field name="model">viajes.parada</field> 29 <field name="arch" type="xml"> 30 <form string="Formulario de Paradas"> 31 <sheet> 32 <group> 33 <field name="viaje_id" /> 34 <field name="titulo" /> 35 <field name="fecha" /> 36 <field name="duracion" /> 37 <field name="localizacion" /> 38 <field name="completada" /> 39 <button name="marcar_completada" type="object" string="Completar"/> 40 </group> 41 <group string="Mapa"> 42 <div> 43 <field name="mapa_embed" widget="html" /> 44 </div> 45 </group> 46 <notebook> 47 <page string="Descripcion"> 48 <field name="descripcion" /> 49 </page> 50 </notebook> 51 </sheet> 52 </form> 53 </field> 54 </record> 55 56 57 <record model="ir.ui.view" id="parada_list_view"> 58 <field name="name">parada.list</field> 59 <field name="model">viajes.parada</field> 60 <field name="arch" type="xml"> 61 <list string="Parada List"> 62 <field name="titulo" /> 63 <field name="fecha" /> 64 <field name="duracion" /> 65 <field name="viaje_id" /> 66 </list> 67 </field> 68 </record> 69 70 <record model="ir.actions.act_window" id="parada_list_action"> 71 <field name="name">Paradas</field> 72 <field name="res_model">viajes.parada</field> 73 <field name="view_mode">list,form,search,calendar</field> 74 <field name="help" type="html"> 75 <p class="oe_view_nocontent_smiling_face">Crear tu primera parada</p> 76 </field> 77 </record> 78 79 80 </data> 81</odoo>
Modifica el fichero
__manifest__.py
1# any module necessary for this one to work correctly 2 'depends': ['base'], 3 4 # always loaded 5 'data': [ 6 'security/ir.model.access.csv', 7 'views/vehiculo.xml', 8 'views/viaje.xml', 9 'views/partner.xml', 10 'views/parada.xml', 11 'views/menus.xml' 12 ],
Crea el fichero
views/menus.xml
1<odoo> 2 <data> 3 <menuitem id="main_viajes_menu" name="Viajes" /> 4 <menuitem id="viajes_menu" name="Elementos" parent="main_viajes_menu" /> 5 <menuitem id="vehiculo_menu" name="Vehiculos" parent="viajes_menu" action="vehiculo_list_action" /> 6 <menuitem id="viaje_menu" name="Viajes" parent="viajes_menu" action="viaje_list_action" /> 7 <menuitem id="configuration_menu" name="Configuration" parent="main_viajes_menu" /> 8 <menuitem id="contact_menu" name="Viajeros" parent="configuration_menu" action="contact_list_action" /> 9 10 11 <menuitem id="parada_menu" name="Paradas" parent="viajes_menu" action="parada_list_action" /> 12 </data> 13</odoo>
Modifica el fichero
views/viaje.xml
1<record model="ir.ui.view" id="viaje_form_view"> 2 <field name="name">viaje.form</field> 3 <field name="model">viajes.viaje</field> 4 <field name="arch" type="xml"> 5 <form string="Formulario de Viajes"> 6 <sheet> 7 <group string="General"> 8 <field name="vehiculo_id" /> 9 <field name="titulo" /> 10 <field name="conductor_id" /> 11 <field name="estado" /> 12 <field name="estado_display" /> 13 <field name="finalizado"/> 14 </group> 15 <group string="Calendario"> 16 <field name="fecha_inicio" /> 17 <field name="fecha_fin"/> 18 <field name="duracion" /> 19 <field name="plazas" /> 20 <field name="plazas_ocupadas" widget="progressbar"/> 21 </group> 22 23 <notebook> 24 <page string="pasajeros"> 25 <field name="pasajeros_ids" /> 26 </page> 27 <page string="Paradas"> 28 <field name="paradas_ids"> 29 <list string="Paradas registrados"> 30 <field name="titulo"/> 31 <field name="fecha"/> 32 <field name="localizacion"/> 33 </list> 34 </field> 35 </page> 36 </notebook> 37 </sheet> 38 </form> 39 </field> 40</record>