Programacion Interactiva

Descubre una Nueva y Poderosa Herramienta.

FrameWork de Nueva Generacion

Acceso a tu Informacion desde cualquier Dispositivo con Navegador.

Enfoque en el Backend

Frontend de forma facil con Odoo y XML.

Creacion de Verticales

Creacion de nuevas Verticales Conquistando nuevos Mercados.

Tu marca aqui mismo

Llega a miles de personas.

Publicidad

Mostrando las entradas con la etiqueta functions. Mostrar todas las entradas
Mostrando las entradas con la etiqueta functions. Mostrar todas las entradas

miƩrcoles, 23 de septiembre de 2015

Ejecución de Métodos en Clases Odoo desde Web Services

Como ejecutar un MƩtodo desde un Web Services Python



Anteriormente hable un poco sobre como utilizar los Web Services de Odoo desde aplicaciones externas como Python Django, ahora quiero compartir como ejecutar un método no propio del FrameWork( Create, Unlink, Copy, Search, Write, Read), si no ejecutar un metodo de una clase X, por ejemplo el método Confirmar Pedido de Venta desde una conexión Web Service Python.

La sintaxis es la siguiente:

import xmlrpclib
dbname = "Mi_Base"
username = "admin"
pwd = "admin"
sock_common = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/common')
uid = sock_common.login(dbname, username, pwd)
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')
res = sock.execute(dbname, username, pwd, 'sale.order', 'action_button_confirm', [1])
print '############ Resultado >>>>> ',res
print " Ejecución Finalizada ... "

    Como podemos observar, es necesario Indicar la Base de Datos, Usuario y ContraseƱa de admin o algĆŗn usuario con los permisos sobre la clase que vamos a trabajar y al final enfocarnos en los IDS del metodo a ejecutar, en el ejemplo anterior mande el registro 1 de la tabla sale_order.

lunes, 20 de enero de 2014

Como Funciona la Herencia en Odoo (OpenERP)


HERENCIA DE CLASES Y METODOS Odoo (OPENERP)

_inherit (Herencia de objetos).

    Al hacer referencia a este atributo, hacemos referencia a la HERENCIA. Un hijo hereda
todos los campos, y funciones de su padre.

Ejemplo: 

    Como todos sabemos, existe una clase que se llama “res.partner”. En el siguiente ejemplo vamos a crear una nueva clase que herede de “res.partner”. A esta nueva clase le aƱadiremos 2 Campos uno para Identificar que elementos de "res.partner" (Clientes/Proveedores) tienen facebook y cual seria el facebook de dichos registros:

 Esta serĆ­a la declaración de la nueva clase:

class res_partner(osv.osv):

<!--­­ Aqui indico el atributo 'name' del Objeto Padre ­­-->

_inherit ='res.partner'
     
<!--­­ Nuevo campo que voy a aƱadir al Objeto res.partner ­­-->
   
_columns= {
    'facebook': fields.boolean('Facebook'),
    'facebook_description': fields.boolean('URL Facebook'),
}
 
res_partner()

 Heredar funciones, y llamar a funciones padre con SUPER.

     A veces nos puede interesar heredar una función de una clase, para poder modificarla. Vamos a poner como ejemplo la función 'onchange_xxxxx' que estĆ” definida en la clase 'mi.clase'.

       Esta función se ejecuta cada vez que cambiemos el id de “mi.clase”, asĆ­ que imaginemos que queremos cambiar el funcionamiento de dicha función. Teniendo en cuenta que en mi.clase existe la función onchange_xxxxx(self, cr, uid, ids, part), vamos a ver el siguiente ejemplo:

class mi_clase(osv.osv):

    <!--­­ HEREDAMOS DE LA CLASE ­­-->

    _inherit = 'mi.clase'

    <!--­­ DECLARAMOS OTRA VEZ LA FUNCIƓN QUE VAMOS A MODIFICAR --­­>
 
    def onchange_xxxxx(self, cr, uid, ids, part):
        value = {}
        miclase_obj = self.pool.get('mi.clase')

  <!­­-- LLAMAMOS A LA FUNCION PADRE ­­-->

  <!­­-- super(mi_clase,self): De esta manera llamamos a la función padre.   Hay que pasarle 2 parĆ”metro: la clase padre, y 'self' ­­ -->

        res = super(mi_clase, self).onchange_xxxxx(cr, uid, ids, part)
        value = res['value']
        if part:
            miclase = miclase_obj.browse(cr, uid, part)

<!--­­  Modificamos 'value', si en value existe 'client_order_ref'  modifica su valor, si no existe, lo crea  dentro de value  -->
            value.update({
               'client_order_ref': miclase.name,
            })
  <!­­ La función 'onchange' siempre devuelve un value ­­>

return {'value': value}
 
sale_order()

lunes, 13 de enero de 2014

Reglas en Odoo (OpenERP) utilizando campos Many2Many y One2Many



Reglas con Campos Many2Many y One2Many


    Durante la creación de Reglas para Grupos en OpenERP en ocasiones tenemos que utilizar  campos many2many ó one2many para comparar que un valor se encuentre dentro de una lista de valores.

    Por ejemplo cuando trabajamos en un entorno MulticompaƱia en OpenERP en ocasiones tenemos errores durante el manejo de Modelos que tengan Acceso a campos que utilicen la campos con referencia a compaƱƭa, por ejemplo si queremos la comprobación de que un elemento se encuentra dentro de una lista ó que un campo compaƱia se encuentre dentro del campo company_ids que se encuentra en Usuarios y que contiene una lista de compaƱias a las cuales el usuario puede tener acceso, tendrĆ­amos que agregar en la creación de regla el dominio siguiente:

[('company_id','in',[x.id for x in user.company_ids])]

 - company_id: Es el campo que encuentra en el modelo OpenERP al cual quiero ligar con mi regla.

 - in: Es el la palabra reservada para comparar que un elemento se encuentra dentro de una lista.

 - [x.id for x in user.company_ids]: En esta linea  utilizamos un poco de código Python para crear una lista con los valores para la comparación de mi dominio, x.id es el valor obtenido de un ciclo for utilizando una variable x para la iterar dentro de el campo user.company_ids que contiene la relación many2many con el modelo de compaƱia. Al Final nos quedarĆ­a en ejecución algo como lo siguiente [('10','in',[1,5,15,10,25,35,2])], esto da como resultado True o False depensiendo si el valor 10 se encuentra dentro de los valores 1, 5, 15, 10, 25, 35, 2. A este proceso se le conoce en Python como Listas de Comprensión 


miƩrcoles, 8 de enero de 2014

MƩtodos ORM BƔsicos para Programar Modulos en Odoo (OpenERP)

MƩtodos ORM bƔsicos (Crear, Buscar, Leer, Actualizar y Borrar)

MƩtodo create

Sintaxis

create (cr, uid, values, context=None)

Crea un nuevo registro con los valores especificados. ParƔmetros especƭficos:

values: Diccionario con los valores de los campos para el nuevo registro.

Devuelve el id del registro creado. Puede generar los siguientes errores:

AccessError: Si el usuario no tiene permisos de escritura en el objeto solicitado, o si el usuario intenta
ignorar las reglas de acceso para crear el objeto solicitado.

ValidateError: Si el usuario intenta introducir un valor invƔlido para un campo que no estƔ en la
selección.

UserError: Si se crease un bucle en una estructura de objetos jerÔrquica como resultado de la operación (como establecer un objeto como su propio padre).

Por ejemplo para crear un producto tendriamos que generar el diccionario con los valores necesarios, principalmente los que son requeridos por el Modelo:

product_obj = self.pool.get('product.product')

product_vals = {
                         'name': 'Producto X',
                         'type': 'product' ,
                         'list_price': 45.00,
                         'procure_method': 'make_to_stock',
                         }

product_create_id = product_obj.create(cr, uid, product_vals, context=None)

ParƔmetros comunes a la mayorƭa de mƩtodos ORM en Odoo (OPENERP)



La mayorƭa de mƩtodos ORM tiene una serie de parƔmetros comunes a todos ellos:

  •cr: Cursor de la base de datos
  •uid: Identificador del usuario actual
  •ids: Lista de enteros con los identificadores de los registros (o lista con un Ćŗnico entero cuando hay       sólo un id)
  •context: Diccionario con los argumentos de contexto, como idioma, zona horaria, ...

    Al definir nuestros modelos como herencia de la clase osv.osv permite que todos los mĆ©todos de ORM estĆ©n disponibles para la programación de los módulos. Estos mĆ©todos pueden ser invocados por los propios objetos, dentro de la clase Python, o desde fuera de la clase, obteniendo en primer lugar una instancia a travĆ©s del concentrador (pooler) del sistema de ORM.

Contexto de los mƩtodos ORM


    En OpenObject, el contexto tiene datos muy importantes, como el idioma en que se debe escribir un documento, si el campo de una función necesita actualizarse o no, ...

    Cuando se efectĆŗa una llamada a un mĆ©todo ORM, es probable que el objeto ya tenga un contexto y el OpenObject lo proporcione como un parĆ”metro en casi todos los mĆ©todos. Si el objeto tiene un contexto, es muy importante que siempre se pase el mismo a todos los mĆ©todos a los que se llame.

    Esta regla tambiĆ©n es aplicable a los mĆ©todos ORM que escriba un programador. El programador debe esperar recibir un contexto como parĆ”metro en todos los mĆ©todos que desee llamar, y siempre debe pasar el contexto a todos los mĆ©todos a los que llame.


lunes, 6 de enero de 2014

Campos Funcionales con OpenERP

En OpenERP un campo funcional es un campo cuyo valor no sera definido por el usuario sino el resultado de una funcion (estos campos no se guardan en base de datos ). En ocasiones, para aumentar la velocidad de consulta de OpenERP y facilitar las bĆŗsquedas, los campos funcionales tambiĆ©n pueden ser guardados en la base de datos aunque siempre son calculados/actualizados por una o varias funciones y no por el usuario
.
La estructura de un campo funcional es la Siguiente:
fields.function(fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type="float, fnct_search=None, obj=None, method=False, store=False, multi=False,...)