Projet

Général

Profil

0003-manager-add-a-month-redirect-view-for-event-agenda-4.patch

Lauréline Guérin, 16 juillet 2020 10:56

Télécharger (26,8 ko)

Voir les différences:

Subject: [PATCH 3/5] manager: add a month redirect view for event agenda
 (#44457)

 chrono/manager/urls.py  |   5 +
 chrono/manager/views.py |  60 ++++++-----
 tests/test_manager.py   | 218 +++++++++++++++++++++-------------------
 3 files changed, 153 insertions(+), 130 deletions(-)
chrono/manager/urls.py
38 38
    url(r'^agendas/add/$', views.agenda_add, name='chrono-manager-agenda-add'),
39 39
    url(r'^agendas/import/$', views.agendas_import, name='chrono-manager-agendas-import'),
40 40
    url(r'^agendas/(?P<pk>\d+)/$', views.agenda_view, name='chrono-manager-agenda-view'),
41
    url(
42
        r'^agendas/(?P<pk>\d+)/month/$',
43
        views.agenda_month_redirect_view,
44
        name='chrono-manager-agenda-month-redirect-view',
45
    ),
41 46
    url(
42 47
        r'^agendas/(?P<pk>\d+)/(?P<year>[0-9]{4})/(?P<month>[0-9]+)/$',
43 48
        views.agenda_monthly_view,
chrono/manager/views.py
24 24
from django.core.exceptions import PermissionDenied
25 25
from django.db.models import Q
26 26
from django.db.models import Min, Max
27
from django.forms import ValidationError
28 27
from django.http import Http404, HttpResponse, HttpResponseRedirect
29 28
from django.shortcuts import get_object_or_404
29
from django.shortcuts import redirect
30 30
from django.template.response import TemplateResponse
31 31
from django.urls import reverse, reverse_lazy
32 32
from django.utils.dates import MONTHS
......
613 613

  
614 614
class AgendaView(ViewableAgendaMixin, View):
615 615
    def get(self, request, *args, **kwargs):
616
        today = datetime.date.today()
617 616
        if self.agenda.kind == 'virtual':
618 617
            real_agendas = [
619 618
                (agenda, agenda.can_be_viewed(request.user)) for agenda in self.agenda.real_agendas.all()
......
631 630

  
632 631
        if self.agenda.kind == 'meetings':
633 632
            # redirect to today view
634
            return HttpResponseRedirect(
635
                reverse(
636
                    'chrono-manager-agenda-day-view',
637
                    kwargs={'pk': self.agenda.id, 'year': today.year, 'month': today.month, 'day': today.day},
638
                )
633
            today = datetime.date.today()
634
            return redirect(
635
                'chrono-manager-agenda-day-view',
636
                pk=self.agenda.id,
637
                year=today.year,
638
                month=today.month,
639
                day=today.day,
639 640
            )
640 641

  
641 642
        if self.agenda.kind == 'events':
642
            # redirect to monthly view, to first month where there are events,
643
            # otherwise to latest month with events, otherwise to this month.
644
            event = self.agenda.event_set.filter(
645
                start_datetime__gte=datetime.date(today.year, today.month, 1)
646
            ).first()
647
            if not event:
648
                event = self.agenda.event_set.filter(
649
                    start_datetime__lte=datetime.date(today.year, today.month, 1)
650
                ).last()
651
            if event:
652
                day = event.start_datetime
653
            else:
654
                day = today
655
            return HttpResponseRedirect(
656
                reverse(
657
                    'chrono-manager-agenda-month-view',
658
                    kwargs={'pk': self.agenda.id, 'year': day.year, 'month': day.month},
659
                )
660
            )
643
            return redirect('chrono-manager-agenda-month-redirect-view', pk=self.agenda.pk)
661 644

  
662 645

  
663 646
agenda_view = AgendaView.as_view()
664 647

  
665 648

  
649
class AgendaMonthRedirectView(ViewableAgendaMixin, View):
650
    def get(self, request, *args, **kwargs):
651
        if self.agenda.kind != 'events':
652
            return redirect('chrono-manager-agenda-view', pk=self.agenda.pk)
653

  
654
        # redirect to monthly view, to first month where there are events,
655
        # otherwise to latest month with events, otherwise to this month.
656
        today = datetime.date.today()
657
        event = self.agenda.event_set.filter(
658
            start_datetime__gte=datetime.date(today.year, today.month, 1)
659
        ).first()
660
        if not event:
661
            event = self.agenda.event_set.filter(
662
                start_datetime__lte=datetime.date(today.year, today.month, 1)
663
            ).last()
664
        if event:
665
            day = event.start_datetime
666
        else:
667
            day = today
668
        return redirect('chrono-manager-agenda-month-view', pk=self.agenda.pk, year=day.year, month=day.month)
669

  
670

  
671
agenda_month_redirect_view = AgendaMonthRedirectView.as_view()
672

  
673

  
666 674
class AgendaDateView(DateMixin, ViewableAgendaMixin):
667 675
    model = Event
668 676
    month_format = '%m'
tests/test_manager.py
150 150
    assert resp2.content_type == 'application/javascript'
151 151

  
152 152

  
153
def test_events_agenda_redirect(app, admin_user):
154
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='events')
155

  
156
    app = login(app)
157
    resp = app.get('/manage/agendas/%s/' % agenda.pk, status=302)
158
    assert resp.location.endswith('/manage/agendas/%s/month/' % agenda.pk)
159

  
160

  
161
@freezegun.freeze_time('2020-07-12')
162
def test_events_agenda_month_redirect(app, admin_user):
163
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='events')
164

  
165
    app = login(app)
166
    # no event, redirect to current month
167
    resp = app.get('/manage/agendas/%s/month/' % agenda.pk, status=302)
168
    assert resp.location.endswith('/manage/agendas/%s/2020/7/' % agenda.pk)
169

  
170
    # only past events, redirect to last event month
171
    Event.objects.create(
172
        agenda=agenda, places=1, start_datetime=now() - datetime.timedelta(days=60),
173
    )
174
    resp = app.get('/manage/agendas/%s/month/' % agenda.pk, status=302)
175
    assert resp.location.endswith('/manage/agendas/%s/2020/5/' % agenda.pk)
176
    Event.objects.create(
177
        agenda=agenda, places=1, start_datetime=now() - datetime.timedelta(days=30),
178
    )
179
    resp = app.get('/manage/agendas/%s/month/' % agenda.pk, status=302)
180
    assert resp.location.endswith('/manage/agendas/%s/2020/6/' % agenda.pk)
181

  
182
    # future events
183
    Event.objects.create(
184
        agenda=agenda, places=1, start_datetime=now() + datetime.timedelta(days=60),
185
    )
186
    resp = app.get('/manage/agendas/%s/month/' % agenda.pk, status=302)
187
    assert resp.location.endswith('/manage/agendas/%s/2020/9/' % agenda.pk)
188
    Event.objects.create(
189
        agenda=agenda, places=1, start_datetime=now() + datetime.timedelta(days=30),
190
    )
191
    resp = app.get('/manage/agendas/%s/month/' % agenda.pk, status=302)
192
    assert resp.location.endswith('/manage/agendas/%s/2020/8/' % agenda.pk)
193

  
194
    # wrong kind
195
    agenda.kind = 'virtual'
196
    agenda.save()
197
    resp = app.get('/manage/agendas/%s/month/' % agenda.pk, status=302)
198
    assert resp.location.endswith('/manage/agendas/%s/' % agenda.pk)
199
    agenda.kind = 'meetings'
200
    agenda.save()
201
    resp = app.get('/manage/agendas/%s/month/' % agenda.pk, status=302)
202
    assert resp.location.endswith('/manage/agendas/%s/' % agenda.pk)
203

  
204

  
205
@freezegun.freeze_time('2020-07-12')
206
def test_meetings_agenda_redirect(app, admin_user):
207
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='meetings')
208

  
209
    app = login(app)
210
    resp = app.get('/manage/agendas/%s/' % agenda.pk, status=302)
211
    assert resp.location.endswith('/manage/agendas/%s/2020/7/12/' % agenda.pk)
212

  
213

  
214
def test_virtual_agenda_redirect(app, admin_user):
215
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='virtual')
216

  
217
    app = login(app)
218
    resp = app.get('/manage/agendas/%s/' % agenda.pk)  # no redirection
219

  
220

  
153 221
def test_view_agendas_as_manager(app, manager_user):
154 222
    agenda = Agenda(label=u'Foo Bar')
155 223
    agenda.view_role = manager_user.groups.all()[0]
......
639 707
    agenda.view_role = manager_user.groups.all()[0]
640 708
    agenda.save()
641 709
    app = login(app, username='manager', password='manager')
642
    resp = app.get('/manage/', status=200)
643
    resp = app.get('/manage/agendas/add/', status=403)
710
    app.get('/manage/agendas/add/', status=403)
644 711

  
645 712

  
646 713
def test_options_agenda(app, admin_user):
647 714
    agenda = Agenda(label=u'Foo bar')
648 715
    agenda.save()
649 716
    app = login(app)
650
    resp = app.get('/manage/', status=200)
651
    resp = resp.click('Foo bar').follow()
652
    resp = resp.click('Settings')
717
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
653 718
    resp = resp.click('Options')
654 719
    assert resp.form['label'].value == 'Foo bar'
655 720
    resp.form['label'] = 'Foo baz'
......
691 756
    agenda.save()
692 757
    app = login(app, username='manager', password='manager')
693 758
    resp = app.get('/manage/', status=200)
694
    resp = resp.click('Foo bar')
695
    assert not 'Settings' in resp.text
759
    resp = resp.click('Foo bar').follow().follow()
760
    assert 'Settings' not in resp.text
696 761
    resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=403)
697 762
    resp = app.get('/manage/agendas/%s/edit' % agenda.id, status=403)
698 763
    agenda.kind = 'meetings'
......
707 772
    agenda.edit_role = manager_user.groups.all()[0]
708 773
    agenda.save()
709 774

  
710
    resp = app.get('/manage/', status=200)
711
    resp = resp.click('Foo bar').follow()
712
    resp = resp.click('Settings')
775
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
713 776
    resp = resp.click('Options')
714 777
    assert resp.form['label'].value == 'Foo bar'
715 778
    resp.form['label'] = 'Foo baz'
......
805 868
    agenda.save()
806 869
    app = login(app)
807 870
    resp = app.get('/manage/', status=200)
808
    resp = resp.click('Foo bar').follow()
809
    resp = resp.click('Settings')
871
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
810 872
    resp = resp.click('Delete')
811 873
    resp = resp.form.submit()
812 874
    assert resp.location.endswith('/manage/')
813 875
    resp = resp.follow()
814
    assert not 'Foo bar' in resp.text
876
    assert 'Foo bar' not in resp.text
815 877

  
816 878

  
817 879
def test_delete_busy_agenda(app, admin_user):
......
821 883
    event.save()
822 884

  
823 885
    app = login(app)
824
    resp = app.get('/manage/', status=200)
825
    resp = resp.click('Foo bar').follow()
826
    resp = resp.click('Settings')
886
    resp = app.get('/manage/agendas/%s/settings' % agenda.id)
827 887
    resp = resp.click('Delete')
828 888
    assert 'Are you sure you want to delete this?' in resp.text
829 889

  
830 890
    booking = Booking(event=event)
831 891
    booking.save()
832
    resp = app.get('/manage/', status=200)
833
    resp = resp.click('Foo bar').follow()
834
    resp = resp.click('Settings')
892
    resp = app.get('/manage/agendas/%s/settings' % agenda.id)
835 893
    resp = resp.click('Delete')
836 894
    assert 'This cannot be removed' in resp.text
837 895

  
838 896
    booking.cancellation_datetime = now()
839 897
    booking.save()
840
    resp = app.get('/manage/', status=200)
841
    resp = resp.click('Foo bar').follow()
842
    resp = resp.click('Settings')
898
    resp = app.get('/manage/agendas/%s/settings' % agenda.id)
843 899
    resp = resp.click('Delete')
844 900
    assert 'Are you sure you want to delete this?' in resp.text
845 901

  
......
855 911
    agenda.edit_role = manager_user.groups.all()[0]
856 912
    agenda.save()
857 913
    app = login(app, username='manager', password='manager')
858
    resp = app.get('/manage/', status=200)
859
    resp = resp.click('Foo bar').follow()
860
    resp = resp.click('Settings')
914
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
861 915
    assert 'Options' in resp.text
862 916
    assert 'Delete' not in resp.text
863 917
    resp = app.get('/manage/agendas/%s/delete' % agenda.id, status=403)
......
874 928

  
875 929
    app = login(app)
876 930
    resp = app.get('/manage/', status=200)
877
    resp = resp.click('Foo bar').follow()
878
    resp = resp.click('Settings')
931
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
879 932
    desk_page = resp.click('Desk A')
880 933
    desk_delete_page = desk_page.click('Delete')
881 934
    assert 'Are you sure you want to delete this?' in desk_delete_page.text
......
964 1017
    agenda.edit_role = manager_user.groups.all()[0]
965 1018
    agenda.save()
966 1019

  
967
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
968
    resp = resp.click('Settings')
1020
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
969 1021
    assert '<h2>Settings' in resp.text
970 1022
    resp = resp.click('New Event')
971 1023
    resp.form['start_datetime$date'] = '2016-02-15'
......
1409 1461
    agenda = Agenda(label=u'Foo bar', kind='meetings')
1410 1462
    agenda.save()
1411 1463
    app = login(app)
1412
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
1413
    resp = resp.click('Settings')
1464
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1414 1465
    assert "This agenda doesn't have any meeting type yet." in resp.text
1415 1466
    resp = resp.click('New Meeting Type')
1416 1467
    resp.form['label'] = 'Blah'
......
1441 1492
    meeting_type.save()
1442 1493

  
1443 1494
    app = login(app)
1444
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
1445
    resp = resp.click('Settings')
1495
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1446 1496
    resp = resp.click('Blah')
1447 1497
    resp = resp.click('Delete')
1448 1498
    assert 'Are you sure you want to delete this?' in resp.text
......
1454 1504
    assert '__deleted__' in meeting_type.slug
1455 1505

  
1456 1506
    # meeting type not showing up anymore
1457
    resp = app.get('/manage/', status=200)
1458
    resp = resp.click('Foo').follow()
1459
    resp = resp.click('Settings')
1507
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1460 1508
    assert 'Meeting Type Foo' not in resp.text
1461 1509

  
1462 1510
    # it is possible to add a new meeting type with the same slug
......
1576 1624
    agenda.edit_role = manager_user.groups.all()[0]
1577 1625
    agenda.save()
1578 1626

  
1579
    resp = app.get('/manage/agendas/%d/' % agenda.id).follow()
1580
    resp = resp.click('Settings')
1627
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1581 1628
    assert 'Add a time period' in resp.text
1582 1629
    assert '/manage/timeperiods/%s/edit' % time_period.id in resp.text
1583 1630
    assert '/manage/timeperiods/%s/delete' % time_period.id in resp.text
......
1598 1645
    agenda = Agenda.objects.get(slug='foo-bar')
1599 1646
    MeetingType(agenda=agenda, label='Blah').save()
1600 1647

  
1601
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
1602
    resp = resp.click('Settings')
1648
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1603 1649
    resp = resp.click('New Desk')
1604 1650
    resp.form['label'] = 'Desk A'
1605 1651
    resp = resp.form.submit().follow()
......
1655 1701
    agenda = Agenda.objects.get(slug='foo-bar')
1656 1702
    MeetingType(agenda=agenda, label='Blah').save()
1657 1703

  
1658
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
1659
    resp = resp.click('Settings')
1704
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1660 1705
    resp = resp.click('New Desk')
1661 1706
    resp.form['label'] = 'Desk A'
1662 1707
    resp = resp.form.submit().follow()
......
1721 1766
    )
1722 1767
    Booking.objects.create(event=event)
1723 1768
    login(app)
1724
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
1725
    resp = resp.click('Settings')
1769
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1726 1770
    resp = resp.click('Add a time period exception')
1727 1771
    resp = resp.form.submit()  # submit empty form
1728 1772
    # fields should be marked with errors
......
1751 1795
        event=event, cancellation_datetime=make_aware(datetime.datetime(2017, 5, 20, 10, 30))
1752 1796
    )
1753 1797
    login(app)
1754
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
1755
    resp = resp.click('Settings')
1798
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1756 1799
    resp = resp.click('Add a time period exception')
1757 1800
    resp.form['start_datetime$date'] = '2017-05-22'
1758 1801
    resp.form['start_datetime$time'] = '08:00'
......
1806 1849
        weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
1807 1850
    )
1808 1851
    login(app)
1809
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
1810
    resp = resp.click('Settings')
1852
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1811 1853
    resp = resp.click('Add a time period exception')
1812 1854
    today = datetime.datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
1813 1855
    tomorrow = make_aware(today + datetime.timedelta(days=15))
......
1959 2001
        weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
1960 2002
    )
1961 2003
    login(app)
1962
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
1963
    resp = resp.click('Settings')
2004
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1964 2005
    resp = resp.click('upload')
1965 2006
    ics_with_recurrent_exceptions = b"""BEGIN:VCALENDAR
1966 2007
VERSION:2.0
......
2112 2153
    )
2113 2154
    login(app)
2114 2155
    # import a source
2115
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2116
    resp = resp.click('Settings')
2156
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2117 2157
    resp = resp.click('upload')
2118 2158
    ics_with_recurrent_exceptions = b"""BEGIN:VCALENDAR
2119 2159
VERSION:2.0
......
2132 2172
    assert source1.timeperiodexception_set.count() == 2
2133 2173

  
2134 2174
    # import another one
2135
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2136
    resp = resp.click('Settings')
2175
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2137 2176
    resp = resp.click('upload')
2138 2177
    resp.form['ics_file'] = Upload('exceptions.ics', ics_with_recurrent_exceptions, 'text/calendar')
2139 2178
    resp = resp.form.submit(status=302).follow()
......
2142 2181
    assert source2.timeperiodexception_set.count() == 2
2143 2182

  
2144 2183
    # delete the second one
2145
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2146
    resp = resp.click('Settings')
2184
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2147 2185
    resp = resp.click('upload')
2148 2186
    resp = resp.click(href='/manage/time-period-exceptions-source/%d/delete' % source2.pk)
2149 2187
    resp = resp.form.submit().follow()
......
2152 2190
    assert TimePeriodExceptionSource.objects.filter(pk=source2.pk).exists() is False
2153 2191

  
2154 2192
    # delete the first one
2155
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2156
    resp = resp.click('Settings')
2193
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2157 2194
    resp = resp.click('upload')
2158 2195
    resp = resp.click(href='/manage/time-period-exceptions-source/%d/delete' % source1.pk)
2159 2196
    resp = resp.form.submit().follow()
......
2182 2219

  
2183 2220
    login(app)
2184 2221
    # import a source from a file
2185
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2186
    resp = resp.click('Settings')
2222
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2187 2223
    resp = resp.click('upload')
2188 2224
    resp.form['ics_file'] = Upload('exceptions.ics', ics_file_content, 'text/calendar')
2189 2225
    resp = resp.form.submit(status=302).follow()
......
2194 2230
    old_ics_file_path = source.ics_file.path
2195 2231

  
2196 2232
    # replace the source
2197
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2198
    resp = resp.click('Settings')
2233
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2199 2234
    resp = resp.click('upload')
2200 2235
    resp = resp.click(href='/manage/time-period-exceptions-source/%d/replace' % source.pk)
2201 2236
    resp.form['ics_newfile'] = Upload('exceptions.ics', ics_file_content, 'text/calendar')
......
2230 2265

  
2231 2266
    login(app)
2232 2267
    # import a source from an url
2233
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2234
    resp = resp.click('Settings')
2268
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2235 2269
    resp = resp.click('upload')
2236 2270
    resp.form['ics_url'] = 'http://example.com/foo.ics'
2237 2271
    mocked_response = mock.Mock()
......
2244 2278
    exceptions = list(source.timeperiodexception_set.order_by('pk'))
2245 2279

  
2246 2280
    # refresh the source
2247
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2248
    resp = resp.click('Settings')
2281
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2249 2282
    resp = resp.click('upload')
2250 2283
    mocked_response = mock.Mock()
2251 2284
    mocked_response.text = ics_url_content
......
2261 2294
    agenda = Agenda.objects.create(label='New Example', kind='meetings')
2262 2295
    desk = Desk.objects.create(agenda=agenda, label='New Desk')
2263 2296
    desk.save()
2297
    today = datetime.date.today()
2264 2298

  
2265 2299
    meetingtype = MeetingType(agenda=agenda, label='Bar', duration=30)
2266 2300
    meetingtype.save()
2267 2301

  
2268 2302
    login(app)
2269
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302)
2270
    today = datetime.date.today()
2271
    assert resp.location.endswith('%s/%s/%s/' % (today.year, today.month, today.day))
2272
    resp = resp.follow()
2303
    resp = app.get('/manage/agendas/%s/%s/%s/%s/' % (agenda.pk, today.year, today.month, today.day))
2273 2304
    assert 'No opening hours this day.' in resp.text  # no time pediod
2274 2305

  
2275 2306
    timeperiod = TimePeriod(
2276 2307
        desk=desk, weekday=today.weekday(), start_time=datetime.time(10, 0), end_time=datetime.time(18, 0)
2277 2308
    )
2278 2309
    timeperiod.save()
2279
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302).follow()
2310
    resp = app.get('/manage/agendas/%s/%s/%s/%s/' % (agenda.pk, today.year, today.month, today.day))
2280 2311
    assert 'No opening hours this day.' not in resp.text
2281 2312
    assert 'div class="booking' not in resp.text
2282 2313
    assert resp.text.count('<tr') == 9  # 10->18 (not included)
2283 2314

  
2284 2315
    timeperiod.end_time = datetime.time(18, 30)  # end during an hour
2285 2316
    timeperiod.save()
2286
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302).follow()
2317
    resp = app.get('/manage/agendas/%s/%s/%s/%s/' % (agenda.pk, today.year, today.month, today.day))
2287 2318
    assert resp.text.count('<tr') == 10  # 10->18 (included)
2288 2319

  
2289 2320
    # check opening hours cells
......
2382 2413
    timeperiod.save()
2383 2414

  
2384 2415
    login(app)
2385
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302).follow()
2416
    resp = app.get('/manage/agendas/%s/%s/%s/%s/' % (agenda.pk, today.year, today.month, today.day))
2386 2417
    assert resp.text.count('<tr') == 15
2387 2418
    assert '<th class="hour">11 p.m.</th>' in resp.text
2388 2419

  
......
2444 2475
    assert 'style="height: 600%; top: 100%;"' in resp.text
2445 2476

  
2446 2477

  
2447
def test_agenda_events_month_view(app, admin_user, manager_user, api_user):
2478
def test_agenda_events_month_view(app, admin_user):
2448 2479
    agenda = Agenda.objects.create(label='Events', kind='events')
2480
    today = datetime.date.today()
2449 2481

  
2450 2482
    login(app)
2451
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302)
2452
    resp = resp.follow()
2483
    resp = app.get('/manage/agendas/%s/%s/%s/' % (agenda.pk, today.year, today.month))
2453 2484
    assert "This month doesn't have any event configured." in resp.text
2454
    today = datetime.date.today()
2455 2485
    assert resp.request.url.endswith('%s/%s/' % (today.year, today.month))
2456 2486

  
2457 2487
    # add event in a future month
2458
    event = Event(label='xyz', start_datetime=now() + datetime.timedelta(days=40), places=10, agenda=agenda)
2459
    event.save()
2460
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
2461
    assert 'xyz' in resp.text
2462
    day = event.start_datetime
2463
    assert resp.request.url.endswith('%s/%s/' % (day.year, day.month))
2464

  
2488
    event = Event.objects.create(
2489
        label='xyz', start_datetime=now() + datetime.timedelta(days=40), places=10, agenda=agenda
2490
    )
2465 2491
    with CaptureQueriesContext(connection) as ctx:
2466 2492
        app.get(
2467 2493
            '/manage/agendas/%s/%s/%s/' % (agenda.id, event.start_datetime.year, event.start_datetime.month)
......
2472 2498
    resp = app.get('/manage/agendas/%s/%s/%s/' % (agenda.id, today.year, today.month))
2473 2499
    assert "This month doesn't have any event configured." in resp.text
2474 2500

  
2475
    # add event in the past
2476
    event2 = Event(label='zyx', start_datetime=now() - datetime.timedelta(days=40), places=10, agenda=agenda)
2477
    event2.save()
2478
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
2479
    assert 'xyz' in resp.text
2480
    day = event.start_datetime  # still the future event
2481
    assert resp.request.url.endswith('%s/%s/' % (day.year, day.month))
2482

  
2483
    # remove future event
2484
    event.delete()
2485
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
2486
    assert 'zyx' in resp.text
2487
    day = event2.start_datetime  # now the past event
2488
    assert resp.request.url.endswith('%s/%s/' % (day.year, day.month))
2489

  
2490 2501

  
2491 2502
def test_agenda_month_view(app, admin_user, manager_user, api_user):
2492 2503
    agenda = Agenda.objects.create(label='Passeports', kind='meetings')
2493 2504
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
2505
    today = datetime.date.today()
2494 2506

  
2495 2507
    meetingtype = MeetingType(agenda=agenda, label='passeport', duration=20)
2496 2508
    meetingtype.save()
2497 2509

  
2498 2510
    login(app)
2499
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302)
2500
    resp = resp.follow()
2511
    resp = app.get('/manage/agendas/%s/%d/%d/%d/' % (agenda.pk, today.year, today.month, today.day))
2501 2512
    assert 'Month view' in resp.text
2502 2513
    resp = resp.click('Month view')
2503
    today = datetime.date.today()
2504 2514
    assert resp.request.url.endswith('%s/%s/' % (today.year, today.month))
2505 2515

  
2506 2516
    assert 'Day view' in resp.text  # date view link should be present
......
2513 2523
    )
2514 2524
    timeperiod.save()
2515 2525
    resp = app.get('/manage/agendas/%s/%s/%s/' % (agenda.id, today.year, today.month))
2516
    assert not 'No opening hours this month.' in resp.text
2517
    assert not '<div class="booking' in resp.text
2526
    assert 'No opening hours this month.' not in resp.text
2527
    assert '<div class="booking' not in resp.text
2518 2528
    first_month_day = today.replace(day=1)
2519 2529
    last_month_day = today.replace(day=1, month=today.month + 1) - datetime.timedelta(days=1)
2520 2530
    start_week_number = first_month_day.isocalendar()[1]
2521
-