0001-manager-prevent-time-period-changes-when-bookings-ex.patch
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 localtime |
|
22 | 23 |
from django.utils.translation import ugettext_lazy as _ |
23 | 24 | |
24 | 25 |
from chrono.agendas.models import (Event, MeetingType, TimePeriod, Desk, |
25 |
TimePeriodException) |
|
26 |
TimePeriodException, Booking)
|
|
26 | 27 | |
27 | 28 |
from . import widgets |
28 | 29 | |
... | ... | |
76 | 77 |
} |
77 | 78 |
exclude = [] |
78 | 79 | |
80 |
def clean(self): |
|
81 |
cleaned_data = super(TimePeriodForm, self).clean() |
|
82 |
if hasattr(self.instance, 'desk'): |
|
83 |
if not self.changes_ok(): |
|
84 |
raise ValidationError(_('One or several bookings exist within this time preiod.')) |
|
85 |
return cleaned_data |
|
86 | ||
87 |
def changes_ok(self): |
|
88 |
bookings = Booking.objects.filter( |
|
89 |
event__desk=self.instance.desk, cancellation_datetime__isnull=True).select_related('event') |
|
90 |
for booking in bookings: |
|
91 |
event_startdt = localtime(booking.event.start_datetime) |
|
92 |
if event_startdt.weekday() != self.instance.weekday: |
|
93 |
continue |
|
94 |
if self.instance.start_time <= event_startdt.time() < self.instance.end_time: |
|
95 |
return False |
|
96 |
return True |
|
97 | ||
79 | 98 | |
80 | 99 |
class NewDeskForm(forms.ModelForm): |
81 | 100 |
class Meta: |
tests/test_manager.py | ||
---|---|---|
1127 | 1127 |
mocked_get.side_effect = mocked_requests_http_ssl_error |
1128 | 1128 |
resp = resp.form.submit(status=200) |
1129 | 1129 |
assert 'Failed to retrieve remote calendar (SSL error).' in resp.content |
1130 | ||
1131 | ||
1132 |
def test_prevent_time_period_changes_when_bookings_exist(app, admin_user): |
|
1133 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings') |
|
1134 |
desk = Desk.objects.create(agenda=agenda, label='Desk A') |
|
1135 |
MeetingType(agenda=agenda, label='Blah').save() |
|
1136 |
timeperiod = TimePeriod.objects.create( |
|
1137 |
weekday=1, desk=desk, start_time=datetime.time(7, 30), end_time=datetime.time(12, 0)) |
|
1138 |
event = Event.objects.create(agenda=agenda, places=1, desk=desk, |
|
1139 |
start_datetime=datetime.datetime(2017, 5, 23, 8, 30)) |
|
1140 |
Booking.objects.create(event=event) |
|
1141 |
login(app) |
|
1142 |
resp = app.get('/manage/agendas/%d/' % agenda.pk) |
|
1143 |
resp = resp.click(href="/manage/timeperiods/%d/edit" % timeperiod.pk) |
|
1144 |
resp.form['start_time'] = '9:30' |
|
1145 |
resp.form['end_time'] = '12:00' |
|
1146 |
resp = resp.form.submit() |
|
1147 |
error_message = resp.html.find('ul', {'class': 'errorlist'}).text |
|
1148 |
assert error_message == 'One or several bookings exist within this time preiod.' |
|
1130 |
- |