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)
|
||||
|
||||
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,
|
||||
|
|
|
@ -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(
|
||||
{
|
||||
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):
|
||||
|
|
|
@ -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.',
|
||||
]
|
||||
|
|
Loading…
Reference in New Issue