Projet

Général

Profil

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

Valentin Deniaud, 21 novembre 2019 11:58

Télécharger (7,12 ko)

Voir les différences:

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

 bijoe/templates/bijoe/homepage.html           |  7 +-----
 bijoe/templates/bijoe/visualizations.html     |  6 +----
 .../templates/bijoe/visualizations_list.html  | 10 ++++++++
 bijoe/views.py                                |  1 +
 bijoe/visualization/models.py                 | 11 +++++++++
 bijoe/visualization/utils.py                  | 10 +++++---
 bijoe/visualization/views.py                  |  1 +
 tests/test_views.py                           | 23 ++++++++++++++++---
 8 files changed, 52 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 in visualizations %}
5
    {% url 'visualization' pk=visualization.pk as visualization_url %}
6
    <li>
7
      <a {% if visualization.exists %}href="{{ visualization_url }}"{% else %}class="disabled" title="{% trans "Form data not found" %}"{% endif %}>{{ visualization.name }}</a>
8
    </li>
9
  {% endfor %}
10
</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):
bijoe/visualization/models.py
18 18
import datetime
19 19

  
20 20
from django.db import models
21
from django.http import Http404
21 22
from django.utils.text import slugify
22 23
from django.utils.translation import ugettext_lazy as _
23 24
from jsonfield import JSONField
24 25

  
26
from .utils import Visualization as VisuUtils
27

  
25 28

  
26 29
class JSONEncoder(json.JSONEncoder):
27 30
    def default(self, obj):
......
62 65
                slug = '%s-%s' % (base_slug, i)
63 66
            self.slug = slug
64 67
        return super(Visualization, self).save(*args, **kwargs)
68

  
69
    @property
70
    def exists(self):
71
        try:
72
            VisuUtils.get_cube(self.parameters)
73
            return True
74
        except Http404:
75
            return False
bijoe/visualization/utils.py
74 74
                             drilldown_x=self.drilldown_x, drilldown_y=self.drilldown_y,
75 75
                             filters=copy.deepcopy(self.filters), loop=self.loop)
76 76

  
77
    @classmethod
78
    def from_json(cls, d):
77
    @staticmethod
78
    def get_cube(d):
79 79
        for warehouse in get_warehouses():
80 80
            if d['warehouse'] == warehouse.name:
81 81
                break
......
83 83
            raise Http404('warehouse %s not found' % d['warehouse'])
84 84
        engine = Engine(warehouse)
85 85
        try:
86
            cube = engine[d['cube']]
86
            return engine[d['cube']]
87 87
        except KeyError:
88 88
            raise Http404('cube %s not found' % d['cube'])
89

  
90
    @classmethod
91
    def from_json(cls, d):
92
        cube = cls.get_cube(d)
89 93
        representation = d['representation']
90 94
        measure = cube.measures[d['measure']]
91 95
        drilldown_x = cube.dimensions[d['drilldown_x']] if 'drilldown_x' in d else None
bijoe/visualization/views.py
185 185
class VisualizationsView(views.AuthorizationMixin, ListView):
186 186
    template_name = 'bijoe/visualizations.html'
187 187
    model = models.Visualization
188
    context_object_name = 'visualizations'
188 189

  
189 190

  
190 191
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
-