Publicidad

jueves, 21 de noviembre de 2013

Herencia de Vistas y Objetos en OpenERP 7.0 para Agregar Campos en Formularios

OpenERP al utilizar Python como lenguaje de programación, obtiene la características como la programación orientada a objetos y por lo tanto podemos hacer uso de la Herencia para modificar, extender, utilizar métodos, clases, sin necesidad de crear un metodo nuevamente.
Existen diferentes tipos de herencia en OpenERP pueden leer un poco mas sobre herencia en el enlace: http://doc.openerp.com/v6.0//developer/2_5_Objects_Fields_Methods/object_inherit.html
En este tutorial explicare como crear un modulo en OpenERP para extender nuestro objeto y modificar a nuestras necesidades los objetos de OpenERP, anteriormente se explico como agregar campos en formularios directamente en OpenERP, pero OpenERP version 7.0 tiene algunos problemas si queremos realizar cambios de esta manera, ademas de que al actualizar cualquier modulo que modificamos se eliminan los cambios realizados, para evitar esto creamos un modulo por separado que herede los objetos que queremos extender y asi poder instalar nuestro modulo cada ves que sea necesario sin afectar al Sistema directamente y de una manera mas profesional manejar nuestras clases.

Es recomendable que para poder seguir con este tutorial conoscamos un poco sobre Python.

Para poder crear modulos en OpenERP basta con tener Gedit en Ubuntu, aunque si queremos utilizar un IDE para el desarrollo existen algunos como APTANA, ECLIPSE, SPE, GEINY, entre muchos otros mas.
Ya teniendo instalado ya sea un IDE o directamente utilizando Gedit iniciamos insertando las cabeceras de OpenERP para esto seleccionamos el siguiente fragmento y lo insertamos en nuestro archivo, iniciando en la linea 1:

# -*- encoding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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 &lt;http://www.gnu.org/licenses/&gt;.
#
##############################################################################
Importamos las librerias que utiliza OpenERP ademas de tener la posibilidad cualquier otra libreria de Python.
from osv import osv, fields
import time
Iniciamos nuestra clase en Python en este caso quiero crear campos extra en Productos para ello nombro mi clase como product:
class product_product(osv.osv):
    _name = 'product.product'
    _inherit ='product.product'
En el codigo anterior, product_product es el nombre via base de datos que utiliza OpenERP mientras que _name = "product.product" es el nombre via Python, la etiqueta _inherit="product.product" es muy importante para extender cualquier objeto via herencia y es el nombre del objeto que queremos extender, como podemos saber que objeto extender es muy sencillo activando la vista modo desarrollador, si no saben como realizar esto podemos leer el post:
http://www.hesatecnica.com/?p=451 Ahora ya tenemos el nombre de nuestra clase y la herencia a donde se aplicara, definimos los campos y que queremos insertar con el siguiente codigo:
    _columns = {

        }
Dentro de Columnas entre las llaves {} estamos definiendo un diccionario con los campos que queremos insertar, por ejemplo quiero agregar 2 campos en producto que sean lote de produccion y fecha de captura para ello los crearia de tipo entero para lote y de tipo fecha para el campo fecha de captura:
    _columns = {
        'lote_produccion'    : fields.integer('Lote de Produccion', size='128', help="Campo Creado mediante Herencia" ),
        'fecha_captura'    : fields.date('Fecha de Captura'),
        }
Una ves definidos los campos cerramos nuestra clase:
product_product()
Insertamos la siguiente linea al final de las lineas:
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
El archivo Final quedaria de la siguiente manera:
# -*- encoding: utf-8 -*-
##############################################################################
#    
#    OpenERP, Open Source Management Solution
#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
#    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 osv import osv, fields
import netsvc
import pooler
from tools.translate import _
import decimal_precision as dp
from osv.orm import browse_record, browse_null
import time
from datetime import datetime, date

# Products => We need flags for some process with TMS Module
class product_product(osv.osv):
    _name = 'product.product'
    _inherit ='product.product'

    _columns = {
        'lote_produccion'    : fields.integer('Lote de Produccion', size='128', help="Campo Creado mediante Herencia" ),
        'fecha_captura'    : fields.date('Fecha de Captura'),
        }
product_product()

# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
Ahora lo guardamos en una carpeta con el nombre product_inherit y el archivo debe llevar la extension .py por ejemplo el nombre seria product.py.
product.py
De esta manera extendimos a la clase product ahora para que los cambios se vean reflejados dentro de OpenERP tenemos que crear la vista de nuestro modulo, heredando la vista principal para poder insertar nuestros campos. Para ello dentro de la carpeta product_inherit creamos un archivo product_view.xml con extension XML.
product_view.xml
Insertamos las etiquetas cabeceras del XML y obligatorias en OpenERP:
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
</data>
</openerp>
Dentro de estas etiquetas insertamos la etiqueta siguiente en donde model es el modelo para crear la vista el id es el nombre que tendra nuestra vista para futuros cambios y es obligatorio en OpenERP.
<field name="model"></field>
Ahora la siguiente linea definimos el nombre de nuestra vista:
            inherit.product.normal.form
Definimos el nombre del modelo de nuestra clase python que tendra esta vista se encuentra dentro del archivo que creamos anteriormente product.py
            product.product
Se define el tipo de vista que queremos crear o heredar, en este caso queremos crear la herencia de la vista formulario:
            form
Definimos la prioridad en este caso utilizaremos la prioridad 50:
            50
La linea siguiente seria la referencia de la vista que sera modificada por herencia, para conocer la vista tenemos que utilizar el modo desarrollador para conocer el ID de la vista que queremos modificaro editando el archivo que contiene la vista del modulo a modificar y buscar la vista form, la referencia quedaria de la siguiente manera(antecediendo a esta vista el nombre de la carpeta que contiene el modulo):

Definimos que sera de tipo XML y no cerramos la etiqueta como las anteriores /> se cerrara al final de los campos:



La parte complicada es la siguiente en donde tenemos que buscar la pocision para nuestros campos y buscar si nuestro campo se insertara antes, despues o reemplazara algun campo para ello la pocision tendra que ser after(despues), before(antes) o reeplace(reemplazar), este campo no se cerrara como las anteriores con /> si no quedara abierto para insertar dentro los campos que creamos, al final cerramos la etiqueta como se muestra a continuacion.

Ahora cerramos las etiquetas que dejamos de alguna manera "abiertas" :



Al final quedaria un codigo como el siguiente:

            inherit.product.normal.form
            product.product
            form
            50
Una ves definidos tanto las clases como las vistas heredadas, solo falta crear el descriptor del modulo o sea el archivo __openerp__.py y el importador o __init__.py dentro de la carpeta product_inherit, si no saben como crear estos archivos pueden ver el post: http://www.hesatecnica.com/?p=361 Quedando archivos de la siguiente manera: __openerp__.py
# -*- encoding: utf-8 -*-
##############################################################################
#    
#    OpenERP, Open Source Management Solution
#    Copyright (C) 2012 HESATEC (<http://www.hesatecnica.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" : "Inherit in Product ",
    "version" : "1.0",
    "category" : "Example for Inherit in Product ",
    'complexity': "normal",
    "author" : "HESATEC",
    "website": "http://www.hesatecnica.com",
    "depends" : ["base","product"],
    "description": "Agreement for Transportation Management System",
    "demo_xml" : [],
    "init_xml" : [],
    "update_xml" : [
                    'product_view.xml',
                    ],
    "active": False,
    'application': True,
    "installable": True
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
__init__.py
# -*- encoding: utf-8 -*-
##############################################################################
#    
#    OpenERP, Open Source Management Solution
#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
#    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 product

# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
Ahora para poder instalar nuestro modulo una ves creado basta con mover nuestra carpeta creada con el modulo en este caso seria product_inherit e insertarla en addons de openerp o la carpeta que contenga nuestros addons al arrancar el servidor de openerp, una ves realizado tenemos que ir a nuestro navegador web --> Configuracion --> Actualizar Modulos, y ahora solo basta con buscar nuestro modulo escribimos en el buscador de modulos product_inherit y como ultimo paso instalamos el modulo y al ingresar a productos observaremos los nuevos campos creados.

Podemos decargar el modulo mediante BZR del enlace:
bzr branch lp:~german-ponce/+junk/product_inherit

Espero sea de su ayuda no se olviden comentar....

1 comentario:

  1. Buenas, estoy trabajando en la edición del formulario de candidato en el modulo de seleccion y reclutamiento de OpenERP, y me piden que el modulo registre las experiencias laborales, el problema es que solo sé añadir una sola experiencia laboral, ¿existe alguna manera de añadir más experiencias laborales con los mismos campos para un candidato o aplicante?

    ResponderEliminar