agendas: move desk settings exceptions import to view (#47966)

This commit is contained in:
Valentin Deniaud 2020-10-26 17:26:57 +01:00
parent 06220c72e2
commit 0483142578
4 changed files with 52 additions and 11 deletions

View File

@ -1132,14 +1132,11 @@ class Desk(models.Model):
ordering = ['label']
unique_together = ['agenda', 'slug']
def save(self, *args, import_exceptions=True, **kwargs):
def save(self, *args, **kwargs):
assert self.agenda.kind != 'virtual', "a desk can't reference a virtual agenda"
first_created = not self.pk
if not self.slug:
self.slug = generate_slug(self, agenda=self.agenda)
super(Desk, self).save(*args, **kwargs)
if first_created and import_exceptions:
self.import_timeperiod_exceptions_from_settings(enable=True)
@property
def base_slug(self):
@ -1179,7 +1176,7 @@ class Desk(models.Model):
if agenda_target:
new_desk.agenda = agenda_target
# store new desk
new_desk.save(import_exceptions=False)
new_desk.save()
# clone related objects
for time_period in self.timeperiod_set.all():

View File

@ -582,6 +582,7 @@ class AgendaAddView(CreateView):
if self.object.kind == 'meetings':
default_desk = Desk(agenda=self.object, label=_('Desk 1'))
default_desk.save()
default_desk.import_timeperiod_exceptions_from_settings(enable=True)
return model_form
def get_success_url(self):
@ -1797,6 +1798,11 @@ class AgendaAddDesk(ManagedAgendaMixin, CreateView):
model = Desk
form_class = NewDeskForm
def form_valid(self, form):
self.object = form.save()
self.object.import_timeperiod_exceptions_from_settings(enable=True)
return HttpResponseRedirect(self.get_success_url())
agenda_add_desk = AgendaAddDesk.as_view()

View File

@ -525,8 +525,8 @@ def test_timeperiodexception_from_settings():
agenda.save()
desk = Desk(label='Test 1 desk', agenda=agenda)
desk.save()
desk.import_timeperiod_exceptions_from_settings(enable=True)
# first save automatically load exceptions
source = TimePeriodExceptionSource.objects.get(desk=desk)
assert source.settings_slug == 'holidays'
assert source.enabled
@ -555,21 +555,23 @@ def test_timeperiodexception_from_settings_command():
}
agenda = Agenda(label=u'Test 1 agenda')
agenda.save()
desk1 = Desk(label='Test 1 desk', agenda=agenda)
desk1.save()
assert not TimePeriodExceptionSource.objects.filter(desk=desk1).exists()
with override_settings(**setting):
desk2 = Desk(label='Test 2 desk', agenda=agenda)
desk2.save()
desk2.import_timeperiod_exceptions_from_settings(enable=True)
desk3 = Desk(label='Test 3 desk', agenda=agenda)
desk3.save()
source3 = TimePeriodExceptionSource.objects.get(desk=desk3)
source3.disable()
desk3.import_timeperiod_exceptions_from_settings(enable=False)
call_command('sync_desks_timeperiod_exceptions_from_settings')
assert not TimePeriodExceptionSource.objects.get(desk=desk1).enabled
source2 = TimePeriodExceptionSource.objects.get(desk=desk2)
assert source2.enabled
source3.refresh_from_db()
source3 = TimePeriodExceptionSource.objects.get(desk=desk3)
assert not source3.enabled
exceptions_count = source2.timeperiodexception_set.count()
@ -997,6 +999,7 @@ def test_desk_duplicate_exception_sources():
def test_desk_duplicate_exception_source_from_settings():
agenda = Agenda.objects.create(label='Agenda')
desk = Desk.objects.create(label='Desk', agenda=agenda)
desk.import_timeperiod_exceptions_from_settings(enable=True)
source = desk.timeperiodexceptionsource_set.get(settings_slug='holidays')
assert source.enabled

View File

@ -872,6 +872,39 @@ def test_add_agenda(app, admin_user):
assert agenda.maximal_booking_delay == 56
@override_settings(
EXCEPTIONS_SOURCES={'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},}
)
def test_add_agenda_exceptions_from_settings(app, admin_user):
app = login(app)
resp = app.get('/manage/', status=200)
resp = resp.click('New')
resp.form['label'] = 'Foo bar'
resp.form['kind'] = 'meetings'
resp = resp.form.submit().follow()
agenda = Agenda.objects.get(label='Foo bar')
assert agenda.desk_set.count() == 1
default_desk = agenda.desk_set.first()
assert default_desk.timeperiodexception_set.exists()
assert default_desk.timeperiodexceptionsource_set.count() == 1
source = default_desk.timeperiodexceptionsource_set.first()
assert source.enabled
resp = resp.click('New Desk')
resp.form['label'] = 'Desk A'
resp = resp.form.submit().follow()
desk = Desk.objects.get(slug='desk-a')
assert desk.timeperiodexception_set.exists()
assert desk.timeperiodexceptionsource_set.count() == 1
source = desk.timeperiodexceptionsource_set.first()
assert source.enabled
def test_add_agenda_as_manager(app, manager_user):
# open /manage/ access to manager_user, and check agenda creation is not
# allowed.
@ -2676,6 +2709,7 @@ END:VCALENDAR"""
def test_meetings_agenda_time_period_exception_source_from_settings(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
desk = Desk.objects.create(agenda=agenda, label='Desk A')
desk.import_timeperiod_exceptions_from_settings(enable=True)
MeetingType(agenda=agenda, label='Blah').save()
TimePeriod.objects.create(
weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
@ -2725,10 +2759,11 @@ def test_meetings_agenda_time_period_exception_source_try_disable_ics(app, admin
@override_settings(
EXCEPTIONS_SOURCES={'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},}
)
def test_meetings_agenda_time_period_exception_source_external(app, admin_user, freezer):
def test_meetings_agenda_time_period_exception_source_from_settings(app, admin_user, freezer):
freezer.move_to('2020-01-01')
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
desk = Desk.objects.create(agenda=agenda, label='Desk A')
desk.import_timeperiod_exceptions_from_settings(enable=True)
MeetingType(agenda=agenda, label='Blah').save()
TimePeriod.objects.create(
weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)