diff --git a/chrono/manager/templates/chrono/manager_event_detail.html b/chrono/manager/templates/chrono/manager_event_detail.html new file mode 100644 index 00000000..88048e74 --- /dev/null +++ b/chrono/manager/templates/chrono/manager_event_detail.html @@ -0,0 +1,59 @@ +{% extends "chrono/manager_home.html" %} +{% load i18n %} + +{% block page-title-extra-label %} +- {% firstof agenda.label object.label %} +{% endblock %} + +{% block breadcrumb %} +{{ block.super }} +{{agenda.label}} +{{object}} +{% endblock %} + +{% block appbar %} +{% if object.label %}

{{ object.label }} — {{object.start_datetime|date:"DATETIME_FORMAT"}}

+{% else %}

{{ object.start_datetime|date:"DATETIME_FORMAT"}}

+{% endif %} +{% endblock %} + +{% block content %} + +{% if object.description %} +
+

{{ object.description }}

+
+{% endif %} + +
+

{% trans "Bookings" %} ({{booked|length}}/{{object.places}})

+
+ + {% if event.booked_places > event.places %} +

{% trans "This event is overbooked." %}

+ {% endif %} + + +
+
+ +{% if object.waiting_list_places %} +
+

{% trans "Waiting List" %} ({{waiting|length}}/{{object.waiting_list_places}})

+
+ +
+
+{% endif %} + +{% endblock %} diff --git a/chrono/manager/templates/chrono/manager_events_agenda_month_view.html b/chrono/manager/templates/chrono/manager_events_agenda_month_view.html index 08a2a533..a64e7ad4 100644 --- a/chrono/manager/templates/chrono/manager_events_agenda_month_view.html +++ b/chrono/manager/templates/chrono/manager_events_agenda_month_view.html @@ -16,7 +16,7 @@ {% elif event.waiting_list_places %} data-total="{{event.waiting_list_places}}" data-booked="{{event.waiting_list}}" {% endif %} - > + > {% if event.label %}{{event.label}} / {% endif %} {{ event.start_datetime }} {% if event.full %}/ {% trans "full" %}{% endif %} diff --git a/chrono/manager/urls.py b/chrono/manager/urls.py index 8cee6b8c..1d4f926c 100644 --- a/chrono/manager/urls.py +++ b/chrono/manager/urls.py @@ -43,6 +43,11 @@ urlpatterns = [ views.agenda_import_events, name='chrono-manager-agenda-import-events', ), + url( + r'^agendas/(?P\d+)/events/(?P\d+)/$', + views.event_view, + name='chrono-manager-event-view', + ), url( r'^agendas/(?P\d+)/events/(?P\d+)/edit$', views.event_edit, diff --git a/chrono/manager/views.py b/chrono/manager/views.py index fdf67f08..30503fa9 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -693,6 +693,26 @@ class AgendaImportEventsView(ManagedAgendaMixin, FormView): agenda_import_events = AgendaImportEventsView.as_view() +class EventDetailView(ViewableAgendaMixin, DetailView): + template_name = 'chrono/manager_event_detail.html' + model = Event + pk_url_kwarg = 'event_pk' + + def get_context_data(self, **kwargs): + context = super(EventDetailView, self).get_context_data(**kwargs) + event = self.get_object() + context['booked'] = event.booking_set.filter( + cancellation_datetime__isnull=True, in_waiting_list=False + ) + context['waiting'] = event.booking_set.filter( + cancellation_datetime__isnull=True, in_waiting_list=True + ) + return context + + +event_view = EventDetailView.as_view() + + class EventEditView(ManagedAgendaMixin, UpdateView): template_name = 'chrono/manager_event_form.html' model = Event diff --git a/tests/test_manager.py b/tests/test_manager.py index 9f65feec..da1083bc 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -1903,6 +1903,36 @@ def test_agenda_month_view_dst_change(app, admin_user, manager_user, api_user): assert resp.text.count('height:33.0%;top:100.0%;') == 2 +def test_agenda_view_event(app, manager_user): + agenda = Agenda(label=u'Foo bar') + agenda.view_role = manager_user.groups.all()[0] + agenda.save() + event = Event( + label='xyz', + start_datetime=make_aware(datetime.datetime(2019, 12, 22, 17, 0)), + places=10, + agenda=agenda, + ) + event.save() + for i in range(8): + Booking(event=event).save() + app = login(app, username='manager', password='manager') + resp = app.get('/manage/agendas/%s/2019/12/' % agenda.id, status=200) + resp = resp.click('xyz') + assert 'Bookings (8/10)' in resp.text + assert 'Waiting' not in resp.text + assert 'overbooked' not in resp.text + event.waiting_list_places = 5 + event.save() + resp = app.get(resp.request.url) + assert 'Waiting List (0/5)' in resp.text + + event.places = 5 + event.save() + resp = app.get(resp.request.url) + assert 'overbooked' in resp.text + + def test_import_agenda_as_manager(app, manager_user): # open /manage/ access to manager_user, and check agenda import is not # allowed.