From 99043cde28fc633605a5b7b0e34336f5b10cfe64 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 12 Jan 2022 11:37:52 +0100 Subject: [PATCH 2/5] dataviz: turn dataviz graph into class based view (#60547) --- .../dataviz/templates/combo/dataviz-error.svg | 8 ++ combo/apps/dataviz/views.py | 74 ++++++++++--------- 2 files changed, 48 insertions(+), 34 deletions(-) create mode 100644 combo/apps/dataviz/templates/combo/dataviz-error.svg diff --git a/combo/apps/dataviz/templates/combo/dataviz-error.svg b/combo/apps/dataviz/templates/combo/dataviz-error.svg new file mode 100644 index 00000000..ed6948cd --- /dev/null +++ b/combo/apps/dataviz/templates/combo/dataviz-error.svg @@ -0,0 +1,8 @@ + + + {{ text }} + diff --git a/combo/apps/dataviz/views.py b/combo/apps/dataviz/views.py index ca44ab52..8a5661b0 100644 --- a/combo/apps/dataviz/views.py +++ b/combo/apps/dataviz/views.py @@ -16,7 +16,9 @@ from django.core.exceptions import PermissionDenied from django.http import Http404, HttpResponse +from django.shortcuts import render from django.utils.translation import ugettext_lazy as _ +from django.views.generic import DetailView from requests.exceptions import HTTPError from combo.utils import get_templated_url, requests @@ -30,40 +32,44 @@ def ajax_gauge_count(request, *args, **kwargs): return HttpResponse(response.content, content_type='text/json') -def dataviz_graph(request, *args, **kwargs): - cell = ChartNgCell.objects.get(id=kwargs.get('cell')) - if not cell.page.is_visible(request.user): - raise PermissionDenied() - if not cell.is_visible(user=request.user): - raise PermissionDenied() - if not cell.statistic or not cell.statistic.url: - raise Http404('misconfigured cell') - error_text = None - try: - chart = cell.get_chart( - width=int(request.GET['width']) if request.GET.get('width') else None, - height=int(request.GET['height']) if request.GET.get('height') else int(cell.height), - ) - except UnsupportedDataSet: - error_text = _('Unsupported dataset.') - except HTTPError as e: - if e.response.status_code == 404: - error_text = _('Visualization not found.') - else: - error_text = _('Unknown HTTP error: %s' % e) +class DatavizGraphView(DetailView): + model = ChartNgCell + pk_url_kwarg = 'cell' - if error_text: - svg = """ - - %(text)s -""" % { - 'width': request.GET.get('width', 200), + def dispatch(self, request, *args, **kwargs): + self.cell = self.get_object() + + if not self.cell.page.is_visible(request.user): + raise PermissionDenied() + if not self.cell.is_visible(user=request.user): + raise PermissionDenied() + if not self.cell.statistic or not self.cell.statistic.url: + raise Http404('misconfigured cell') + + return super().dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + try: + chart = self.cell.get_chart( + width=int(request.GET['width']) if request.GET.get('width') else None, + height=int(request.GET['height']) if request.GET.get('height') else int(self.cell.height), + ) + except UnsupportedDataSet: + return self.svg_error(_('Unsupported dataset.')) + except HTTPError as e: + if e.response.status_code == 404: + return self.svg_error(_('Visualization not found.')) + else: + return self.svg_error(_('Unknown HTTP error: %s' % e)) + + return HttpResponse(chart.render(), content_type='image/svg+xml') + + def svg_error(self, error_text): + context = { + 'width': self.request.GET.get('width', 200), 'text': error_text, } - else: - svg = chart.render() - return HttpResponse(svg, content_type='image/svg+xml') + return render(self.request, 'combo/dataviz-error.svg', context=context, content_type='image/svg+xml') + + +dataviz_graph = DatavizGraphView.as_view() -- 2.30.2