From 6b99e6e0d45238f62589b4cac7f2caeef58fe7cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 31 Oct 2018 11:43:30 +0100 Subject: [PATCH] manager: redirect day view to last day of month when out of range (#26455) --- chrono/manager/views.py | 18 +++++++++++++++--- tests/test_manager.py | 12 ++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/chrono/manager/views.py b/chrono/manager/views.py index c16a9dae..87c69b4f 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -205,9 +205,21 @@ class AgendaDateView(object): # specify 6am time to get the expected timezone on daylight saving time # days. - self.date = make_aware(datetime.datetime.strptime( - '%s-%s-%s 06:00' % (self.get_year(), self.get_month(), self.get_day()), - '%Y-%m-%d %H:%M')) + try: + self.date = make_aware(datetime.datetime.strptime( + '%s-%s-%s 06:00' % (self.get_year(), self.get_month(), self.get_day()), + '%Y-%m-%d %H:%M')) + except ValueError: # day is out of range for month + # redirect to last day of month + date = datetime.date(int(self.get_year()), int(self.get_month()), 1) + date += datetime.timedelta(days=40) + date = date.replace(day=1) + date -= datetime.timedelta(days=1) + return HttpResponseRedirect(reverse('chrono-manager-agenda-day-view', + kwargs={'pk': self.agenda.id, + 'year': date.year, + 'month': date.month, + 'day': date.day})) return super(AgendaDateView, self).dispatch(request, *args, **kwargs) def get_context_data(self, **kwargs): diff --git a/tests/test_manager.py b/tests/test_manager.py index 3259e50b..8da5dc1d 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -1372,6 +1372,18 @@ def test_agenda_day_view_late_meeting(app, admin_user, manager_user, api_user): assert resp.text.count('11 p.m.' in resp.text +def test_agenda_invalid_day_view(app, admin_user, manager_user, api_user): + agenda = Agenda.objects.create(label='New Example', kind='meetings') + desk = Desk.objects.create(agenda=agenda, label='New Desk') + desk.save() + + meetingtype = MeetingType(agenda=agenda, label='Bar', duration=30) + meetingtype.save() + + login(app) + resp = app.get('/manage/agendas/%s/%d/%d/%d/' % (agenda.id, 2018, 11, 31), status=302) + assert resp.location.endswith('2018/11/30/') + def test_agenda_month_view(app, admin_user, manager_user, api_user): agenda = Agenda.objects.create(label='Passeports', kind='meetings') desk = Desk.objects.create(agenda=agenda, label='Desk A')