From 2cd4969312f6b33f817c35d99dafed7aef51c0ec Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 11 Jun 2020 17:04:58 +0200 Subject: [PATCH] manager: improve error display in events import (#42344) --- chrono/manager/forms.py | 22 +++++++++++++++++----- tests/test_manager.py | 6 ++++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/chrono/manager/forms.py b/chrono/manager/forms.py index 7176326..f7230d5 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -21,6 +21,7 @@ import datetime from django import forms from django.contrib.auth.models import Group +from django.core.exceptions import FieldDoesNotExist from django.forms import ValidationError from django.utils.encoding import force_text from django.utils.timezone import make_aware @@ -345,15 +346,26 @@ class ImportEventsForm(forms.Form): try: event.full_clean(exclude=exclude) except ValidationError as e: - errors = [ - _('Invalid file format. (%(label)s: %(errors)s, line %(line)d)') - % {'label': label, 'errors': u', '.join(field_errors), 'line': i + 1} - for label, field_errors in e.message_dict.items() - ] + errors = [_('Invalid file format:\n')] + for label, field_errors in e.message_dict.items(): + label_name = self.get_verbose_name(label) + msg = _('%s: ') % label_name if label_name else '' + msg += _('%(errors)s (line %(line)d)') % { + 'errors': ', '.join(field_errors), + 'line': i + 1, + } + errors.append(msg) raise ValidationError(errors) events.append(event) self.events = events + @staticmethod + def get_verbose_name(field_name): + try: + return Event._meta.get_field(field_name).verbose_name + except FieldDoesNotExist: + return '' + class ExceptionsImportForm(forms.ModelForm): ics_file = forms.FileField( diff --git a/tests/test_manager.py b/tests/test_manager.py index 5a54952..e9f67ad 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -1011,7 +1011,7 @@ def test_import_events(app, admin_user): resp.form['events_csv_file'] = Upload('t.csv', b'2016-09-16,18:00,10,5,' + b'x' * 151, 'text/csv') resp = resp.form.submit(status=200) - assert 'Invalid file format. (label: Ensure this value has at most 150' in resp.text + assert 'Ensure this value has at most 150' in resp.text 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', 'text/csv') @@ -1101,7 +1101,8 @@ def test_import_events(app, admin_user): 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', 'text/csv') resp = resp.form.submit(status=200) - assert 'Invalid file format. (__all__: Event with this Agenda and Identifier already exists.' in resp.text + assert 'Event with this Agenda and Identifier already exists.' in resp.text + assert not '__all__' in resp.text # additional optional attributes Event.objects.all().delete() @@ -1134,6 +1135,7 @@ def test_import_events(app, admin_user): resp.form['events_csv_file'] = Upload('t.csv', b'2016-09-16,18:00,10,5,label,1234', 'text/csv') resp = resp.form.submit(status=200) assert 'value cannot be a number' in resp.text + assert 'Identifier:' in resp.text # verbose_name is shown, not field name ('slug:') def test_add_meetings_agenda(app, admin_user): -- 2.20.1