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 bibliotecaque nos permitirá registrar el titulo del libro, fecha  de registro y una descripción, tal como muestra la figura siguiente:

mod_bibliot

 

1. Nos dirigimos a la siguiente ruta.

cd /opt/odoo/server/addons/

2. Creamos  una carpeta que para nuestro caso será biblioteca e ingresamos en dicha carpeta

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

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.

vim __init__.py

Agregamos lo siguiente y guardamos los cambios

# -*- encoding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (c) 2015 SC. (http://salazarcarlos.com).
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################

import biblioteca

# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

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

vim __openerp__.py

Agregamos los siguiente y guardamos

# -*- coding: utf-8 -*-
##############################################################################
#
#    OpenERP, Open Source Management Solution
#    Copyright (C) 2015 S&C (<http://salazarcarlos.com>).
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU Affero General Public License as
#    published by the Free Software Foundation, either version 3 of the
#    License, or (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU Affero General Public License for more details.
#
#    You should have received a copy of the GNU Affero General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################


{
	'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:

 

# -*- coding: utf-8 -*-
##############################################################################
#
#    OpenERP, Open Source Management Solution
#    Copyright (C) 2015 S&C (<http://salazarcarlos.com>).
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU Affero General Public License as
#    published by the Free Software Foundation, either version 3 of the
#    License, or (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU Affero General Public License for more details.
#
#    You should have received a copy of the GNU Affero General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################


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:

<?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.

menuroot

Linea 7: Aquí definimos otro menu que es un submenu del menu definido en la linea 5, para nuestro caso es el menu Libros.

menus

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 menu Listar libros.

menus

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:


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

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.

form_sheet

8. Damos los permisos a nuestro modulo biblioteca y reinciamos nuestro servicio de Odoo.

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écnicas para el usuario administrador y nos dirigimos a la pestaña Configuración/Actualizar lista de módulos y damos actualizar.

actua

10. Nos dirigimos a Configuración/módulos locales y en la parte derecha en el área de búsqueda colocamos el nombre del modulo biblioteca y presionamos enter, nos debería mostrar el modulo Biblioteca, presionamos en el botón Instalar.

install

 

11. Si todo hemos hecho correctamente nos debería mostrar el menu de Biblioteca .

inic

 

Eso es todo espero que les sea de utilidad.

Categorías: Odoo ERP v8

Javier Salazar Carlos

Soy Ingeniero de Ingeniería de Sistemas, egresado de la Universidad Nacional del Callao, especialista en Tecnologías de la Información y de las Comunicaciones (TICs).

17 comentarios

Carlos · 18/08/2015 a las 4:00 pm

Hola un gusto, funciono a la primera, disculpa como puedo agregar uno o varios campos a el formulario productos en odoo V8, muchas gracias.

    Javier Salazar Carlos · 19/08/2015 a las 6:50 pm

    Hola que tal Carlos podrías guiarte del articulo que publique anteriormente, aunque es para la v7 de Odoo tranquilamente se podría adaptar a la v8, ver el artículo aquí.

Rafa Petit · 08/11/2015 a las 8:04 am

No termino de entender porque inicialmente se crea el archivo biblioteca.py y despues nombras que se modifique el archivo libro.py cuando aun no lo he creado. Tengo que crear el archivo libro.py o tengo que modificar el biblioteca.py.
Esa es mi cuestion.
Gracias por tu tiempo.

    Javier Salazar Carlos · 08/11/2015 a las 3:52 pm

    Hola Rafa, efectivamente fue un error de parte mía al momento de escribir el tutorial, pero acabo de corregirlo.

    Gracias.

ng · 13/11/2015 a las 10:22 am

Buenas tardes,

he seguido paso por paso pero no me aparecen en los modulos, el nuevo módulo biblioteca para poder probarlo. Un saludo

    Javier Salazar Carlos · 13/11/2015 a las 11:33 am

    Reinicia el servicio de Odoo:
    /etc/init.d/odoo-server restart
    Luego asegúrate de haber ejecutado el paso 9, con eso deberías poder visualizar el modulo que estas desarrollando.

      ng · 13/11/2015 a las 12:27 pm

      Como activo el módulo de características técnicas.

      Gracias

      ng · 13/11/2015 a las 12:34 pm

      Ok, he vuelto ha hacer paso 8 y 9. Además ya tengo las características técnicas aplicadas, le doy a actualizar módulos… actualiza pero no me sale la biblioteca.

      ¿Por qué puede ser?

paul · 06/01/2016 a las 9:58 am

esto sirve para la version 8? me sale este error al querer instlarlor Field(s) `arch` failed against a constraint: Invalid view definition

desde ya gracias

pep · 29/01/2016 a las 10:55 pm

Hola,
He hecho este mismo ejemplo y el módulo se instala sin problemas. No me da ningún error, si lo busco aparece como instalado y me crea las tablas correspondientes en la base de datos. Pero en la parte superior de Odoo no veo el menú Biblioteca así que no puedo acceder de ninguna manera. No aparece por ningún sitio.
¿Tienes alguna idea de que puede estar pasando?
Un saludo y gracias.

    Javier Salazar Carlos · 30/01/2016 a las 9:41 am

    Quizás no estés importando en __openerp__.py el archivo que genera la vista ‘biblioteca_view.xml.

Cesar Gonzalez Rocha · 29/03/2016 a las 6:32 pm

Hola que tal muy buen tutorial

Lo he seguido y e tenido un error
tengo la version de odoo 9 instalada

ell modulo me aparece correctamente
solo que cuando lo quiero instalar
me lanza este bug

Odoo Server Error
Traceback (most recent call last):
File «/opt/odoos/server/openerp/http.py», line 643, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File «/opt/odoos/server/openerp/http.py», line 680, in dispatch
result = self._call_function(**self.params)
File «/opt/odoos/server/openerp/http.py», line 316, in _call_function
return checked_call(self.db, *args, **kwargs)
File «/opt/odoos/server/openerp/service/model.py», line 118, in wrapper
return f(dbname, *args, **kwargs)
File «/opt/odoos/server/openerp/http.py», line 309, in checked_call
result = self.endpoint(*a, **kw)
File «/opt/odoos/server/openerp/http.py», line 959, in __call__
return self.method(*args, **kw)
File «/opt/odoos/server/openerp/http.py», line 509, in response_wrap
response = f(*args, **kw)
File «/opt/odoos/server/addons/web/controllers/main.py», line 896, in call_button
action = self._call_kw(model, method, args, {})
File «/opt/odoos/server/addons/web/controllers/main.py», line 884, in _call_kw
return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs)
File «/opt/odoos/server/openerp/api.py», line 250, in wrapper
return old_api(self, *args, **kwargs)
File «/opt/odoos/server/openerp/addons/base/module/module.py», line 459, in button_immediate_install
return self._button_immediate_function(cr, uid, ids, self.button_install, context=context)
File «/opt/odoos/server/openerp/api.py», line 250, in wrapper
return old_api(self, *args, **kwargs)
File «/opt/odoos/server/openerp/addons/base/module/module.py», line 533, in _button_immediate_function
registry = openerp.modules.registry.RegistryManager.new(cr.dbname, update_module=True)
File «/opt/odoos/server/openerp/modules/registry.py», line 386, in new
openerp.modules.load_modules(registry._db, force_demo, status, update_module)
File «/opt/odoos/server/openerp/modules/loading.py», line 338, in load_modules
loaded_modules, update_module)
File «/opt/odoos/server/openerp/modules/loading.py», line 237, in load_marked_modules
loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks)
File «/opt/odoos/server/openerp/modules/loading.py», line 137, in load_module_graph
init_module_models(cr, package.name, models)
File «/opt/odoos/server/openerp/modules/module.py», line 293, in init_module_models
result = obj._auto_init(cr, {‘module’: module_name})
File «/opt/odoos/server/openerp/api.py», line 250, in wrapper
return old_api(self, *args, **kwargs)
File «/opt/odoos/server/openerp/models.py», line 2429, in _auto_init
raise_on_invalid_object_name(self._name)
File «/opt/odoos/server/openerp/models.py», line 107, in raise_on_invalid_object_name
raise ValueError(msg)
ValueError: The _name attribute Queseria.queso is not valid.

Tienen alguina idea???

De antemano muchas gracias 🙂

    Cesar Gonzalez Rocha · 30/03/2016 a las 5:30 pm

    Ya pude resolverlo, Solo unos cambios para odoo 9

Andres felipe · 06/05/2016 a las 3:27 pm

Buen día podría contactarlo para una consulta para la integración de un modulo que me genera error?

Quedo atento

Andres felipe · 12/05/2016 a las 11:03 am

me presenta este error cuando voy a integrar un modulo que puede ser la falla

could not get content for /base/static/src/css/modules.css defined in bundle ‘web.assets backend’

Juan · 13/06/2016 a las 12:51 pm

Buen tema gracias por el aporte, podrías orientarme ya que a partir de la creación del formulario necesito mostrar esos datos insertados en la base de datos y mostrarlos en el formulario. Podrías orientarme con este problema?

Responder a ng Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

code