diff --git a/bijoe/visualization/utils.py b/bijoe/visualization/utils.py index 852b251..a176791 100644 --- a/bijoe/visualization/utils.py +++ b/bijoe/visualization/utils.py @@ -125,9 +125,21 @@ class Visualization: errors.append(_('Dimension %s does not exist.') % e) filters = d.get('filters', {}) + for dimension_name in list(filters): + try: + cube.dimensions[dimension_name] + except schemas.DimensionNotFound as e: + filters.pop(dimension_name) + errors.append(_('Filter %s does not exist.') % e) + loop = d.get('loop') if loop: - loop = cube.dimensions[loop] + try: + loop = cube.dimensions[d.get('loop')] + except schemas.DimensionNotFound as e: + errors.append(_('Dimension %s does not exist.') % e) + loop = None + visualization = cls( cube, representation, diff --git a/bijoe/visualization/views.py b/bijoe/visualization/views.py index 4e2fb65..4426c32 100644 --- a/bijoe/visualization/views.py +++ b/bijoe/visualization/views.py @@ -372,15 +372,18 @@ class VisualizationJSONView(generics.GenericAPIView): unit = 'seconds' if all_visualizations.measure.type == 'duration' else None measure = all_visualizations.measure.type - return Response( - { - 'data': data, - 'axis': axis, - 'format': '1', - 'unit': unit, # legacy, prefer measure. - 'measure': measure, - } - ) + response = { + 'data': data, + 'axis': axis, + 'format': '1', + 'unit': unit, # legacy, prefer measure. + 'measure': measure, + } + if all_visualizations.cube.warnings: + response['warnings'] = all_visualizations.cube.warnings + if all_visualizations.errors: + response['errors'] = all_visualizations.errors + return Response(response) class ExportVisualizationView(views.AuthorizationMixin, DetailView): diff --git a/tests/test_views.py b/tests/test_views.py index 4c6fead..5d27b7a 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -20,6 +20,7 @@ import json from unittest import mock import pytest +from django.test import override_settings from django.urls import reverse from django.utils.encoding import force_bytes from utils import login @@ -123,6 +124,10 @@ def test_visualization_json_api(schema1, app, admin, visualization): 'format': '1', 'unit': None, 'measure': 'integer', + 'warnings': [ + "le champ « pouët » n'est pas bon", + 'warning2', + ], } @@ -159,6 +164,10 @@ def test_visualization_json_api_duration(schema1, app, admin, visualization): 'format': '1', 'unit': 'seconds', 'measure': 'duration', + 'warnings': [ + "le champ « pouët » n'est pas bon", + 'warning2', + ], } @@ -279,6 +288,7 @@ def test_import_visualization(schema1, app, admin, visualization, settings, free assert Visualization.objects.count() == 3 +@override_settings(LANGUAGE_CODE='en-us') def test_save_as(schema1, app, admin, visualization): login(app, admin) resp = app.get('/visualization/%s/' % visualization.id) @@ -332,9 +342,42 @@ def test_mellon_idp_redirections(mocked_resolv_url, mocked_get_idps, app): def test_visualization_json_api_dimension_not_found(schema1, app, admin, visualization): + visualization.parameters['drilldown_x'] = 'foo' + visualization.parameters['drilldown_y'] = 'bar' + visualization.parameters['loop'] = 'zob' visualization.parameters['filters']['coin'] = '1' visualization.save() login(app, admin) - resp = app.get(reverse('visualization-json', kwargs={'pk': visualization.id}), status=400) - assert resp.json == {'err': 'dimension-not-found', 'err_desc': 'coin'} + resp = app.get(reverse('visualization-json', kwargs={'pk': visualization.id}), status=200) + assert resp.json['warnings'] == [ + "le champ « pouët » n'est pas bon", + 'warning2', + ] + assert resp.json['errors'] == [ + 'La dimension «\xa0foo\xa0» n’existe pas.', + 'La dimension «\xa0bar\xa0» n’existe pas.', + 'La dimension «\xa0coin\xa0» n’existe pas, le filtre sera ignoré.', + 'La dimension «\xa0zob\xa0» n’existe pas.', + ] + + +def test_visualization_dimension_not_found(schema1, app, admin, visualization): + visualization.parameters['drilldown_x'] = 'foo' + visualization.parameters['drilldown_y'] = 'bar' + visualization.parameters['loop'] = 'zob' + visualization.parameters['filters']['coin'] = '1' + visualization.save() + + login(app, admin) + resp = app.get(reverse('visualization', kwargs={'pk': visualization.id}), status=200) + assert [elt.text() for elt in resp.pyquery('ul.messages li.warning').items()] == [ + "le champ « pouët » n'est pas bon", + 'warning2', + ] + assert [elt.text() for elt in resp.pyquery('ul.messages li.error').items()] == [ + 'La dimension «\xa0foo\xa0» n’existe pas.', + 'La dimension «\xa0bar\xa0» n’existe pas.', + 'La dimension «\xa0coin\xa0» n’existe pas, le filtre sera ignoré.', + 'La dimension «\xa0zob\xa0» n’existe pas.', + ]