informe personalizado a través de python odoo 9

¿Cómo pasar datos de múltiples módulos a un informe QWeb? ¿Hay algo similar a pasar un diccionario al renderizar html desde el controlador?

class account(model.Models): _name = 'account.main' name = fields.Char() class accountSub(model.Models): _name = 'account.sub' name = fields.Char() class PrintWizard(model.Models): _name = 'print.report' account = fields.Many2one('erp.account') @api.multi def print_report(self): ctx = self.env.context.copy() ctx.update({'domain':[('name','=',self.account.name)]}) self.with_context(ctx) return {'name': 'Report', 'type': 'ir.actions.report.xml', 'report_name': 'erp.report_id', 'report_type': 'qweb-pdf'} class ErpReport(models.AbstractModel): _name = "report.erp.report_id" @api.multi def print_report(self) domain = self.env.context.get('domain') print(domain) #Print result was None main = self.env['account.main'].search(domain) sub = self.env['account.sub'].search([]) docs = { 'docs1': main, 'docs2': sub, } return self.env['report'].render('erp.report', docs) 

QWeb

     

Pasar datos a través del contexto no funciona. Intenté imprimir el dominio en la clase abstracta que no devuelve ninguno. pero en mi asistente está bien

Si desea ejecutar un código específico antes de que se imprima su informe o pasar datos personalizados a su plantilla para renderizar, puede crear un modelo abstracto que defina una función render_html para que su función se ejecute al imprimir el informe en lugar de la función odoo genérica. A esto se hace referencia en la documentación AQUÍ.

Echale un vistazo a éste ejemplo.

 from openerp import models, fields, api, exceptions class YourReport(models.AbstractModel): _name = 'report.your_addon.report_template_id' @api.multi def render_html(self, data=None): report_obj = self.env['report'] report = report_obj._get_report_from_name('your_addon.report_template_id') model1_docs = self.env['your_addon.your_model1'].search([('something','=','something')]) model2_docs = self.env['your_addon.your_model2'].search([('something','=','something')]) docargs = { 'doc_model': report.model, 'model1_docs': model1_docs, 'model2_docs': model2_docs, } return report_obj.render('your_addon.report_template_id', docargs) 

ACTUALIZACIÓN CON CONTEXTO MODIFICADO:

Para llamar a su informe con un contexto modificado, intente lo siguiente (sin probar). No pude encontrar ningún ejemplo de informes de llamadas con contexto modificado, sin embargo, no se veía ampliamente.

 ctx = self.env.context.copy() ctx.update({'domain':[('something','=','something')]}) self.with_context(ctx) return { 'name':'Report', 'type':'ir.actions.report.xml, 'report_name':'your_addon.report_template_id', 'report_type':'qweb-pdf' } 

Luego, desde su función de informe que definimos anteriormente, debería poder acceder al contexto a través de su entorno.

 domain = self.env.context.get('domain') 

Deberá crear una función en su asistente que llame al informe que pasa el contexto.

A continuación se muestra el código para crear un informe de modelo personalizado que se envuelve en la API v9. Crear un informe de objeto personalizado es un proceso de tres pasos

  1. Crear RML Prase Objeto de informe personalizado
  2. Ajustar informe RML a AbstractModel Informe para motor qweb.
  3. Plantilla de diseño para el objeto personalizado.
  4. Registre su registro bajo informe.

Todas las cuatro partes enumeradas aquí con posible código de ejemplo.

RML Prase Objeto de informe personalizado

 import time from openerp.osv import osv from openerp.report import report_sxw class CustomReportPrint(report_sxw.rml_parse): def __init__(self, cr, uid, name, context): super(CustomReportPrint, self).__init__(cr, uid, name, context=context) self.localcontext.update({ 'time': time, 'lst': self._lst, 'total': self._some_total, 'get_records':self._get_records, }) def _get_records(self, res_ids): records = self.pool.get('res.partner').browse(self.cr, self.uid, res_ids) return records def _lst(self, employee_id, dt_from, dt_to, max, *args): #Your code goes here return res def _some_total(self, employee_id, dt_from, dt_to, max, *args): #Your code goes here return [result_dict] 

Envolviendo el objeto RML Prase al motor QWeb.

 class report_custom_print(osv.AbstractModel): _name = 'report..report_custom_print' _inherit = 'report.abstract_report' _template = '.report_custom_print' _wrapped_report_class = CustomReportPrint 

El aspecto del informe XML se muestra a continuación como puede ver. Estoy llamando a get_records desde el modelo de informe personalizado.

       

Informe de registro

   Custom Print Report qweb-pdf res.partner .report_custom_print .report_custom_print  

En el objeto de informe Rml personalizado, puede definir tantas funciones como desee y registrarlas en __int__ y puede llamar a esas funciones directamente en yor rpeort y mutlatar los datos que necesite.

PD: reemplaza con tu módulo para que el ingenio funcione correctamente.

Espero que esto ayude.