Projet

Général

Profil

0001-manager-add-exception-on-all-desks-42411.patch

Lauréline Guérin, 28 septembre 2020 14:28

Télécharger (4,96 ko)

Voir les différences:

Subject: [PATCH] manager: add exception on all desks (#42411)

 chrono/manager/forms.py |  9 +++++++++
 chrono/manager/views.py | 25 ++++++++++++++++++++++---
 tests/test_manager.py   | 28 ++++++++++++++++++++++++++++
 3 files changed, 59 insertions(+), 3 deletions(-)
chrono/manager/forms.py
280 280

  
281 281

  
282 282
class TimePeriodExceptionForm(forms.ModelForm):
283
    all_desks = forms.BooleanField(label=_('Apply exception on all desks of the agenda'), required=False)
284

  
283 285
    class Meta:
284 286
        model = TimePeriodException
285 287
        fields = ['desk', 'start_datetime', 'end_datetime', 'label']
......
291 293
            'end_datetime': SplitDateTimeField,
292 294
        }
293 295

  
296
    def __init__(self, *args, **kwargs):
297
        super().__init__(*args, **kwargs)
298
        if self.instance.pk is not None:
299
            del self.fields['all_desks']
300
        elif 'desk' in self.initial and self.initial['desk'].agenda.desk_set.count() == 1:
301
            del self.fields['all_desks']
302

  
294 303
    def clean(self):
295 304
        cleaned_data = super().clean()
296 305

  
chrono/manager/views.py
1741 1741

  
1742 1742
    def form_valid(self, form):
1743 1743
        result = super().form_valid(form)
1744
        if self.object.has_booking_within_time_slot():
1745
            message = _('Exception added. Note: one or several bookings exists within this time slot.')
1746
            messages.info(self.request, message)
1744
        exceptions = [self.object]
1745
        if form.cleaned_data.get('all_desks'):
1746
            for desk in Desk.objects.filter(agenda=self.object.desk.agenda_id):
1747
                if desk == self.object.desk:
1748
                    continue
1749
                exceptions.append(
1750
                    TimePeriodException.objects.create(
1751
                        desk=desk,
1752
                        label=self.object.label,
1753
                        start_datetime=self.object.start_datetime,
1754
                        end_datetime=self.object.end_datetime,
1755
                    )
1756
                )
1757
        for exception in exceptions:
1758
            if exception.has_booking_within_time_slot():
1759
                message = ungettext(
1760
                    'Exception added. Note: one or several bookings exists within this time slot.',
1761
                    'Exceptions added. Note: one or several bookings exists within this time slot.',
1762
                    len(exceptions),
1763
                )
1764
                messages.info(self.request, message)
1765
                break
1747 1766
        return result
1748 1767

  
1749 1768

  
tests/test_manager.py
1933 1933
    assert 'Exception 1' in resp.text
1934 1934
    assert 'Exception 2' in resp.text
1935 1935

  
1936
    # add global time exception
1937
    # only one desk: no option to apply to all desks
1938
    resp = app.get('/manage/agendas/%s/desk/%s/add-time-period-exception' % (agenda.pk, desk.pk))
1939
    assert 'all_desks' not in resp.context['form'].fields
1940
    # more than one desk
1941
    agenda2 = Agenda.objects.create(label='Foo bar', kind='meetings')
1942
    Desk.objects.create(agenda=agenda2, label='Other Desk')  # check exception is not created for this one
1943
    desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
1944
    event = Event.objects.create(
1945
        agenda=agenda, places=1, desk=desk2, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 30))
1946
    )
1947
    Booking.objects.create(event=event)
1948
    resp = app.get('/manage/agendas/%s/desk/%s/add-time-period-exception' % (agenda.pk, desk.pk))
1949
    future = tomorrow + datetime.timedelta(days=35)
1950
    resp.form['label'] = 'Exception 3'
1951
    resp.form['start_datetime_0'] = '2017-05-22'
1952
    resp.form['start_datetime_1'] = '08:00'
1953
    resp.form['end_datetime_0'] = '2017-05-26'
1954
    resp.form['end_datetime_1'] = '17:30'
1955
    resp.form['all_desks'] = True
1956
    resp = resp.form.submit().follow()
1957
    assert TimePeriodException.objects.count() == 4
1958
    assert 'Exceptions added. Note: one or several bookings exists within this time slot.' in resp.text
1959

  
1960
    exception = TimePeriodException.objects.first()
1961
    resp = app.get('/manage/time-period-exceptions/%s/edit' % exception.pk)
1962
    assert 'all_desks' not in resp.context['form'].fields
1963

  
1936 1964

  
1937 1965
def test_meetings_agenda_add_time_period_exception_when_booking_exists(app, admin_user):
1938 1966
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1939
-