manager: add exception on all desks (#42411)
This commit is contained in:
parent
0a7bdd9882
commit
dec5d9b14a
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue