agendas: use update_or_create on TimePeriod and TimePeriodException import (#48095)

This commit is contained in:
Emmanuel Cazenave 2020-10-30 15:00:49 +01:00
parent 3617c3ff05
commit df03dfd515
2 changed files with 33 additions and 4 deletions

View File

@ -609,8 +609,7 @@ class TimePeriod(models.Model):
@classmethod
def import_json(cls, data):
data = clean_import_data(cls, data)
timeperiod = cls(**data)
timeperiod.save()
timeperiod, _ = cls.objects.update_or_create(defaults=data, **data)
return timeperiod
def export_json(self):
@ -1631,8 +1630,9 @@ class TimePeriodException(models.Model):
if k.endswith('_datetime'):
data[k] = import_datetime(v)
data = clean_import_data(cls, data)
exception = cls(**data)
exception.save()
query_data = data.copy()
query_data.pop('update_datetime')
exception, _ = cls.objects.update_or_create(defaults=data, **query_data)
return exception
def export_json(self):

View File

@ -565,3 +565,32 @@ def test_import_export_time_period_exception_source():
source = desk.timeperiodexceptionsource_set.first()
assert not source.enabled
assert not desk.timeperiodexception_set.exists()
def test_import_export_do_not_duplicate_timeperiod_and_exceptions():
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
desk = Desk.objects.create(slug='test', agenda=agenda)
TimePeriod.objects.create(
desk=desk, weekday=2, start_time=datetime.time(10, 0), end_time=datetime.time(11, 0)
)
TimePeriod.objects.create(
desk=desk, weekday=3, start_time=datetime.time(10, 0), end_time=datetime.time(11, 0)
)
TimePeriodException.objects.create(
desk=desk,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 8, 0)),
end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 30)),
)
TimePeriodException.objects.create(
desk=desk,
start_datetime=make_aware(datetime.datetime(2017, 6, 22, 8, 0)),
end_datetime=make_aware(datetime.datetime(2017, 6, 22, 12, 30)),
)
assert TimePeriod.objects.count() == 2
assert TimePeriodException.objects.count() == 2
output = get_output_of_command('export_site')
payload = json.loads(output)
import_site(payload)
assert TimePeriod.objects.count() == 2
assert TimePeriodException.objects.count() == 2