Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)