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.
Métodos de Modelos
Section titled “Métodos de Modelos”-
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
-
Crea el modelo Record y el método init en el archivo
record.py.from odoo import models, fields, apiclass Record(models.TransientModel):_name = "record_"_description = "Modelo Record"name = fields.Char(string="Name")@api.modeldef 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. -
Actualice el modelo Project en el archivo
project.pyfrom odoo import models, fields, api, exceptionsclass 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).dayselse: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. -
Actualice el modelo Task en el archivo
task.pyfrom odoo import models, fields, api, exceptionsclass 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([]) -
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> -
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> -
Importa los modelos en el archivo
helpers/__init__.py.from . import record -
Importa el directorio de modelos en el archivo
project_19/__init__.py.from . import models, helpers -
Reinicie el servidor de Odoo y actualice el módulo.