Projet

Général

Profil

0008-manager-simple-desk-management-time-periods-48924.patch

Lauréline Guérin, 02 février 2021 14:32

Télécharger (12,5 ko)

Voir les différences:

Subject: [PATCH 08/11] manager: simple desk management & time periods (#48924)

 chrono/manager/forms.py |  27 +++++++
 chrono/manager/views.py |  25 +++++-
 tests/test_manager.py   | 165 +++++++++++++++++++++++++++++++---------
 3 files changed, 181 insertions(+), 36 deletions(-)
chrono/manager/forms.py
266 266
        }
267 267
        exclude = ['agenda', 'desk']
268 268

  
269
    def __init__(self, *args, **kwargs):
270
        super().__init__(*args, **kwargs)
271
        self.old_weekday = self.instance.weekday
272
        self.old_start_time = self.instance.start_time
273
        self.old_end_time = self.instance.end_time
274

  
269 275
    def clean_end_time(self):
270 276
        if self.cleaned_data['end_time'] <= self.cleaned_data['start_time']:
271 277
            raise ValidationError(_('End time must come after start time.'))
272 278
        return self.cleaned_data['end_time']
273 279

  
280
    def save(self):
281
        super().save()
282

  
283
        if not self.instance.desk:
284
            return self.instance
285

  
286
        if not self.instance.desk.agenda.desk_simple_management:
287
            return self.instance
288

  
289
        for desk in self.instance.desk.agenda.desk_set.exclude(pk=self.instance.desk.pk):
290
            timeperiod = desk.timeperiod_set.filter(
291
                weekday=self.old_weekday, start_time=self.old_start_time, end_time=self.old_end_time
292
            ).first()
293
            if timeperiod is not None:
294
                timeperiod.weekday = self.instance.weekday
295
                timeperiod.start_time = self.instance.start_time
296
                timeperiod.end_time = self.instance.end_time
297
                timeperiod.save()
298

  
299
        return self.instance
300

  
274 301

  
275 302
class NewDeskForm(forms.ModelForm):
276 303
    copy_from = forms.ModelChoiceField(
chrono/manager/views.py
1882 1882
        return super(FormView, self).get_form_kwargs()
1883 1883

  
1884 1884
    def form_valid(self, form):
1885
        process_time_period_add_form(form, desk=self.desk)
1885
        if self.desk.agenda.desk_simple_management:
1886
            for desk in self.desk.agenda.desk_set.all():
1887
                process_time_period_add_form(form, desk=desk)
1888
        else:
1889
            process_time_period_add_form(form, desk=self.desk)
1886 1890
        return super(AgendaAddTimePeriodView, self).form_valid(form)
1887 1891

  
1888 1892

  
......
1917 1921
    template_name = 'chrono/manager_confirm_delete.html'
1918 1922
    model = TimePeriod
1919 1923

  
1924
    def delete(self, request, *args, **kwargs):
1925
        time_period = self.get_object()
1926
        response = super().delete(request, *args, **kwargs)
1927

  
1928
        if not time_period.desk:
1929
            return response
1930

  
1931
        if not time_period.desk.agenda.desk_simple_management:
1932
            return response
1933

  
1934
        for desk in time_period.desk.agenda.desk_set.exclude(pk=time_period.desk.pk):
1935
            tp = desk.timeperiod_set.filter(
1936
                weekday=time_period.weekday, start_time=time_period.start_time, end_time=time_period.end_time
1937
            ).first()
1938
            if tp is not None:
1939
                tp.delete()
1940

  
1941
        return response
1942

  
1920 1943

  
1921 1944
time_period_delete = TimePeriodDeleteView.as_view()
1922 1945

  
tests/test_manager.py
1989 1989
def test_meetings_agenda_add_time_period(app, admin_user):
1990 1990
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1991 1991
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1992
    desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
1992 1993
    MeetingType.objects.create(agenda=agenda, label='Blah')
1993 1994
    app = login(app)
1994 1995
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1995
    resp = resp.click('Add a time period$')
1996
    resp = resp.click('Add a time period', index=0)
1996 1997
    resp.form['weekdays-2'].checked = True
1997 1998
    resp.form['start_time'] = '10:00'
1998 1999
    resp.form['end_time'] = '17:00'
......
2002 2003
    assert TimePeriod.objects.get(desk=desk).start_time.minute == 0
2003 2004
    assert TimePeriod.objects.get(desk=desk).end_time.hour == 17
2004 2005
    assert TimePeriod.objects.get(desk=desk).end_time.minute == 0
2006
    assert desk2.timeperiod_set.exists() is False
2005 2007
    resp = resp.follow()
2006 2008

  
2007 2009
    # add a second time period
......
2023 2025
    resp2 = resp2.form.submit()
2024 2026
    assert 'End time must come after start time.' in resp2.text
2025 2027

  
2026
    # and edit
2027
    resp = resp.click(u'Wednesday / 10 a.m. → 5 p.m.')
2028
    assert 'Edit Time Period' in resp.text
2029
    resp.form['start_time'] = '9:00'
2030
    resp = resp.form.submit()
2031
    resp = resp.follow()
2032
    assert TimePeriod.objects.get(desk=desk, weekday=2).start_time.hour == 9
2033

  
2034
    # and edit with inverted start/end
2035
    resp2 = resp.click(u'Wednesday / 9 a.m. → 5 p.m.')
2036
    resp2.form['start_time'] = '18:00'
2037
    resp2 = resp2.form.submit()
2038
    assert 'End time must come after start time.' in resp2.text
2039

  
2040 2028
    # and add same time periods on multiple days
2041 2029
    resp = resp.click('Add a time period', index=0)
2042 2030
    resp.form['weekdays-4'].checked = True
......
2047 2035
    assert TimePeriod.objects.filter(desk=desk).count() == 4
2048 2036

  
2049 2037

  
2050
def test_meetings_agenda_delete_time_period(app, admin_user):
2051
    agenda = Agenda(label=u'Foo bar', kind='meetings')
2052
    agenda.save()
2053

  
2054
    MeetingType(agenda=agenda, label='Blah').save()
2055

  
2038
def test_meetings_agenda_add_time_period_desk_simple_management(app, admin_user):
2039
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings', desk_simple_management=True)
2056 2040
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
2057
    time_period = TimePeriod(
2058
        desk=desk, weekday=2, start_time=datetime.time(10, 0), end_time=datetime.time(18, 0)
2059
    )
2060
    time_period.save()
2041
    desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
2042
    assert agenda.is_available_for_simple_management() is True
2061 2043

  
2062 2044
    app = login(app)
2063
    resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
2064
    resp = resp.click('Wednesday')
2065
    resp = resp.click('Delete')
2066
    resp = resp.form.submit()
2067
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id)
2068
    assert TimePeriod.objects.count() == 0
2045
    resp = app.get('/manage/agendas/%s/desk/%s/add-time-period' % (agenda.pk, desk.pk))
2046
    resp.form['weekdays-0'].checked = True
2047
    resp.form['start_time'] = '10:00'
2048
    resp.form['end_time'] = '13:00'
2049
    resp.form.submit()
2050

  
2051
    assert TimePeriod.objects.filter(desk=desk).count() == 1
2052
    assert TimePeriod.objects.filter(desk=desk2).count() == 1
2053
    assert agenda.is_available_for_simple_management() is True
2069 2054

  
2070 2055

  
2071 2056
def test_meetings_agenda_add_time_period_on_missing_desk(app, admin_user):
2072 2057
    app = login(app)
2073
    agenda = Agenda(label=u'Foo bar', kind='meetings')
2074
    agenda.save()
2075
    MeetingType(agenda=agenda, label='Blah').save()
2076
    app.get('/manage/agendas/1/desk/777/add-time-period', status=404)
2058
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
2059
    app.get('/manage/agendas/%s/desk/0/add-time-period' % agenda.pk, status=404)
2077 2060

  
2078 2061

  
2079 2062
def test_meetings_agenda_add_time_period_as_manager(app, manager_user):
......
2107 2090
    app.get('/manage/timeperiods/%d/edit' % time_period.id, status=200)
2108 2091

  
2109 2092

  
2093
def test_meetings_agenda_edit_time_period(app, admin_user):
2094
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
2095
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
2096
    time_period = TimePeriod.objects.create(
2097
        desk=desk, weekday=0, start_time=datetime.time(9, 0), end_time=datetime.time(12, 0)
2098
    )
2099
    desk2 = desk.duplicate()
2100
    time_period2 = desk2.timeperiod_set.get()
2101

  
2102
    app = login(app)
2103
    # edit
2104
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2105
    resp = resp.click('Monday / 9 a.m. → noon', index=0)
2106
    assert 'Edit Time Period' in resp.text
2107
    resp.form['start_time'] = '10:00'
2108
    resp = resp.form.submit()
2109
    resp = resp.follow()
2110
    time_period.refresh_from_db()
2111
    assert time_period.start_time.hour == 10
2112
    time_period2.refresh_from_db()
2113
    assert time_period2.start_time.hour == 9
2114

  
2115
    # edit with inverted start/end
2116
    resp2 = resp.click('Monday / 10 a.m. → noon')
2117
    resp2.form['start_time'] = '18:00'
2118
    resp2 = resp2.form.submit()
2119
    assert 'End time must come after start time.' in resp2.text
2120

  
2121

  
2122
def test_meetings_agenda_edit_time_period_desk_simple_management(app, admin_user):
2123
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings', desk_simple_management=True)
2124
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
2125
    time_period = TimePeriod.objects.create(
2126
        desk=desk, weekday=0, start_time=datetime.time(9, 0), end_time=datetime.time(12, 0)
2127
    )
2128
    desk2 = desk.duplicate()
2129
    time_period2 = desk2.timeperiod_set.get()
2130
    assert agenda.is_available_for_simple_management() is True
2131

  
2132
    app = login(app)
2133
    resp = app.get('/manage/timeperiods/%s/edit' % time_period.pk)
2134
    resp.form['weekday'] = 3
2135
    resp.form['start_time'] = '10:00'
2136
    resp.form['end_time'] = '11:00'
2137
    resp.form.submit()
2138
    time_period.refresh_from_db()
2139
    time_period2.refresh_from_db()
2140
    assert time_period.weekday == 3
2141
    assert time_period.start_time.hour == 10
2142
    assert time_period.end_time.hour == 11
2143
    assert time_period2.weekday == 3
2144
    assert time_period2.start_time.hour == 10
2145
    assert time_period2.end_time.hour == 11
2146
    assert agenda.is_available_for_simple_management() is True
2147

  
2148
    # should not happen: corresponding time period does not exist
2149
    time_period2.delete()
2150
    resp = app.get('/manage/timeperiods/%s/edit' % time_period.pk)
2151
    resp.form['weekday'] = 3
2152
    resp.form['start_time'] = '10:00'
2153
    resp.form['end_time'] = '11:00'
2154
    # no error
2155
    resp.form.submit()
2156
    time_period.refresh_from_db()
2157
    assert time_period.weekday == 3
2158
    assert time_period.start_time.hour == 10
2159
    assert time_period.end_time.hour == 11
2160

  
2161

  
2162
def test_meetings_agenda_delete_time_period(app, admin_user):
2163
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
2164
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
2165
    TimePeriod.objects.create(
2166
        desk=desk, weekday=2, start_time=datetime.time(10, 0), end_time=datetime.time(18, 0)
2167
    )
2168
    desk.duplicate()
2169
    assert TimePeriod.objects.count() == 2
2170

  
2171
    app = login(app)
2172
    resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
2173
    resp = resp.click('Wednesday', index=0)
2174
    resp = resp.click('Delete')
2175
    resp = resp.form.submit()
2176
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id)
2177
    assert TimePeriod.objects.count() == 1
2178

  
2179

  
2180
def test_meetings_agenda_delete_time_period_desk_simple_management(app, admin_user):
2181
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings', desk_simple_management=True)
2182
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
2183
    time_period = TimePeriod.objects.create(
2184
        desk=desk, weekday=0, start_time=datetime.time(9, 0), end_time=datetime.time(12, 0)
2185
    )
2186
    desk.duplicate()
2187
    assert TimePeriod.objects.count() == 2
2188
    assert agenda.is_available_for_simple_management() is True
2189

  
2190
    app = login(app)
2191
    resp = app.get('/manage/timeperiods/%s/delete' % time_period.pk)
2192
    resp.form.submit()
2193
    assert TimePeriod.objects.count() == 0
2194
    assert agenda.is_available_for_simple_management() is True
2195

  
2196
    # should not happen: corresponding time period does not exist
2197
    time_period = TimePeriod.objects.create(
2198
        desk=desk, weekday=0, start_time=datetime.time(9, 0), end_time=datetime.time(12, 0)
2199
    )
2200
    resp = app.get('/manage/timeperiods/%s/delete' % time_period.pk)
2201
    resp.form.submit()
2202
    assert TimePeriod.objects.count() == 0
2203

  
2204

  
2110 2205
def test_meetings_agenda_add_desk(app, admin_user):
2111 2206
    app = login(app)
2112 2207
    resp = app.get('/manage/', status=200)
2113
-