コード例 #1
0
ファイル: report.py プロジェクト: renyi/django-model-report
    def get_render_context(self, request, extra_context={}, by_row=None):
        context_request = request or self.request
        related_fields = []
        filter_related_fields = {}
        if self.parent_report and by_row:

            for index, (pfield,
                        plookup) in enumerate(self.parent_report.model_fields):
                for cfield, clookup in self.model_fields:
                    if pfield is cfield and plookup in clookup:
                        related_fields.append([
                            pfield, cfield, plookup, clookup,
                            by_row[index].value
                        ])
                        filter_related_fields[clookup] = by_row[index].value

        try:
            form_groupby = self.get_form_groupby(context_request)
            form_filter = self.get_form_filter(context_request)
            form_config = self.get_form_config(context_request)

            column_labels = self.get_column_names(filter_related_fields)
            report_rows = []
            groupby_data = None
            filter_kwargs = None
            report_anchors = []
            chart = None

            context = {
                'report': self,
                'form_groupby': form_groupby,
                'form_filter': form_filter,
                'form_config': form_config if self.type == 'chart' else None,
                'chart': chart,
                'report_anchors': report_anchors,
                'column_labels': column_labels,
                'report_rows': report_rows,
            }

            if context_request.GET:
                groupby_data = form_groupby.get_cleaned_data(
                ) if form_groupby else None
                filter_kwargs = filter_related_fields or form_filter.get_filter_kwargs(
                )
                if groupby_data:
                    self.__dict__.update(groupby_data)
                else:
                    self.__dict__['onlytotals'] = False
                report_rows = self.get_rows(context_request, groupby_data,
                                            filter_kwargs,
                                            filter_related_fields)

                for g, r in report_rows:
                    report_anchors.append(g)

                if len(report_anchors) <= 1:
                    report_anchors = []

                if self.type == 'chart' and groupby_data and groupby_data[
                        'groupby']:
                    config = form_config.get_config_data()
                    if config:
                        chart = self.get_chart(config, report_rows)

                if self.onlytotals:
                    for g, rows in report_rows:
                        for r in list(rows):
                            if r.is_value():
                                rows.remove(r)

                if not context_request.GET.get(
                        'export', None) is None and not self.parent_report:
                    if context_request.GET.get('export') == 'excel':
                        response = HttpResponse(mimetype='text/csv')
                        response[
                            'Content-Disposition'] = 'attachment; filename=%s.csv' % self.slug

                        writer = csv.writer(response)

                        writer.writerow([
                            unicode(x).encode("utf-8") for x in column_labels
                        ])

                        for g, rows in report_rows:
                            for row in list(rows):
                                if row.is_value():
                                    writer.writerow([
                                        unicode(x.value).encode("utf-8")
                                        for x in row
                                    ])
                                elif row.is_caption:
                                    writer.writerow([
                                        unicode(x).encode("utf-8") for x in row
                                    ])
                                elif row.is_total:
                                    writer.writerow([
                                        unicode(x.value).encode("utf-8")
                                        for x in row
                                    ])
                                    writer.writerow([
                                        unicode(' ').encode("utf-8")
                                        for x in row
                                    ])

                        return response
                    if context_request.GET.get('export') == 'pdf':
                        inlines = [
                            ir(self, context_request) for ir in self.inlines
                        ]
                        report_anchors = None
                        setattr(self, 'is_export', True)
                        context = {
                            'report': self,
                            'column_labels': column_labels,
                            'report_rows': report_rows,
                            'report_inlines': inlines,
                        }
                        context.update({'pagesize': 'legal landscape'})
                        return render_to_pdf(
                            self, 'model_report/export_pdf.html', context)

            inlines = [ir(self, context_request) for ir in self.inlines]

            is_inline = self.parent_report is None
            render_report = not (len(report_rows) == 0 and is_inline)
            context = {
                'render_report':
                render_report,
                'is_inline':
                is_inline,
                'inline_column_span':
                0 if is_inline else len(self.parent_report.get_column_names()),
                'report':
                self,
                'form_groupby':
                form_groupby,
                'form_filter':
                form_filter,
                'form_config':
                form_config if self.type == 'chart' else None,
                'chart':
                chart,
                'report_anchors':
                report_anchors,
                'column_labels':
                column_labels,
                'report_rows':
                report_rows,
                'report_inlines':
                inlines,
            }

            if extra_context:
                context.update(extra_context)

            context['request'] = request
            return context
        finally:
            globals()['_cache_class'] = {}
コード例 #2
0
    def get_render_context(self, request, extra_context={}, by_row=None):
        context_request = request or self.request
        related_fields = []
        filter_related_fields = {}
        if self.parent_report and by_row:
            for index, (pfield,
                        plookup) in enumerate(self.parent_report.model_fields):
                for cfield, clookup in self.model_fields:
                    if pfield is cfield and plookup in clookup:
                        related_fields.append(
                            [pfield, cfield, plookup, clookup, by_row[index]])
                        filter_related_fields[clookup] = by_row[index]

        try:
            form_groupby = self.get_form_groupby(context_request)
            form_filter = self.get_form_filter(context_request)
            form_config = self.get_form_config(context_request)

            column_labels = self.get_column_names(filter_related_fields)
            report_rows = []
            groupby_data = None
            filter_kwargs = None
            report_anchors = []
            chart = None

            context = {
                'report': self,
                'form_groupby': form_groupby,
                'form_filter': form_filter,
                'form_config': form_config if self.type == 'chart' else None,
                'chart': chart,
                'report_anchors': report_anchors,
                'column_labels': column_labels,
                'report_rows': report_rows,
            }

            if context_request.GET:
                groupby_data = form_groupby.get_cleaned_data(
                ) if form_groupby else None
                filter_kwargs = filter_related_fields or form_filter.get_filter_kwargs(
                )
                if groupby_data:
                    self.__dict__.update(groupby_data)
                else:
                    self.__dict__['onlytotals'] = False
                report_rows = self.get_rows(context_request, groupby_data,
                                            filter_kwargs,
                                            filter_related_fields)

                for g, r in report_rows:
                    report_anchors.append(g)

                if len(report_anchors) <= 1:
                    report_anchors = []

                if self.type == 'chart':
                    config = form_config.get_config_data()
                    if config:
                        chart = self.get_chart(config, report_rows)

                if self.onlytotals:
                    for g, rows in report_rows:
                        for r in list(rows):
                            if r.is_value():
                                rows.remove(r)

                if not context_request.GET.get(
                        'export', None) is None and not self.parent_report:
                    if context_request.GET.get('export') == 'excel':
                        response = HttpResponse(mimetype='text/csv')
                        response[
                            'Content-Disposition'] = 'attachment; filename=%s.csv' % self.slug

                        writer = csv.writer(response)

                        writer.writerow([
                            unicode(x).encode("utf-8") for x in column_labels
                        ])

                        for g, rows in report_rows:
                            for row in list(rows):
                                if row.is_value():
                                    writer.writerow([
                                        unicode(x.value).encode("utf-8")
                                        for x in row
                                    ])
                                elif row.is_caption:
                                    writer.writerow([
                                        unicode(x).encode("utf-8") for x in row
                                    ])
                                elif row.is_total:
                                    writer.writerow([
                                        unicode(x.value).encode("utf-8")
                                        for x in row
                                    ])
                                    writer.writerow([
                                        unicode(' ').encode("utf-8")
                                        for x in row
                                    ])

                        return response
                    if context_request.GET.get('export') == 'pdf':
                        inlines = [
                            ir(self, context_request) for ir in self.inlines
                        ]
                        report_anchors = None
                        setattr(self, 'is_export', True)
                        context = {
                            'report': self,
                            'column_labels': column_labels,
                            'report_rows': report_rows,
                            'report_inlines': inlines,
                        }
                        context.update({'pagesize': 'legal landscape'})
                        return render_to_pdf(self,
                                             'model_report/export_pdf.html',
                                             context)

            inlines = [ir(self, context_request) for ir in self.inlines]

            context = {
                'report': self,
                'form_groupby': form_groupby,
                'form_filter': form_filter,
                'form_config': form_config if self.type == 'chart' else None,
                'chart': chart,
                'report_anchors': report_anchors,
                'column_labels': column_labels,
                'report_rows': report_rows,
                'report_inlines': inlines,
                'request': context_request,
            }

            if extra_context:
                context.update(extra_context)

            return context
        finally:
            globals()['_cache_class'] = {}
コード例 #3
0
    def get_render_context(self, request, extra_context={}, by_row=None):
        context_request = request or self.request
        related_fields = []
        filter_related_fields = {}
        if self.parent_report and by_row:
            for index, (pfield, plookup) in enumerate(self.parent_report.model_fields):
                for cfield, clookup in self.model_fields:
                    if pfield is cfield and plookup in clookup:
                        related_fields.append([pfield, cfield, plookup, clookup, by_row[index]])
                        filter_related_fields[clookup] = by_row[index]

        try:
            form_groupby = self.get_form_groupby(context_request)
            form_filter = self.get_form_filter(context_request)
            form_config = self.get_form_config(context_request)

            column_labels = self.get_column_names(filter_related_fields)
            report_rows = []
            groupby_data = None
            filter_kwargs = None
            report_anchors = []
            chart = None

            context = {
                "report": self,
                "form_groupby": form_groupby,
                "form_filter": form_filter,
                "form_config": form_config if self.type == "chart" else None,
                "chart": chart,
                "report_anchors": report_anchors,
                "column_labels": column_labels,
                "report_rows": report_rows,
            }

            if context_request.GET:
                groupby_data = form_groupby.get_cleaned_data() if form_groupby else None
                filter_kwargs = filter_related_fields or form_filter.get_filter_kwargs()
                if groupby_data:
                    self.__dict__.update(groupby_data)
                else:
                    self.__dict__["onlytotals"] = False
                report_rows = self.get_rows(context_request, groupby_data, filter_kwargs, filter_related_fields)

                for g, r in report_rows:
                    report_anchors.append(g)

                if len(report_anchors) <= 1:
                    report_anchors = []

                if self.type == "chart":
                    config = form_config.get_config_data()
                    if config:
                        chart = self.get_chart(config, report_rows)

                if self.onlytotals:
                    for g, rows in report_rows:
                        for r in list(rows):
                            if r.is_value():
                                rows.remove(r)

                if not context_request.GET.get("export", None) is None and not self.parent_report:
                    if context_request.GET.get("export") == "excel":
                        response = HttpResponse(mimetype="text/csv")
                        response["Content-Disposition"] = "attachment; filename=%s.csv" % self.slug

                        writer = csv.writer(response)

                        writer.writerow([unicode(x).encode("utf-8") for x in column_labels])

                        for g, rows in report_rows:
                            for row in list(rows):
                                if row.is_value():
                                    writer.writerow([unicode(x.value).encode("utf-8") for x in row])
                                elif row.is_caption:
                                    writer.writerow([unicode(x).encode("utf-8") for x in row])
                                elif row.is_total:
                                    writer.writerow([unicode(x.value).encode("utf-8") for x in row])
                                    writer.writerow([unicode(" ").encode("utf-8") for x in row])

                        return response
                    if context_request.GET.get("export") == "pdf":
                        inlines = [ir(self, context_request) for ir in self.inlines]
                        report_anchors = None
                        setattr(self, "is_export", True)
                        context = {
                            "report": self,
                            "column_labels": column_labels,
                            "report_rows": report_rows,
                            "report_inlines": inlines,
                        }
                        context.update({"pagesize": "legal landscape"})
                        return render_to_pdf(self, "model_report/export_pdf.html", context)

            inlines = [ir(self, context_request) for ir in self.inlines]

            context = {
                "report": self,
                "form_groupby": form_groupby,
                "form_filter": form_filter,
                "form_config": form_config if self.type == "chart" else None,
                "chart": chart,
                "report_anchors": report_anchors,
                "column_labels": column_labels,
                "report_rows": report_rows,
                "report_inlines": inlines,
                "request": context_request,
            }

            if extra_context:
                context.update(extra_context)

            return context
        finally:
            globals()["_cache_class"] = {}
コード例 #4
0
    def get_render_context(self, request, extra_context={}, by_row=None):
        context_request = request or self.request
        related_fields = []
        filter_related_fields = {}
        if self.parent_report and by_row:
            for mfield, cfield, index in self.related_inline_filters:
                filter_related_fields[cfield] = by_row[index].value

        try:
            form_groupby = self.get_form_groupby(context_request)
            form_filter = self.get_form_filter(context_request)
            form_config = self.get_form_config(context_request)

            column_labels = self.get_column_names(filter_related_fields)
            report_rows = []
            groupby_data = None
            filter_kwargs = None
            report_anchors = []
            chart = None

            context = {
                'report': self,
                'form_groupby': form_groupby,
                'form_filter': form_filter,
                'form_config': form_config if self.type == 'chart' else None,
                'chart': chart,
                'report_anchors': report_anchors,
                'column_labels': column_labels,
                'report_rows': report_rows,
            }

            if context_request.GET:
                groupby_data = form_groupby.get_cleaned_data() if form_groupby else None
                filter_kwargs = filter_related_fields or form_filter.get_filter_kwargs()
                if groupby_data:
                    self.__dict__.update(groupby_data)
                else:
                    self.__dict__['onlytotals'] = False
                report_rows = self.get_rows(context_request, groupby_data, filter_kwargs, filter_related_fields)

                for g, r in report_rows:
                    report_anchors.append(g)

                if len(report_anchors) <= 1:
                    report_anchors = []

                if self.type == 'chart' and groupby_data and groupby_data['groupby']:
                    config = form_config.get_config_data()
                    if config:
                        chart = self.get_chart(config, report_rows)

                if self.onlytotals:
                    for g, rows in report_rows:
                        for r in list(rows):
                            if r.is_value():
                                rows.remove(r)

                if not context_request.GET.get('export', None) is None and not self.parent_report:
                    if context_request.GET.get('export') == 'excel':
                        book = Workbook(encoding='utf-8')
                        sheet1 = FitSheetWrapper(book.add_sheet(self.get_title()[:20]))
                        stylebold = easyxf('font: bold true; alignment:')
                        stylevalue = easyxf('alignment: horizontal left, vertical top;')
                        row_index = 0
                        for index, x in enumerate(column_labels):
                            sheet1.write(row_index, index, u'%s' % x, stylebold)
                        row_index += 1

                        for g, rows in report_rows:
                            if g:
                                sheet1.write(row_index, 0, u'%s' % x, stylebold)
                                row_index += 1
                            for row in list(rows):
                                if row.is_value():
                                    for index, x in enumerate(row):
                                        if isinstance(x.value, (list, tuple)):
                                            xvalue = ''.join(['%s\n' % v for v in x.value])
                                        else:
                                            xvalue = x.text()
                                        sheet1.write(row_index, index, xvalue, stylevalue)
                                    row_index += 1
                                elif row.is_caption:
                                    for index, x in enumerate(row):
                                        if not isinstance(x, unicode):
                                            sheet1.write(row_index, index, x.text(), stylebold)
                                        else:
                                            sheet1.write(row_index, index, x, stylebold)
                                    row_index += 1
                                elif row.is_total:
                                    for index, x in enumerate(row):
                                        sheet1.write(row_index, index, x.text(), stylebold)
                                        sheet1.write(row_index + 1, index, ' ')
                                    row_index += 2

                        response = HttpResponse(mimetype="application/ms-excel")
                        response['Content-Disposition'] = 'attachment; filename=%s.xls' % self.slug
                        book.save(response)
                        return response
                    if context_request.GET.get('export') == 'pdf':
                        inlines = [ir(self, context_request) for ir in self.inlines]
                        report_anchors = None
                        setattr(self, 'is_export', True)
                        context = {
                            'report': self,
                            'column_labels': column_labels,
                            'report_rows': report_rows,
                            'report_inlines': inlines,
                        }
                        context.update({'pagesize': 'legal landscape'})
                        return render_to_pdf(self, 'model_report/export_pdf.html', context)

            inlines = [ir(self, context_request) for ir in self.inlines]

            is_inline = self.parent_report is None
            render_report = not (len(report_rows) == 0 and is_inline)
            context = {
                'render_report': render_report,
                'is_inline': is_inline,
                'inline_column_span': 0 if is_inline else len(self.parent_report.get_column_names()),
                'report': self,
                'form_groupby': form_groupby,
                'form_filter': form_filter,
                'form_config': form_config if self.type == 'chart' else None,
                'chart': chart,
                'report_anchors': report_anchors,
                'column_labels': column_labels,
                'report_rows': report_rows,
                'report_inlines': inlines,
            }

            if extra_context:
                context.update(extra_context)

            context['request'] = request
            return context
        finally:
            globals()['_cache_class'] = {}
コード例 #5
0
    def render(self, request, extra_context={}):
        try:
            form_groupby = self.get_form_groupby(request)
            form_filter = self.get_form_filter(request)
            form_config = self.get_form_config(request)

            column_labels = self.get_column_names()
            report_rows = []
            groupby_data = None
            filter_kwargs = None
            report_anchors = []
            chart = None

            context = {
                'report': self,
                'form_groupby': form_groupby,
                'form_filter': form_filter,
                'form_config': form_config if self.type == 'chart' else None,
                'chart': chart,
                'report_anchors': report_anchors,
                'column_labels': column_labels,
                'report_rows': report_rows,
            }

            if request.GET:
                groupby_data = form_groupby.get_cleaned_data() if form_groupby else None
                filter_kwargs = form_filter.get_filter_kwargs()
                self.__dict__.update(groupby_data)
                report_rows = self.get_rows(request, groupby_data, filter_kwargs)

                for g, r in report_rows:
                    report_anchors.append(g)

                if len(report_anchors) <= 1:
                    report_anchors = []

                if self.type == 'chart':
                    config = form_config.get_config_data()
                    if config:
                        chart = self.get_chart(config, report_rows)

                if self.onlytotals:
                    for g, rows in report_rows:
                        for r in list(rows):
                            if r.is_value():
                                rows.remove(r)

                if not request.GET.get('export', None) is None:
                    if request.GET.get('export') == 'excel':
                        import csv
                        from django.http import HttpResponse

                        response = HttpResponse(mimetype='text/csv')
                        response['Content-Disposition'] = 'attachment; filename=%s.csv' % self.slug

                        writer = csv.writer(response)

                        writer.writerow([unicode(x).encode("utf-8") for x in column_labels])

                        for g, rows in report_rows:
                            for row in list(rows):
                                if row.is_value():
                                    writer.writerow([unicode(x.value).encode("utf-8") for x in row])
                                elif row.is_caption:
                                    writer.writerow([unicode(x).encode("utf-8") for x in row])
                                elif row.is_total:
                                    writer.writerow([unicode(x.value).encode("utf-8") for x in row])
                                    writer.writerow([unicode(' ').encode("utf-8") for x in row])

                        return response
                    if request.GET.get('export') == 'pdf':
                        report_anchors = None
                        setattr(self, 'is_export', True)
                        context = {
                            'report': self,
                            'column_labels': column_labels,
                            'report_rows': report_rows,
                        }
                        context.update({'pagesize': 'legal landscape'})
                        return render_to_pdf(self, 'model_report/export_pdf.html', context)

            context = {
                'report': self,
                'form_groupby': form_groupby,
                'form_filter': form_filter,
                'form_config': form_config if self.type == 'chart' else None,
                'chart': chart,
                'report_anchors': report_anchors,
                'column_labels': column_labels,
                'report_rows': report_rows,
            }

            if extra_context:
                context.update(extra_context)

            return render_to_response('model_report/report.html', context, context_instance=RequestContext(request))
        finally:
            globals()['_cache_class'] = {}