0003-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 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 |
- |