Hola amigo en esta publicación les explicaré como crear módulos en Odoo v8, si bien ya he hecho una publicación al respecto:
CREACION DE MODULOS EN ODOO ERP V8 – PARTE I, lo cierto es que en esta anterior publicación explico de forma rápida la creación de módulos, quizás para usuarios que vienen de la v7 de Odoo les sea mas fácil entender, pero para aquellos que recién se inician en Odoo a partir de la v8, encontrarán ciertas dificultades, es por eso que hago esta nueva publicación.
En ésta publicación les explicaré como desarrollar un módulo en Odoo v8 usando su propio framework OPENOBJECT.
Suponemos que tiene instalado Odoo v8 en Ubuntu Server o Desktop recomiendo la Version 14 o alguna otra distribución de GNU/Linux.
Vamos a crear un modulo llamado biblioteca, que nos permitirá registrar el titulo del libro, fecha de registro y una descripción, tal como muestra la figura siguiente:
1. Nos dirigimos a la siguiente ruta.
1
|
cd /opt/odoo/server/addons/
|
2. Creamos una carpeta que para nuestro caso será biblioteca e ingresamos en dicha carpeta
1
2
|
mkdir biblioteca
cd biblioteca
|
Si no tenemos permiso para crear dicha carpeta en addons lo debemos de hacer con el usuario root y darle los permisos adecuados.
3. Creamos los archivo __init__.py, __openerp__.py, biblioteca.py y biblioteca_view.xml
1
2
3
4
|
touch __init__.py
touch __openerp__.py
touch biblioteca.py
touch biblioteca_view.xml
|
__init__.py: Aqui importaremos todos los archivos y directorios que contienen codigo python, éste archivo hace que Odoo reconozca al directorio o capeta biblioteca como un módulo.
__openerp__.py: Contiene un diccionario en Python para agregar las descripciones del módulo, como autor, versión, etc.
biblioteca.py: Aquí escribiremos el código Python que permitirá agregar o modificar las funcionalidades de Odoo, este archivo será importado en __init__.py, como veremos mas abajo.
biblioteca_view.xml: Aquí vamos agregar los codigos XML que permitirá construir la vista del módulo en Odoo, el nombre debe de terminar en _view.xml por convención.
4. Con tu editor favorito editamos el archivo __init__.py para este ejemplo usaré el editor vim o podemos usar Sublime Text.
Agregamos lo siguiente y guardamos los cambios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
|
La primera linea se recomienda agregar, para que python trabaje en utf-8, se agrega a todo archivo.py
Ojo las demás lineas que inician con
# son comentarios para nuestro caso, desde la
linea 2 hasta la 27 expresan los términos de la licencia de software libre:
GNU AFFERO GENERAL PUBLIC LICENSE
La linea 29: Aqui importamos el archivo biblioteca.py sin la extension .py, este archivo contiene la lógica de nuestro modulo hecho en python.
5. Editamos el archivo __openerp__.py
Agregamos los siguiente y guardamos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
{
'name' : 'Biblioteca' ,
'version' : '1.0' ,
'author' : 'Ing. Salazar C. J.' ,
'summary' : 'Modulo de odoo para demo' ,
'description' : 'modulo varios demo' ,
'depends' : [
'base' ,
],
'data' : [
'biblioteca_view.xml' ,
],
'installable' : True ,
'aplication' : True ,
}
|
Este archivo (__openerp__.py) como habíamos dicho contiene un diccionario en Python para agregar las descripciones del módulo, como autor, versión, etc.
Linea 29: depends, es una lista donde se agrega los módulos que debería estar instalados (Módulos dependencia) para que nuestro modulo pueda ser instalado en Odoo.
Linea 32: data, es una lista donde agregaremos todas las vistas de nuestro módulo, es decir los archivos.xml y archivos.csv.
Linea 35 y 35: Estos siempre toman estos valores.
6. Editamos el archivo biblioteca.py y agregamos el siguiente código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
from openerp import models, fields, api, _
class biblioteca_libro(models.Model):
_name = 'biblioteca.libro'
name = fields.Char(string = 'Titulo' , required = True ,)
description = fields.Text( 'Observacion' )
date = fields.Date(string = 'Fecha de registro' )
|
Linea 23: Importamos las clases propias de Odoo.
Linea 25: Definimos nuestro modelo o clase biblioteca_libro que hereda de la clase models.Model, toda clase en Odoo finalmente representa un tabla en la base de datos POSTGRESQL, que lo veremos luego de instalar el módulo.
Linea 26: Toda clase definida en el framework de odoo, debe tener un atributo _name este atributo por lo general es el mismo nombre de la clase o modelo pero se reemplaza el (_) por (.), con este nombre se creará una tabla en POSTGRESQL.
Linea 28-30: Se agregan las columnas (campos) que tendrá nuestra tabla o modelo (
biblioteca_libro), a cada campo o fields se le define el tipo de dato que almacenará, mas información
aquí.
7. Editamos el archivo libro_view.xml que permitirá construir la vista formulario y vista lista o árbol de las clase biblioteca_libro, agregando lo siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
<? xml version = "1.0" encoding = "utf-8" ?>
< openerp >
< data >
< menuitem id = "menu_root_biblioteca" name = "Biblioteca" sequence = "30" />
< menuitem id = "menu_root_biblioteca_libro_view" name = "Libros" parent = "menu_root_biblioteca" />
< record model = "ir.actions.act_window" id = "listar_libro_action" >
< field name = "name" >Biblioteca</ field >
< field name = "res_model" >biblioteca.libro</ field >
< field name = "view_mode" >tree,form</ field >
</ record >
< menuitem id = "menu_root_biblioteca_listar_libro" name = "Listar libros" parent = "menu_root_biblioteca_libro_view" action = "listar_libro_action" />
< record model = "ir.ui.view" id = "view_biblioteca_libro_tree" >
< field name = "name" >view.biblioteca.libro.tree</ field >
< field name = "model" >biblioteca.libro</ field >
< field name = "arch" type = "xml" >
< tree string = "Idea list" >
< field name = "name" />
< field name = "date" />
</ tree >
</ field >
</ record >
< record model = "ir.ui.view" id = "view_biblioteca_libro_form" >
< field name = 'name' >view.biblioteca.libro.form</ field >
< field name = "model" >biblioteca.libro</ field >
< field name = "arch" type = "xml" >
< form string = "libro form" version = "7.0" >
< sheet >
< group colspan = "2" col = "2" >
< group >
< field name = "name" />
</ group >
< group >
< field name = "date" />
</ group >
</ group >
< notebook colspan = "4" >
< page string = "Description" >
< field name = "description" />
</ page >
</ notebook >
</ sheet >
</ form >
</ field >
</ record >
</ data >
</ openerp >
|
Explicando un poco el contenido del XML, en ODOO existe varios tipos de vista: Vista lista(tree), Vista formulario(form), etc. para nuestro caso hemos construido solo las dos tipos de vista form y tree.
Linea 2 y 3: Explicarles que todo el contenido de la vista en Odoo siempre van a ir delimitados por la etiqueta <openerp> y <data> en ese orden respectivamente.
Linea 5: Definimos el nombre del menu padre o root para el modulo biblioteca, este ira en la parte superior de Odoo, para nuestro caso es el menu Biblioteca, los menús en Odoo se definen con la etiqueta <menuitem>, esta etiqueta tiene atributos como por ejemplo:
id: Es único para cada menú,
name: Es el label o nombre que veremos en el menu.
parent: Este atributo permite colocar un menu dentro de otro, con solo colocar el id de menu padre.
action: Este atributo me indica la acción a realizar si hago clic en dicho menu, que por lo general es mostrar la vista form o tree de nuestro clase definida en nuestro módulo.
Linea 7: Aquí definimos otro menu que es un submenu del menu definido en la linea 5, para nuestro caso es el menu Libros.
Linea 15: Definimos otro menu que es un submenu del menu definido en la linea 7, este menu tiene el atributo action cuyo valor es el id de la acción definida en la linea 9, para nuestro caso es el menuListar libros.
Las etiquetas record son registros que se insertan en la base de datos.
Linea 9: Aquí definimos una acción que nos mostrará el listado de libros al hacer click en el menu Listar libros, toda acción se define con la etiqueta <record model=”ir.actions.act_window” id=”listar_libro_action”>, ésta etiqueta tiene varios atributos:
id: Es un identicador único para acción definida
model: Indica que vamos a insertar este registro en la tabla ir.actions.act_window con los valores de los campos: id, name, res_model y view_mode
Para insertar los valores de los campos (linea 10-12) de dicho registro se usa la etiqueta <field>, tenemos los atributos para field:
name: Es un nombre que se le asigna a cada acción.
res_model: Indica a que modelo o clase pertenece esta acción.
view_mode: Indica que tipo de vista mostrará si se llama esta acción, para nuestro caso llama primero a la vista tree, que la definiremos a continuación.
Vista tree:
Fila 18-27: Aquí definimos nuestra vista tree, la vista tree o árbol, también se define con la etiqueta <record model=”ir.ui.view” id=”view_biblioteca_libro_tree”> y estos son sus atributos:
id: Es un identificador único para cada vista tree, debe de empezar siempre en view y terminar en tree por convencion.
model: Indica que vamos a insertar este registro en la tabla ir.ui.view con los valores de los campos (etiqueta <field>): id, name, model y arch.
Para insertar los valores de los campos (linea 19-21) de dicho registro se usa la etiqueta <field>, tenemos los atributos para field:
name: Es un nombre que se le asigna a la vista tree.
model: Indica a que modelo o clase esta asociada esta vista tree (valor de _name: biblioteca.libro en la clase biblioteca_libro)
arch: Linea 21-26, indica que es un archivo de tipo xml y que tiene como contenido todo lo que está dentro de la etiqueta <tree>, dentro de la etiqueta <tree> vamos a definir usando la etiqueta <field> los campos que deseamos que se muestre en la vista lista o tree de nuestro modelo, por ejemplo la etiqueta <field name=”date”/> tiene un atributo name que toma como valor el nombre del campo difinido en el modelo o clase de nuestro modulo.
Vista form
Fila 30-52: Aquí definimos nuestra vista form, la vista formulario, también se define con la etiqueta <record model=”ir.ui.view” id=”view_biblioteca_libro_form”> y estos son sus atributos:
id: Es un identificador único para cada vista form, debe de empezar siempre en view y terminar en form por convencion.
model: Indica que vamos a insertar este registro en la tabla ir.ui.view con los valores de los campos (etiqueta <field>): id, name, model y arch.
Para insertar los valores de los campos (linea 31-33) de dicho registro se usa la etiqueta <field>, tenemos los atributos para field:
name: Es un nombre que se le asigna a la vista formulario.
model: Indica a que modelo o clase esta asociada esta vista formulario (valor de _name: biblioteca.libro en la clase biblioteca_libro)
arch: Linea 33-51, indica que es un archivo de tipo xml y que tiene como contenido todo lo que está dentro de la etiqueta <form>, dentro de la etiqueta <form> vamos a definir usando la etiqueta <field> los campos que deseamos que se muestre en la vista formulario de nuestro modelo, por ejemplo la etiqueta <field name=”date”/> (linea 41) tiene un atributo name que toma como valor el nombre del campo difinido en el modelo o clase de nuestro modulo.
La etiqueta <sheet> hace que nuestro formulario se muestre mas elegante, ver gráfico a continuación.
8. Damos los permisos a nuestro modulo biblioteca y reinciamos nuestro servicio de Odoo.
1
2
|
chown -R odoo: /opt/odoo/server/addons/biblioteca
/etc/init .d /odoo-server restart
|
9. Ingresamos a nuestro ODOO por medio de un navegador web: http://ip_mi_server:8060 iniciamos sesión con usuario administrador y ademas debemos de tener activado Características técnicaspara el usuario administrador y nos dirigimos a la pestaña Configuración/Actualizar lista de módulos y damos actualizar.
10. Nos dirigimos a Configuración/módulos locales y en la parte derecha en el área de búsquedacolocamos el nombre del modulo biblioteca y presionamos enter, nos debería mostrar el modulo Biblioteca, presionamos en el botón Instalar.
11. Si todo hemos hecho correctamente nos debería mostrar el menu de Biblioteca .