manager: check slugs on import (#45221)

This commit is contained in:
Lauréline Guérin 2020-07-21 16:13:57 +02:00
parent 6efa344ff6
commit 3f1ae0d037
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 49 additions and 1 deletions

View File

@ -79,10 +79,16 @@ def clean_import_data(cls, data):
cleaned_data = copy.deepcopy(data)
for param in data:
try:
cls._meta.get_field(param)
field = cls._meta.get_field(param)
except FieldDoesNotExist:
# remove unknown fields
cleaned_data.pop(param)
if param == 'slug':
value = cleaned_data[param]
try:
field.run_validators(value)
except ValidationError:
raise AgendaImportError(_('Bad slug format "%s"') % value)
return cleaned_data

View File

@ -2,6 +2,7 @@
from __future__ import unicode_literals
import copy
import datetime
from io import StringIO
import json
@ -376,3 +377,44 @@ def test_import_export_desk_unknown_fields(app, some_data, meetings_agenda):
assert Desk.objects.exists() is True
assert TimePeriod.objects.exists() is True
assert TimePeriodException.objects.exists() is True
def test_import_export_slug_fields(app):
agenda_events = Agenda.objects.create(label='Events Agenda', kind='events')
Event.objects.create(agenda=agenda_events, start_datetime=make_aware(datetime.datetime.now()), places=10)
agenda_meetings = Agenda.objects.create(label='Meetings Agenda', kind='meetings')
MeetingType.objects.create(agenda=agenda_meetings, label='Meeting Type', duration=30)
Desk.objects.create(agenda=agenda_meetings, label='Desk')
output = get_output_of_command('export_site')
original_payload = json.loads(output)
Agenda.objects.all().delete()
assert Agenda.objects.exists() is False
assert MeetingType.objects.exists() is False
assert Desk.objects.exists() is False
assert Event.objects.exists() is False
payload = copy.deepcopy(original_payload)
payload['agendas'][0]['slug'] = 'events-agenda&'
with pytest.raises(AgendaImportError) as excinfo:
import_site(payload)
assert str(excinfo.value) == 'Bad slug format "events-agenda&"'
payload = copy.deepcopy(original_payload)
payload['agendas'][0]['events'][0]['slug'] = 'events-agenda-event&'
with pytest.raises(AgendaImportError) as excinfo:
import_site(payload)
assert str(excinfo.value) == 'Bad slug format "events-agenda-event&"'
payload = copy.deepcopy(original_payload)
payload['agendas'][1]['desks'][0]['slug'] = 'desk&'
with pytest.raises(AgendaImportError) as excinfo:
import_site(payload)
assert str(excinfo.value) == 'Bad slug format "desk&"'
payload = copy.deepcopy(original_payload)
payload['agendas'][1]['meetingtypes'][0]['slug'] = 'meeting-type&'
with pytest.raises(AgendaImportError) as excinfo:
import_site(payload)
assert str(excinfo.value) == 'Bad slug format "meeting-type&"'