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.

Asesoria Especializada

Consultoria desde $15 USD por Hora.

Publicidad

jueves, 18 de agosto de 2016

Solución a la lectura de Registros por permisos Ocultos en Odoo

Saltarnos algunas Reglas de Lectura de Registros en Odoo



    Este pequeño fragmento de Código es un ejemplo sobre como poder saltarse las reglas de lectura de registros para algunas clases, les contare un poco que me orillo a esta solución un poco agresiva, esto lo he tenido que hacer para un Cliente que tiene desarrollos de Terceros, por alguna circunstancia dentro de algún modulo existe un fragmento de Código que limita al usuario a solo visualizar sus Registros Creados sin utilizar las Reglas de Odoo, buscando dentro de todos los módulos no encontré ese fragmento y me puse a pensar una solución a este detalle y se me ocurrió usar la librería SUPERUSER_ID de Odoo y pasarla al método principal de búsqueda, esto ayuda a poder usar el Root de Odoo y visualizar la información sin problema, el ejemplo siguiente es para la tabla de Albaranes o Movimientos de Almacén:


class stock_picking(osv.osv):
    _name = 'stock.picking'
    _inherit ='stock.picking'
    _columns = {
        }

    _defaults = {
        }

    ########## METODOS PARA VOLARNOS LAS REGLAS DE LECTURA DE REGISTROS #############

    def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
        from openerp import SUPERUSER_ID

        res = super(stock_picking, self).fields_view_get(cr, SUPERUSER_ID, view_id, view_type, context=context,
        toolbar=toolbar, submenu=submenu)
        
        return res

    def search(self, cr, uid, args, offset=0, limit=None, order=None,
            context=None, count=False):
        from openerp import SUPERUSER_ID

        res = super(stock_picking, self).search(cr, SUPERUSER_ID, args, offset, limit, order,
            context, count)
        return res

Podríamos mejorar un poco el codigo añadiendo algunas normas de lectura, etc...

Notas: El ejemplo esta hecho para OpenERP 7 y Odoo 8, para Odoo 9 solo sustituimos la herencia y los métodos por la API.


Espero les sea de utilidad.

martes, 2 de agosto de 2016

Consultar las Tablas Relacionales Many2many en Odoo 9

Como encontrar las tablas resultantes de campos Many2many en Odoo 9



    Dentro de los muchos cambios que estamos observando en la API de odoo y para los que venimos de la programación de módulos en versiones inferiores a odoo (openerp) notamos una dificultad en los campos relacionales, en openerp 7 hacia abajo uno de los atributos que necesitabas para poder declarar un campo de tipo many2many era el nombre de la tabla relacion, por ejemplo la clase purchase.order (compras) y la relacion con account.invoice (facturas), esta relacion de tipo many2many estaba declarada de la siguiente manera:

'invoice_ids': fields.many2many('account.invoice',
               'purchase_invoice_rel', 
               'purchase_id', 'invoice_id', 
               'Invoices', help="Invoices generated for a purchase order"),

A simple vista identificamos la tabla resultante de la relación llamada purchase_invoice_rel.


En la API de odoo ya no es necesario indicar el nombre de la tabla relación, esta se creara de forma interna, aunque si nosotros la indicamos en la declaración del campo odoo respetara ese atributo. El mismo ejemplo anterior con la API de Odoo seria:

invoice_ids = fields.Many2many('account.invoice',
              compute="_compute_invoice", string='Invoices', copy=False)

A simple vista no podemos identificar la tabla resultante de la misma relación, para ello debemos consultar la tabla ir_model_relation  a nivel base de datos y buscarla de forma manual, es una tarea un poco mas compleja,pero al final nos ayudara un poco y nos evitara buscar en todo el codigo del modulo:

select * from ir_model_relation where name like '%order%'


Si queremos ver todas las relaciones creadas en nuestra Base de Datos:

select * from ir_model_relation order by name

Una alternativa es consultando los atributos del campo, en la tabla ir_model_fields:

select * from ir_model_fields where model = 'purchase.order' and name='invoice_ids'

Nota:
         Debemos asegurarnos que el campo que vayamos a consultar el modulo que lo contiene este instalado en la base de datos.