def parse(cls, report, records, data, localcontext): ''' Parse the report and return a tuple with report type and report. ''' pool = Pool() User = pool.get('res.user') Translation = pool.get('ir.translation') localcontext['data'] = data localcontext['user'] = User(Transaction().user) localcontext['formatLang'] = lambda *args, **kargs: \ cls.format_lang(*args, **kargs) localcontext['StringIO'] = StringIO.StringIO localcontext['time'] = time localcontext['datetime'] = datetime localcontext['context'] = Transaction().context translate = TranslateFactory(cls.__name__, Transaction().language, Translation) localcontext['setLang'] = lambda language: translate.set_language( language) localcontext['records'] = records # Convert to str as buffer from DB is not supported by StringIO report_content = (str(report.report_content) if report.report_content else False) if not report_content: raise Exception('Error', 'Missing report file!') result = cls.render_template(report_content, localcontext, translate) output_format = report.extension or report.template_extension # Convert the report to PDF if the output format is PDF # Do not convert when report is generated in tests, as it takes # time to convert to PDF due to which tests run longer. # Pool.test is True when running tests. if output_format in ('pdf',) and not Pool.test: result = cls.wkhtml_to_pdf(result) # Check if the output_format has a different extension for it oext = FORMAT2EXT.get(output_format, output_format) return (oext, result)
def render(cls, report, report_context): pool = Pool() Translation = pool.get('ir.translation') Company = pool.get('company.company') # Convert to str as buffer from DB is not supported by StringIO report_content = (str(report.report_content) if report.report_content else False) if not report_content: raise Exception('Error', 'Missing report file!') translate = TranslateFactory(cls.__name__, Transaction().language, Translation) report_context['setLang'] = lambda language: translate.set_language( language) company_id = Transaction().context.get('company') report_context['company'] = Company(company_id) return cls.render_template(report_content, report_context, translate)
def render(cls, report, report_context): pool = Pool() Translation = pool.get('ir.translation') Company = pool.get('company.company') # Convert to str as buffer from DB is not supported by StringIO report_content = (str(report.report_content) if report.report_content else False) if not report_content: raise Exception('Error', 'Missing report file!') # Make the report itself available n the report context report_context['report'] = report translate = TranslateFactory(cls.__name__, Transaction().language, Translation) report_context['setLang'] = lambda language: translate.set_language( language) company_id = Transaction().context.get('company') report_context['company'] = Company(company_id) return cls.render_template(report_content, report_context, translate)
def parse(cls, report, records, data, localcontext): """Create QGis project file based on the selected record: the fields referenced in the model FIELDS variable will each have a separate layer in the renderd file. """ User = Pool().get('res.user') Translation = Pool().get('ir.translation') filename = os.path.join(os.path.dirname(__file__), 'qgis.qgs') report = RelatorioReport(filename, 'text/plain', ReportFactory(), MIMETemplateLoader()) QGisConf = Pool().get('qgis.conf') conf = QGisConf.search([]) if len(conf) != 0: version = conf[0].version else: version = '1.9.0-Master' legend = OrderedDict() if cls.FIELDS is None: layers, bbox, srid = cls.get_layer(records, records[0].__name__) for layer in layers: legend[layer['title']] = layer else: layers = [] bbox = None Model = Pool().get(records[0].__name__) for field, val in cls.FIELDS.iteritems(): if val is None: fields = [field] else: fields = val.keys() sublayers = [] for _field in fields: recs = getattr(records[0], _field) relation = getattr(Model, _field).model_name _layers, _bbox, srid = cls.get_layer(recs, relation) if _bbox is not None: bbox = envelope_union(_bbox, bbox) sublayers += _layers # Remove sublayers that are already added _sublayers = [] for layer in sublayers: if layer['model'] in [_layer['model'] for _layer in layers]: continue _sublayers.append(layer) sublayers = _sublayers layers += sublayers if val is None: for layer in sublayers: legend[layer['title']] = layer else: if field not in legend: legend[field] = OrderedDict() for layer in sublayers: legend[field][layer['title']] = layer if bbox is None: bbox = [ -357823.2365, 6037008.6939, 1313632.3628, 7230727.3772 ] WfsConf = Pool().get('wfs.conf') wfs_url = WfsConf.get_url() localcontext.update({ 'data': data, 'user': User(Transaction().user), 'formatLang': cls.format_lang, 'StringIO': StringIO.StringIO, 'time': time, 'datetime': datetime, 'context': Transaction().context, 'qgis_version': version, 'wfs_url': wfs_url, 'bbox': bbox, 'srid': srid, 'layers': layers, 'legend': legend, }) translate = TranslateFactory(cls.__name__, Transaction().language, Translation) localcontext['setLang'] = lambda language: translate.set_language(language) translator = Translator(lambda text: translate(text)) report.filters.insert(0, translator) localcontext = dict(map(lambda x: (str(x[0]), x[1]), localcontext.iteritems())) #Test compatibility with old relatorio version <= 0.3.0 if len(inspect.getargspec(report.__call__)[0]) == 2: data = report(records, **localcontext).render().getvalue() else: localcontext['objects'] = records # XXX to remove localcontext['records'] = records data = report(**localcontext).render() if hasattr(data, 'getvalue'): data = data.getvalue() return ('qgs', data)