Projet

Général

Profil

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

Josué Kouka, 19 décembre 2017 15:07

Télécharger (3,32 ko)

Voir les différences:

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

 chrono/manager/forms.py | 21 ++++++++++++++++++++-
 tests/test_manager.py   | 19 +++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)
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
-