Recorrido de tablas en OpenERP (Odoo), ejemplos

En OpenERP existen múltiples métodos que se heredan de las clases principales de la herramienta para realizar consultas directas a la base de datos, dichos métodos, tienen sintaxis propias de OpenERP con la intención de realizar un desarrollo más rápido e intuitivo, sin embargo, al principio es un tanto engorroso comprender dichas sintaxis, acá dejaré algunos ejemplos de uso para browse(cr, uid, ids, context).

Dicho método, genera un objeto o una lista de una consulta, la sintaxis base del método es:

# -*- coding: utf-8 -*-

from openerp.osv import fields, osv

class mi_clase(osv.Model):

    _inherit = 'usuarios.estudiantes'

    var = self.browse(cr, uid, 4)
        
# Fin de mi_clase

En el ejemplo, estoy cargando la variable var con objeto lleno de una serie de datos que corresponden al registro número 4, de la tabla usuarios.estudiantes. Si la tabla contiene un campo llamado name, para visualizar dicho campo se haría de la siguiente manera:

print 'Nombre del estudiante: ', var.name

Si el registro contiene un campo múltiple que asocia datos de otra tabla, ejemplo un dato de tipo one2many, se pudiera recorrer dicho campo e imprimir sus respectivos resultados de la siguiente manera:

for item in var.materias_ids:
    print 'Materia: ', item.name
    print 'Profesor: ', item.profesor
    print 'Nota: %2.2f' % item.nota

Todo lo anterior corresponde al resultado de un registro específico, si deseamos obtener todos los registros de la misma tabla en cuestión, se tendría que usar el recurso alternativo del método search(cr, uid, domain, order), en el cual empleamos un domino igualado a sí mismo para que siempre sea verdadero y recorra todo el objeto o tabla, por ejemplo:

all_records = self.search(cr, uid, [(1, '=', 1)], order='id')

for item in self.browse(cr, uid, all_records, context):
    print 'Nombre del estudiante: ', item.name
    for j in item.materias_ids:
        print 'Materia: ', j.name
        print 'Profesor: ', j.profesor
        print 'Nota: %2.2f' % j.nota

El prefijo self usado en cada método, corresponde a la búsqueda propia en la clase y objetos o tablas propias de dicha clase.

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.

22 Responses to Recorrido de tablas en OpenERP (Odoo), ejemplos

  1. Francisco says:

    Hola, de donde es que sacas los comandos y funciones propios de Odoo ?? Tenes algun link con todos estos comandos y sintaxis completo ?? Gracias

    • felixurbina says:

      Qué tal Francisco, no tengo un enlace donde se publican todos esos comandos o clases, una parte las he leído desde un pequeño manual para desarrolladores que se llama: OpenERP Technical Memento; y otra parte la he ido sacando de leer los logs cada vez que uso una parte del sistema voy leyendo simultáneamente los logs y veo cómo se llama cada clase o método utilizado y de ahí obtengo una referencia más cercana que me permite buscar dentro del código base del sistema, luego determino si reuso el código de un método o desarrollo uno que se ajuste a mis necesidades.

      Saludos.

      • Francisco says:

        Gracias por tu pronta respuesta!! Te hago otra consultita si no te molesta.
        Tengo una tabla con vendedores y los dias de atencion de cada vendedor , y en el cliente(res.partner) tengo relacionada esta tabla vendedores con un campo many2one que me permite asignar un vendedor a un cliente. Pero ademas de seleccionar el vendedor que le corresponde a cada cliente, quiero que en el form de cliente me muestre los dias de atencion correspondientes a ese vendedor seleccionado(campo perteneciente al objeto vendedor). Como puedo hacer esto??
        Desde ya gracias.

      • felixurbina says:

        Qué tal Francisco. El sistema por defecto tiene un módulo de recursos humanos, a su vez, cuando instalas dicho módulo, puedes relacionar hr.employee con res.users, el vendedor asignado para cada cliente tiene una relación hacia res.users. Cuando tengas el módulo de recursos humanos instalado, puedes usar tiempos de trabajo de cada empleado, ahí de esas tablas puedes sacar el campo que quieres que aparezca en los días de atención de un vendedor. Es decir, una vez que tengas recursos humanos y su respectiva relación de res.users para cada empleado, asigna tiempos de trabajo y en res.partner, agrega un campo que relacione con un dominio el tiempo del vendedor que elijas al momento de crear el registro de vendedor para cliente. Sé que es un poco complejo pero instala los módulos y revisa, luego si tienes alguna duda me avisas y veré cómo pudiera guiarte de algún modo. Saludos.

  2. Francisco says:

    Nuevamente gracias por tu respuesta!! Mi duda puntual era : Al generar una relacion many2one entre un objeto(por ejemplo vendedor) y otro (por ejemplo cliente) como hago para que al seleccionar un vendedor dentro del combo de vendedores luego pueda seleccionar los campos propios de ese objeto vendedor desde el cliente. Simplificando, seria que en la relacion many2one no solo me traiga el campo name del objeto sino tambien sus atributos para que los pueda modificar

    • felixurbina says:

      Puedes agregar un atributo domain en el segundo campo en donde su criterio se determine el campo seleccionado, vendedor, y arroje la lista de opciones relacionadas con ese vendedor, ese campo secundario del tiempo, horario o tiempo de venta del vendedor, deberá tener un campo interno al cual hace referencia. Así es un poco difícil de explicar, sería, vendedor_id un many2one y luego un tiempo_id también many2one, en el campo tiempo_id colocas un atributo domain parecido a: domain=”[(‘user_id’, ‘=’, vendedor_id)]”

  3. David Ocampo says:

    Buenas felixurbina. Me gustan mucho sus tutoriales. Me han ayudado mucho sus tutoriales.
    Quería hacerle una consulta. Vos sabes cómo puedo hacer para agregar el nombre del usuario logueado a algún campo que lo agarre de forma automática?

    • felixurbina says:

      Hola David, gracias por el comentario.

      Puedes hacerlo de varias maneras, bien sea creando un campo de tipo function y que éste, tome el valor del usuario autenticado y lo muestre en la vista, haciendo énfasis que el campo de tipo function no se guarda el registro de lo mostrado debes agregar un atributo llamado store con valor True.

      También, pudiera ser creando el campo y haciendo una función alternativa que llene dicho campo desde el archivo .py donde está la clase de donde corresponde el campo.

      Te dejo los dos ejemplo en el siguiente enlace:

      http://pastebin.com/uCChcd1r

      Yo me inclino por el ejemplo 1.

      Saludos.

      • felixurbina says:

        Te repito, son ejemplos, será cuestión de asociar lo que tienes y cómo implementarlos.

        Saludos.

      • David Ocampo says:

        Muchas gracias de verdad por su pronta respuesta, me ayuda bastante este ejemplo. En el xml debo agregar algo más aparte de la llamada al campo para la vista? Es que algo no estoy haciendo bien por eso no me llama el usuario.

        Mi ejemplo en Python

        class purchase_order(osv.osv):
        _name = ‘purchase.order’ # Aqui va el mismo nombre de la clase que se hereda
        _inherit = ‘purchase.order’ # Permite la herencia propiamente dicho del modulo res.partner

        def _get_name_rel(self, cr, uid, ids, fields_name, args, context=None):
        res = {}
        for i in self.browse(cr, uid, ids, context):
        res[i.id] = ”
        if i.res_user:
        res[i.id] = i.res_user.name
        return res

        _columns = {
        ‘usuario_id’: fields.function(_get_name_rel, type=’char’, string=’Usuario’, store=True, help=”Toma usuario logueado$
        ‘firma’: fields.char(string=’Firma’),
        }

        purchase_order()

        En XML llamo el campo así.

      • David Ocampo says:

        field name=”usuario_id”/

        usuario_id’: fields.function(_get_name_rel, type=’char’, string=’Usuario’, store=True,

  4. David Ocampo says:

    El fields_name para que se utiliza Felixurbina?

    • felixurbina says:

      Qué tal David, leí tus mensajes pero no he tenido chance de contestar. No he estudiado formalmente el código de OpenERP, sin embargo, he visto que el fields_name es un parámetro obligatorio y no he visto si traduce algún valor que se pasa cuando se usa de esa manera un método en las clases. Pero siempre lo necesita al igual que args.

      Lo otro, es probable que sea la interpretación del tipo de campo function con sus respectivos atributos y los atributos son el grupo fields_name y args sus respectivos valores.

      Por otro lado, en el xml de tu vista, solo muestra el campo que creaste sin nada adicional, el método por detrás hará el trabajo de hacer la búsqueda del valor que corresponde y retornarlo a tu campo en la vista xml.

      Si logro tener tiempo para hacer un pequeño ejercicio te lo paso.

      Saludos.

      • David Ocampo says:

        Buenos días Felix.
        Lograste ver mí código o necesitas algo más?
        Disculpa la molestia y gracias por la ayuda.

      • felixurbina says:

        Qué tal David, sinceramente no he tenido el chance de verlo, tengo una conexión a Internet muy limitada en tiempo.

      • David Ocampo says:

        Bueno Felix no se preocupe, en cuanto puedas lo ves. Más bien le agradezco la ayuda brindada.

      • David Ocampo says:

        Buenas Felix.
        Disculpa la molestia, le escribí al correo.
        Que pase buen día.
        Gracias.

      • felixurbina says:

        Qué tal David, he estado pendiente para revisar, pero también he tenido bastante trabajo y no me ha dado chance. Voy a copiar el código para llevarlo a la casa.

      • David Ocampo says:

        Buenos días Felix.
        Muchas gracias más bien por responder.
        Me dijeron que utilizando este código self.pool.get(‘res.users’).browse(cr,uid,uid).name
        ¿Qué opinas?

  5. David Ocampo says:

    Muchas gracias Felixurbina de verdad en cuanto puedas acá le dejo mí correo. docampolcr@openmailbox.org. Muchas gracias por la ayuda.

  6. David Ocampo says:

    Felix si gustas me envías un correo y le mando mí código, para ver si me puedes brindar una luz. Le agradezco y disculpa la molestia.

  7. David Ocampo says:

    Ya le envié el código Felix cualquier cosa y gracias por la ayuda.

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