misc: ignore filters and loops for unknown dimensions (#75513)

Check they are reported in HTML and JSON view.
This commit is contained in:
Benjamin Dauvergne 2023-04-17 09:02:33 +02:00
parent 2ce0efa30a
commit 19d3883821
3 changed files with 70 additions and 12 deletions

View File

@ -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,

View File

@ -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):

View File

@ -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» nexiste pas.',
'La dimension «\xa0bar\xa0» nexiste pas.',
'La dimension «\xa0coin\xa0» nexiste pas, le filtre sera ignoré.',
'La dimension «\xa0zob\xa0» nexiste 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» nexiste pas.',
'La dimension «\xa0bar\xa0» nexiste pas.',
'La dimension «\xa0coin\xa0» nexiste pas, le filtre sera ignoré.',
'La dimension «\xa0zob\xa0» nexiste pas.',
]