Projet

Général

Profil

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

Josué Kouka, 17 janvier 2018 17:32

Télécharger (7,12 ko)

Voir les différences:

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

 chrono/manager/forms.py | 27 ++++++++++++++--
 tests/test_manager.py   | 83 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 108 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 or self.cleaned_data['weekday'] != self.instance.weekday:
100
                return True
101
        return False
102

  
80 103

  
81 104
class NewDeskForm(forms.ModelForm):
82 105
    class Meta:
tests/test_manager.py
1266 1266
    agenda.save()
1267 1267
    resp = app.get('/manage/agendas/%s/%d/%d/%d/' % (
1268 1268
        agenda.id, date.year, date.month, date.day), status=200)
1269

  
1270

  
1271
@mock.patch('chrono.manager.forms.now', lambda: datetime.datetime(2017, 5, 20, 10, 23))
1272
def test_prevent_time_period_changes_when_bookings_exist(app, admin_user):
1273
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1274
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1275
    meeting_type = MeetingType(agenda=agenda, label='Blah', duration=30)
1276
    meeting_type.save()
1277
    timeperiod = TimePeriod.objects.create(
1278
        weekday=1, desk=desk, start_time=datetime.time(8, 00), end_time=datetime.time(11, 0))
1279
    event = Event.objects.create(agenda=agenda, places=1, desk=desk, meeting_type=meeting_type,
1280
                                 start_datetime=make_aware(datetime.datetime(2017, 5, 22, 8, 30)))
1281
    Booking.objects.create(event=event)
1282
    event = Event.objects.create(agenda=agenda, places=1, desk=desk, meeting_type=meeting_type,
1283
                                 start_datetime=make_aware(datetime.datetime(2017, 5, 23, 8, 30)))
1284
    Booking.objects.create(event=event)
1285
    login(app)
1286
    agenda_url = '/manage/agendas/%d/settings' % agenda.pk
1287
    timeperiod_edit_link = "/manage/timeperiods/%d/edit" % timeperiod.pk
1288
    # change time period weekday
1289
    resp = app.get(agenda_url)
1290
    resp = resp.click(href=timeperiod_edit_link)
1291
    resp.form['weekday'] = '2'
1292
    resp = resp.form.submit()
1293
    error_message = resp.html.find('ul', {'class': 'errorlist'}).text.strip()
1294
    assert error_message == 'One or several bookings exist within this time period.'
1295
    # extend time period start
1296
    resp = app.get(agenda_url)
1297
    resp = resp.click(href=timeperiod_edit_link)
1298
    resp.form['start_time'] = '7:30'
1299
    resp = resp.form.submit().follow()
1300
    assert resp.html.find('a', {'href': timeperiod_edit_link}).text.strip() == u'Tuesday / 7:30 a.m. \u2192 11 a.m.'
1301
    # shorten time period start at booking's bound
1302
    resp = app.get(agenda_url)
1303
    resp = resp.click(href=timeperiod_edit_link)
1304
    resp.form['start_time'] = '8:30'
1305
    resp = resp.form.submit().follow()
1306
    assert resp.html.find('a', {'href': timeperiod_edit_link}).text.strip() == u'Tuesday / 8:30 a.m. \u2192 11 a.m.'
1307
    # shorten time period start
1308
    resp = app.get(agenda_url)
1309
    resp = resp.click(href=timeperiod_edit_link)
1310
    resp.form['start_time'] = '9:30'
1311
    resp = resp.form.submit()
1312
    error_message = resp.html.find('ul', {'class': 'errorlist'}).text.strip()
1313
    assert error_message == 'One or several bookings exist within this time period.'
1314
    # extend time period end
1315
    resp = app.get(agenda_url)
1316
    resp = resp.click(href=timeperiod_edit_link)
1317
    resp.form['end_time'] = '12:30'
1318
    resp = resp.form.submit().follow()
1319
    assert resp.html.find('a', {'href': timeperiod_edit_link}).text.strip() == u'Tuesday / 8:30 a.m. \u2192 12:30 p.m.'
1320
    event = Event.objects.create(agenda=agenda, places=1, desk=desk, meeting_type=meeting_type,
1321
                                 start_datetime=make_aware(datetime.datetime(2017, 5, 23, 11, 30)))
1322
    Booking.objects.create(event=event)
1323
    # shorten time period end at booking's bound
1324
    resp = app.get(agenda_url)
1325
    resp = resp.click(href=timeperiod_edit_link)
1326
    resp.form['end_time'] = '12:00'
1327
    resp = resp.form.submit().follow()
1328
    assert resp.html.find('a', {'href': timeperiod_edit_link}).text.strip() == u'Tuesday / 8:30 a.m. \u2192 noon'
1329
    # shorten time period end
1330
    resp = app.get(agenda_url)
1331
    resp = resp.click(href=timeperiod_edit_link)
1332
    resp.form['end_time'] = '11:00'
1333
    resp = resp.form.submit()
1334
    error_message = resp.html.find('ul', {'class': 'errorlist'}).text.strip()
1335
    assert error_message == 'One or several bookings exist within this time period.'
1336
    # extend both time period start and end
1337
    resp = app.get(agenda_url)
1338
    resp = resp.click(href=timeperiod_edit_link)
1339
    resp.form['start_time'] = '7:00'
1340
    resp.form['end_time'] = '12:30'
1341
    resp = resp.form.submit().follow()
1342
    assert resp.html.find('a', {'href': timeperiod_edit_link}).text.strip() == u'Tuesday / 7 a.m. \u2192 12:30 p.m.'
1343
    # shorten both time period start and end
1344
    Booking.objects.create(event=event)
1345
    resp = app.get(agenda_url)
1346
    resp = resp.click(href=timeperiod_edit_link)
1347
    resp.form['start_time'] = '8:00'
1348
    resp.form['end_time'] = '11:00'
1349
    resp = resp.form.submit()
1350
    error_message = resp.html.find('ul', {'class': 'errorlist'}).text.strip()
1351
    assert error_message == 'One or several bookings exist within this time period.'
1269
-