manager: add detail view for events (#20279)

This commit is contained in:
Frédéric Péters 2019-12-22 16:22:29 +01:00
parent 7ada884db3
commit 07e8f284ed
5 changed files with 115 additions and 1 deletions

View File

@ -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 }}
<a href="{% url 'chrono-manager-agenda-month-view' pk=agenda.id year=object.start_datetime.year month=object.start_datetime.month %}">{{agenda.label}}</a>
<a href="{% url 'chrono-manager-event-view' pk=agenda.id event_pk=object.id %}">{{object}}</a>
{% endblock %}
{% block appbar %}
{% if object.label %}<h2>{{ object.label }} — {{object.start_datetime|date:"DATETIME_FORMAT"}}</h2>
{% else %}<h2>{{ object.start_datetime|date:"DATETIME_FORMAT"}}</h2>
{% endif %}
{% endblock %}
{% block content %}
{% if object.description %}
<div class="section">
<div><p>{{ object.description }}</p></div>
</div>
{% endif %}
<div class="section">
<h3>{% trans "Bookings" %} ({{booked|length}}/{{object.places}})</h3>
<div>
{% if event.booked_places > event.places %}
<div class="errornotice"><p>{% trans "This event is overbooked." %}</p></div>
{% endif %}
<ul class="objects-list single-links">
{% for booking in booked %}
<li><a {% if booking.backoffice_url %}href="{{ booking.backoffice_url }}"{% endif %}>{% if booking.user_name %}{{ booking.user_name }}{% else %}{% trans "Unknown" %}{% endif %},
{{ booking.creation_datetime|date:"DATETIME_FORMAT" }}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% if object.waiting_list_places %}
<div class="section">
<h3>{% trans "Waiting List" %} ({{waiting|length}}/{{object.waiting_list_places}})</h3>
<div>
<ul class="objects-list single-links">
{% for booking in waiting %}
<li><a {% if booking.backoffice_url %}href="{{ booking.backoffice_url }}"{% endif %}>{% if booking.user_name %}{{ booking.user_name }}{% else %}{% trans "Unknown" %}{% endif %},
{{ booking.creation_datetime|date:"DATETIME_FORMAT" }}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
{% endblock %}

View File

@ -16,7 +16,7 @@
{% elif event.waiting_list_places %}
data-total="{{event.waiting_list_places}}" data-booked="{{event.waiting_list}}"
{% endif %}
><a>
><a href="{% url 'chrono-manager-event-view' pk=agenda.id event_pk=event.id %}">
{% if event.label %}{{event.label}} / {% endif %}
{{ event.start_datetime }}
{% if event.full %}/ <span class="full">{% trans "full" %}</span>{% endif %}

View File

@ -43,6 +43,11 @@ urlpatterns = [
views.agenda_import_events,
name='chrono-manager-agenda-import-events',
),
url(
r'^agendas/(?P<pk>\d+)/events/(?P<event_pk>\d+)/$',
views.event_view,
name='chrono-manager-event-view',
),
url(
r'^agendas/(?P<pk>\d+)/events/(?P<event_pk>\d+)/edit$',
views.event_edit,

View File

@ -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

View File

@ -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.