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)
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
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
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."))
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
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)
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)
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)
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."))