From ef47c1a00c421fcef8e586448f793d90b1369f7f Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 21 Sep 2022 16:10:04 +0200 Subject: [PATCH] manager: report errors in CSV import using event indexes (#66184) --- chrono/manager/forms.py | 18 +++++++++++------- tests/manager/test_event.py | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/chrono/manager/forms.py b/chrono/manager/forms.py index 62d1c957..08f7c328 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -27,6 +27,7 @@ from dateutil.relativedelta import relativedelta from django import forms from django.conf import settings from django.contrib.auth.models import Group +from django.contrib.humanize.templatetags.humanize import ordinal from django.core.exceptions import FieldDoesNotExist from django.core.validators import URLValidator from django.db import transaction @@ -1092,7 +1093,7 @@ class ImportEventsForm(forms.Form): if not csvline: continue if len(csvline) < 3: - raise ValidationError(_('Invalid file format. (line %d)') % (i + 1)) + raise ValidationError(_('Invalid file format. (%s event)') % ordinal(i + 1)) if i == 0 and csvline[0].strip('#') in ('date', 'Date', _('date'), _('Date')): continue @@ -1146,17 +1147,18 @@ class ImportEventsForm(forms.Form): event.start_datetime = event_datetime break else: - raise ValidationError(_('Invalid file format. (date/time format, line %d)') % (i + 1)) + raise ValidationError(_('Invalid file format. (date/time format, %s event)') % ordinal(i + 1)) try: event.places = int(csvline[2]) except ValueError: - raise ValidationError(_('Invalid file format. (number of places, line %d)') % (i + 1)) + raise ValidationError(_('Invalid file format. (number of places, %s event)') % ordinal(i + 1)) if len(csvline) >= 4: try: event.waiting_list_places = int(csvline[3]) except ValueError: raise ValidationError( - _('Invalid file format. (number of places in waiting list, line %d)') % (i + 1) + _('Invalid file format. (number of places in waiting list, %s event)') + % ordinal(i + 1) ) column_index = 7 @@ -1183,13 +1185,15 @@ class ImportEventsForm(forms.Form): except ValueError: continue else: - raise ValidationError(_('Invalid file format. (date/time format, line %d)') % (i + 1)) + raise ValidationError( + _('Invalid file format. (date/time format, %s event)') % ordinal(i + 1) + ) if len(csvline) >= 11 and csvline[10]: # duration is optional try: event.duration = int(csvline[10]) except ValueError: - raise ValidationError(_('Invalid file format. (duration, line %d)') % (i + 1)) + raise ValidationError(_('Invalid file format. (duration, %s event)') % ordinal(i + 1)) try: event.full_clean(exclude=['desk', 'meeting_type', 'primary_event']) @@ -1198,7 +1202,7 @@ class ImportEventsForm(forms.Form): 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)') % { + msg += _('%(errors)s (event %(line)d)') % { 'errors': ', '.join(field_errors), 'line': i + 1, } diff --git a/tests/manager/test_event.py b/tests/manager/test_event.py index 3b5602c0..52f87378 100644 --- a/tests/manager/test_event.py +++ b/tests/manager/test_event.py @@ -784,7 +784,7 @@ def test_import_events(app, admin_user): resp.form['events_csv_file'] = Upload('t.csv', b'2016-14-16,18:00,10', 'text/csv') resp = resp.form.submit(status=200) - assert 'Invalid file format. (date/time format' in resp.text + assert 'Invalid file format. (date/time format, 1st event)' in resp.text resp.form['events_csv_file'] = Upload('t.csv', b'2016-09-16,18:00,blah', 'text/csv') resp = resp.form.submit(status=200) -- 2.30.2