From 55a5a73ae15664e966b0adf6bd09dc41a33b4c87 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 11 Jun 2020 17:54:24 +0200 Subject: [PATCH] manager: fix handling duplicated slug in event import (#43947) --- chrono/manager/forms.py | 7 +++++++ chrono/manager/views.py | 2 -- tests/test_manager.py | 12 ++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/chrono/manager/forms.py b/chrono/manager/forms.py index f7230d5..856f8de 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -295,6 +295,7 @@ class ImportEventsForm(forms.Form): dialect = None events = [] + slugs = set() for i, csvline in enumerate(csv.reader(content.splitlines(), dialect=dialect)): if not csvline: continue @@ -335,6 +336,12 @@ class ImportEventsForm(forms.Form): exclude = ['desk', 'meeting_type'] if len(csvline) >= 6: event.slug = force_text(csvline[5]) if csvline[5] else None + if event.slug and event.slug in slugs: + raise ValidationError( + _('File contains duplicated event identifiers: %s') % event.slug + ) + else: + slugs.add(event.slug) else: exclude += ['slug'] column_index = 7 diff --git a/chrono/manager/views.py b/chrono/manager/views.py index 8eacca9..e6e5bec 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -1120,8 +1120,6 @@ class AgendaImportEventsView(ManagedAgendaMixin, FormView): if form.events: for event in form.events: event.agenda_id = self.kwargs['pk'] - if event.slug and Event.objects.filter(agenda_id=event.agenda_id, slug=event.slug).exists(): - raise ValidationError(_('Duplicated event identifier')) event.save() messages.info(self.request, _('%d events have been imported.') % len(form.events)) return super(AgendaImportEventsView, self).form_valid(form) diff --git a/tests/test_manager.py b/tests/test_manager.py index e9f67ad..76c2f1e 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -1137,6 +1137,18 @@ def test_import_events(app, admin_user): assert 'value cannot be a number' in resp.text assert 'Identifier:' in resp.text # verbose_name is shown, not field name ('slug:') + # handle duplicated slug + Event.objects.all().delete() + resp = app.get('/manage/agendas/%s/import-events' % agenda.id, status=200) + resp.form['events_csv_file'] = Upload( + 't.csv', + b'2016-09-16,18:00,10,5,label,slug\n' + b'2016-09-16,18:00,10,5,label,slug\n', + 'text/csv', + ) + resp = resp.form.submit(status=200) + assert 'duplicated event identifiers' in resp.text + def test_add_meetings_agenda(app, admin_user): app = login(app) -- 2.20.1