From a45feb7d5ad3bb2e38c91460defbcec51fdb7b73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sun, 26 Nov 2017 11:55:09 +0100 Subject: [PATCH 1/2] general: move agenda settings to a secondary page (#11114) --- .../templates/chrono/manager_agenda_settings.html | 173 +++++++++++++++++++++ .../templates/chrono/manager_agenda_view.html | 144 +---------------- .../templates/chrono/manager_desk_form.html | 2 +- .../templates/chrono/manager_event_form.html | 2 +- .../templates/chrono/manager_import_events.html | 2 +- .../chrono/manager_import_exceptions.html | 2 +- .../chrono/manager_meeting_type_form.html | 2 +- .../chrono/manager_time_period_exception_form.html | 2 +- .../templates/chrono/manager_time_period_form.html | 2 +- chrono/manager/urls.py | 2 + chrono/manager/views.py | 43 +++-- tests/test_manager.py | 154 +++++++++--------- 12 files changed, 293 insertions(+), 237 deletions(-) create mode 100644 chrono/manager/templates/chrono/manager_agenda_settings.html diff --git a/chrono/manager/templates/chrono/manager_agenda_settings.html b/chrono/manager/templates/chrono/manager_agenda_settings.html new file mode 100644 index 0000000..0fcc261 --- /dev/null +++ b/chrono/manager/templates/chrono/manager_agenda_settings.html @@ -0,0 +1,173 @@ +{% extends "chrono/manager_agenda_view.html" %} +{% load i18n %} + +{% block breadcrumb %} +{{ block.super }} +{% trans "Settings" %} +{% endblock %} + +{% block appbar %} +

{% trans "Settings" %} + [{% trans "identifier:" %} {{object.slug}}]

+ +{% if user.is_staff %} + {% trans 'Delete' %} +{% endif %} +{% if user_can_manage %} + {% trans 'Options' %} + {% if object.kind == "events" %} + {% trans 'Import Events' %} + {% trans 'New Event' %} + {% else %} + {% trans 'New Meeting Type' %} + {% trans 'New Desk' %} + {% endif %} +{% endif %} +{% endblock %} + +{% block content %} + +{% if object.kind == "events" %} +

{% trans "Events" %}

+{% if object.event_set.count %} +
+ +
+{% else %} +
+ {% blocktrans %} + This agenda doesn't have any event yet. Click on the "New Event" button in + the top right of the page to add a first one. + {% endblocktrans %} +
+{% endif %} +{% endif %} + +{% if object.kind == "meetings" %} + +

{% trans 'Meeting Types' %}

+{% if object.meetingtype_set.count %} +
+ +
+ +

{% trans 'Time Periods' %}

+ {% if object.desk_set.count %} +
+ {% for desk in object.desk_set.all %} +
+ {% url 'chrono-manager-agenda-add-time-period' agenda_pk=object.pk pk=desk.pk as add_time_period_url %} + +
+ {% endfor %} +
+ {% else %} +
+ {% blocktrans %} + This agenda doesn't have any desk yet. Click on the "New Desk" button in + the top right of the page to add a first one. + {% endblocktrans %} +
+{% endif %} + +{% else %} +
+ {% blocktrans %} + This agenda doesn't have any meeting type yet. Click on the "New Meeting Type" button in + the top right of the page to add a first one. + {% endblocktrans %} +
+{% endif %} + + +{% endif %} + + +

{% trans "Permissions" %}

+ + + +

{% trans "Booking Delays" %}

+ + + +{% endblock %} diff --git a/chrono/manager/templates/chrono/manager_agenda_view.html b/chrono/manager/templates/chrono/manager_agenda_view.html index aa94a85..b134a53 100644 --- a/chrono/manager/templates/chrono/manager_agenda_view.html +++ b/chrono/manager/templates/chrono/manager_agenda_view.html @@ -2,21 +2,9 @@ {% load i18n %} {% block appbar %} -

{{ object.label }} - [{% trans "identifier:" %} {{object.slug}}]

- -{% if user.is_staff %} - {% trans 'Delete' %} -{% endif %} +

{{ object.label }}

{% if user_can_manage %} - {% trans 'Options' %} - {% if object.kind == "events" %} - {% trans 'Import Events' %} - {% trans 'New Event' %} - {% else %} - {% trans 'New Meeting Type' %} - {% trans 'New Desk' %} - {% endif %} + {% trans 'Settings' %} {% endif %} {% endblock %} @@ -30,132 +18,4 @@ {% endblock %} {% block content %} - -{% if object.kind == "events" %} -{% if object.event_set.count %} -
- -
-{% else %} -
- {% blocktrans %} - This agenda doesn't have any event yet. Click on the "New Event" button in - the top right of the page to add a first one. - {% endblocktrans %} -
-{% endif %} -{% endif %} - -{% if object.kind == "meetings" %} - -

{% trans 'Meeting Types' %}

-{% if object.meetingtype_set.count %} -
- -
- -

{% trans 'Time Periods' %}

- {% if object.desk_set.count %} -
- {% for desk in object.desk_set.all %} -
- {% url 'chrono-manager-agenda-add-time-period' agenda_pk=object.pk pk=desk.pk as add_time_period_url %} - -
- {% endfor %} -
- {% else %} -
- {% blocktrans %} - This agenda doesn't have any desk yet. Click on the "New Desk" button in - the top right of the page to add a first one. - {% endblocktrans %} -
-{% endif %} - -{% else %} -
- {% blocktrans %} - This agenda doesn't have any meeting type yet. Click on the "New Meeting Type" button in - the top right of the page to add a first one. - {% endblocktrans %} -
-{% endif %} - - -{% endif %} - {% endblock %} diff --git a/chrono/manager/templates/chrono/manager_desk_form.html b/chrono/manager/templates/chrono/manager_desk_form.html index 930f892..02c713e 100644 --- a/chrono/manager/templates/chrono/manager_desk_form.html +++ b/chrono/manager/templates/chrono/manager_desk_form.html @@ -31,7 +31,7 @@ {{ form.as_p }}
- {% trans 'Cancel' %} + {% trans 'Cancel' %}
{% endblock %} diff --git a/chrono/manager/templates/chrono/manager_event_form.html b/chrono/manager/templates/chrono/manager_event_form.html index ffe4370..0a8f8f4 100644 --- a/chrono/manager/templates/chrono/manager_event_form.html +++ b/chrono/manager/templates/chrono/manager_event_form.html @@ -29,7 +29,7 @@ {{ form.as_p }}
- {% trans 'Cancel' %} + {% trans 'Cancel' %}
{% endblock %} diff --git a/chrono/manager/templates/chrono/manager_import_events.html b/chrono/manager/templates/chrono/manager_import_events.html index 3651524..6247f6b 100644 --- a/chrono/manager/templates/chrono/manager_import_events.html +++ b/chrono/manager/templates/chrono/manager_import_events.html @@ -25,7 +25,7 @@

- {% trans 'Cancel' %} + {% trans 'Cancel' %}
{% endblock %} diff --git a/chrono/manager/templates/chrono/manager_import_exceptions.html b/chrono/manager/templates/chrono/manager_import_exceptions.html index 1b119d8..39d5e52 100644 --- a/chrono/manager/templates/chrono/manager_import_exceptions.html +++ b/chrono/manager/templates/chrono/manager_import_exceptions.html @@ -20,7 +20,7 @@

- {% trans 'Cancel' %} + {% trans 'Cancel' %}
{% endblock %} diff --git a/chrono/manager/templates/chrono/manager_meeting_type_form.html b/chrono/manager/templates/chrono/manager_meeting_type_form.html index 601dd1d..6d79f7f 100644 --- a/chrono/manager/templates/chrono/manager_meeting_type_form.html +++ b/chrono/manager/templates/chrono/manager_meeting_type_form.html @@ -29,7 +29,7 @@ {{ form.as_p }}
- {% trans 'Cancel' %} + {% trans 'Cancel' %}
{% endblock %} diff --git a/chrono/manager/templates/chrono/manager_time_period_exception_form.html b/chrono/manager/templates/chrono/manager_time_period_exception_form.html index 5d920cb..79eee76 100644 --- a/chrono/manager/templates/chrono/manager_time_period_exception_form.html +++ b/chrono/manager/templates/chrono/manager_time_period_exception_form.html @@ -31,7 +31,7 @@ {{ form.as_p }}
- {% trans 'Cancel' %} + {% trans 'Cancel' %}
{% endblock %} diff --git a/chrono/manager/templates/chrono/manager_time_period_form.html b/chrono/manager/templates/chrono/manager_time_period_form.html index 38c54ea..70e26f4 100644 --- a/chrono/manager/templates/chrono/manager_time_period_form.html +++ b/chrono/manager/templates/chrono/manager_time_period_form.html @@ -31,7 +31,7 @@ {{ form.as_p }}
- {% trans 'Cancel' %} + {% trans 'Cancel' %}
{% endblock %} diff --git a/chrono/manager/urls.py b/chrono/manager/urls.py index 8a98cb0..cf80923 100644 --- a/chrono/manager/urls.py +++ b/chrono/manager/urls.py @@ -24,6 +24,8 @@ urlpatterns = [ name='chrono-manager-agenda-add'), url(r'^agendas/(?P\w+)/$', views.agenda_view, name='chrono-manager-agenda-view'), + url(r'^agendas/(?P\w+)/settings$', views.agenda_settings, + name='chrono-manager-agenda-settings'), url(r'^agendas/(?P\w+)/edit$', views.agenda_edit, name='chrono-manager-agenda-edit'), url(r'^agendas/(?P\w+)/delete$', views.agenda_delete, diff --git a/chrono/manager/views.py b/chrono/manager/views.py index 91722c7..068d448 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -20,7 +20,7 @@ from django.contrib import messages from django.core.exceptions import PermissionDenied from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import Q -from django.http import HttpResponse, Http404 +from django.http import HttpResponse, Http404, HttpResponseRedirect from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext @@ -67,6 +67,9 @@ class AgendaAddView(CreateView): default_desk.save() return model_form + def get_success_url(self): + return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.object.id}) + agenda_add = AgendaAddView.as_view() @@ -81,6 +84,9 @@ class AgendaEditView(UpdateView): raise PermissionDenied() return obj + def get_success_url(self): + return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.object.id}) + agenda_edit = AgendaEditView.as_view() @@ -113,15 +119,18 @@ agenda_delete = AgendaDeleteView.as_view() class AgendaView(DetailView): - template_name = 'chrono/manager_agenda_view.html' model = Agenda - def get_context_data(self, **kwargs): - context = super(AgendaView, self).get_context_data(**kwargs) - if not self.get_object().can_be_viewed(self.request.user): + def get(self, request, *args, **kwargs): + try: + agenda = Agenda.objects.get(id=kwargs.get('pk')) + except Agenda.DoesNotExist: + raise Http404() + if not agenda.can_be_viewed(self.request.user): raise PermissionDenied() - context['user_can_manage'] = self.get_object().can_be_managed(self.request.user) - return context + + return HttpResponseRedirect( + reverse('chrono-manager-agenda-settings', kwargs={'pk': agenda.id})) agenda_view = AgendaView.as_view() @@ -149,7 +158,7 @@ class ManagedAgendaMixin(object): return initial def get_success_url(self): - return self.agenda.get_absolute_url() + return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id}) class ManagedAgendaSubobjectMixin(object): @@ -167,7 +176,7 @@ class ManagedAgendaSubobjectMixin(object): return context def get_success_url(self): - return self.agenda.get_absolute_url() + return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id}) class ManagedDeskMixin(object): @@ -194,7 +203,7 @@ class ManagedDeskMixin(object): return initial def get_success_url(self): - return self.desk.agenda.get_absolute_url() + return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda.id}) class ManagedDeskSubobjectMixin(object): @@ -213,7 +222,19 @@ class ManagedDeskSubobjectMixin(object): return context def get_success_url(self): - return self.desk.agenda.get_absolute_url() + return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda.id}) + + +class AgendaSettings(ManagedAgendaMixin, DetailView): + template_name = 'chrono/manager_agenda_settings.html' + model = Agenda + + def get_context_data(self, **kwargs): + context = super(AgendaSettings, self).get_context_data(**kwargs) + context['user_can_manage'] = self.get_object().can_be_managed(self.request.user) + return context + +agenda_settings = AgendaSettings.as_view() class AgendaAddEventView(ManagedAgendaMixin, CreateView): diff --git a/tests/test_manager.py b/tests/test_manager.py index 3cffe5d..bdd4f0c 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -127,9 +127,10 @@ def test_add_agenda(app, admin_user): resp = resp.form.submit() agenda = Agenda.objects.get(label='Foo bar') - assert resp.location.endswith('/manage/agendas/%s/' % agenda.id) + assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id) resp = resp.follow() - assert '

Foo bar' in resp.body + assert 'Foo bar' in resp.body + assert '

Settings' in resp.body def test_add_agenda_as_manager(app, manager_user): # open /manage/ access to manager_user, and check agenda creation is not @@ -146,14 +147,15 @@ def test_options_agenda(app, admin_user): agenda.save() app = login(app) resp = app.get('/manage/', status=200) - resp = resp.click('Foo bar') + resp = resp.click('Foo bar').follow() resp = resp.click('Options') assert resp.form['label'].value == 'Foo bar' resp.form['label'] = 'Foo baz' resp = resp.form.submit() - assert resp.location.endswith('/manage/agendas/%s/' % agenda.id) + assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id) resp = resp.follow() - assert '

Foo baz' in resp.body + assert 'Foo baz' in resp.body + assert '

Settings' in resp.body def test_options_agenda_as_manager(app, manager_user): agenda = Agenda(label=u'Foo bar') @@ -162,28 +164,30 @@ def test_options_agenda_as_manager(app, manager_user): app = login(app, username='manager', password='manager') resp = app.get('/manage/', status=200) resp = resp.click('Foo bar') - assert not 'Options' in resp.body + assert not 'Settings' in resp.body + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=403) resp = app.get('/manage/agendas/%s/edit' % agenda.id, status=403) agenda.edit_role = manager_user.groups.all()[0] agenda.save() resp = app.get('/manage/', status=200) - resp = resp.click('Foo bar') + resp = resp.click('Foo bar').follow() resp = resp.click('Options') assert resp.form['label'].value == 'Foo bar' resp.form['label'] = 'Foo baz' resp = resp.form.submit() - assert resp.location.endswith('/manage/agendas/%s/' % agenda.id) + assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id) resp = resp.follow() - assert '

Foo baz' in resp.body + assert 'Foo baz' in resp.body + assert '

Settings' in resp.body def test_delete_agenda(app, admin_user): agenda = Agenda(label=u'Foo bar') agenda.save() app = login(app) resp = app.get('/manage/', status=200) - resp = resp.click('Foo bar') + resp = resp.click('Foo bar').follow() resp = resp.click('Delete') resp = resp.form.submit() assert resp.location.endswith('/manage/') @@ -199,21 +203,21 @@ def test_delete_busy_agenda(app, admin_user): app = login(app) resp = app.get('/manage/', status=200) - resp = resp.click('Foo bar') + resp = resp.click('Foo bar').follow() resp = resp.click('Delete') assert 'Are you sure you want to delete this?' in resp.body booking = Booking(event=event) booking.save() resp = app.get('/manage/', status=200) - resp = resp.click('Foo bar') + resp = resp.click('Foo bar').follow() resp = resp.click('Delete') assert 'This cannot be removed' in resp.body booking.cancellation_datetime = now() booking.save() resp = app.get('/manage/', status=200) - resp = resp.click('Foo bar') + resp = resp.click('Foo bar').follow() resp = resp.click('Delete') assert 'Are you sure you want to delete this?' in resp.body @@ -229,7 +233,7 @@ def test_delete_agenda_as_manager(app, manager_user): agenda.save() app = login(app, username='manager', password='manager') resp = app.get('/manage/', status=200) - resp = resp.click('Foo bar') + resp = resp.click('Foo bar').follow() assert 'Options' in resp.body assert 'Delete' not in resp.body resp = app.get('/manage/agendas/%s/delete' % agenda.id, status=403) @@ -239,7 +243,7 @@ def test_add_event(app, admin_user): agenda.maximal_booking_delay = 0 agenda.save() app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) assert "This agenda doesn't have any event yet." in resp.body year = now().year + 1 resp = resp.click('New Event') @@ -266,15 +270,15 @@ def test_add_event_as_manager(app, manager_user): agenda.view_role = manager_user.groups.all()[0] agenda.save() app = login(app, username='manager', password='manager') - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) - assert "This agenda doesn't have any event yet." in resp.body - assert '>New Event<' not in resp.body + resp = app.get('/manage/agendas/%s/' % agenda.id, status=302) + app.get('/manage/agendas/%s/settings' % agenda.id, status=403) app.get('/manage/agendas/%s/add-event' % agenda.id, status=403) agenda.edit_role = manager_user.groups.all()[0] agenda.save() - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/' % agenda.id).follow() + assert '

Settings' in resp.body resp = resp.click('New Event') resp.form['start_datetime'] = '2016-02-15 17:00' resp.form['places'] = 10 @@ -293,7 +297,7 @@ def test_edit_event(app, admin_user): places=20, agenda=agenda) event.save() app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click('Feb. 15, 2016, 5 p.m.') assert resp.form['start_datetime'].value == '15/02/2016 17:00' resp.form['start_datetime'] = '2016-02-16 17:00' @@ -316,13 +320,11 @@ def test_edit_event_as_manager(app, manager_user): places=20, agenda=agenda) event.save() app = login(app, username='manager', password='manager') - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) - assert '/events/%s/' % event.id not in resp.body resp = app.get('/manage/events/%s/' % event.id, status=403) agenda.edit_role = manager_user.groups.all()[0] agenda.save() - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click('Feb. 15, 2016, 5 p.m.') assert resp.form['start_datetime'].value == '15/02/2016 17:00' resp.form['start_datetime'] = '2016-02-16 17:00' @@ -342,7 +344,7 @@ def test_booked_places(app, admin_user): Booking(event=event).save() Booking(event=event).save() app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) assert '10 places' in resp.body assert '2 booked places' in resp.body @@ -356,19 +358,19 @@ def test_event_classes(app, admin_user): Booking(event=event).save() app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) assert not 'full' in resp.body assert not 'overbooking' in resp.body for i in range(8): Booking(event=event).save() - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) assert 'full' in resp.body assert not 'overbooking' in resp.body Booking(event=event).save() - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) assert 'full' in resp.body assert 'overbooking' in resp.body @@ -380,11 +382,11 @@ def test_delete_event(app, admin_user): event.save() app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click(href=r'/manage/events/%s/$' % event.id) resp = resp.click('Delete') resp = resp.form.submit() - assert resp.location.endswith('/manage/agendas/%s/' % agenda.id) + assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id) assert Event.objects.count() == 0 def test_delete_busy_event(app, admin_user): @@ -395,21 +397,21 @@ def test_delete_busy_event(app, admin_user): event.save() app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click(href=r'/manage/events/%s/$' % event.id) resp = resp.click('Delete') assert 'Are you sure you want to delete this?' in resp.body booking = Booking(event=event) booking.save() - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click(href=r'/manage/events/%s/$' % event.id) resp = resp.click('Delete') assert 'This cannot be removed' in resp.body booking.cancellation_datetime = now() booking.save() - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click(href=r'/manage/events/%s/$' % event.id) resp = resp.click('Delete') assert 'Are you sure you want to delete this?' in resp.body @@ -429,11 +431,11 @@ def test_delete_event_as_manager(app, manager_user): event.save() app = login(app, username='manager', password='manager') - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click(href=r'/manage/events/%s/$' % event.id) resp = resp.click('Delete') resp = resp.form.submit() - assert resp.location.endswith('/manage/agendas/%s/' % agenda.id) + assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id) assert Event.objects.count() == 0 def test_import_events(app, admin_user): @@ -441,7 +443,7 @@ def test_import_events(app, admin_user): agenda.save() app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click('Import Events') sample_csv_resp = resp.click('Download sample file') assert sample_csv_resp.content_type == 'text/csv' @@ -521,9 +523,10 @@ def test_add_meetings_agenda(app, admin_user): resp.form['kind'] = 'meetings' resp = resp.form.submit() agenda = Agenda.objects.get(label='Foo bar') - assert resp.location.endswith('/manage/agendas/%s/' % agenda.id) + assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id) resp = resp.follow() - assert '

Foo bar' in resp.body + assert 'Foo bar' in resp.body + assert '

Settings' in resp.body assert 'Meeting Types' in resp.body agenda = Agenda.objects.get(label='Foo bar') assert agenda.kind == 'meetings' @@ -532,7 +535,7 @@ def test_meetings_agenda_add_meeting_type(app, admin_user): agenda = Agenda(label=u'Foo bar', kind='meetings') agenda.save() app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/' % agenda.id).follow() assert "This agenda doesn't have any meeting type yet." in resp.body resp = resp.click('New Meeting Type') resp.form['label'] = 'Blah' @@ -557,11 +560,11 @@ def test_meetings_agenda_delete_meeting_type(app, admin_user): meeting_type.save() app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/' % agenda.id).follow() resp = resp.click('Blah') resp = resp.click('Delete') resp = resp.form.submit() - assert resp.location.endswith('/manage/agendas/%s/' % agenda.id) + assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id) assert MeetingType.objects.count() == 0 def test_meetings_agenda_add_time_period(app, admin_user): @@ -569,10 +572,10 @@ def test_meetings_agenda_add_time_period(app, admin_user): agenda.save() desk = Desk.objects.create(agenda=agenda, label='Desk A') app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/' % agenda.id).follow() assert not 'Add a time period' in resp.body MeetingType(agenda=agenda, label='Blah').save() - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/' % agenda.id).follow() resp = resp.click('Add a time period') resp.form['weekday'].select(text='Wednesday') resp.form['start_time'] = '10:00' @@ -617,11 +620,11 @@ def test_meetings_agenda_delete_time_period(app, admin_user): time_period.save() app = login(app) - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200) resp = resp.click('Wednesday') resp = resp.click('Delete') resp = resp.form.submit() - assert resp.location.endswith('/manage/agendas/%s/' % agenda.id) + assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id) assert TimePeriod.objects.count() == 0 @@ -640,24 +643,21 @@ def test_meetings_agenda_add_time_period_as_manager(app, manager_user): desk = Desk.objects.create(agenda=agenda, label='Desk A') app = login(app, username='manager', password='manager') resp = app.get('/manage/agendas/%d/' % agenda.id) - assert 'New Meeting Type' in resp.content - assert 'Add a time period' not in resp.content + assert not 'Settings' in resp.body + resp = app.get('/manage/agendas/%d/settings' % agenda.id, status=403) MeetingType(agenda=agenda, label='Blah').save() - resp = app.get('/manage/agendas/%d/' % agenda.id) - assert 'Add a time period' not in resp.content app.get('/manage/agendas/%d/desk/%d/add-time-period' % (agenda.id, desk.id), status=403) time_period = TimePeriod(desk=desk, weekday=0, start_time=datetime.time(9, 0), end_time=datetime.time(12, 0)) time_period.save() resp = app.get('/manage/agendas/%d/' % agenda.id) - assert '/manage/timeperiods/%s/edit' % time_period.id not in resp.body - assert '/manage/timeperiods/%s/delete' % time_period.id not in resp.body app.get('/manage/timeperiods/%d/edit' % time_period.id, status=403) + app.get('/manage/timeperiods/%d/delete' % time_period.id, status=403) # grant edit right to manager agenda.edit_role = manager_user.groups.all()[0] agenda.save() - resp = app.get('/manage/agendas/%d/' % agenda.id) + resp = app.get('/manage/agendas/%d/' % agenda.id).follow() assert 'Add a time period' in resp.content assert '/manage/timeperiods/%s/edit' % time_period.id in resp.body assert '/manage/timeperiods/%s/delete' % time_period.id in resp.body @@ -678,7 +678,7 @@ def test_meetings_agenda_add_desk(app, admin_user): agenda = Agenda.objects.get(slug='foo-bar') MeetingType(agenda=agenda, label='Blah').save() - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/' % agenda.id).follow() resp = resp.click('New Desk') resp.form['label'] = 'Desk A' resp = resp.form.submit().follow() @@ -708,7 +708,7 @@ def test_meetings_agenda_delete_desk(app, admin_user): agenda = Agenda.objects.get(slug='foo-bar') MeetingType(agenda=agenda, label='Blah').save() - resp = app.get('/manage/agendas/%s/' % agenda.id, status=200) + resp = app.get('/manage/agendas/%s/' % agenda.id).follow() resp = resp.click('New Desk') resp.form['label'] = 'Desk A' resp = resp.form.submit().follow() @@ -716,7 +716,7 @@ def test_meetings_agenda_delete_desk(app, admin_user): resp = resp.click('Desk A', index=0) resp = resp.click('Delete') resp = resp.form.submit() - assert resp.location == 'http://testserver/manage/agendas/%s/' % agenda.id + assert resp.location == 'http://testserver/manage/agendas/%s/settings' % agenda.id assert Desk.objects.count() == 1 @@ -775,7 +775,7 @@ def test_meetings_agenda_add_time_period_exception_when_booking_exists(app, admi start_datetime=datetime.datetime(2017, 5, 22, 10, 30)) Booking.objects.create(event=event) login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('Add a time period exception') resp.form['start_datetime'] = '2017-05-22 08:00' resp.form['end_datetime'] = '2017-05-26 17:30' @@ -794,7 +794,7 @@ def test_meetings_agenda_add_time_period_exception_when_cancelled_booking_exists Booking.objects.create(event=event, cancellation_datetime=datetime.datetime(2017, 5, 20, 10, 30)) login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('Add a time period exception') resp.form['start_datetime'] = '2017-05-22 08:00' resp.form['end_datetime'] = '2017-05-26 17:30' @@ -809,7 +809,7 @@ def test_meetings_agenda_add_invalid_time_period_exception(app, admin_user): TimePeriod.objects.create(weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)) login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('Add a time period exception') resp.form['start_datetime'] = '2017-05-26 17:30' resp.form['end_datetime'] = '2017-05-22 08:00' @@ -824,7 +824,7 @@ def test_meetings_agenda_delete_time_period_exception(app, admin_user): TimePeriod.objects.create(weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)) login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('Add a time period exception') today = datetime.datetime.today().replace(hour=0, minute=0, second=0, microsecond=0) tomorrow = make_aware(today + datetime.timedelta(days=15)) @@ -847,18 +847,18 @@ def test_agenda_import_time_period_exception_from_ics(app, admin_user): desk = Desk.objects.create(agenda=agenda, label='Test Desk') MeetingType(agenda=agenda, label='Foo').save() login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() assert 'Import exceptions from .ics' not in resp.content TimePeriod.objects.create(weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() assert 'Import exceptions from .ics' in resp.content resp = resp.click('upload') assert "You can upload a file or specify an address to a remote calendar." in resp resp = resp.form.submit(status=302) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') resp.form['ics_file'] = Upload('exceptions.ics', 'invalid content', 'text/calendar') resp = resp.form.submit(status=200) @@ -904,7 +904,7 @@ DTEND:20180101 SUMMARY:New Year's Eve END:VEVENT END:VCALENDAR""" - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') resp.form['ics_file'] = Upload('exceptions.ics', ics_with_exceptions, 'text/calendar') resp = resp.form.submit(status=302) @@ -918,13 +918,13 @@ def test_agenda_import_time_period_exception_with_remote_ics(mocked_get, app, ad desk = Desk.objects.create(agenda=agenda, label='New Desk') MeetingType(agenda=agenda, label='Bar').save() login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() assert 'Import exceptions from .ics' not in resp.content TimePeriod.objects.create(weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') assert 'ics_file' in resp.form.fields @@ -946,7 +946,7 @@ END:VCALENDAR""" assert TimePeriodException.objects.filter(desk=desk).count() == 1 exception = TimePeriodException.objects.get(desk=desk) assert exception.external_id == 'random-event-id' - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') resp.form['ics_url'] = '' resp = resp.form.submit(status=302) @@ -959,13 +959,13 @@ def test_agenda_import_time_period_exception_with_remote_ics_no_events(mocked_ge desk = Desk.objects.create(agenda=agenda, label='New Desk') MeetingType(agenda=agenda, label='Bar').save() login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() assert 'Import exceptions from .ics' not in resp.content TimePeriod.objects.create(weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') resp.form['ics_url'] = 'http://example.com/foo.ics' mocked_response = mock.Mock() @@ -988,7 +988,7 @@ END:VCALENDAR""" VERSION:2.0 PRODID:-//foo.bar//EN END:VCALENDAR""" - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') resp = resp.form.submit(status=302) assert not TimePeriodException.objects.filter(desk=desk, @@ -1001,13 +1001,13 @@ def test_agenda_update_time_period_exception_from_remote_ics(mocked_get, app, ad desk = Desk.objects.create(agenda=agenda, label='New Desk') MeetingType(agenda=agenda, label='Bar').save() login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() assert 'Import exceptions from .ics' not in resp.content TimePeriod.objects.create(weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') resp.form['ics_url'] = 'http://example.com/foo.ics' mocked_response = mock.Mock() @@ -1030,7 +1030,7 @@ END:VCALENDAR""" mocked_get.return_value = mocked_response resp = resp.form.submit(status=302) assert TimePeriodException.objects.filter(desk=desk).count() == 2 - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') resp.form['ics_url'] = 'http://example.com/foo.ics' mocked_response.text = """BEGIN:VCALENDAR @@ -1053,13 +1053,13 @@ def test_agenda_import_time_period_exception_from_remote_ics_with_connection_err desk = Desk.objects.create(agenda=agenda, label='New Desk') MeetingType(agenda=agenda, label='Bar').save() login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() assert 'Import exceptions from .ics' not in resp.content TimePeriod.objects.create(weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') assert 'ics_file' in resp.form.fields @@ -1079,13 +1079,13 @@ def test_agenda_import_time_period_exception_from_forbidden_remote_ics(mocked_ge desk = Desk.objects.create(agenda=agenda, label='New Desk') MeetingType(agenda=agenda, label='Bar').save() login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() assert 'Import exceptions from .ics' not in resp.content TimePeriod.objects.create(weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') resp.form['ics_url'] = 'http://example.com/foo.ics' mocked_response = mock.Mock() @@ -1103,12 +1103,12 @@ def test_agenda_import_time_period_exception_from_remote_ics_with_ssl_error(mock desk = Desk.objects.create(agenda=agenda, label='New Desk') MeetingType(agenda=agenda, label='Bar').save() login(app) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() assert 'Import exceptions from .ics' not in resp.content TimePeriod.objects.create(weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)) - resp = app.get('/manage/agendas/%d/' % agenda.pk) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('upload') resp.form['ics_url'] = 'https://example.com/foo.ics' mocked_response = mock.Mock() -- 2.15.0