Seleccionar página

A veces podemos querer copiar sólo parte de un objeto a otro, y podemos encontrarnos con estructuras con bucles anidados, que no nos permiten aprovechar toda la potencia de los objetos de openerp, quedan poco elegantes y poco mantenibles.

Un objeto en OpenERP tiene la capacidad de exportar sus datos, con el método export_data. A este método le podemos pasar una lista de campos queremos exportar. Tenemos que tener en cuenta que el resultado lo devuelve de una forma un tanto extraña, en un diccionario de un solo elemento, de este estilo:

{ 
    "data": [
        ["valor_campo1", "valor_campo2"],
        ["valor_campo1", "valor_campo2"],
    ]
}

Para crear un objeto con los datos que hemos extraido, necesitamos convertirlos en un diccionario. Para esto vamos a haber guardado inicialmente la lista (en una lista) de elementos a exportar, con la cual llamaremos a la función to_export, para posteriormente poder utilizar la función zip. Esta función nos devolverá en base a dos listas un diccionario.

 

    zip([ clave1, clave2 ], [valor1, valor2]  )

Nos devolverá

{
    clave1 : valor1,
    clave2 : valor2
}

Normalmente querremos asociar a este nuevo objeto otros valores, que no hayan salido de ese modelo, para esto utilizamos el método update de un diccionario.

def on_action(self, cr, uid, ids, context=None):
    to_export = [
        'field1', 'field2', 'field3', 'field4',
    ]
    result = []
    item = {
        "state" : "copied"
    }

    object = self.browse(cr, uid, ids, context=context)

    item.update(dict(zip(
        to_export,
        object.export_data(to_export)['datas'][0])))
    self.pool.get('our_object').create(cr, uid, item)