agendas: fix import with bad datetimes (#62352)
This commit is contained in:
parent
26fdc69a95
commit
387b08b7aa
|
@ -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'):
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue