Hola chicos,
Estoy creando un modulo para generar reportes en pdf, usando una librería en rust.
Mirando algunos ejemplos extendí la class Report con una class GenPdfReport usando el Pool.register_mixin
funciona bien la extensión, puedo heredar las funciones de la class Report, funciona muy bien el report_context, pero no funciona el Transaction().contexten la class GenPdfReport para hacer el get de una variable, que fue asignada desde el report de una factura.
algo de código para explicar:
parte de la clase GenPdfReport
class GenPdfReport:
@classmethod
def execute(cls, ids, data):
if Transaction().context.get('use_genpdf', False) == True:
action_report, report_context = cls.get_data_execute(ids, data)
if "genpdf_doc" in report_context:
content = cls.render_genpdf(action_report, report_context["genpdf_doc"])
return ("pdf", content, action_report.direct_print, action_report.name)
else:
raise ValueError("not genpdfdoc in report_context")
else:
return super().execute(ids, data)
siempre se mantiene en False la variable use_genpdf
el get_data_execute es codigo de la class Padre que debo repetir para recuperar el el action_report y el report_context
la class Invoice que esta en este nuevo modulo:
class InvoiceReport(metaclass=PoolMeta):
__name__ = 'account.invoice'
@classmethod
def execute(cls, ids, data):
with Transaction().set_context(use_genpdf=True) :
return super().execute(ids, data)
@classmethod
def get_genpdf_doc(cls, context):
dir_now = os.path.dirname(os.path.abspath(__file__))
build_report = load_module(dir_now +"/build_report_invoice.py")
return build_report.load_report(context)
@classmethod
def get_context(cls, records, header, data):
context = super().get_context(records, header, data)
Transaction().set_context(use_genpdf=True)
pool = Pool()
Date = pool.get('ir.date')
context['invoice'] = context['record']
with Transaction().set_context(company=context['invoice'].company.id):
context['today'] = Date.today()
doc = cls.get_genpdf_doc(context)
context['genpdf_doc'] = doc
return context
como no logré usar la transaction tuve que hacer algo temporal así:
class GenPdfReport:
@classmethod
def execute(cls, ids, data):
#por ahora va a realizar 2 veces el check_access en caso que no se use genpdf
action_report, report_context = cls.get_data_execute(ids, data)
if "genpdf_doc" in report_context:
content = cls.render_genpdf(action_report, report_context["genpdf_doc"])
return ("pdf", content, action_report.direct_print, action_report.name)
else:
return super().execute(ids, data)
que podría ser?
