Projet

Général

Profil

0001-manager-prevent-time-period-changes-when-bookings-ex.patch

Josué Kouka, 12 janvier 2018 15:08

Télécharger (7,36 ko)

Voir les différences:

Subject: [PATCH] manager: prevent time period changes when bookings exist
 (#20791)

 chrono/manager/forms.py | 29 +++++++++++++++--
 tests/test_manager.py   | 82 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 109 insertions(+), 2 deletions(-)
chrono/manager/forms.py
19 19

  
20 20
from django import forms
21 21
from django.forms import ValidationError
22
from django.utils.timezone import make_aware
22
from django.utils.timezone import make_aware, now
23 23
from django.utils.translation import ugettext_lazy as _
24 24

  
25 25
from chrono.agendas.models import (Event, MeetingType, TimePeriod, Desk,
26
                                   TimePeriodException)
26
                                   TimePeriodException, Booking)
27 27

  
28 28
from . import widgets
29 29

  
......
77 77
        }
78 78
        exclude = []
79 79

  
80
    def clean(self):
81
        cleaned_data = super(TimePeriodForm, self).clean()
82
        if self.has_booking_out_of_bounds():
83
            raise ValidationError(_('One or several bookings exist within this time period.'))
84
        return cleaned_data
85

  
86
    def has_booking_out_of_bounds(self):
87
        if not self.instance.desk_id:
88
            return False
89
        bookings = Booking.objects.filter(
90
            event__start_datetime__gte=now(),
91
            event__desk=self.instance.desk, cancellation_datetime__isnull=True).select_related('event')
92
        for booking in bookings:
93
            event_startdt = booking.event.start_datetime
94
            event_enddt = booking.event.end_datetime
95
            if event_startdt.weekday() != self.instance.weekday:
96
                continue
97
            start = make_aware(datetime.datetime.combine(event_startdt, self.cleaned_data['start_time']))
98
            end = make_aware(datetime.datetime.combine(event_enddt, self.cleaned_data['end_time']))
99
            if (event_startdt < start) or (event_enddt) > end:
100
                return True
101
            if self.cleaned_data['weekday'] != self.instance.weekday:
102
                return True
103
        return False
104

  
80 105

  
81 106
class NewDeskForm(forms.ModelForm):
82 107
    class Meta:
tests/test_manager.py
1139 1139
    mocked_get.side_effect = mocked_requests_http_ssl_error
1140 1140
    resp = resp.form.submit(status=200)
1141 1141
    assert 'Failed to retrieve remote calendar (SSL error).' in resp.content
1142

  
1143

  
1144
@mock.patch('chrono.manager.forms.now', lambda: datetime.datetime(2017, 5, 20, 10, 23))
1145
def test_prevent_time_period_changes_when_bookings_exist(app, admin_user):
1146
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1147
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1148
    meeting_type = MeetingType(agenda=agenda, label='Blah', duration=30)
1149
    meeting_type.save()
1150
    timeperiod = TimePeriod.objects.create(
1151
        weekday=1, desk=desk, start_time=datetime.time(8, 00), end_time=datetime.time(11, 0))
1152
    event = Event.objects.create(agenda=agenda, places=1, desk=desk, meeting_type=meeting_type,
1153
                                 start_datetime=make_aware(datetime.datetime(2017, 5, 22, 8, 30)))
1154
    Booking.objects.create(event=event)
1155
    event = Event.objects.create(agenda=agenda, places=1, desk=desk, meeting_type=meeting_type,
1156
                                 start_datetime=make_aware(datetime.datetime(2017, 5, 23, 8, 30)))
1157
    Booking.objects.create(event=event)
1158
    login(app)
1159
    timeperiod_edit_link = "/manage/timeperiods/%d/edit" % timeperiod.pk
1160
    # change time period weekday
1161
    resp = app.get('/manage/agendas/%d/' % agenda.pk)
1162
    resp = resp.click(href=timeperiod_edit_link)
1163
    resp.form['weekday'] = '2'
1164
    resp = resp.form.submit()
1165
    error_message = resp.html.find('ul', {'class': 'errorlist'}).text.strip()
1166
    assert error_message == 'One or several bookings exist within this time period.'
1167
    # extend time period start
1168
    resp = app.get('/manage/agendas/%d/' % agenda.pk)
1169
    resp = resp.click(href=timeperiod_edit_link)
1170
    resp.form['start_time'] = '7:30'
1171
    resp = resp.form.submit().follow()
1172
    assert resp.html.find('a', {'href': timeperiod_edit_link}).text.strip() == u'Tuesday / 7:30 a.m. \u2192 11 a.m.'
1173
    # shorten time period start at booking's bound
1174
    resp = app.get('/manage/agendas/%d/' % agenda.pk)
1175
    resp = resp.click(href=timeperiod_edit_link)
1176
    resp.form['start_time'] = '8:30'
1177
    resp = resp.form.submit().follow()
1178
    assert resp.html.find('a', {'href': timeperiod_edit_link}).text.strip() == u'Tuesday / 8:30 a.m. \u2192 11 a.m.'
1179
    # shorten time period start
1180
    resp = app.get('/manage/agendas/%d/' % agenda.pk)
1181
    resp = resp.click(href=timeperiod_edit_link)
1182
    resp.form['start_time'] = '9:30'
1183
    resp = resp.form.submit()
1184
    error_message = resp.html.find('ul', {'class': 'errorlist'}).text.strip()
1185
    assert error_message == 'One or several bookings exist within this time period.'
1186
    # extend time period end
1187
    resp = app.get('/manage/agendas/%d/' % agenda.pk)
1188
    resp = resp.click(href=timeperiod_edit_link)
1189
    resp.form['end_time'] = '12:30'
1190
    resp = resp.form.submit().follow()
1191
    assert resp.html.find('a', {'href': timeperiod_edit_link}).text.strip() == u'Tuesday / 8:30 a.m. \u2192 12:30 p.m.'
1192
    event = Event.objects.create(agenda=agenda, places=1, desk=desk, meeting_type=meeting_type,
1193
                                 start_datetime=make_aware(datetime.datetime(2017, 5, 23, 11, 30)))
1194
    Booking.objects.create(event=event)
1195
    # shorten time period end at booking's bound
1196
    resp = app.get('/manage/agendas/%d/' % agenda.pk)
1197
    resp = resp.click(href=timeperiod_edit_link)
1198
    resp.form['end_time'] = '12:00'
1199
    resp = resp.form.submit().follow()
1200
    assert resp.html.find('a', {'href': timeperiod_edit_link}).text.strip() == u'Tuesday / 8:30 a.m. \u2192 noon'
1201
    # shorten time period end
1202
    resp = app.get('/manage/agendas/%d/' % agenda.pk)
1203
    resp = resp.click(href=timeperiod_edit_link)
1204
    resp.form['end_time'] = '11:00'
1205
    resp = resp.form.submit()
1206
    error_message = resp.html.find('ul', {'class': 'errorlist'}).text.strip()
1207
    assert error_message == 'One or several bookings exist within this time period.'
1208
    # extend both time period start and end
1209
    resp = app.get('/manage/agendas/%d/' % agenda.pk)
1210
    resp = resp.click(href=timeperiod_edit_link)
1211
    resp.form['start_time'] = '7:00'
1212
    resp.form['end_time'] = '12:30'
1213
    resp = resp.form.submit().follow()
1214
    assert resp.html.find('a', {'href': timeperiod_edit_link}).text.strip() == u'Tuesday / 7 a.m. \u2192 12:30 p.m.'
1215
    # shorten both time period start and end
1216
    Booking.objects.create(event=event)
1217
    resp = app.get('/manage/agendas/%d/' % agenda.pk)
1218
    resp = resp.click(href=timeperiod_edit_link)
1219
    resp.form['start_time'] = '8:00'
1220
    resp.form['end_time'] = '11:00'
1221
    resp = resp.form.submit()
1222
    error_message = resp.html.find('ul', {'class': 'errorlist'}).text.strip()
1223
    assert error_message == 'One or several bookings exist within this time period.'
1142
-