Projet

Général

Profil

0002-views-grey-out-unavailable-visualizations-27412.patch

Valentin Deniaud, 20 novembre 2019 17:18

Télécharger (7,24 ko)

Voir les différences:

Subject: [PATCH 2/3] views: grey out unavailable visualizations (#27412)

 bijoe/templates/bijoe/homepage.html           |  7 +-----
 bijoe/templates/bijoe/visualizations.html     |  6 +----
 .../templates/bijoe/visualizations_list.html  |  8 +++++++
 bijoe/views.py                                |  5 +++-
 bijoe/visualization/utils.py                  | 16 +++++++++++--
 bijoe/visualization/views.py                  |  7 ++++++
 tests/test_views.py                           | 23 ++++++++++++++++---
 7 files changed, 55 insertions(+), 17 deletions(-)
 create mode 100644 bijoe/templates/bijoe/visualizations_list.html
bijoe/templates/bijoe/homepage.html
9 9
{% block content %}
10 10
  {% if visualizations %}
11 11
    <h2>{% trans "Visualizations" %}</h2>
12
    <ul class="objects-list single-links bijoe-visualizations">
13
    {% for visualization in visualizations %}
14
         {% url 'visualization' pk=visualization.pk as visualization_url %}
15
         <li><a href="{{ visualization_url }}">{{ visualization.name }}</a></li>
16
    {% endfor %}
17
    </ul>
12
    {% include "bijoe/visualizations_list.html" %}
18 13
  {% endif %}
19 14
  {% if warehouses %}
20 15
    <h2>{% trans "Data sources" %}</h2>
bijoe/templates/bijoe/visualizations.html
11 11
{% endblock %}
12 12

  
13 13
{% block content %}
14
  <ul class="objects-list single-links bijoe-visualizations">
15
  {% for visualization in object_list %}
16
    <li><a href="{% url "visualization" pk=visualization.pk %}">{{ visualization.name }}</a></li>
17
  {% endfor %}
18
  </ul>
14
{% include "bijoe/visualizations_list.html" %}
19 15
{% endblock %}
bijoe/templates/bijoe/visualizations_list.html
1
{% load i18n %}
2

  
3
<ul class="objects-list single-links bijoe-visualizations">
4
  {% for visualization, exists in visualizations.items %}
5
    {% url 'visualization' pk=visualization.pk as visualization_url %}
6
    <li><a {% if exists %}href="{{ visualization_url }}"{% else %}class="disabled" title="{% trans "Form data not found" %}"{% endif %}>{{ visualization.name }}</a></li>
7
  {% endfor %}
8
</ul>
bijoe/views.py
35 35
from .utils import get_warehouses
36 36
from .engine import Engine
37 37
from .visualization.models import Visualization
38
from .visualization.utils import Visualization as VisuUtil
38 39

  
39 40

  
40 41
class AuthorizationMixin(object):
......
58 59

  
59 60
    def get_context_data(self, **kwargs):
60 61
        ctx = super(HomepageView, self).get_context_data(**kwargs)
61
        ctx['visualizations'] = Visualization.objects.all()
62
        visualizations = Visualization.objects.all()
63
        ctx['visualizations'] = {v: VisuUtil.exists(v, request=self.request)
64
                                 for v in visualizations}
62 65
        ctx['warehouses'] = sorted((Engine(w) for w in get_warehouses(self.request)),
63 66
                                   key=lambda w: w.label)
64 67
        return ctx
bijoe/visualization/utils.py
75 75
                             filters=copy.deepcopy(self.filters), loop=self.loop)
76 76

  
77 77
    @classmethod
78
    def from_json(cls, d, request=None):
78
    def exists(cls, visualization_obj, request=None):
79
        try:
80
            cls.get_cube(visualization_obj.parameters, request)
81
            return True
82
        except Http404:
83
            return False
84

  
85
    @staticmethod
86
    def get_cube(d, request=None):
79 87
        for warehouse in get_warehouses(request=request):
80 88
            if d['warehouse'] == warehouse.name:
81 89
                break
......
83 91
            raise Http404('warehouse %s not found' % d['warehouse'])
84 92
        engine = Engine(warehouse)
85 93
        try:
86
            cube = engine[d['cube']]
94
            return engine[d['cube']]
87 95
        except KeyError:
88 96
            raise Http404('cube %s not found' % d['cube'])
97

  
98
    @classmethod
99
    def from_json(cls, d, request=None):
100
        cube = cls.get_cube(d, request)
89 101
        representation = d['representation']
90 102
        measure = cube.measures[d['measure']]
91 103
        drilldown_x = cube.dimensions[d['drilldown_x']] if 'drilldown_x' in d else None
bijoe/visualization/views.py
186 186
class VisualizationsView(views.AuthorizationMixin, ListView):
187 187
    template_name = 'bijoe/visualizations.html'
188 188
    model = models.Visualization
189
    context_object_name = 'visualizations'
190

  
191
    def get_context_data(self, **kwargs):
192
        ctx = super(VisualizationsView, self).get_context_data(**kwargs)
193
        ctx[self.context_object_name] = {v: Visualization.exists(v, request=self.request)
194
                                         for v in ctx[self.context_object_name]}
195
        return ctx
189 196

  
190 197

  
191 198
class RenameVisualization(views.AuthorizationMixin, UpdateView):
tests/test_views.py
36 36

  
37 37

  
38 38
def test_visualizations_json_api(schema1, app, admin):
39
    Visualization(name='test', parameters={}).save()
40
    Visualization(name='test', parameters={}).save()
41
    Visualization(name='test', parameters={}).save()
39
    Visualization(name='test', parameters={'warehouse': 'schema1', 'cube': 'test'}).save()
40
    Visualization(name='test', parameters={'warehouse': 'schema1', 'cube': 'test'}).save()
41
    Visualization(name='test', parameters={'warehouse': 'schema1', 'cube': 'test'}).save()
42 42
    login(app, admin)
43 43
    resp = app.get(reverse('visualizations-json'))
44 44
    assert set([x['slug'] for x in resp.json]) == set(['test', 'test-2', 'test-3'])
......
90 90
        'format': '1',
91 91
        'unit': 'seconds',
92 92
    }
93

  
94

  
95
def test_missing_data(schema1, app, admin):
96
    visualization = Visualization(
97
        name='test',
98
        parameters={
99
            'cube': 'missing_cube',
100
            'warehouse': 'schema1',
101
            'measure': 'duration',
102
            'representation': 'table',
103
            'loop': '',
104
            'filters': {}})
105
    visualization.save()
106
    login(app, admin)
107

  
108
    response = app.get('/')
109
    assert response.pyquery('ul li a.disabled').text() == visualization.name
93
-