misc: ignore filters and loops for unknown dimensions (#75513)
Check they are reported in HTML and JSON view.
This commit is contained in:
parent
2ce0efa30a
commit
19d3883821
|
@ -125,9 +125,21 @@ class Visualization:
|
||||||
errors.append(_('Dimension %s does not exist.') % e)
|
errors.append(_('Dimension %s does not exist.') % e)
|
||||||
|
|
||||||
filters = d.get('filters', {})
|
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')
|
loop = d.get('loop')
|
||||||
if 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(
|
visualization = cls(
|
||||||
cube,
|
cube,
|
||||||
representation,
|
representation,
|
||||||
|
|
|
@ -372,15 +372,18 @@ class VisualizationJSONView(generics.GenericAPIView):
|
||||||
unit = 'seconds' if all_visualizations.measure.type == 'duration' else None
|
unit = 'seconds' if all_visualizations.measure.type == 'duration' else None
|
||||||
measure = all_visualizations.measure.type
|
measure = all_visualizations.measure.type
|
||||||
|
|
||||||
return Response(
|
response = {
|
||||||
{
|
'data': data,
|
||||||
'data': data,
|
'axis': axis,
|
||||||
'axis': axis,
|
'format': '1',
|
||||||
'format': '1',
|
'unit': unit, # legacy, prefer measure.
|
||||||
'unit': unit, # legacy, prefer measure.
|
'measure': 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):
|
class ExportVisualizationView(views.AuthorizationMixin, DetailView):
|
||||||
|
|
|
@ -20,6 +20,7 @@ import json
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from django.test import override_settings
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.encoding import force_bytes
|
from django.utils.encoding import force_bytes
|
||||||
from utils import login
|
from utils import login
|
||||||
|
@ -123,6 +124,10 @@ def test_visualization_json_api(schema1, app, admin, visualization):
|
||||||
'format': '1',
|
'format': '1',
|
||||||
'unit': None,
|
'unit': None,
|
||||||
'measure': 'integer',
|
'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',
|
'format': '1',
|
||||||
'unit': 'seconds',
|
'unit': 'seconds',
|
||||||
'measure': 'duration',
|
'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
|
assert Visualization.objects.count() == 3
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(LANGUAGE_CODE='en-us')
|
||||||
def test_save_as(schema1, app, admin, visualization):
|
def test_save_as(schema1, app, admin, visualization):
|
||||||
login(app, admin)
|
login(app, admin)
|
||||||
resp = app.get('/visualization/%s/' % visualization.id)
|
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):
|
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.parameters['filters']['coin'] = '1'
|
||||||
visualization.save()
|
visualization.save()
|
||||||
|
|
||||||
login(app, admin)
|
login(app, admin)
|
||||||
resp = app.get(reverse('visualization-json', kwargs={'pk': visualization.id}), status=400)
|
resp = app.get(reverse('visualization-json', kwargs={'pk': visualization.id}), status=200)
|
||||||
assert resp.json == {'err': 'dimension-not-found', 'err_desc': 'coin'}
|
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.',
|
||||||
|
]
|
||||||
|
|
Loading…
Reference in New Issue