Publicidad

martes, 25 de febrero de 2020

Campo Binario B64 a Archivo Temporal Python

Binario B64 a Archivo Fisico Temporal


Ultimamente me han pedido desarrollar reportes en Excel, para esto me apoyo mucho de la libreria xlsxwriter o del modulo report_xlsx, pero muchas veces es necesario utilizar el logo dentro del reporte, en Qweb seria muy sencillo ya que la utilidad hace la conversión del binario, pero en mi caso no fue asi, existen 2 maneras de hacerlo metiendo la ruta fisica del archivo dentro de nuestro moulo o la segunda la cual vengo a enseñarles, guardar el campo a un archivo temporal, en el siguiente ejemplo cree 2 funciones para guardar el logo dato que requiero para dar formato a mi excel.


import tempfile
import base64
import binascii
import os

class ClaseOdoo(models.Model):
    _name = 'mi.clase'
    _inherit ='mi.clase'

    def b64str_to_tempfile(self, b64_str=None, file_suffix=None, file_prefix=None):
        """
        @param b64_str : Text in Base_64 format for add in the file
        @param file_suffix : Sufix of the file
        @param file_prefix : Name of file in TempFile
        """

        (fileno, fname) = tempfile.mkstemp(file_suffix, file_prefix)
        f = open(fname, 'wb')
        f.write(base64.decodestring(b64_str or ''))
        f.close()
        os.close(fileno)
        return fname



    def logo_b64_str_to_physical_file(self, b64_str, file_extension='png', prefix='company_logo'):

        certificate_lib = self.env['facturae.certificate.library']
        b64_temporal_route = self.b64str_to_tempfile(base64.encodestring(''), 
                                                          file_suffix='.%s' % file_extension, 
                                                          file_prefix='odoo__%s__' % prefix)
        _logger.info("\n### b64_temporal_route %s " % b64_temporal_route)
        ### Guardando el Logo  ###
        f = open(b64_temporal_route, 'wb')
        f.write(base64.b64decode(b64_str))
        f.close()
        file_result = open(b64_temporal_route, 'rb').read()
        return file_result, b64_temporal_route




Como paso final solo necesitamos el fragmento de codigo que llame a estas funciones:


        company_logo = self.env.user.company_id.logo
        print ("###### company_logo >>>>>>> ", company_logo)
        if company_logo:
            file_result_b64, logo_path_b64 = self.logo_b64_str_to_physical_file(company_logo, 'png', 'company_logo')
            print ("#### logo_path_b64 >>>>>>>> ",logo_path_b64)     
            image_module_path = logo_path_b64
        else:
            module_path = module.get_module_path('mi_modulo')
            #print "########## MODULE PATH >>> ",module_path
            image_module_path = module_path+'/static/img/logo.jpg'

0 comentarios:

Publicar un comentario