예제 #1
0
    def create_aeroo_report(self, cr, uid, ids, data, report_xml, context=None, output='odt'):
        """ Returns an aeroo report generated with aeroolib
        """
        pool = pooler.get_pool(cr.dbname)
        if not context:
            context={}
        context = context.copy()
        if self.name=='report.printscreen.list':
            context['model'] = data['model']
            context['ids'] = ids

        print_id = context.get('print_id', False)
        aeroo_print = self.active_prints[print_id] # Aeroo print object
        aeroo_print.subreports = []
        #self.oo_subreports[print_id] = []
        objects = self.getObjects_mod(cr, uid, ids, report_xml.report_type, context) or []
        oo_parser = self.parser(cr, uid, self.name2, context=context)
        oo_parser.localcontext.update(context)
        oo_parser.set_context(objects, data, ids, report_xml.report_type)

        self.set_xml_data_fields(objects, oo_parser) # Get/Set XML

        oo_parser.localcontext['data'] = data
        oo_parser.localcontext['user_lang'] = context.get('lang', False)
        if len(objects)>0:
            oo_parser.localcontext['o'] = objects[0]
        xfunc = ExtraFunctions(cr, uid, report_xml.id, oo_parser.localcontext)
        oo_parser.localcontext.update(xfunc.functions)

        #company_id = objects and 'company_id' in objects[0]._table._columns.keys() and \
        #                        objects[0].company_id and objects[0].company_id.id or False # for object company usage
        company_id = False
        style_io=self.get_styles_file(cr, uid, report_xml, company=company_id, context=context)

        if report_xml.tml_source in ('file', 'database'):
            if not report_xml.report_sxw_content or report_xml.report_sxw_content=='False':
                raise osv.except_osv(_('Error!'), _('No template found!'))
            file_data = base64.decodestring(report_xml.report_sxw_content)
        else:
            file_data = self.get_other_template(cr, uid, data, oo_parser)
        if not file_data and not report_xml.report_sxw_content:
            self.logger("End process %s (%s), elapsed time: %s" % (self.name, self.table, time.time() - aeroo_print.start_time), logging.INFO) # debug mode
            return False, output
        #elif file_data:
        #    template_io = StringIO()
        #    template_io.write(file_data or report_xml.report_sxw_content)
        #    basic = Template(source=template_io, styles=style_io)
        else:
            if report_xml.preload_mode == 'preload' and hasattr(self, 'serializer'):
                serializer = copy.copy(self.serializer)
                serializer.apply_style(style_io)
                template_io = serializer.template
            else:
                template_io = StringIO()
                template_io.write(file_data or base64.decodestring(report_xml.report_sxw_content) )
                serializer = OOSerializer(template_io, oo_styles=style_io)
            try:
                basic = Template(source=template_io, serializer=serializer)
            except Exception, e:
                self._raise_exception(e, print_id)
예제 #2
0
    def _render_aeroo(self, template, data, output_format):
        """Generate the aeroo report binary from the template.

        :param template: the Libreoffice template to use
        :param data: the data used for rendering the report
        :param output_format: the output format
        :return: the report's binary data
        """
        # The first given record is
        template_io = BytesIO()
        template_io.write(template)
        serializer = OOSerializer(template_io)

        report_context = GenshiContext(**data)
        report_context.update(self._get_aeroo_extra_functions())
        report_context['t'] = AerooNamespace()

        output = Template(source=template_io, serializer=serializer)\
            .generate(report_context).render().getvalue()

        if self.aeroo_in_format != output_format:
            output = self._convert_aeroo_report(output, output_format)

        return output
예제 #3
0
    def create_aeroo_report(self, cr, uid, ids, data, report_xml, context):
        """ Return an aeroo report generated with aeroolib
        """
        context = context.copy()
        assert report_xml.out_format.code in (
            'oo-odt',
            'oo-ods',
            'oo-doc',
            'oo-xls',
            'oo-csv',
            'oo-pdf',
        )
        assert report_xml.in_format in ('oo-odt', 'oo-ods')

        output_format = report_xml.out_format.code[3:]
        input_format = report_xml.in_format[3:]

        oo_parser = self.parser(cr, uid, self.name2, context=context)

        env = Environment(cr, uid, context)
        objects = env[self.table].browse(ids)

        oo_parser.localcontext.update(context)
        oo_parser.set_context(objects, data, ids, report_xml.report_type)

        oo_parser.localcontext['data'] = data
        oo_parser.localcontext['user_lang'] = context.get('lang', False)
        oo_parser.localcontext['o'] = objects[0]

        xfunc = ExtraFunctions(cr, uid, report_xml.id, oo_parser.localcontext)
        oo_parser.localcontext.update(xfunc.functions)

        template = report_xml.get_aeroo_report_template(objects[0])

        template_io = StringIO()
        template_io.write(template)
        serializer = OOSerializer(template_io)
        basic = Template(source=template_io,
                         serializer=serializer,
                         lookup=DynamicLookup)

        data = basic.generate(**oo_parser.localcontext).render().getvalue()

        if input_format != output_format:
            temp_file = self.generate_temporary_file(cr, uid, ids, data,
                                                     input_format)
            filedir, filename = os.path.split(temp_file.name)

            libreoffice_location = (
                report_xml.env['ir.config_parameter'].get_param(
                    'report_aeroo.libreoffice_location'))

            if not libreoffice_location:
                raise ValidationError(
                    _('Aeroo reports are wrongly configured. '
                      'The global parameter report_aeroo.libreoffice_location '
                      'must be defined.'))

            cmd = [
                libreoffice_location, "--headless", "--convert-to",
                output_format, "--outdir", filedir, temp_file.name
            ]

            self.run_subprocess(cr, uid, ids, report_xml, temp_file, cmd)

            output_filename = temp_file.name[:-3] + output_format

            with open(output_filename, 'r') as f:
                data = f.read()

            os.remove(temp_file.name)
            os.remove(output_filename)

        return data, output_format
예제 #4
0
    def create_aeroo_report(self, cr, uid, ids, data, report_xml, context=None, output='odt'):
        """ Returns an aeroo report generated with aeroolib
        """
        pool = pooler.get_pool(cr.dbname)
        if not context:
            context={}
        context = context.copy()
        if self.name=='report.printscreen.list':
            context['model'] = data['model']
            context['ids'] = ids
        
        objects = not context.get('no_objects', False) and self.getObjects_mod(cr, uid, ids, report_xml.report_type, context) or []
        oo_parser = self.parser(cr, uid, self.name2, context=context)

        oo_parser.objects = objects
        self.set_xml_data_fields(objects, oo_parser) # Get/Set XML

        oo_parser.localcontext['objects'] = objects
        oo_parser.localcontext['data'] = data
        oo_parser.localcontext['user_lang'] = context.get('lang', False)
        if len(objects)==1:
            oo_parser.localcontext['o'] = objects[0]
        xfunc = ExtraFunctions(cr, uid, report_xml.id, oo_parser.localcontext)
        oo_parser.localcontext.update(xfunc.functions)

        company_id = objects and 'company_id' in objects[0]._table._columns.keys() and \
                                objects[0].company_id and objects[0].company_id.id or False # for object company usage
        style_io=self.get_styles_file(cr, uid, report_xml, company=company_id, context=context)

        if report_xml.tml_source in ('file', 'database'):
            file_data = base64.decodestring(report_xml.report_sxw_content)
        else:
            file_data = self.get_other_template(cr, uid, data, oo_parser)
        if not file_data and not report_xml.report_sxw_content:
            return False, output
        #elif file_data:
        #    template_io = StringIO()
        #    template_io.write(file_data or report_xml.report_sxw_content)
        #    basic = Template(source=template_io, styles=style_io)
        else:
            if report_xml.preload_mode == 'preload' and hasattr(self, 'serializer'):
                serializer = copy.copy(self.serializer)
                serializer.apply_style(style_io)
                template_io = serializer.template
            else:
                template_io = StringIO()
                template_io.write(file_data or base64.decodestring(report_xml.report_sxw_content) )
                serializer = OOSerializer(template_io, oo_styles=style_io)
            basic = Template(source=template_io, serializer=serializer)

        #if not file_data:
        #    return False, output

        #basic = Template(source=template_io, serializer=serializer)

        aeroo_ooo = context.get('aeroo_ooo', False)
        oo_parser.localcontext['include_subreport'] = self._subreport(cr, uid, output='odt', aeroo_ooo=aeroo_ooo, context=context)
        oo_parser.localcontext['include_document'] = self._include_document(aeroo_ooo)

        ####### Add counter functons to localcontext #######
        oo_parser.localcontext.update({'def_inc':self._def_inc,
                                      'get_inc':self._get_inc,
                                      'prev':self._prev,
                                      'next':self._next})

        user_name = pool.get('res.users').browse(cr, uid, uid, {}).name
        model_id = pool.get('ir.model').search(cr, uid, [('model','=',context['active_model'])])[0]
        model_name = pool.get('ir.model').browse(cr, uid, model_id).name

        #basic = Template(source=None, filepath=odt_path)

        basic.Serializer.add_title(model_name)
        basic.Serializer.add_creation_user(user_name)
        module_info = load_information_from_description_file('report_aeroo')
        version = module_info['version']
        basic.Serializer.add_generator_info('Aeroo Lib/%s Aeroo Reports/%s' % (aeroolib.__version__, version))
        basic.Serializer.add_custom_property('Aeroo Reports %s' % version, 'Generator')
        basic.Serializer.add_custom_property('OpenERP %s' % release.version, 'Software')
        basic.Serializer.add_custom_property(module_info['website'], 'URL')
        basic.Serializer.add_creation_date(time.strftime('%Y-%m-%dT%H:%M:%S'))

        try:
            data = basic.generate(**oo_parser.localcontext).render().getvalue()
        except Exception, e:
            tb_s = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback))
            self.logger(_("Report generation error!")+'\n'+tb_s, netsvc.LOG_ERROR)
            for sub_report in self.oo_subreports:
                os.unlink(sub_report)
            raise Exception(_("Aeroo Reports: Error while generating the report."), e, str(e), _("For more reference inspect error logs."))
예제 #5
0
    def complex_report(self, docids, data, report, ctx):
        """ Returns an aeroo report generated by aeroolib
        """
        self.model = ctx.get('active_model', False)
        # tmpl_type = 'odt'
        self.record_ids = docids
        self.ctx = ctx
        self.company = self.env.user.company_id
        self.report = report

        #=======================================================================
        def barcode(barcode_type,
                    value,
                    width=600,
                    height=100,
                    humanreadable=0):
            # TODO check that asimage and barcode both accepts width and height
            img = self.env['ir.actions.report'].barcode(
                barcode_type,
                value,
                width=width,
                height=height,
                humanreadable=humanreadable)
            return self._asimage(base64.b64encode(img))

        self.localcontext = {
            'user': self.env.user,
            'user_lang': ctx.get('lang', False),
            'data': data,
            'time': time,
            'asarray': self._asarray,
            'average': self._average,
            'currency_to_text': self._currency_to_text,
            'asimage': self._asimage,
            'get_selection_item': self._get_selection_items('item'),
            'get_selection_items': self._get_selection_items(),
            'get_log': self._get_log,
            'asarray': self._asarray,
            '__filter': self.__filter,  # Don't use in the report template!
            'getLang': self._get_lang,
            'setLang': self._set_lang,
            'formatLang': self._format_lang,
            '_': self._translate_text,
            'gettext': self._translate_text,
            'test': self.test,
            'fields': fields,
            'company': self.env.user.company_id,
            'barcode': barcode,
        }
        self.localcontext.update(ctx)
        self._set_lang(self.company.partner_id.lang)
        self._set_objects(self.model, docids)

        file_data = None
        if report.tml_source == 'database':
            if not report.report_data or report.report_data == 'False':
                # TODO log report ID etc.
                raise MissingError(
                    _("Aeroo Reports could'nt find report template"))
            file_data = b64decode(report.report_data)
        elif report.tml_source == 'file':
            if not report.report_file or report.report_file == 'False':
                # TODO log report ID etc.
                raise MissingError(
                    _("No Aeroo Reports template filename provided"))
            file_data = report._read_template()
        else:
            rec_id = ctx.get('active_id', data.get('id')) or data.get('id')
            file_data = self.get_other_template(self.model, rec_id)

        if not file_data:
            # TODO log report ID etc.
            raise MissingError(
                _("Aeroo Reports could'nt find report template"))

        template_io = BytesIO(file_data)
        if report.styles_mode == 'default':
            serializer = OOSerializer(template_io)
        else:
            style_io = BytesIO(self.get_stylesheet(report))
            serializer = OOSerializer(template_io, oo_styles=style_io)

        basic = Template(source=template_io,
                         serializer=serializer,
                         lookup=StrictLookup)

        # Add metadata
        ser = basic.Serializer
        model_obj = self.env.get('ir.model')
        model_name = model_obj.search([('model', '=', self.model)])[0].name
        ser.add_title(model_name)

        user_name = self.env.user.name
        ser.add_creation_user(user_name)

        module_info = load_information_from_description_file('report_aeroo')
        version = module_info['version']
        ser.add_generator_info('Aeroo Lib/%s Aeroo Reports/%s' %
                               (aeroolib_version, version))
        ser.add_custom_property('Aeroo Reports %s' % version, 'Generator')
        ser.add_custom_property('Odoo %s' % odoo_release.version, 'Software')
        ser.add_custom_property(module_info['website'], 'URL')
        ser.add_creation_date(time.strftime('%Y-%m-%dT%H:%M:%S'))

        file_data = basic.generate(**self.localcontext).render().getvalue()
        #=======================================================================
        code = mime_dict[report.in_format]
        #_logger.info("End process %s (%s), elapsed time: %s" % (self.name, self.model, time.time() - aeroo_print.start_time), logging.INFO) # debug mode

        return file_data, code
예제 #6
0
파일: translate.py 프로젝트: YacineTI/aeroo
def extend_trans_generate(lang, modules, cr):
    dbname = cr.dbname

    pool = pooler.get_pool(dbname)
    trans_obj = pool.get('ir.translation')
    model_data_obj = pool.get('ir.model.data')
    uid = 1
    l = pool.models.items()
    l.sort()

    query = 'SELECT name, model, res_id, module'    \
            '  FROM ir_model_data'

    query_models = """SELECT m.id, m.model, imd.module
            FROM ir_model AS m, ir_model_data AS imd
            WHERE m.id = imd.res_id AND imd.model = 'ir.model' """

    if 'all_installed' in modules:
        query += ' WHERE module IN ( SELECT name FROM ir_module_module WHERE state = \'installed\') '
        query_models += " AND imd.module in ( SELECT name FROM ir_module_module WHERE state = 'installed') "
    query_param = None
    if 'all' not in modules:
        query += ' WHERE module IN %s'
        query_models += ' AND imd.module in %s'
        query_param = (tuple(modules), )
    query += ' ORDER BY module, model, name'
    query_models += ' ORDER BY module, model'

    cr.execute(query, query_param)

    _to_translate = []

    def push_translation(module, type, name, id, source, comments=None):
        tuple = (module, source, name, id, type, comments or [])
        # empty and one-letter terms are ignored, they probably are not meant to be
        # translated, and would be very hard to translate anyway.
        if not source or len(source.strip()) <= 1:
            _logger.debug("Ignoring empty or 1-letter source term: %r", tuple)
            return
        if tuple not in _to_translate:
            _to_translate.append(tuple)

    def encode(s):
        if isinstance(s, unicode):
            return s.encode('utf8')
        return s

    for (xml_name, model, res_id, module) in cr.fetchall():
        module = encode(module)
        model = encode(model)
        xml_name = "%s.%s" % (module, encode(xml_name))

        if not pool.get(model):
            _logger.error("Unable to find object %r", model)
            continue

        exists = pool.get(model).exists(cr, uid, res_id)
        if not exists:
            _logger.warning("Unable to find object %r with id %d", model,
                            res_id)
            continue
        obj = pool.get(model).browse(cr, uid, res_id)

        if model == 'ir.ui.view':
            d = etree.XML(encode(obj.arch))
            #for t in trans_parse_view(d):
            #    push_translation(module, 'view', encode(obj.model), 0, t)
            trans_parse_view(
                d, lambda t, s: push_translation(module, 'view',
                                                 encode(obj.model), 0, t))

        elif model == 'ir.actions.wizard':
            service_name = 'wizard.' + encode(obj.wiz_name)
            import openerp.netsvc as netsvc
            if netsvc.Service._services.get(service_name):
                obj2 = netsvc.Service._services[service_name]
                for state_name, state_def in obj2.states.iteritems():
                    if 'result' in state_def:
                        result = state_def['result']
                        if result['type'] != 'form':
                            continue
                        name = "%s,%s" % (encode(obj.wiz_name), state_name)

                        def_params = {
                            'string': ('wizard_field', lambda s: [encode(s)]),
                            'selection': ('selection', lambda s: [
                                encode(e[1])
                                for e in ((not callable(s)) and s or [])
                            ]),
                            'help': ('help', lambda s: [encode(s)]),
                        }

                        # export fields
                        if not result.has_key('fields'):
                            _logger.warning("res has no fields: %r", result)
                            continue
                        for field_name, field_def in result[
                                'fields'].iteritems():
                            res_name = name + ',' + field_name

                            for fn in def_params:
                                if fn in field_def:
                                    transtype, modifier = def_params[fn]
                                    for val in modifier(field_def[fn]):
                                        push_translation(
                                            module, transtype, res_name, 0,
                                            val)

                        # export arch
                        arch = result['arch']
                        if arch and not isinstance(arch, UpdateableStr):
                            d = etree.XML(arch)
                            for t in trans_parse_view(d):
                                push_translation(module, 'wizard_view', name,
                                                 0, t)

                        # export button labels
                        for but_args in result['state']:
                            button_name = but_args[0]
                            button_label = but_args[1]
                            res_name = name + ',' + button_name
                            push_translation(module, 'wizard_button', res_name,
                                             0, button_label)

        elif model == 'ir.model.fields':
            try:
                field_name = encode(obj.name)
            except AttributeError, exc:
                _logger.error("name error in %s: %s", xml_name, str(exc))
                continue
            objmodel = pool.get(obj.model)
            if not objmodel or not field_name in objmodel._columns:
                continue
            field_def = objmodel._columns[field_name]

            name = "%s,%s" % (encode(obj.model), field_name)
            push_translation(module, 'field', name, 0,
                             encode(field_def.string))

            if field_def.help:
                push_translation(module, 'help', name, 0,
                                 encode(field_def.help))

            if field_def.translate:
                ids = objmodel.search(cr, uid, [])
                obj_values = objmodel.read(cr, uid, ids, [field_name])
                for obj_value in obj_values:
                    res_id = obj_value['id']
                    if obj.name in ('ir.model', 'ir.ui.menu'):
                        res_id = 0
                    model_data_ids = model_data_obj.search(
                        cr, uid, [
                            ('model', '=', model),
                            ('res_id', '=', res_id),
                        ])
                    if not model_data_ids:
                        push_translation(module, 'model', name, 0,
                                         encode(obj_value[field_name]))

            if hasattr(field_def, 'selection') and isinstance(
                    field_def.selection, (list, tuple)):
                for dummy, val in field_def.selection:
                    push_translation(module, 'selection', name, 0, encode(val))

        elif model == 'ir.actions.report.xml':
            name = encode(obj.report_name)
            fname = ""
            ##### Changes for Aeroo ######
            if obj.report_type == 'aeroo':
                trans_ids = trans_obj.search(cr, uid,
                                             [('type', '=', 'report'),
                                              ('res_id', '=', obj.id)])
                for t in trans_obj.read(cr, uid, trans_ids, ['name', 'src']):
                    push_translation(module, "report", t['name'], xml_name,
                                     t['src'])
                if obj.in_format in ['oo-odt', 'oo-ods']\
                        and obj.report_sxw_content:
                    template_io = StringIO()
                    template_io.write(
                        base64.decodestring(obj.report_sxw_content))
                    serializer = OOSerializer(template_io)
                    basic = Template(source=template_io, serializer=serializer)

                    def push_oo_translations(nodes):
                        for node in nodes:
                            if not isinstance(node, tuple):
                                continue
                            if node[0] == 'TEXT':
                                push_translation(module, obj.report_type, name,
                                                 0, node[1], [str(node[2][2])])
                            if node[0] == 'SUB':
                                for n in node[1]:
                                    push_oo_translations(n)

                    push_oo_translations(basic.stream)
            ##############################
            else:
                if obj.report_rml:
                    fname = obj.report_rml
                    parse_func = trans_parse_rml
                    report_type = "report"
                elif obj.report_xsl:
                    fname = obj.report_xsl
                    parse_func = trans_parse_xsl
                    report_type = "xsl"
                if fname and obj.report_type in ('pdf', 'xsl'):
                    try:
                        report_file = misc.file_open(fname)
                        try:
                            d = etree.parse(report_file)
                            for t in parse_func(d.iter()):
                                push_translation(module, report_type, name, 0,
                                                 t)
                        finally:
                            report_file.close()
                    except (IOError, etree.XMLSyntaxError):
                        _logger.exception(
                            "couldn't export translation for report %s %s %s",
                            name, report_type, fname)
예제 #7
0
from io import BytesIO
from os.path import dirname, abspath

folder = dirname(abspath(__file__))
#===============================================================================

with open(folder+TEMPLATE_NAME, 'rb') as fp:
    file_data = fp.read()
    
with open(folder+TEMPLATE_STYLE, 'rb') as fp:
    style_data = fp.read()

template_io = BytesIO()
template_io.write(file_data)

style_io = BytesIO()
style_io.write(style_data)

serializer = OOSerializer(template_io, oo_styles=style_io)

basic = Template(source=template_io, serializer=serializer)

args = {'title': 'Successful test of Aeroo Reports library (aeroolib)',
        'some_unusedva_lue':['x','y','z']
        }

data = basic.generate(**args).render().getvalue()
with open(TEST_RESULT,"wb") as fp:
    fp.write(data)

예제 #8
0
    def create_aeroo_report(self, cr, uid, ids, data, report_xml, context=None, output='odt'):
        """ Returns an aeroo report generated with aeroolib
        """
        deferred = context.get('deferred_process')
        if deferred:
            deferred.set_status(_('Started'))
        pool = registry(cr.dbname)
        if not context:
            context={}
        context = context.copy()
        if self.name=='report.printscreen.list':
            context['model'] = data['model']
            context['ids'] = ids
        
        print_id = context.get('print_id', False)
        aeroo_print = self.active_prints[print_id] # Aeroo print object
        aeroo_print.subreports = []
        #self.oo_subreports[print_id] = []
        oo_parser = self.parser(cr, uid, self.name2, context=context)
        aeroo_docs = self.aeroo_docs_enabled(cr) # Detect report_aeroo_docs module
        if (aeroo_docs and not report_xml.process_sep or not aeroo_docs) and getattr(oo_parser, 'single', False):
            ids = [ids[0]]
        objects = self.getObjects_mod(cr, uid, ids, report_xml.report_type, context) or []
        # Esto es un parche por error de odoo en report_sxw.py al hacer
        # self.setCompany(objects[0].company_id) porque, como el registro
        # tiene el campo company, solo agrega al contexto del reporte la
        # compania del objeto y el usuario puede no tener permiso para dicha
        # cia
        objects_for_context = self.getObjects_mod(cr, 1, ids, report_xml.report_type, context) or []
        oo_parser.localcontext.update(context)
        oo_parser.set_context(objects_for_context, data, ids, report_xml.report_type)
        # oo_parser.set_context(objects, data, ids, report_xml.report_type)

        self.set_xml_data_fields(objects, oo_parser) # Get/Set XML

        oo_parser.localcontext['data'] = data
        oo_parser.localcontext['user_lang'] = context.get('lang', False)
        if len(objects)>0:
            oo_parser.localcontext['o'] = objects[0]
        xfunc = ExtraFunctions(cr, uid, report_xml.id, oo_parser.localcontext)
        oo_parser.localcontext.update(xfunc.functions)

        #company_id = objects and 'company_id' in objects[0]._table._columns.keys() and \
        #                        objects[0].company_id and objects[0].company_id.id or False # for object company usage
        company_id = False
        style_io=self.get_styles_file(cr, uid, report_xml, company=company_id, context=context)

        if report_xml.tml_source in ('file', 'database'):
            if not report_xml.report_sxw_content or report_xml.report_sxw_content=='False':
                raise osv.except_osv(_('Error!'), _('No template found!'))
            file_data = base64.decodestring(report_xml.report_sxw_content)
        else:
            model = context.get('active_model', data.get('model')) or data.get('model')
            rec_id = context.get('active_id', data.get('id')) or data.get('id')
            file_data = self.get_other_template(cr, uid, model, rec_id, oo_parser)
        if not file_data and not report_xml.report_sxw_content:
            self.logger("End process %s (%s), elapsed time: %s" % (self.name, self.table, time.time() - aeroo_print.start_time), logging.INFO) # debug mode
            return False, output
        #elif file_data:
        #    template_io = StringIO()
        #    template_io.write(file_data or report_xml.report_sxw_content)
        #    basic = Template(source=template_io, styles=style_io)
        else:
            if report_xml.preload_mode == 'preload' and hasattr(self, 'serializer'):
                serializer = copy.copy(self.serializer)
                serializer.apply_style(style_io)
                template_io = serializer.template
            else:
                template_io = StringIO()
                template_io.write(file_data or base64.decodestring(report_xml.report_sxw_content) )
                serializer = OOSerializer(template_io, oo_styles=style_io)
            try:
                basic = Template(source=template_io, serializer=serializer, lookup=DynamicLookup)
            except Exception, e:
                self._raise_exception(e, print_id)
예제 #9
0
    def generate(self, cr, user, ids, context=None):
        contract_id = ids
        if isinstance(ids, (list, tuple)):
            contract_id = ids[0]
        contract = self.read(cr, user, contract_id, [])

        service = self.pool.get('brief.services.stage').read(cr, user, contract['service_id'][0], ['template_id'])
        if service['template_id']:
            template = self.pool.get('ir.attachment').read(cr, user, service['template_id'][0],
                                                           ['store_fname', 'parent_id'])
            dbro = self.pool.get('document.directory').read(cr, user, template['parent_id'][0], ['storage_id'], context)
            storage = self.pool.get('document.storage').read(cr, user, dbro['storage_id'][0], ['path'])

            filepath = os.path.join(storage['path'], template['store_fname'])
            file_data = open(filepath, 'rb').read()
            template_io = StringIO()
            template_io.write(file_data)
            serializer = OOSerializer(template_io)
            basic = Template(source=template_io, serializer=serializer)

            d = datetime.strptime(contract['contract_date'], '%Y-%m-%d')
            date_str = dt.ru_strftime(u"%d %B %Y", d, inflected=True)
            if not contract['contract_number']:
                raise osv.except_osv('Договор', 'Необходимо ввести номер договора')
            if not contract['amount']:
                raise osv.except_osv('Договор', 'Необходимо ввести сумму договора')

            term = 7
            if contract['term'] == 'mounth':
                term = 30
            elif contract['term'] == 'year':
                term = 365
            else:
                term = 0
            o = {
                'name': u'-',
                'contract_number': contract['contract_number'],
                'contract_date': date_str,
                'doc_type': contract['doc_type_id'][1] if contract['doc_type_id'] else '-',
                'responsible_id': contract['responsible_id'][1] if contract['responsible_id'] else '-',
                #  Название баннерной или тизерной сети
                'web': 'test',

                #  стоимость услуг цифры
                'cost_num': contract['amount'],
                #  стоимость услуг слова
                'cost_word': numeral.in_words(float(contract['amount'])),

                #  срок предоставления услуги в фомате 30 (тридцать)
                'term': term,


                #  наш генеральный директор
                'our_gen_dir': u'-',
                #  название фирмы
                'our_firm_name': u'-',
                #  наш Юридический адрес
                'our_address': u'-',
                #  Фактический адрес,адрес почтовой корреспонденции наш
                'our_fact_address': u'-',
                #  ИНН / КПП наш
                'our_inn': u'-',
                #  ОГРН наш
                'our_ogrn': u'-',
                #  Код ОКПО наш
                'our_okpo': u'-',
                #  банк наш
                'our_bank': u'-',
                #  к/с наш
                'our_ks': u'-',
                #  р/с наш
                'our_rs': u'-',
                #  бик наш
                'our_bik': u'-',
                #  Тел/факс наш
                'our_phone': u'-',
                #  Web сайт почта наш
                'our_site': u'-',

                #  заказчика e-mail
                'partner_mail': u'-',
                #  название фирмы заказчика
                'partner_firm_name': u'-',
                #  Юридический адрес партнера
                'partner_address': u'-',
                #  Фактический адрес,адрес почтовой корреспонденции партнера
                'partner_fact_address': u'-',
                #  ИНН / КПП партнера
                'partner_inn': u'-',
                #  ОГРН партнера
                'partner_ogrn': u'-',
                #  Код ОКПО партнера
                'partner_okpo': u'-',
                #  банк партнера
                'partner_bank': u'-',
                #  к/с партнера
                'partner_ks': u'-',
                #  р/с партнера
                'partner_rs': u'-',
                #  бик партнера
                'partner_bik': u'-',
                'partner_kpp': u'-',
                #  Тел/факс партнера
                'partner_phone': u'-',
                #  Web сайт почта партнера
                'partner_site': u'-',
            }

            if contract['bank_id']:
                bank = self.pool.get('res.partner.bank').read(cr, 1, contract['bank_id'][0], [])
                o.update({
                    'partner_mail': bank['email'] or u'-',
                    'partner_site': bank['site'] or u'-',
                    'partner_firm_name': bank['fullname'] or u'-',
                    'partner_address': self.pool.get('res.partner.bank.address').get_address(cr, contract['bank_id'][0]) or u'-',
                    'partner_fact_address': self.pool.get('res.partner.bank.address').get_address(cr, contract['bank_id'][0], 'fa') or u'-',
                    'partner_inn': bank['inn'] or u'-',
                    'partner_kpp': bank['kpp'] or u'-',
                    'partner_ogrn': bank['ogrn'] or u'-',
                    'partner_okpo': bank['okpo'] or u'-',
                    'partner_bank': bank['bank'] or u'-',
                    'partner_ks': bank['correspondent_account'] or u'-',
                    'partner_rs': bank['current_account'] or u'-',
                    'partner_bik': bank['bik'] or u'-',
                    'partner_phone': bank['phone'] or u'-',
                })

            if contract['account_id']:
                account = self.pool.get('account.account').read(cr, 1, contract['account_id'][0], [])
                o.update({
                    'our_gen_dir': account['responsible'] or u'-',
                    'our_firm_name': account['full'] or u'-',
                    'our_address': account['address'] or u'-',
                    'our_fact_address': account['address'] or u'-',
                    'our_inn': account['inn'] or u'-',
                    'our_kpp': account['kpp'] or u'-',
                    'our_ogrn': u'1127747081406',
                    'our_okpo': u'13183255',
                    'our_bank': account['bank'] or u'-',
                    'our_ks': account['bank_number'] or u'-',
                    'our_rs': account['account_number'] or u'-',
                    'our_bik': account['bik'] or u'-',
                    'our_phone': account['phone'] or u'-',
                    'our_site': u'UpSale.ru, [email protected]',
                })

            filename = '{0} {1} {2}'.format(
                contract['contract_number'].encode('utf-8'),
                contract['partner_id'][1].encode('utf-8'),
                contract['service_id'][1].encode('utf-8'), )

            #data = [(k, v.encode('cp1251')) for k, v in o.iteritems() if isinstance(v, unicode)]

            odt_file = os.path.join(storage['path'], 'tmp.odt')
            file(odt_file, 'wb').write(basic.generate(o=o).render().getvalue())

            doc_id = self.pool.get('ir.attachment').create(cr, user, {
                'name': '{0}.odt'.format(filename, ),
                'datas': base64.b64encode(open(odt_file, 'rb').read()),
                'datas_fname': '{0}.odt'.format(filename, ),
                'res_model': self._name,
                'res_id': contract['id']
            })
            self.write(cr, user, [contract['id']], {'doc_id': doc_id})
        return True
예제 #10
0
from io import BytesIO
from os.path import dirname, abspath

folder = dirname(abspath(__file__))
#===============================================================================

with open(folder + TEMPLATE_NAME, 'rb') as fp:
    file_data = fp.read()

with open(folder + TEMPLATE_STYLE, 'rb') as fp:
    style_data = fp.read()

template_io = BytesIO()
template_io.write(file_data)

style_io = BytesIO()
style_io.write(style_data)

serializer = OOSerializer(template_io, oo_styles=style_io)

basic = Template(source=template_io, serializer=serializer)

args = {
    'title': 'Successful test of Aeroo Reports library (aeroolib)',
    'some_unusedva_lue': ['x', 'y', 'z']
}

data = basic.generate(**args).render().getvalue()
with open(TEST_RESULT, "wb") as fp:
    fp.write(data)
예제 #11
0
    def generate(self, cr, user, ids, context=None):
        disposition_id = ids
        if isinstance(ids, (list, tuple)):
            disposition_id = ids[0]
        disposition = self.read(cr, user, disposition_id, [])

        category = self.pool.get('cd.disposition.category').read(cr, user, disposition['category_id'][0], ['template_id'])
        if category['template_id']:
            template = self.pool.get('ir.attachment').read(cr, user, category['template_id'][0],
                                                           ['store_fname', 'parent_id'])
            dbro = self.pool.get('document.directory').read(cr, user, template['parent_id'][0], ['storage_id'], context)
            storage = self.pool.get('document.storage').read(cr, user, dbro['storage_id'][0], ['path'])

            filepath = os.path.join(storage['path'], template['store_fname'])
            file_data = open(filepath, 'rb').read()
            template_io = StringIO()
            template_io.write(file_data)
            serializer = OOSerializer(template_io)
            basic = Template(source=template_io, serializer=serializer)

            o = {
                'disposition_number': disposition['id'],
                'disposition_date': dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['disposition_date'], '%Y-%m-%d'), inflected=True),
                'from_date': '-',
                'on_date': '-',
                'from_date_second': '-',
                'on_date_second': '-',
                'not_later_date': '-',
                'not_later_date_second': '-',
                'to_date': '-',
                'financier_id': '-',
                'period_id': '-',
                'seeing': disposition['seeing'] or '-',
                'working_off_dates': disposition['working_off_dates'] or '-',
                'employee_id': '-',
                'job_id': '-',
                'next_job_id': '-',
                'teacher_job_id': '-',
                'department_id': '-',
                'next_department_id': '-',
                'teacher_department_id': '-',
                'trip': disposition['trip'] or '-',
                'trip_place': disposition['trip_place'] or '-',
                'grade_id': '-',
                'reason': disposition['reason'] or '-',
                'remark': disposition['remark'] or '-',
                'direction_name': disposition['direction_name'] or '-',
                'at_rate': int(disposition['at_rate']) or '-',
                'date_ot': '-',
                'next_attestation': '-',
                'motive_rewarding': disposition['motive_rewarding'] or '-',
                'promotion_type': disposition['promotion_type'] or '-',
                'teacher_id': '-',
                'financing_source': disposition['financing_source'] or '-',
                'commission_ids': '-',
                'term': disposition['term'] or '-',
                'term_str': disposition['term_str'] or '-',
                'amount': disposition['amount'] or '-',
                'amount_str': to_grn(disposition['at_rate']),
                'statement_date': '-',
                'instate_date': '-',
                'salary': disposition['salary'] or '-',
                'salary_per': disposition['salary_per'] or '-',
                'variable': disposition['variable'] or '-',
                'variable_per': disposition['variable_per'] or '-',
                'post_probation_grade_id': '-',
                'probation_grade_id': '-',
                'duration_probation': disposition['duration_probation'] or '-',
                'year': disposition['year'] or '-',
                'no_work': disposition['no_work'] or '-',
                'work_day': disposition['work_day'] or '-',
                'fio': disposition['fio'] or '-',
                'schedule_date': '-',
                'commission_date': '-',
                'set_date': '-',
                'list_date': '-',
                'protocol_date': '-',
                'top_date': '-',
                'result_date': '-'
            }

            if disposition['from_date']:
                o['from_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['from_date'], '%Y-%m-%d'), inflected=True)
            if disposition['on_date']:
                o['on_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['on_date'], '%Y-%m-%d'), inflected=True)
            if disposition['from_date_second']:
                o['from_date_second'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['from_date_second'], '%Y-%m-%d'), inflected=True)
            if disposition['on_date_second']:
                o['on_date_second'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['on_date_second'], '%Y-%m-%d'), inflected=True)
            if disposition['not_later_date']:
                o['not_later_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['not_later_date'], '%Y-%m-%d'), inflected=True)
            if disposition['not_later_date_second']:
                o['not_later_date_second'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['not_later_date_second'], '%Y-%m-%d'), inflected=True)
            if disposition['to_date']:
                o['to_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['to_date'], '%Y-%m-%d'), inflected=True)
            if disposition['date_ot']:
                o['date_ot'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['date_ot'], '%Y-%m-%d'), inflected=True)
            if disposition['next_attestation']:
                o['next_attestation'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['next_attestation'], '%Y-%m-%d'), inflected=True)
            if disposition['statement_date']:
                o['statement_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['statement_date'], '%Y-%m-%d'), inflected=True)
            if disposition['instate_date']:
                o['instate_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['instate_date'], '%Y-%m-%d'), inflected=True)
            if disposition['schedule_date']:
                o['schedule_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['schedule_date'], '%Y-%m-%d'), inflected=True)
            if disposition['commission_date']:
                o['commission_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['commission_date'], '%Y-%m-%d'), inflected=True)
            if disposition['set_date']:
                o['set_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['set_date'], '%Y-%m-%d'), inflected=True)
            if disposition['list_date']:
                o['list_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['list_date'], '%Y-%m-%d'), inflected=True)
            if disposition['protocol_date']:
                o['protocol_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['protocol_date'], '%Y-%m-%d'), inflected=True)
            if disposition['top_date']:
                o['top_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['top_date'], '%Y-%m-%d'), inflected=True)
            if disposition['result_date']:
                o['result_date'] = dt.ru_strftime(u"%d %B %Y", datetime.strptime(disposition['result_date'], '%Y-%m-%d'), inflected=True)
            if disposition['financier_id']:
                o['financier_id'] = disposition['financier_id'][1]
            if disposition['employee_id']:
                o['employee_id'] = disposition['employee_id'][1]
            if disposition['job_id']:
                o['job_id'] = disposition['job_id'][1]
            if disposition['teacher_id']:
                o['teacher_id'] = disposition['teacher_id'][1]
            if disposition['next_job_id']:
                o['next_job_id'] = disposition['next_job_id'][1]
            if disposition['teacher_job_id']:
                o['teacher_job_id'] = disposition['teacher_job_id'][1]
            if disposition['department_id']:
                o['department_id'] = disposition['department_id'][1]
            if disposition['next_department_id']:
                o['next_department_id'] = disposition['next_department_id'][1]
            if disposition['teacher_department_id']:
                o['teacher_department_id'] = disposition['teacher_department_id'][1]
            if disposition['grade_id']:
                o['grade_id'] = disposition['grade_id'][1]
            if disposition['post_probation_grade_id']:
                o['post_probation_grade_id'] = disposition['post_probation_grade_id'][1]
            if disposition['probation_grade_id']:
                o['probation_grade_id'] = disposition['probation_grade_id'][1]
            if disposition['commission_ids']:
                o['commission_ids'] = ', '.join([x['name'] for x in self.pool.get('res.users').read(cr, 1, disposition['commission_ids'], ['name'])])
            if disposition['period_id']:
                d = datetime.strptime('2013/10', '%Y/%m').strftime('%B %Y')
                o['period_id'] = tools.ustr(d)

            filename = 'Распоряжение № {0}'.format(disposition['id'],)

            odt_file = os.path.join(storage['path'], 'tmp.odt')
            file(odt_file, 'wb').write(basic.generate(o=o).render().getvalue())

            doc_id = self.pool.get('ir.attachment').create(cr, user, {
                'name': '{0}.odt'.format(filename, ),
                'datas': base64.b64encode(open(odt_file, 'rb').read()),
                'datas_fname': '{0}.odt'.format(filename, ),
                'res_model': self._name,
                'res_id': disposition['id']
            })
            #self.write(cr, user, [disposition['id']], {'doc_id': doc_id})
            return doc_id
        return False
예제 #12
0
    def create_aeroo_report(self,
                            cr,
                            uid,
                            ids,
                            data,
                            report_xml,
                            context=None,
                            output='odt',
                            style_io=None):
        """ Returns an aeroo report generated with aeroolib
        """
        pool = RegistryManager.get(cr.dbname)
        if context is None:
            context = {}
        else:
            context = context.copy()

        if self.name == 'report.printscreen.list':
            context['model'] = data['model']
            context['ids'] = ids

        # create parser
        oo_parser = self.parser(cr, uid, self.name2, context=context)
        objects = not context.get('no_objects', False) and self.getObjects_mod(
            cr, uid, ids, report_xml, context, parser=oo_parser) or []
        report_obj = pool.get("ir.actions.report.xml")

        # check for report forward
        if hasattr(oo_parser, "_report_forward"):
            report_forward = oo_parser._report_forward(objects)
            if report_forward:
                report_forward_inst = report_obj._lookup_report(
                    cr, report_forward["name"])
                forward_report_data, forward_report_format = report_forward_inst.create(
                    cr, uid, report_forward["ids"], data, context)
                return self._onResult(
                    cr,
                    uid,
                    objects, (forward_report_data, forward_report_format),
                    context=context)

        # report replacement
        file_data = None
        if objects and len(objects) == 1:
            # get replacement
            repl_report_xml, style_io = report_obj._get_replacement(
                cr, uid, objects[0], report_xml, context=context)
            if repl_report_xml:
                if isinstance(repl_report_xml, basestring):
                    file_data = base64.decodestring(repl_report_xml)
                elif repl_report_xml.id != report_xml.id:
                    return self.create_aeroo_report(cr,
                                                    uid,
                                                    ids,
                                                    data,
                                                    repl_report_xml,
                                                    context=context,
                                                    output=output,
                                                    style_io=style_io)

        oo_parser.objects = objects
        self.set_xml_data_fields(objects, oo_parser)  # Get/Set XML

        oo_parser.localcontext['objects'] = objects
        oo_parser.localcontext['data'] = data
        oo_parser.localcontext['user_lang'] = context.get('lang', False)
        if len(objects) == 1:
            oo_parser.localcontext['o'] = objects[0]
        xfunc = ExtraFunctions(cr, uid, report_xml.id, oo_parser.localcontext)
        oo_parser.localcontext.update(xfunc.functions)

        # get style
        if not style_io:
            style_io = self.get_styles_file(cr, uid, report_xml, context)

        # get template
        if not file_data:
            if report_xml.tml_source in ('file', 'database'):
                file_data = base64.decodestring(report_xml.report_sxw_content)
            else:
                file_data = self.get_other_template(cr, uid, data, oo_parser)

        # process template
        if not file_data and not report_xml.report_sxw_content:
            return False, output
        else:
            if report_xml.preload_mode == 'preload' and hasattr(
                    self, 'serializer'):
                serializer = copy.copy(self.serializer)
                serializer.apply_style(style_io)
                template_io = serializer.template
            else:
                template_io = StringIO()
                template_io.write(
                    file_data
                    or base64.decodestring(report_xml.report_sxw_content))
                serializer = OOSerializer(template_io, oo_styles=style_io)
            basic = Template(source=template_io, serializer=serializer)

        aeroo_ooo = context.get('aeroo_ooo', False)
        oo_parser.localcontext['include_subreport'] = self._subreport(
            cr, uid, output='odt', aeroo_ooo=aeroo_ooo, context=context)
        oo_parser.localcontext['include_document'] = self._include_document(
            aeroo_ooo)

        ####### Add counter functons to localcontext #######
        oo_parser.localcontext.update({
            'def_inc': self._def_inc,
            'get_inc': self._get_inc,
            'prev': self._prev,
            'next': self._next
        })

        user_name = pool.get('res.users').browse(cr, uid, uid, {}).name

        report_tile = report_xml.name
        eval_model = data.get("model", context.get("active_model"))
        if eval_model:
            modeldef_obj = pool.get('ir.model')
            modeldef_id = modeldef_obj.search(cr, uid,
                                              [('model', '=', eval_model)])[0]
            report_title = modeldef_obj.browse(cr, uid, modeldef_id).name

        #basic = Template(source=None, filepath=odt_path)

        basic.Serializer.add_title(report_tile)
        basic.Serializer.add_creation_user(user_name)
        version = addons.load_information_from_description_file(
            'report_aeroo')['version']
        basic.Serializer.add_generator_info('Aeroo Lib/%s Aeroo Reports/%s' %
                                            (aeroolib.__version__, version))
        basic.Serializer.add_custom_property('Aeroo Reports %s' % version,
                                             'Generator')
        basic.Serializer.add_custom_property('OpenERP %s' % release.version,
                                             'Software')
        basic.Serializer.add_custom_property('http://www.alistek.com/', 'URL')
        basic.Serializer.add_creation_date(time.strftime('%Y-%m-%dT%H:%M:%S'))

        try:
            data = basic.generate(**oo_parser.localcontext).render().getvalue()
        except Exception, e:
            tb_s = reduce(
                lambda x, y: x + y,
                traceback.format_exception(sys.exc_type, sys.exc_value,
                                           sys.exc_traceback))
            logger.error(tb_s)
            self._cleanup_subreports()
            raise Exception(
                _("Aeroo Reports: Error while generating the report."), e,
                str(e), _("For more reference inspect error logs."))