manager: add detail view for events (#20279)
This commit is contained in:
parent
7ada884db3
commit
07e8f284ed
|
@ -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 %}
|
|
@ -16,7 +16,7 @@
|
||||||
{% elif event.waiting_list_places %}
|
{% elif event.waiting_list_places %}
|
||||||
data-total="{{event.waiting_list_places}}" data-booked="{{event.waiting_list}}"
|
data-total="{{event.waiting_list_places}}" data-booked="{{event.waiting_list}}"
|
||||||
{% endif %}
|
{% endif %}
|
||||||
><a>
|
><a href="{% url 'chrono-manager-event-view' pk=agenda.id event_pk=event.id %}">
|
||||||
{% if event.label %}{{event.label}} / {% endif %}
|
{% if event.label %}{{event.label}} / {% endif %}
|
||||||
{{ event.start_datetime }}
|
{{ event.start_datetime }}
|
||||||
{% if event.full %}/ <span class="full">{% trans "full" %}</span>{% endif %}
|
{% if event.full %}/ <span class="full">{% trans "full" %}</span>{% endif %}
|
||||||
|
|
|
@ -43,6 +43,11 @@ urlpatterns = [
|
||||||
views.agenda_import_events,
|
views.agenda_import_events,
|
||||||
name='chrono-manager-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(
|
url(
|
||||||
r'^agendas/(?P<pk>\d+)/events/(?P<event_pk>\d+)/edit$',
|
r'^agendas/(?P<pk>\d+)/events/(?P<event_pk>\d+)/edit$',
|
||||||
views.event_edit,
|
views.event_edit,
|
||||||
|
|
|
@ -693,6 +693,26 @@ class AgendaImportEventsView(ManagedAgendaMixin, FormView):
|
||||||
agenda_import_events = AgendaImportEventsView.as_view()
|
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):
|
class EventEditView(ManagedAgendaMixin, UpdateView):
|
||||||
template_name = 'chrono/manager_event_form.html'
|
template_name = 'chrono/manager_event_form.html'
|
||||||
model = Event
|
model = Event
|
||||||
|
|
|
@ -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
|
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):
|
def test_import_agenda_as_manager(app, manager_user):
|
||||||
# open /manage/ access to manager_user, and check agenda import is not
|
# open /manage/ access to manager_user, and check agenda import is not
|
||||||
# allowed.
|
# allowed.
|
||||||
|
|
Loading…
Reference in New Issue