Skip to content

Lógica de Aplicación

En este tutorial se crearán métodos para los modelos Project y Task, se utilizarán decoradores de funciones de acuerdo a los estándares de modelos de Odoo.

  1. Actualice la estructura de directorios y archivos del módulo, crea el archivo record.py.

    • project_19
    • Directoryhelpers
      • record.py
      • __init__.py
    • Directorymodels
      • project.py
      • task.py
      • __init__.py
    • Directorysecurity
      • ir.model.access.csv
    • Directoryviews
      • project_views.xml
      • task_views.xml
      • menu_view.xml
    • __init__.py
    • __manifest__.py
  2. Crea el modelo Record y el método init en el archivo record.py.

    from odoo import models, fields, api
    class Record(models.TransientModel):
    _name = "record_"
    _description = "Modelo Record"
    name = fields.Char(string="Name")
    @api.model
    def init(self):
    self._create_categories()
    def _create_categories(self):
    names = ["Research", "Development", "Innovation"]
    for name in names:
    category = self.env["ir.module.category"].search(
    [("name", "=", name)], limit=1
    )
    if not category:
    self.env["ir.module.category"].create(
    {"name": name, "description": f"{name} Project Category"}
    )

    El método init() crea las categorías Research, Development e Innovation al instalar o actualizar el módulo.

  3. Actualice el modelo Project en el archivo project.py

    from odoo import models, fields, api, exceptions
    class Project(models.Model):
    _name = "project_"
    _description = "Modelo Project"
    name = fields.Char(string="Nombre")
    description = fields.Char(string="Descripción")
    start_date = fields.Date(string="Fecha de Inicio", default=fields.Date.today)
    end_date = fields.Date(string="Fecha de Fin")
    days = fields.Integer(string="Dias", compute="_compute_days")
    @api.constrains("name")
    def _check_record(self):
    for record in self:
    rec = self.search(
    [
    ("id", "!=", record.id),
    "|",
    ("name", "=", record.name),
    ("description", "=", record.description),
    ],
    limit=1,
    )
    if rec:
    raise exceptions.ValidationError(
    "El registro existe y no puede ser duplicado !"
    )
    @api.depends("start_date")
    def _compute_days(self):
    for record in self:
    if record.start_date:
    record.days = (fields.date.today() - record.start_date).days
    else:
    record.days = 0
    @api.constrains("start_date", "end_date")
    def _check_date(self):
    for record in self:
    if record.start_date == record.end_date:
    raise exceptions.ValidationError(
    _("The start date and end date cannot be equal !")
    )
    @api.constrains("start_date")
    def _check_start_date(self):
    for record in self:
    if record.start_date and record.start_date < fields.date.today():
    raise exceptions.ValidationError(
    _("The start date cannot be set in the past !")
    )
    @api.constrains("end_date")
    def _check_end_date(self):
    for record in self:
    if record.end_date and record.end_date < fields.date.today():
    raise exceptions.ValidationError(
    _("The end date cannot be set in the past !")
    )

    El método _check_record() valida la existencia de registros duplicados, mientras que el método _compute_days() calcula la cantidad de dias restante para finalizar la tarea.

  4. Actualice el modelo Task en el archivo task.py

    from odoo import models, fields, api, exceptions
    class Task(models.Model):
    _name = "task_"
    _description = "Modelo Task"
    name = fields.Char(string="Name")
    state = fields.Selection(
    string="State",
    selection=[
    ("1", "Draft"),
    ("2", "Progress"),
    ("3", "Done"),
    ("4", "Canceled"),
    ],
    )
    task_count = fields.Integer(string="Task Count", compute="_compute_task_count")
    @api.depends()
    def _compute_task_count(self):
    # self.task_count = len(self)
    self.task_count = self.search_count([])
  5. Actualice la vista del modelo Project en el archivo project_views.xml

    <?xml version='1.0' encoding='utf-8'?>
    <odoo>
    <record id="project_list" model="ir.ui.view">
    <field name="name">project.list</field>
    <field name="model">project_</field>
    <field name="arch" type="xml">
    <list>
    <field name="name" />
    <field name="start_date" />
    <field name="end_date" />
    <field name="days"/>
    </list>
    </field>
    </record>
    <record id="project_form" model="ir.ui.view">
    <field name="name">project.form</field>
    <field name="model">project_</field>
    <field name="arch" type="xml">
    <form>
    <sheet>
    <group>
    <field name="name" />
    <field name="description" />
    <field name="start_date" />
    <field name="end_date" />
    </group>
    </sheet>
    </form>
    </field>
    </record>
    <record id="project_action" model="ir.actions.act_window">
    <field name="name">Proyectos</field>
    <field name="res_model">project_</field>
    <field name="view_mode">list,form</field>
    </record>
    </odoo>
  6. Actualice la vista del modelo Task en el archivo task_views.xml

    <?xml version='1.0' encoding='utf-8'?>
    <odoo>
    <record id="task_list" model="ir.ui.view">
    <field name="name">task.list</field>
    <field name="model">task_</field>
    <field name="arch" type="xml">
    <list>
    <field name="name" />
    <field name="state" />
    <field name="task_count"/>
    </list>
    </field>
    </record>
    <record id="task_form" model="ir.ui.view">
    <field name="name">task.form</field>
    <field name="model">task_</field>
    <field name="arch" type="xml">
    <form>
    <sheet>
    <group>
    <field name="name" />
    <field name="state" />
    </group>
    </sheet>
    </form>
    </field>
    </record>
    <record id="task_action" model="ir.actions.act_window">
    <field name="name">Tareas</field>
    <field name="res_model">task_</field>
    <field name="view_mode">list,form</field>
    </record>
    </odoo>
  7. Importa los modelos en el archivo helpers/__init__.py.

    from . import record
  8. Importa el directorio de modelos en el archivo project_19/__init__.py.

    from . import models, helpers
  9. Reinicie el servidor de Odoo y actualice el módulo.