agendas: fix import with bad datetimes (#62352)

This commit is contained in:
Lauréline Guérin 2022-03-03 16:40:26 +01:00
parent 26fdc69a95
commit 387b08b7aa
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 43 additions and 5 deletions

View File

@ -1610,12 +1610,17 @@ class Event(models.Model):
@classmethod
def import_json(cls, data):
data['start_datetime'] = make_aware(
datetime.datetime.strptime(data['start_datetime'], '%Y-%m-%d %H:%M:%S')
)
try:
data['start_datetime'] = make_aware(
datetime.datetime.strptime(data['start_datetime'], '%Y-%m-%d %H:%M:%S')
)
except ValueError:
raise AgendaImportError(_('Bad datetime format "%s"') % data['start_datetime'])
data = clean_import_data(cls, data)
if data.get('slug'):
event, _ = cls.objects.update_or_create(agenda=data['agenda'], slug=data['slug'], defaults=data)
event, dummy = cls.objects.update_or_create(
agenda=data['agenda'], slug=data['slug'], defaults=data
)
else:
event = cls(**data)
event.save()
@ -2650,7 +2655,10 @@ class TimePeriodException(models.Model):
def import_json(cls, data):
def import_datetime(s):
'''Import datetime as a naive ISO8601 serialization'''
return make_aware(datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S'), is_dst=True)
try:
return make_aware(datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S'), is_dst=True)
except ValueError:
raise AgendaImportError(_('Bad datetime format "%s"') % s)
for k, v in data.items():
if k.endswith('_datetime'):

View File

@ -140,6 +140,36 @@ def test_import_export(app):
shutil.rmtree(tempdir)
def test_import_export_bad_date_format(app):
agenda_events = Agenda.objects.create(label='Events Agenda', kind='events')
Desk.objects.create(agenda=agenda_events, slug='_exceptions_holder')
Event.objects.create(
agenda=agenda_events, start_datetime=make_aware(datetime.datetime(2020, 7, 21, 16, 42, 35)), places=10
)
output = get_output_of_command('export_site')
payload = json.loads(output)
assert len(payload['agendas']) == 1
payload['agendas'][0]['events'][0]['start_datetime'] = '20-07-21 16:42:00'
with pytest.raises(AgendaImportError) as excinfo:
import_site(payload)
assert '%s' % excinfo.value == 'Bad datetime format "20-07-21 16:42:00"'
Agenda.objects.all().delete()
agenda_meetings = Agenda.objects.create(label='Meetings Agenda', kind='meetings')
desk = Desk.objects.create(agenda=agenda_meetings, label='Desk')
tpx_start = make_aware(datetime.datetime(2017, 5, 22, 8, 0))
tpx_end = make_aware(datetime.datetime(2017, 5, 22, 12, 30))
TimePeriodException.objects.create(desk=desk, start_datetime=tpx_start, end_datetime=tpx_end)
output = get_output_of_command('export_site')
payload = json.loads(output)
assert len(payload['agendas']) == 1
payload['agendas'][0]['desks'][0]['exceptions'][0]['start_datetime'] = '17-05-22 08:00:00'
with pytest.raises(AgendaImportError) as excinfo:
import_site(payload)
assert '%s' % excinfo.value == 'Bad datetime format "17-05-22 08:00:00"'
def test_import_export_events_agenda_options(app):
agenda = Agenda.objects.create(
label='Foo Bar',