Projet

Général

Profil

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

Lauréline Guérin, 09 juillet 2020 14:51

Télécharger (27,6 ko)

Voir les différences:

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

 .../templates/chrono/manager_agenda_view.html |   3 +-
 chrono/manager/urls.py                        |   5 +
 chrono/manager/views.py                       |  60 ++---
 tests/test_manager.py                         | 218 +++++++++---------
 4 files changed, 155 insertions(+), 131 deletions(-)
chrono/manager/templates/chrono/manager_agenda_view.html
9 9
<h2>{{ object.label }}</h2>
10 10
{% if user_can_manage %}
11 11
  <span class="actions">
12
  <a href="{% url 'chrono-manager-agenda-settings' pk=object.id %}">{% trans 'Settings' %}</a>
12
    <a href="{% url 'chrono-manager-agenda-settings' pk=object.id %}">{% trans 'Settings' %}</a>
13
    {% block extra-actions %}{% endblock %}
13 14
  </span>
14 15
{% endif %}
15 16
{% endblock %}
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'
......
1397 1449
    agenda = Agenda(label=u'Foo bar', kind='meetings')
1398 1450
    agenda.save()
1399 1451
    app = login(app)
1400
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
1401
    resp = resp.click('Settings')
1452
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1402 1453
    assert "This agenda doesn't have any meeting type yet." in resp.text
1403 1454
    resp = resp.click('New Meeting Type')
1404 1455
    resp.form['label'] = 'Blah'
......
1429 1480
    meeting_type.save()
1430 1481

  
1431 1482
    app = login(app)
1432
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
1433
    resp = resp.click('Settings')
1483
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1434 1484
    resp = resp.click('Blah')
1435 1485
    resp = resp.click('Delete')
1436 1486
    assert 'Are you sure you want to delete this?' in resp.text
......
1442 1492
    assert '__deleted__' in meeting_type.slug
1443 1493

  
1444 1494
    # meeting type not showing up anymore
1445
    resp = app.get('/manage/', status=200)
1446
    resp = resp.click('Foo').follow()
1447
    resp = resp.click('Settings')
1495
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1448 1496
    assert 'Meeting Type Foo' not in resp.text
1449 1497

  
1450 1498
    # it is possible to add a new meeting type with the same slug
......
1564 1612
    agenda.edit_role = manager_user.groups.all()[0]
1565 1613
    agenda.save()
1566 1614

  
1567
    resp = app.get('/manage/agendas/%d/' % agenda.id).follow()
1568
    resp = resp.click('Settings')
1615
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1569 1616
    assert 'Add a time period' in resp.text
1570 1617
    assert '/manage/timeperiods/%s/edit' % time_period.id in resp.text
1571 1618
    assert '/manage/timeperiods/%s/delete' % time_period.id in resp.text
......
1586 1633
    agenda = Agenda.objects.get(slug='foo-bar')
1587 1634
    MeetingType(agenda=agenda, label='Blah').save()
1588 1635

  
1589
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
1590
    resp = resp.click('Settings')
1636
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1591 1637
    resp = resp.click('New Desk')
1592 1638
    resp.form['label'] = 'Desk A'
1593 1639
    resp = resp.form.submit().follow()
......
1643 1689
    agenda = Agenda.objects.get(slug='foo-bar')
1644 1690
    MeetingType(agenda=agenda, label='Blah').save()
1645 1691

  
1646
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
1647
    resp = resp.click('Settings')
1692
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1648 1693
    resp = resp.click('New Desk')
1649 1694
    resp.form['label'] = 'Desk A'
1650 1695
    resp = resp.form.submit().follow()
......
1709 1754
    )
1710 1755
    Booking.objects.create(event=event)
1711 1756
    login(app)
1712
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
1713
    resp = resp.click('Settings')
1757
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1714 1758
    resp = resp.click('Add a time period exception')
1715 1759
    resp = resp.form.submit()  # submit empty form
1716 1760
    # fields should be marked with errors
......
1739 1783
        event=event, cancellation_datetime=make_aware(datetime.datetime(2017, 5, 20, 10, 30))
1740 1784
    )
1741 1785
    login(app)
1742
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
1743
    resp = resp.click('Settings')
1786
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1744 1787
    resp = resp.click('Add a time period exception')
1745 1788
    resp.form['start_datetime$date'] = '2017-05-22'
1746 1789
    resp.form['start_datetime$time'] = '08:00'
......
1794 1837
        weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
1795 1838
    )
1796 1839
    login(app)
1797
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
1798
    resp = resp.click('Settings')
1840
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1799 1841
    resp = resp.click('Add a time period exception')
1800 1842
    today = datetime.datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
1801 1843
    tomorrow = make_aware(today + datetime.timedelta(days=15))
......
1947 1989
        weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
1948 1990
    )
1949 1991
    login(app)
1950
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
1951
    resp = resp.click('Settings')
1992
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
1952 1993
    resp = resp.click('upload')
1953 1994
    ics_with_recurrent_exceptions = b"""BEGIN:VCALENDAR
1954 1995
VERSION:2.0
......
2100 2141
    )
2101 2142
    login(app)
2102 2143
    # import a source
2103
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2104
    resp = resp.click('Settings')
2144
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2105 2145
    resp = resp.click('upload')
2106 2146
    ics_with_recurrent_exceptions = b"""BEGIN:VCALENDAR
2107 2147
VERSION:2.0
......
2120 2160
    assert source1.timeperiodexception_set.count() == 2
2121 2161

  
2122 2162
    # import another one
2123
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2124
    resp = resp.click('Settings')
2163
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2125 2164
    resp = resp.click('upload')
2126 2165
    resp.form['ics_file'] = Upload('exceptions.ics', ics_with_recurrent_exceptions, 'text/calendar')
2127 2166
    resp = resp.form.submit(status=302).follow()
......
2130 2169
    assert source2.timeperiodexception_set.count() == 2
2131 2170

  
2132 2171
    # delete the second one
2133
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2134
    resp = resp.click('Settings')
2172
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2135 2173
    resp = resp.click('upload')
2136 2174
    resp = resp.click(href='/manage/time-period-exceptions-source/%d/delete' % source2.pk)
2137 2175
    resp = resp.form.submit().follow()
......
2140 2178
    assert TimePeriodExceptionSource.objects.filter(pk=source2.pk).exists() is False
2141 2179

  
2142 2180
    # delete the first one
2143
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2144
    resp = resp.click('Settings')
2181
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2145 2182
    resp = resp.click('upload')
2146 2183
    resp = resp.click(href='/manage/time-period-exceptions-source/%d/delete' % source1.pk)
2147 2184
    resp = resp.form.submit().follow()
......
2170 2207

  
2171 2208
    login(app)
2172 2209
    # import a source from a file
2173
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2174
    resp = resp.click('Settings')
2210
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2175 2211
    resp = resp.click('upload')
2176 2212
    resp.form['ics_file'] = Upload('exceptions.ics', ics_file_content, 'text/calendar')
2177 2213
    resp = resp.form.submit(status=302).follow()
......
2182 2218
    old_ics_file_path = source.ics_file.path
2183 2219

  
2184 2220
    # replace the source
2185
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2186
    resp = resp.click('Settings')
2221
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2187 2222
    resp = resp.click('upload')
2188 2223
    resp = resp.click(href='/manage/time-period-exceptions-source/%d/replace' % source.pk)
2189 2224
    resp.form['ics_newfile'] = Upload('exceptions.ics', ics_file_content, 'text/calendar')
......
2218 2253

  
2219 2254
    login(app)
2220 2255
    # import a source from an url
2221
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2222
    resp = resp.click('Settings')
2256
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2223 2257
    resp = resp.click('upload')
2224 2258
    resp.form['ics_url'] = 'http://example.com/foo.ics'
2225 2259
    mocked_response = mock.Mock()
......
2232 2266
    exceptions = list(source.timeperiodexception_set.order_by('pk'))
2233 2267

  
2234 2268
    # refresh the source
2235
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
2236
    resp = resp.click('Settings')
2269
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2237 2270
    resp = resp.click('upload')
2238 2271
    mocked_response = mock.Mock()
2239 2272
    mocked_response.text = ics_url_content
......
2249 2282
    agenda = Agenda.objects.create(label='New Example', kind='meetings')
2250 2283
    desk = Desk.objects.create(agenda=agenda, label='New Desk')
2251 2284
    desk.save()
2285
    today = datetime.date.today()
2252 2286

  
2253 2287
    meetingtype = MeetingType(agenda=agenda, label='Bar', duration=30)
2254 2288
    meetingtype.save()
2255 2289

  
2256 2290
    login(app)
2257
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302)
2258
    today = datetime.date.today()
2259
    assert resp.location.endswith('%s/%s/%s/' % (today.year, today.month, today.day))
2260
    resp = resp.follow()
2291
    resp = app.get('/manage/agendas/%s/%s/%s/%s/' % (agenda.pk, today.year, today.month, today.day))
2261 2292
    assert 'No opening hours this day.' in resp.text  # no time pediod
2262 2293

  
2263 2294
    timeperiod = TimePeriod(
2264 2295
        desk=desk, weekday=today.weekday(), start_time=datetime.time(10, 0), end_time=datetime.time(18, 0)
2265 2296
    )
2266 2297
    timeperiod.save()
2267
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302).follow()
2298
    resp = app.get('/manage/agendas/%s/%s/%s/%s/' % (agenda.pk, today.year, today.month, today.day))
2268 2299
    assert 'No opening hours this day.' not in resp.text
2269 2300
    assert 'div class="booking' not in resp.text
2270 2301
    assert resp.text.count('<tr') == 9  # 10->18 (not included)
2271 2302

  
2272 2303
    timeperiod.end_time = datetime.time(18, 30)  # end during an hour
2273 2304
    timeperiod.save()
2274
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302).follow()
2305
    resp = app.get('/manage/agendas/%s/%s/%s/%s/' % (agenda.pk, today.year, today.month, today.day))
2275 2306
    assert resp.text.count('<tr') == 10  # 10->18 (included)
2276 2307

  
2277 2308
    # check opening hours cells
......
2370 2401
    timeperiod.save()
2371 2402

  
2372 2403
    login(app)
2373
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302).follow()
2404
    resp = app.get('/manage/agendas/%s/%s/%s/%s/' % (agenda.pk, today.year, today.month, today.day))
2374 2405
    assert resp.text.count('<tr') == 15
2375 2406
    assert '<th class="hour">11 p.m.</th>' in resp.text
2376 2407

  
......
2432 2463
    assert 'style="height: 600%; top: 100%;"' in resp.text
2433 2464

  
2434 2465

  
2435
def test_agenda_events_month_view(app, admin_user, manager_user, api_user):
2466
def test_agenda_events_month_view(app, admin_user):
2436 2467
    agenda = Agenda.objects.create(label='Events', kind='events')
2468
    today = datetime.date.today()
2437 2469

  
2438 2470
    login(app)
2439
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302)
2440
    resp = resp.follow()
2471
    resp = app.get('/manage/agendas/%s/%s/%s/' % (agenda.pk, today.year, today.month))
2441 2472
    assert "This month doesn't have any event configured." in resp.text
2442
    today = datetime.date.today()
2443 2473
    assert resp.request.url.endswith('%s/%s/' % (today.year, today.month))
2444 2474

  
2445 2475
    # add event in a future month
2446
    event = Event(label='xyz', start_datetime=now() + datetime.timedelta(days=40), places=10, agenda=agenda)
2447
    event.save()
2448
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
2449
    assert 'xyz' in resp.text
2450
    day = event.start_datetime
2451
    assert resp.request.url.endswith('%s/%s/' % (day.year, day.month))
2452

  
2476
    event = Event.objects.create(
2477
        label='xyz', start_datetime=now() + datetime.timedelta(days=40), places=10, agenda=agenda
2478
    )
2453 2479
    with CaptureQueriesContext(connection) as ctx:
2454 2480
        app.get(
2455 2481
            '/manage/agendas/%s/%s/%s/' % (agenda.id, event.start_datetime.year, event.start_datetime.month)
......
2460 2486
    resp = app.get('/manage/agendas/%s/%s/%s/' % (agenda.id, today.year, today.month))
2461 2487
    assert "This month doesn't have any event configured." in resp.text
2462 2488

  
2463
    # add event in the past
2464
    event2 = Event(label='zyx', start_datetime=now() - datetime.timedelta(days=40), places=10, agenda=agenda)
2465
    event2.save()
2466
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
2467
    assert 'xyz' in resp.text
2468
    day = event.start_datetime  # still the future event
2469
    assert resp.request.url.endswith('%s/%s/' % (day.year, day.month))
2470

  
2471
    # remove future event
2472
    event.delete()
2473
    resp = app.get('/manage/agendas/%s/' % agenda.id).follow()
2474
    assert 'zyx' in resp.text
2475
    day = event2.start_datetime  # now the past event
2476
    assert resp.request.url.endswith('%s/%s/' % (day.year, day.month))
2477

  
2478 2489

  
2479 2490
def test_agenda_month_view(app, admin_user, manager_user, api_user):
2480 2491
    agenda = Agenda.objects.create(label='Passeports', kind='meetings')
2481 2492
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
2493
    today = datetime.date.today()
2482 2494

  
2483 2495
    meetingtype = MeetingType(agenda=agenda, label='passeport', duration=20)
2484 2496
    meetingtype.save()
2485 2497

  
2486 2498
    login(app)
2487
    resp = app.get('/manage/agendas/%s/' % agenda.id, status=302)
2488
    resp = resp.follow()
2499
    resp = app.get('/manage/agendas/%s/%d/%d/%d/' % (agenda.pk, today.year, today.month, today.day))
2489 2500
    assert 'Month view' in resp.text
2490 2501
    resp = resp.click('Month view')
2491
    today = datetime.date.today()
2492 2502
    assert resp.request.url.endswith('%s/%s/' % (today.year, today.month))
2493 2503

  
2494 2504
    assert 'Day view' in resp.text  # date view link should be present
......
2501 2511
    )
2502 2512
    timeperiod.save()
2503 2513
    resp = app.get('/manage/agendas/%s/%s/%s/' % (agenda.id, today.year, today.month))
2504
    assert not 'No opening hours this month.' in resp.text
2505
    assert not '<div class="booking' in resp.text
2514
    assert 'No opening hours this month.' not in resp.text
2515
    assert '<div class="booking' not in resp.text
2506 2516
    first_month_day = today.replace(day=1)
2507 2517
    last_month_day = today.replace(day=1, month=today.month + 1) - datetime.timedelta(days=1)
2508 2518
    start_week_number = first_month_day.isocalendar()[1]
2509
-