Contexto (Transaction().context) no funciona al querer extender la class Report

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?

Hola Chicos

He logrado configurar el módulo, no era necesario el Pool.register_mixin, tan solo había que agregar la class GenPdfReport dentro del InvoiceReport

el resultado del test:

Saludos!

1 Like

Comparto mi logro con la comunidad, ya que puede servir como una nueva idea para Tryton o como una opción más:

el modulo usa a :

Saludos!

2 Likes

This topic was automatically closed 24 hours after the last reply. New replies are no longer allowed.