0002-views-grey-out-unavailable-visualizations-27412.patch
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 |
- |