manager: add exception on all desks (#42411)

This commit is contained in:
Lauréline Guérin 2020-08-28 17:35:36 +02:00
parent 0a7bdd9882
commit dec5d9b14a
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 59 additions and 3 deletions

View File

@ -283,6 +283,8 @@ class DeskForm(forms.ModelForm):
class TimePeriodExceptionForm(forms.ModelForm):
all_desks = forms.BooleanField(label=_('Apply exception on all desks of the agenda'), required=False)
class Meta:
model = TimePeriodException
fields = ['desk', 'start_datetime', 'end_datetime', 'label']
@ -294,6 +296,13 @@ class TimePeriodExceptionForm(forms.ModelForm):
'end_datetime': SplitDateTimeField,
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance.pk is not None:
del self.fields['all_desks']
elif 'desk' in self.initial and self.initial['desk'].agenda.desk_set.count() == 1:
del self.fields['all_desks']
def clean(self):
cleaned_data = super().clean()

View File

@ -1738,9 +1738,28 @@ class AgendaAddTimePeriodExceptionView(ManagedDeskMixin, CreateView):
def form_valid(self, form):
result = super().form_valid(form)
if self.object.has_booking_within_time_slot():
message = _('Exception added. Note: one or several bookings exists within this time slot.')
messages.info(self.request, message)
exceptions = [self.object]
if form.cleaned_data.get('all_desks'):
for desk in Desk.objects.filter(agenda=self.object.desk.agenda_id):
if desk == self.object.desk:
continue
exceptions.append(
TimePeriodException.objects.create(
desk=desk,
label=self.object.label,
start_datetime=self.object.start_datetime,
end_datetime=self.object.end_datetime,
)
)
for exception in exceptions:
if exception.has_booking_within_time_slot():
message = ungettext(
'Exception added. Note: one or several bookings exists within this time slot.',
'Exceptions added. Note: one or several bookings exists within this time slot.',
len(exceptions),
)
messages.info(self.request, message)
break
return result

View File

@ -1945,6 +1945,34 @@ def test_meetings_agenda_add_time_period_exception(app, admin_user):
assert 'Exception 1' in resp.text
assert 'Exception 2' in resp.text
# add global time exception
# only one desk: no option to apply to all desks
resp = app.get('/manage/agendas/%s/desk/%s/add-time-period-exception' % (agenda.pk, desk.pk))
assert 'all_desks' not in resp.context['form'].fields
# more than one desk
agenda2 = Agenda.objects.create(label='Foo bar', kind='meetings')
Desk.objects.create(agenda=agenda2, label='Other Desk') # check exception is not created for this one
desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
event = Event.objects.create(
agenda=agenda, places=1, desk=desk2, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 30))
)
Booking.objects.create(event=event)
resp = app.get('/manage/agendas/%s/desk/%s/add-time-period-exception' % (agenda.pk, desk.pk))
future = tomorrow + datetime.timedelta(days=35)
resp.form['label'] = 'Exception 3'
resp.form['start_datetime_0'] = '2017-05-22'
resp.form['start_datetime_1'] = '08:00'
resp.form['end_datetime_0'] = '2017-05-26'
resp.form['end_datetime_1'] = '17:30'
resp.form['all_desks'] = True
resp = resp.form.submit().follow()
assert TimePeriodException.objects.count() == 4
assert 'Exceptions added. Note: one or several bookings exists within this time slot.' in resp.text
exception = TimePeriodException.objects.first()
resp = app.get('/manage/time-period-exceptions/%s/edit' % exception.pk)
assert 'all_desks' not in resp.context['form'].fields
def test_meetings_agenda_add_time_period_exception_when_booking_exists(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')