¿Ustedes sienten ese sonido? Oh sí! es agua que cae. Aquí tan solo les hemos señalado el rumbo a la vertiente y  ustedes lo están alcanzando valiéndose de todos sus sentidos. Ya falta poco acusmatas, ya falta poco…

Quiero creer que si están aquí, es porque antes vieron la publicación sobre MVC (si no saben que significan esas siglas me han decepcionado). Bueno, nada de lo que se dibuja en el plano de estudios es un capricho de algún ser mortal, ese plano nos lo ha legado el mismísimo Pitágoras, a nosotros sus discípulos y sus ultimas palabras fueron … es cierto no puedo contarles sobre las palabras del maestro, porque aún son acusmatas y solo se confundirían… retomemos lo nuestro.

Manos a la obra

En Odoo existen cuatro conceptos sumamente utilizados en su desarrollo: Vistas, Menúes, Acciones y Modelos.

No se apresuren con las conclusiones, no intenten hacer una relación directa entre el paradigma presentado por Odoo y el patrón de diseño MVC. El framework de trabajo que presenta odoo es de muy alto nivel (con poco código podemos hacer grandes cosas), por lo que voy a explicar en qué consiste cada uno de estos conceptos y cómo se relacionan con el patrón de diseño MVC.

cerrar

No intenten desarrollar en esta instancia, este capítulo es solo para explicar el paradigma que odoo plantea para desarrollar módulos. Mas adelante, en el plano de estudios, tendremos un capítulo específico donde desarrollaremos linea a linea un módulo desde cero.

Un modelo

Es la declaración de una entidad de información que cuenta de campos y relaciones con otras entidades, pero también cuenta con la lógica o controlador. No deben confundir el modelo de MVC con el modelo de Odoo, a este último lo llamamos modelo de negocio. El modelo de negocio, una vez que lo declaramos, genera automáticamente su forma de persistirse en la base de datos, para nosotros es transparente.

Los modelos se declaran en lenguaje python.

Veamos un ejemplo

Vamos a declarar estos dos Modelos y presten atención a como se relacionan entre sí.


# -*- coding: utf-8 -*-
from odoo import models, fields


class CarMake(models.Model):
    _name       = 'pyth.car.make'
	
	name 		= fields.Char()
	car_ids  	= fields.One2many('pyth.car','make_id')
	

class Car(models.Model):
    _name       = 'pyth.car'
	
	domain 		= fields.Char()
	make_id 	= fields.Many2one('pyth.car.make')
Analisis linea a linea

Como estamos heredando los modelos que declaramos de la clase models.Model ya tenemos muchas prestaciones implementadas, por ejemplo, no debemos escribir una función que le diga al modelo cómo guardarse, eso lo resuelve naturalmente Odoo.

Una vista

Es la declaración de cómo visualizará el usuario los registros que se hagan de determinado modelo. Existen dos tipos básicos de vistas en odoo: vista form y vista tree. Cuando queremos crear o editar un registro de determinado modelo, entonces debemos abrir su vista form asociada. Cuando queremos ver todos los registros que tenemos hechos de un modelo, entonces debemos visualizar su vista tree. A través de la vista, el usuario del sistema podrá generar ciertos eventos para crear, editar o eliminar, registros.

Las vistas en odoo se declaran en lenguaje xml.

Siguiendo con el mismo ejemplo

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <!--TREE VIEW-->
        <record id="view_tree_car" model="ir.ui.view">
            <field name="name">pyth.car.tree</field>
            <field name="model">pyth.car</field>
            <field name="arch" type="xml">
                <tree>
                    <field name="domain"/>
                    <field name="make_id"/>
                </tree>
            </field>
        </record>
	

        <!-- FORM VIEW -->
        <record id="view_tree_car" model="ir.ui.view">
            <field name="name">pyth.car.tree.form</field>
            <field name="model">pyth.car.tree</field>
            <field name="arch" type="xml">
               

<form string="Car values">
                    <group string="Data">
			<field name="domain"/>
			<field name="make_id"/>
                    </group>
                </form>


            </field>
        </record>
    </data>
</odoo>
Análisis linea a linea

Un menú

Es un botón que se muestra en la interfaz de odoo. Dependiendo de si tiene un padre o no, será un menú principal y aparecerá en la parte superior de la interfaz o, en el caso de que tenga padre, se muestra en el costado izquierdo de la interfaz de odoo. Un menú puede tener asociada una action que se ejecuta cuando es presionado.

En la imagen del ejemplo, Cars es un menú principal, no tiene padre ni ejecuta ninguna action, Vehicles es un menú secundario, tiene como padre al menú Cars y no ejecuta ninguna action y el menú My Cars tiene como padre al menú Vehicles y si ejecuta una action que mostrara una lista de registros.

Ejemplo de como se declara un menu

        <menuitem id="cars_main_menu" name="Cars" sequence="3"/>

        <menuitem id="cars_sec_menu" name="Vehicles" parent="cars_main_menu"/>
		
        <menuitem id="cars_menu" name="My Cars" parent="cars_sec_menu" action="action_cars"/>

Vale aclarar que ese código de declaración de menúes, debe ir a continuación de la declaración de registros que veníamos haciendo con la vista, o bien dentro de un nuevo archivo xml con las etiquetas obligatorias que solicita odoo: codificación del archivo, tag odoo y tag data, de esta forma el sistema de odoo lo interpreta y sabe que está ante una declaración de información.

Una acción (action)

Relaciona un menú con las vistas que quieren mostrarse al presionar ese menú. Dentro de una action pueden ir parámetros que afecten la forma en que se muestra o los registros que se muestran (tema para mas adelante).

Ejemplo de una declaración de action

        <!-- ACTION -->
        <record model="ir.actions.act_window" id="action_cars">
            <field name="name">View Cars</field>
            <field name="type">ir.actions.act_window</field>
            <field name="res_model">pyth.car.tree</field>
            <field name="view_type">form</field>
            <field name="view_mode">form,tree</field>
        </record>

Ya pueden probar su intuición y analizar el código de declaración de la action. Lo único que diré es que en la linea 7 le indicamos a odoo que solo debe permitir que se visualice la vista form y la vista tree. Es decir, si en el atributo view_mode colocamos solo el valor tree, entonces odoo, cuando ejecute esa action, solo nos dejará ver la vista “de tabla” (tree) del modelo y no su vista form.

Recordatorio

  • Los modelos se declaran en archivos python.
  • Las vistas, menúes y acciones se declaran en archivos XML y tienen un formato predeterminado por odoo.
  • La etiqueta record se utiliza para registrar información en la base de datos, esta información puede ser de nuestros modelos personalizados o de los modelos nativos a odoo, que utiliza para definir su comportamiento.

Ahora descansen acusmatas, deben aprender a administrar su tiempo, porque si tan solo se dedican a alcanzar la luz de Odoo podrían cegarse, por eso vayan a hacer deporte o a pensar cómo hacer de este mundo un lugar mejor.

Éxito.