Operaciones con recordsets
A partir de la versión 8 Odoo permite operaciones sobre sus recordsets (algo bastante común en la librería pandas). Uno puede aplicar tres operaciones sobre los recordsets en Odoo: filtered, sorted y mapped. Aca vamos a explicar las dos primeras y veremos como se utilizaron en el IVA Digital, donde se aplican extensivamente.
Que es un recordset?
Un recordset es un conjunto de objetos en Odoo. Puede ser por ejemplo las líneas de impuestos asociadas a las facturas:
move_tax_ids = inv.move_tax_ids
Esto devuelve una lista de objetos del modelo account.move.tax. Algo lindo de los mismos, pueden ser iterados.
filtered
Filtra un recordset en base a una función lambda. En el IVA Digital lo podemos ver por ejemplo cuando queremos iterar un recordset de los impuestos de tipo IVA que están relacionados con una factura
for move_tax in inv.move_tax_ids.filtered(lambda l: l.tax_id.tax_group_id.tax_type == 'vat'):
En este ejemplo iteramos los impuestos cuyo grupo son del tipo IVA. Otro ejemplo es, supongamos que queremos obtener la cantidad de alícuotas de IVA presentes en una factura
cantidad = len(inv.move_tax_ids.filtered(lambda l: l.tax_id.tax_group_id.tax_type == 'vat'))
mapped
Permite obtener una lista de campos (o resultado de una función) de un recordset. Supongamos que queremos sumar los montos de los impuestos de IIBB de una factura
perception_amount = sum(inv.move_tax_ids.\
filtered(lambda l: l.tax_id.tax_group_id.tax_type == 'withholdings' and l.tax_id.tax_group_id.l10n_ar_tribute_afip_code in ['07']).\
mapped('tax_amount'))
sorted
Tambien existe otra función llamada sorted que permite ordenar un recordset (por ejemplo, si queremos ordenar las alicuotas en base al código de la alícuota)
alicuotas = inv.move_tax_ids.filtered(lambda l: l.tax_id.tax_group_id.tax_type == 'vat').sorted(lambda l: l.tax_id.tax_group_id.l10n_ar_vat_afip_code)
Conclusión
Las operaciones sobre los recordsets son herramientas muy poderosas de programación en Odoo. Uno debe aprenderlas porque reducen en forma notoria la cantidad de código y la posibilidad de errores.
Acerca de:
Gustavo Orrillo
Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.