views: grey out unavailable visualizations (#27412)

This commit is contained in:
Valentin Deniaud 2019-10-29 17:46:21 +01:00
parent ba2c0c4fab
commit a0caedde62
8 changed files with 52 additions and 17 deletions

View File

@ -9,12 +9,7 @@
{% block content %}
{% if visualizations %}
<h2>{% trans "Visualizations" %}</h2>
<ul class="objects-list single-links bijoe-visualizations">
{% for visualization in visualizations %}
{% url 'visualization' pk=visualization.pk as visualization_url %}
<li><a href="{{ visualization_url }}">{{ visualization.name }}</a></li>
{% endfor %}
</ul>
{% include "bijoe/visualizations_list.html" %}
{% endif %}
{% if warehouses %}
<h2>{% trans "Data sources" %}</h2>

View File

@ -11,9 +11,5 @@
{% endblock %}
{% block content %}
<ul class="objects-list single-links bijoe-visualizations">
{% for visualization in object_list %}
<li><a href="{% url "visualization" pk=visualization.pk %}">{{ visualization.name }}</a></li>
{% endfor %}
</ul>
{% include "bijoe/visualizations_list.html" %}
{% endblock %}

View File

@ -0,0 +1,10 @@
{% load i18n %}
<ul class="objects-list single-links bijoe-visualizations">
{% for visualization in visualizations %}
{% url 'visualization' pk=visualization.pk as visualization_url %}
<li>
<a {% if visualization.exists %}href="{{ visualization_url }}"{% else %}class="disabled" title="{% trans "Form data not found" %}"{% endif %}>{{ visualization.name }}</a>
</li>
{% endfor %}
</ul>

View File

@ -35,6 +35,7 @@ except ImportError:
from .utils import get_warehouses
from .engine import Engine
from .visualization.models import Visualization
from .visualization.utils import Visualization as VisuUtil
class AuthorizationMixin(object):

View File

@ -18,10 +18,13 @@ import json
import datetime
from django.db import models
from django.http import Http404
from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _
from jsonfield import JSONField
from .utils import Visualization as VisuUtils
class JSONEncoder(json.JSONEncoder):
def default(self, obj):
@ -62,3 +65,11 @@ class Visualization(models.Model):
slug = '%s-%s' % (base_slug, i)
self.slug = slug
return super(Visualization, self).save(*args, **kwargs)
@property
def exists(self):
try:
VisuUtils.get_cube(self.parameters)
return True
except Http404:
return False

View File

@ -74,8 +74,8 @@ class Visualization(object):
drilldown_x=self.drilldown_x, drilldown_y=self.drilldown_y,
filters=copy.deepcopy(self.filters), loop=self.loop)
@classmethod
def from_json(cls, d):
@staticmethod
def get_cube(d):
for warehouse in get_warehouses():
if d['warehouse'] == warehouse.name:
break
@ -83,9 +83,13 @@ class Visualization(object):
raise Http404('warehouse %s not found' % d['warehouse'])
engine = Engine(warehouse)
try:
cube = engine[d['cube']]
return engine[d['cube']]
except KeyError:
raise Http404('cube %s not found' % d['cube'])
@classmethod
def from_json(cls, d):
cube = cls.get_cube(d)
representation = d['representation']
measure = cube.measures[d['measure']]
drilldown_x = cube.dimensions[d['drilldown_x']] if 'drilldown_x' in d else None

View File

@ -185,6 +185,7 @@ class DeleteVisualizationView(views.AuthorizationMixin, DeleteView):
class VisualizationsView(views.AuthorizationMixin, ListView):
template_name = 'bijoe/visualizations.html'
model = models.Visualization
context_object_name = 'visualizations'
class RenameVisualization(views.AuthorizationMixin, UpdateView):

View File

@ -36,9 +36,9 @@ def test_superuser(app, admin):
def test_visualizations_json_api(schema1, app, admin):
Visualization(name='test', parameters={}).save()
Visualization(name='test', parameters={}).save()
Visualization(name='test', parameters={}).save()
Visualization(name='test', parameters={'warehouse': 'schema1', 'cube': 'test'}).save()
Visualization(name='test', parameters={'warehouse': 'schema1', 'cube': 'test'}).save()
Visualization(name='test', parameters={'warehouse': 'schema1', 'cube': 'test'}).save()
login(app, admin)
resp = app.get(reverse('visualizations-json'))
assert set([x['slug'] for x in resp.json]) == set(['test', 'test-2', 'test-3'])
@ -90,3 +90,20 @@ def test_visualization_json_api_duration(schema1, app, admin):
'format': '1',
'unit': 'seconds',
}
def test_missing_data(schema1, app, admin):
visualization = Visualization(
name='test',
parameters={
'cube': 'missing_cube',
'warehouse': 'schema1',
'measure': 'duration',
'representation': 'table',
'loop': '',
'filters': {}})
visualization.save()
login(app, admin)
response = app.get('/')
assert response.pyquery('ul li a.disabled').text() == visualization.name