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:
- 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.
- 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:
- 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:
Esto todo amigos espero que les sea de ayuda.
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
Javier Salazar Carlos · 19/12/2013 a las 4:29 am
Envíame a este correo huber@salazarcarlos.com y te ayudaré
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
Javier Salazar Carlos · 19/12/2013 a las 4:32 am
Envíame a este correo huber@salazarcarlos.com y te ayudaré
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
Javier Salazar Carlos · 13/02/2014 a las 2:39 am
Estoy preparando un nuevo articulo del tama, en breve lo publicaré
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
Javier Salazar Carlos · 29/01/2015 a las 11:47 am
Tienes problemas en el xml al momento de cerrar algunas de las etiquetas, vefiricalo.
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
Javier Salazar Carlos · 29/01/2015 a las 11:51 am
Puedes enviarme parte de tu codigo de tu módulo al correo jsalazarcarlos@gmail.com para revisarlo y luego te dire enque te has equivocado.
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
Javier Salazar Carlos · 14/01/2016 a las 1:55 pm
Esta publicación solo es valida para la v7 de Odoo
Diego Chamorro · 14/07/2016 a las 4:02 pm
Podrías poner el ejemplo para Odoo 8?
Muchas gracias.
Javier Salazar Carlos · 01/08/2016 a las 11:19 pm
Si, claro en una próxima publicación.
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