Hola amigos en esta oportunidad quiero compartir con ustedes la forma mas correcta de agregar un campo a un formulario de OPENERP usando su propio FRAMEWORK OPENOBJECT.

Cuando nos referimos a módulos se refiere a cualquier modificación o cambio que se quiera agregar a un formulario o en general a cualquier funcionalidad de OPENERP.

Suponemos que tiene instalado OPENERP 7 en Ubuntu Server o alguna otra distribución de GNU/Linux.

  • Si vemos el formulario actual de PRODUCTO vemos los campos tal como muestra en la imagen siguiente:

form_producto

  • Lo que haremos es agregar el campo Color en la pestaña Información debajo del campo Precio de venta, por medio de un módulo que llamaremos product_color. para ello ingresamos a nuestro servidor y mediante la terminal ingresamos a la carpeta addons de openerp.

#: significa que hemos iniciado sesión como superusuario o root.

 #cd /opt/openerp/server/openerp/addons/
  • Creamos una nueva carpeta llamada product_color
#mkdir product_color
  •  Ingresamos a la carpeta
#cd product_color
  • Crear los archivos __init__.py, __openerp__.py,  product_color.py y product_color_view.xml
#touch __init__.py 
#touch __openerp__.py 
#touch product_color.py
#touch product_color_view.xml

__init__.py: Aqui importaremos todos los archivos y directorios que contienen codigo python, éste archivo hace que OPENERP reconosca al directorio o capeta product_color como un módulo.

__openerp__.py: Contiene un diccionario en Python para agregar las descripciones del módulo, como autor, versión, etc.

product_color.py: Aquí escribiremos el código Python que permitirá agregar o modificar las funcionalidades de OPENERP, este archivo será importado en __init__.py, como veremos mas abajo.

product_color_view.xml: Aquí vamos agregar los codigos XML que permitirá la vista del Módulo en OPENERP, en nombre debe de terminar en _view.xml por convencion.

  • Con tu editor favorito editamos el archivo __init__.py, para este ejemplo usaré el editor vim.
#vim __init__.py
  • Agregamos lo siguiente y guardamos los cambios.
# -*- coding: utf-8 -*-
import product_color

 La primera linea se recomienda agregar, permite reconocer que python trabaje en utf-8

  • Editamos el archivo __openerp__.py
#vim __openerp__.py
  • Agregamos lo siguiente y gurdamos:
# -*- encoding: utf-8 -*-

{
    "name": "Product Color",
    "version": "1.0",
    "description": """
        Permite agregar al formulario producto el campo color
    """,
    "author": "Ing. Javier Salazar Carlos",
    "website": "http://salazarcarlos.com",
    "category": "Tools",
    "depends": [
            "product",
            "base",#Este modulo para instalarse debe tener el modulo base y product instalado
                ],
    "data":[
            "product_color_view.xml", #todos los archivos xml que posea nuestro modulo se debe de agregarse aqui
                ],
    "demo_xml": [
                        ],
    "update_xml": [
                        ],
    "active": False,
    "installable": True,
    "certificate" : "",
}
  • Editamos el archivo product_color.py y agregamos el siguiente código:

 

# -*- encoding: utf-8 -*-

#importamos la clase osv del modulo osv y fields
from osv import osv, fields

#Creamos una clase llamada product_product que hereda de la clase product_product padre que esta en /opt/openerp/server/openerp/addons/product
#En openobject hay varios tipos de herencia averiguar mas del tema
#Aqui las clases tienen un atributo _name que es el nombre de la tabla que existe o se creara cuando instalamos el modulo en postgresql

class product_product(osv.osv):
    _name = 'product.product' # Aqui va el mismo nombre de la clase que se hereda
    _inherit = 'product.product' # Permite la herencia propiamente dicho del modulo product 

    #Agregamos el campo color al formulario producto o a la tabla product_product
    _columns = {
                'colores': fields.char('Color',size=40),
        }
product_product()
  • Editamos el archivo product_color_view.xml que permitirá mostrar el campo color en formulario producto.
#vim product_color_view.xml

 

  • En OPENERP existe varios tipos de vista: Vista lista(tree)Vista formulario(form), etc. para nuestro caso usaremos una vista formulario, ya que es a este tipo de vista a donde agregaremos el campo color.

La etiqueta <record> tiene los atributos:

model: vista heredada del modelo ir.ui.view

id: Nombre único para cada vista etiqueta <record>

La etiqueta <field> tiene varios atributos los mas importantes son.

name: Indica el nombre de acction a realizar

model: Indica el nombre de la clase a la que se asocia esta vista.

inherit_id: Herencia de vista, para nuestro caso hereda de la vista del modulo product  que esta en /opt/openerp/server/openerp/addons/product/product_view.xml

type: Este es una vista tipo formulario

Agregamos el siguiente código:

<?xml version="1.0" encoding="UTF-8"?>

<!-- Siempre las lineas xml van a ir delimitados por la etiqueta openerp-->
<openerp>
        <!-- Las etiquetas data tambien delimitan a las record siempre -->
        <data>
                <!-- La etiqueta record son la que permitiran mostrar el campo color en el formulario producto-->
                <record model='ir.ui.view' id='product_color_form_view'>
                        <field name='name'>product.form.color</field>
                        <field name='model'>product.product</field>
                        <field name='inherit_id' ref='product.product_normal_form_view'/>
                        <field name='type'>form</field>
                        <field name='arch' type='xml'>
                                <field name="list_price" position="after"> <!-- after: despues del campo list_price -->
                                        <field name="colores"/> <!-- llamamos al campo coleres con el atributo name de field -->
                                </field>
                        </field>

                </record>
        </data>
</openerp>

 

  • Ingresamos a nuestro OPENERP 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 modulos y damos actualizar.

Captura de pantalla de 2013-11-24 04:28:42

  • Nos dirigimos a Configuración/modulos instalados y en la parte derecha en el área de búsqueda colocamos el nombre del modulo product_color y presionamos enter:

Captura de pantalla de 2013-11-24 04:34:03

  • Hacemos clic en instalar y si todo hemos hecho correctamente no nos debería mostrar ningún error y al ir al formulario de producto deberíamos el nuevo campo creado:

Captura de pantalla de 2013-11-24 04:36:50

 

Esto todo amigos espero que les sea de ayuda.

 

 

Categorías: Odoo ERP v7

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

30 comentarios

Cesar · 05/12/2013 a las 9:48 pm

Muy bueno, Gracias por el aporte y a la espera de la parte 2 de tutorial.

Saludos desde Pucallpa Peru

Dayne · 17/12/2013 a las 6:27 pm

Hola muy buena la explicación y la he utilizado para crear un nuevo campo solo que en el formulario de venta, pues necesito poner el motivo por el cual se hace la venta. El modulo sale como instalado pero cuando voy al form de venta no veo el campo creado, yo no se de programar modulos en openerp, solo trate de seguir una analogia entre productos y ventas segun lo que se explica aca. Ah el campo si se creo en la BD. supongo el error sea en el xml.

Aca esta lo que puse en cada archivo.

__init__.py

# -*- coding: utf-8 -*-
import sales_reason

__openerp__.py

# -*- encoding: utf-8 -*-

{
«name»: «Sales reason»,
«version»: «1.0»,
«description»: «»»
Permite agregar al formulario ventas el campo motivo
«»»,
«author»: «Dayne»,

«category»: «Tools»,
«depends»: [
«sale»,
«base»,
],
«data»:[
«sales_reason_view.xml»,
],
«demo_xml»: [
],
«update_xml»: [
],
«active»: False,
«installable»: True,
«certificate» : «»,
}

sales_reason.py

# -*- encoding: utf-8 -*-

#importamos la clase osv del modulo osv y fields
from osv import osv, fields

#Creamos una clase llamada sale_shop que hereda de la clase sale_shop padre que esta en /opt/openerp/server/openerp/addons/sale_shop
#En openobject hay varios tipos de herencia averiguar mas del tema
#Aqui las clases tienen un atributo _name que es el nombre de la tabla que existe o se creara cuando instalamos el modulo en postgresql

class sale_order(osv.osv):
_name = ‘sale.order’
_inherit = ‘sale.order’

_columns = {
‘motivo’: fields.char(‘Motivo’,size=50),
}
sale_order()

sales_reason_view.xml

sale.form.motivo
sale.order

form

    Javier Salazar Carlos · 19/12/2013 a las 4:26 am

    Es posible que estés haciendo mal la herencia en la vista, me refiero a la herencia dentro sales_reason_view.xml, seria bueno que me envíes las lineas de xml que has colocado, para ver donde está tu error.

Dayne · 17/12/2013 a las 6:30 pm

arriba no salio el xml completo

sale.form.motivo
sale.order

form

Dayne · 18/12/2013 a las 2:27 pm

Hola esta guía me ha servido de mucho pero en mi caso necesité hacer un nuevo campo en el formulario de venta, pero no se me muestra y supongo sea error del xml porque si se creo en la tabla. Solo que soy nueva con openerp y los datos de las clases y modelo trate de hacerlo por analogía y no con seguridad, si pudiera ver estos codigos se lo agradecería.

archivo sales_reason.py

class sale_order(osv.osv):
_name = ‘sale.order’
_inherit = ‘sale.order’
_columns = {
‘motivo’: fields.char(‘Motivo’,size=50),
}
sale_order()

archivo sales_reason_view.xml

sale.form.motivo
sale.order

form

Fernando · 10/02/2014 a las 10:37 pm

Hola, en primer lugar reiterar mi comentario de otros posts por lo agradecido a tu blog que me está ayudando tanto en este proyecto fin de carrera. me gustaría preguntarte una duda.

Me gustaría poner un objeto en otro menú. Esto es algo muy simple si de hace en modo gráfico, pero como bien me has abierto los ojos en una respuesta a una pregunta anterior esto no es práctico. ¿¿Habría alguna manera de hacerlo tal y como lo haces tu en este post???creando un modulo pequeño en el que especifique el menú?

Concretamente el objeto que quiero mover, o mejor dicho que quiero que se vea tambien en otro menú es el «Producto» (product.product) y «Cliente» del mismo menú de ventas a uno personalizado, pero muy sencillo.

Muchas gracias

Nicolás · 15/02/2014 a las 6:17 pm

Hola, estoy empezando a conocer OpenERP y viendo tu post se me ocurrió hacer un módulo que sirva para indicar lo siguiente:
Si «X» producto tiene stock = ó 0, la casilla de «puede ser vendido» se marque.
Me podrías guiar para lograrlo?
Saludos

depilacion laser en madrid · 21/03/2014 a las 7:35 am

He leido vuestro articulo con mucha atecion y me ha parecido didactico ademas de facil de leer. No dejeis de cuidar este blog es buena.
Saludos

[url=http://www.centromedicae.es/index.php/depilacion-laser-madrid.html]depilacion laser en madrid[/url]

Arturo · 08/05/2014 a las 7:19 pm

Estimado Xavier,
He seguido la explicaciones paso a paso lo unico es que trabajo bajo Windows 7, pero me sale el siguiente error, te agradeceria me indiques que esta mal.

Client Traceback (most recent call last):
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\http.py», line 203, in dispatch
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\controllers\main.py», line 1133, in call_button
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\controllers\main.py», line 1121, in _call_kw
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\session.py», line 43, in proxy
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\session.py», line 31, in proxy_method
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\session.py», line 104, in send

Server Traceback (most recent call last):
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\session.py», line 90, in send
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\netsvc.py», line 293, in dispatch_rpc
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\service\web_services.py», line 626, in dispatch
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\osv\osv.py», line 188, in execute_kw
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\osv\osv.py», line 131, in wrapper
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\osv\osv.py», line 197, in execute
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\osv\osv.py», line 185, in execute_cr
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\base\module\wizard\base_module_upgrade.py», line 90, in upgrade_module
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\pooler.py», line 39, in restart_pool
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\modules\registry.py», line 218, in new
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\modules\loading.py», line 348, in load_modules
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\modules\loading.py», line 259, in load_marked_modules
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\modules\loading.py», line 191, in load_module_graph
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\modules\loading.py», line 76, in
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\modules\loading.py», line 127, in _load_data
File «C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\tools\convert.py», line 941, in convert_xml_import
File «lxml.etree.pyx», line 2698, in lxml.etree.parse (src/lxml/lxml.etree.c:49590)
File «parser.pxi», line 1513, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:71423)
File «parser.pxi», line 1543, in lxml.etree._parseFilelikeDocument (src/lxml/lxml.etree.c:71733)
File «parser.pxi», line 1426, in lxml.etree._parseDocFromFilelike (src/lxml/lxml.etree.c:70648)
File «parser.pxi», line 997, in lxml.etree._BaseParser._parseDocFromFilelike (src/lxml/lxml.etree.c:67944)
File «parser.pxi», line 539, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:63820)
File «parser.pxi», line 625, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:64741)
File «parser.pxi», line 565, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:64084)
XMLSyntaxError: Premature end of data in tag openerp line 3, line 22, column 1

Gio · 19/12/2014 a las 4:30 pm

Buen dia tengo una pregunta. ¿Como añado más de un campo? solo consigo añadir un solo campo y quiero agregar 3 campos

    Javier Salazar Carlos · 29/01/2015 a las 11:49 am

    Para añadir mas de un campo debes de agregar esos campos en el atributo _colummns luego eso mismo agregarlo en la vista del xml

Gaby Lopez · 19/01/2015 a las 3:12 pm

Hola, buen día, he seguido el tutorial, instalé correctamente el modulo despues de crear los archivos .py y xml, el problema es que mi campo no aparece en el formulario, si voy a la sección de vistas, el campo aparece. Ya intenté poner el codigo directamente en la vista, pero ni así aparece.
Aparte de instalar el módulo debo hacer algo más?

mi xml es el siguiente:

foreign_rfc.partner.normal.form
res.partner
form
1

David · 27/04/2015 a las 1:58 pm

¿Disculpa esta referencia a que es lo que liga?

Manuel · 06/05/2015 a las 7:29 am

Hola, he echo este tutorial paso a paso, pero en vez de en open erp, lo he hecho en odoo, y no me aparece la opción «modulos instalados», y tampoco me aparece el campo color, en productos. ¿Sabes a que es debido?

    Javier Salazar Carlos · 06/05/2015 a las 12:55 pm

    Que versión de Odoo tienes instalado y sobre que distribucion de GNU/LInux?

      Manuel · 07/05/2015 a las 4:57 am

      La ultima versión de odoo y en debian

Pablo Brown · 06/08/2015 a las 3:51 pm

Hola, primero que nada excelente post!
Por otro lado una consulta, he creado un modulo exactamente igual al del ejemplo, pero luego al actualizar los módulos no aparece dentro de la lista de los mismos para poder instalarlo. ¿Alguna idea de donde puede estar el problema?
Espero tu respuesta
Saludos!

    Javier Salazar Carlos · 10/08/2015 a las 8:26 am

    Debes de reiniciar el servicio de Odoo, Luego ingresa a Odoo via web y ve a la parte configuración, Módulos locales y luego actualizar lista de módulos, allí debe de aparecerte el modulo.

Fernando Leon · 26/08/2015 a las 12:02 pm

Hola Javier, gracias por el articulo.
Lo he hecho todo identico pero en odoo 8, cuando actualizo no sale ningun modulo nuevo. Alguna sugerencia?

Fernando · 21/09/2015 a las 10:55 am

Hola Javier, gracias por el post.

Lo he seguido paso a paso y he utilizado el mismo código, solo he cambiado el nombre del campo y el nombre del modulo. cuando lo voy a instalar me da el sigt error:

ParseError: «ValidateError
Field(s) `arch` failed against a constraint: Invalid view definition

Error details:
Element » cannot be located in parent view

Error context:
View `product.form.partnumber`
[view_id: 767, xml_id: n/a, model: product.product, parent_id: 260]» while parsing file:///C:/Program%20Files%20(x86)/Odoo%208.0-20150910/server/openerp/addons/product_partnumber/product_partnumber_view.xml:8, near

product.form.partnumber
product.product

form


aqui te pongo el codigo:

************************************************la vista*****************************

product.form.partnumber
product.product

form


**********************************************************************************************
*************************************************la clase***********************************
from openerp.osv import osv, fields

#Creamos una clase llamada product_product que hereda de la clase product_product padre

class product_product(osv.osv):
_name = ‘product.product’ # Aqui va el mismo nombre de la clase que se hereda
_inherit = ‘product.product’ # Permite la herencia propiamente dicho del modulo product

#Agregamos el campo partnumber al formulario producto o a la tabla product_product

_columns = {
‘partnumbers’: fields.char(‘Part number’,size=40),
}
product_product()
*************************************************************************************************************

cualquier ayuda, muchas gracias

paul · 06/01/2016 a las 10:00 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

Diego Chamorro · 14/07/2016 a las 4:02 pm

Podrías poner el ejemplo para Odoo 8?
Muchas gracias.

miguel · 26/01/2018 a las 4:41 pm

El campo `cantidad_iva` no existe

Error de contexto:
Vista `product.product.form`
[view_id: 736, xml_id: n/a, model: product.product, parent_id: 307]
None» while parsing file:///c:/program%20files%20(x86)/odoo%2010.0/server/odoo/addons/productoiva/productoiva_view.xml:4, near

product.product.form
product.product
form

Ami me sale este error despues de querer instalar el modulo

Deja un comentario

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

*

code