def get_module_info(cls, name): try: return modules.load_information_from_description_file(name) except Exception: _logger.debug( 'Error when trying to fetch information for module %s', name, exc_info=True) return {}
def _import_module(self, module, path, force=False): known_mods = self.search([]) known_mods_names = {m.name: m for m in known_mods} installed_mods = [m.name for m in known_mods if m.state == 'installed'] terp = load_information_from_description_file(module, mod_path=path) if not terp: return False values = self.get_values_from_terp(terp) if 'version' in terp: values['latest_version'] = terp['version'] unmet_dependencies = set(terp['depends']).difference(installed_mods) if unmet_dependencies: if (unmet_dependencies == set(['web_studio']) and _is_studio_custom(path)): err = _("Studio customizations require Studio") else: err = _("Unmet module dependencies: %s") % ', '.join( unmet_dependencies, ) raise UserError(err) elif 'web_studio' not in installed_mods and _is_studio_custom(path): raise UserError(_("Studio customizations require Studio")) mod = known_mods_names.get(module) if mod: mod.write(dict(state='installed', **values)) mode = 'update' if not force else 'init' else: assert terp.get('installable', True), "Module not installable" self.create( dict(name=module, state='installed', imported=True, **values)) mode = 'init' for kind in ['data', 'init_xml', 'update_xml']: for filename in terp[kind]: ext = os.path.splitext(filename)[1].lower() if ext not in ('.xml', '.csv', '.sql'): _logger.info("module %s: skip unsupported file %s", module, filename) continue _logger.info("module %s: loading %s", module, filename) noupdate = False if ext == '.csv' and kind in ('init', 'init_xml'): noupdate = True pathname = opj(path, filename) idref = {} convert_file(self.env.cr, module, filename, idref, mode=mode, noupdate=noupdate, kind=kind, pathname=pathname) path_static = opj(path, 'static') IrAttachment = self.env['ir.attachment'] if os.path.isdir(path_static): for root, dirs, files in os.walk(path_static): for static_file in files: full_path = opj(root, static_file) with open(full_path, 'rb') as fp: data = base64.b64encode(fp.read()) url_path = '/{}{}'.format( module, full_path.split(path)[1].replace(os.path.sep, '/')) if not isinstance(url_path, pycompat.text_type): url_path = url_path.decode(sys.getfilesystemencoding()) filename = os.path.split(url_path)[1] values = dict( name=filename, datas_fname=filename, url=url_path, res_model='ir.ui.view', type='binary', datas=data, ) attachment = IrAttachment.search([('url', '=', url_path), ('type', '=', 'binary'), ('res_model', '=', 'ir.ui.view')]) if attachment: attachment.write(values) else: IrAttachment.create(values) return True
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 #======================================================================= 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, } 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('Flectra %s' % flectra_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