Curso odoo (Módulos)

Tabla de vehiculos viajes paradas

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>