Campo tipo function en OpenERP (Odoo)

Uno de los tipos de campos utilizados en OpenERP (Odoo) es el de tipo function, que muy bien puede ser utilizado para capturar un valor en tiempo real o mostrar el resultado específico de un valor obtenido por la operación de otras variables en el sistema.

El esquema básico para usar el tipo de campo function es:

class mi_clase(osv.Model):
    
    _inherit = 'account.invoice.line'
        
    def _get_precio(self, cr, uid, ids, name_fields, args, context=None):
        res = {}        
        for inv_line in self.browse(cr, uid, ids, context):
            res[inv_line.id] = 0.00
            cr.execute('SELECT order_line_id FROM sale_order_line_invoice_rel WHERE invoice_id='+str(inv_line.id))
            id_order_line = cr.fetchall()
            if id_order_line:
                cr.execute('SELECT precio_compra FROM sale_order_line WHERE id='+str(id_order_line[0][0]))
                precio_compra = cr.fetchall()
                if precio_compra:
                    res[inv_line.id] = precio_compra[0][0]
        return res
    
    _columns = {
        'precio_compra': fields.function(_get_precio, type='float', 
            string='Precio de compra', digits=(10,2))
    }
    
mi_clase()

En el ejemplo anterior, quiero obtener el precio de compra de productos desde la tabla account_invoice_line, cada vez que se muestra una vista relacionada a dicha tabla u objeto, la función que contiene el campo o variable precio_compra, se calcula en tiempo real y se muestra un resultado de tipo numérico flotante a través del método _get_precio.

Sin embargo, este tipo de campo no se puede editar desde la vista en cuestión, para que pueda ser editado desde la vista, se puede implementar una contra función dentro del mismo dato o campo.

Pudiera ser de la siguiente manera:

class mi_clase(osv.Model):
    
    _inherit = 'account.invoice.line'
    
    def _actualiza_precio(self, cr, uid, ids, name, value, args, context=None):
        cr.execute('SELECT order_line_id FROM sale_order_line_invoice_rel WHERE invoice_id='+str(ids))
        id_order_line = cr.fetchall()
        if id_order_line:
            cr.execute('UPDATE sale_order_line SET precio_compra='+str(value)+' WHERE id='+str(id_order_line[0][0]))
        return True
        
    def _get_precio(self, cr, uid, ids, name_fields, args, context=None):
        res = {}        
        for inv_line in self.browse(cr, uid, ids, context):
            res[inv_line.id] = 0.00
            cr.execute('SELECT order_line_id FROM sale_order_line_invoice_rel WHERE invoice_id='+str(inv_line.id))
            id_order_line = cr.fetchall()
            if id_order_line:
                cr.execute('SELECT precio_compra FROM sale_order_line WHERE id='+str(id_order_line[0][0]))
                precio_compra = cr.fetchall()
                if precio_compra:
                    res[inv_line.id] = precio_compra[0][0]
        return res
    
    _columns = {
        'precio_compra': fields.function(_get_precio, type='float', 
            fnct_inv=_actualiza_precio, string='Precio de compra',
            digits=(10,2))
    }
    
mi_clase()

En el ejemplo anterior, se agrega una función inversa dentro del mismo campo, donde se realiza la actualización del valor desde la vista a través del método _actualiza_precio.

Como se puede apreciar, se realiza una actualización directa en la base de datos con un SQL común.

Advertisements

About felixurbina

Humano con todos los defectos y virtudes que vienen de fábrica.
This entry was posted in Odoo, OpenERP. Bookmark the permalink.

2 Responses to Campo tipo function en OpenERP (Odoo)

  1. Juan says:

    Buenas tardes quisiera hacer algo parecido pero solo con un fields.Char de un usuario que logea su nombre en ese fields al inicio de las vistas para que posteriormente mientras vaya recorriendo las vistas pueda mostrarse su nombre por default por lo que requiero de como plantearme la situacion?

    • felixurbina says:

      Qué tal Juan, creo que para esto, es un poco sencillo, siempre que un usuario se autentica en el sistema, en todas las tablas o casi todas las tablas, existe un campo que guarda el registro del usuario autenticado, solo deberías agregarlo para que se muestre si así lo deseas, no tengo instalado el Odoo como para hacer una prueba, pero pudieras buscar en las tablas el usuario autenticado y por cada vista, buscas el xml de la vista para que veas dónde pudiera estar, sin embargo, en la parte superior del sistema, siempre aparece el nombre de usuario autenticado.

      Si no es eso que te comento, ¿me pudieras hacer unas capturas de pantalla señalando lo que deseas?

      Saludos.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s