Projet

Général

Profil

0002-dataviz-turn-dataviz-graph-into-class-based-view-605.patch

Valentin Deniaud, 18 janvier 2022 17:09

Télécharger (4,65 ko)

Voir les différences:

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
combo/apps/dataviz/templates/combo/dataviz-error.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
3
  viewBox="0 0 {{ width }} 30" width="{{ width }}" height="30">
4
  <text
5
       y="20"
6
       x="10"
7
       style="font-family: sans-serif; font-size: 16px; fill:#000000;">{{ text }}</text>
8
</svg>
combo/apps/dataviz/views.py
16 16

  
17 17
from django.core.exceptions import PermissionDenied
18 18
from django.http import Http404, HttpResponse
19
from django.shortcuts import render
19 20
from django.utils.translation import ugettext_lazy as _
21
from django.views.generic import DetailView
20 22
from requests.exceptions import HTTPError
21 23

  
22 24
from combo.utils import get_templated_url, requests
......
30 32
    return HttpResponse(response.content, content_type='text/json')
31 33

  
32 34

  
33
def dataviz_graph(request, *args, **kwargs):
34
    cell = ChartNgCell.objects.get(id=kwargs.get('cell'))
35
    if not cell.page.is_visible(request.user):
36
        raise PermissionDenied()
37
    if not cell.is_visible(user=request.user):
38
        raise PermissionDenied()
39
    if not cell.statistic or not cell.statistic.url:
40
        raise Http404('misconfigured cell')
41
    error_text = None
42
    try:
43
        chart = cell.get_chart(
44
            width=int(request.GET['width']) if request.GET.get('width') else None,
45
            height=int(request.GET['height']) if request.GET.get('height') else int(cell.height),
46
        )
47
    except UnsupportedDataSet:
48
        error_text = _('Unsupported dataset.')
49
    except HTTPError as e:
50
        if e.response.status_code == 404:
51
            error_text = _('Visualization not found.')
52
        else:
53
            error_text = _('Unknown HTTP error: %s' % e)
35
class DatavizGraphView(DetailView):
36
    model = ChartNgCell
37
    pk_url_kwarg = 'cell'
54 38

  
55
    if error_text:
56
        svg = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
57
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
58
  viewBox="0 0 %(width)s 30" width="%(width)s" height="30">
59
  <text
60
       y="20"
61
       x="10"
62
       style="font-family: sans-serif; font-size: 16px; fill:#000000;">%(text)s</text>
63
</svg>""" % {
64
            'width': request.GET.get('width', 200),
39
    def dispatch(self, request, *args, **kwargs):
40
        self.cell = self.get_object()
41

  
42
        if not self.cell.page.is_visible(request.user):
43
            raise PermissionDenied()
44
        if not self.cell.is_visible(user=request.user):
45
            raise PermissionDenied()
46
        if not self.cell.statistic or not self.cell.statistic.url:
47
            raise Http404('misconfigured cell')
48

  
49
        return super().dispatch(request, *args, **kwargs)
50

  
51
    def get(self, request, *args, **kwargs):
52
        try:
53
            chart = self.cell.get_chart(
54
                width=int(request.GET['width']) if request.GET.get('width') else None,
55
                height=int(request.GET['height']) if request.GET.get('height') else int(self.cell.height),
56
            )
57
        except UnsupportedDataSet:
58
            return self.svg_error(_('Unsupported dataset.'))
59
        except HTTPError as e:
60
            if e.response.status_code == 404:
61
                return self.svg_error(_('Visualization not found.'))
62
            else:
63
                return self.svg_error(_('Unknown HTTP error: %s' % e))
64

  
65
        return HttpResponse(chart.render(), content_type='image/svg+xml')
66

  
67
    def svg_error(self, error_text):
68
        context = {
69
            'width': self.request.GET.get('width', 200),
65 70
            'text': error_text,
66 71
        }
67
    else:
68
        svg = chart.render()
69
    return HttpResponse(svg, content_type='image/svg+xml')
72
        return render(self.request, 'combo/dataviz-error.svg', context=context, content_type='image/svg+xml')
73

  
74

  
75
dataviz_graph = DatavizGraphView.as_view()
70
-