Skip to content
Snippets Groups Projects
Commit 964f9969 authored by Tom Teichler's avatar Tom Teichler :beers:
Browse files

Add event detail page

parent fedcb0f9
No related branches found
No related tags found
1 merge request!23Resolve "Event detail page"
Pipeline #69118 passed with warnings
...@@ -88,17 +88,6 @@ MENUS = { ...@@ -88,17 +88,6 @@ MENUS = {
) )
], ],
}, },
{
"name": _("Registrations"),
"url": "registrations",
"icon": "how_to_reg",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
"paweljong.view_registrations_rule",
)
],
},
], ],
}, },
], ],
......
...@@ -50,3 +50,12 @@ time.icon span { ...@@ -50,3 +50,12 @@ time.icon span {
padding-top: 0.8em; padding-top: 0.8em;
color: #0606FA; color: #0606FA;
} }
#owners-chip {
width: 16px;
height: 16px;
}
#event-detail-table {
table-layout: fixed;
}
...@@ -21,7 +21,7 @@ class ManageEventsTable(tables.Table): ...@@ -21,7 +21,7 @@ class ManageEventsTable(tables.Table):
text=_("Edit"), text=_("Edit"),
) )
view = tables.LinkColumn( view = tables.LinkColumn(
"event_by_name", "event_detail_by_name",
args=[A("slug")], args=[A("slug")],
verbose_name=_("View"), verbose_name=_("View"),
text=_("View"), text=_("View"),
......
{# -*- engine:django -*- #}
{% extends "core/base.html" %}
{% load i18n static rules material_form coerce html_helpers %}
{% load render_table from django_tables2 %}
{% block browser_title %}{{ event }}{% endblock %}
{% block extra_head %}
<link rel="stylesheet" href="{% static 'css/paweljong.css' %}"/>
{% endblock %}
{% block content %}
<h4>{{ event }}</h4>
{% has_perm 'paweljong.manage_event' user event as can_manage_event %}
{% if can_manage_event %}
<p>
{% if can_manage_event %}
<a href="{% url 'edit_event_by_slug' event.slug %}" class="btn waves-effect waves-light">
<i class="material-icons left iconify" data-icon="mdi:edit"></i>
{% trans "Edit" %}
</a>
{% endif %}
</p>
{% endif %}
<div class="card">
<div class="card-content">
<p>{{ event.description }}</p>
<table id="event-detail-table">
<tr>
<td><i class="material-icons small">event</i></td>
<td>{{ event.date_event }}</td>
<td><i class="material-icons small">location_on</i></td>
<td>{{ event.place }}</td>
</tr>
<tr>
<td><i class="material-icons small">edit_calendar</i></td>
<td colspan="2">{% trans "Registration open until" %}:</td>
<td>{{ event.date_registration }}</td>
</tr>
<tr>
<td><i class="material-icons small">money</i></td>
<td colspan="2">{% trans "Participation fee (all inclusive)" %}</td>
<td>{{ event.cost }}</td>
</tr>
<tr>
<td><i class="material-icons small">group</i></td>
<td colspan="2">{{ event.linked_group.members.count }}</td>
<td>{% trans "of" %} {{ event.max_participants }}</td>
</tr>
<tr>
<td><i class="material-icons iconify" data-icon="vscode-icons:file-type-light-codeowners"></i></td>
<td colspan="2">{% trans "Owners" %}</td>
<td>
{% for owner in event.owners_persons.all %}
<div class="chip">
<img src="{{ owner.avatar_url }}" alt="{{ owner }}" id="owners-chip">
<a href="{{ owner.get_absolute_url }}">{{ owner }}</a>
</div>
{% endfor %}
</td>
</tr>
<tr>
<td>{% trans "Description" %}</td>
<td colspan="3">
{{ event.information|add_class_to_el:"ul, browser-default"|safe }}
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<h5>{% blocktrans %}Additional fields{% endblocktrans %}</h5>
{% render_table additional_fields_table %}
<h5>{% blocktrans %}Child groups{% endblocktrans%}</h5>
{% render_table child_groups_table %}
<h5>{% blocktrans %}Registrations{% endblocktrans %}</h5>
{% render_table registrations_table %}
{% endblock %}
{% extends "core/base.html" %}
{% load material_form i18n %}
{% load render_table from django_tables2 %}
{% block page_title %}{% blocktrans %}Registrations{% endblocktrans %}{% endblock %}
{% block browser_title %}{% blocktrans %}Registrations{% endblocktrans %}{% endblock %}
{% block content %}
<h5>{% trans "Filter registrations" %}</h5>
<form method="get">
{% form form=registrations_filter.form %}{% endform %}
{% trans "Search" as caption %}
{% include "core/partials/save_button.html" with caption=caption icon="search" %}
<button type="reset" class="btn red waves-effect waves-light">
<i class="material-icons left">clear</i>
{% trans "Clear" %}
</button>
</form>
<h5>{% trans "Selected registrations" %}</h5>
{% render_table registrations_table %}
{% endblock %}
...@@ -43,6 +43,7 @@ urlpatterns = [ ...@@ -43,6 +43,7 @@ urlpatterns = [
name="register_event_by_slug", name="register_event_by_slug",
), ),
path("event/<slug:slug>", views.EventFullView.as_view(), name="event_by_name"), path("event/<slug:slug>", views.EventFullView.as_view(), name="event_by_name"),
path("event/<slug:slug>/detail", views.EventDetailView.as_view(), name="event_detail_by_name"),
path( path(
"event/<slug:slug>/start", "event/<slug:slug>/start",
views.RegisterEventStart.as_view(), views.RegisterEventStart.as_view(),
...@@ -71,7 +72,6 @@ urlpatterns = [ ...@@ -71,7 +72,6 @@ urlpatterns = [
path("vouchers/<int:pk>/print", views.print_voucher, name="print_voucher_by_pk"), path("vouchers/<int:pk>/print", views.print_voucher, name="print_voucher_by_pk"),
path("vouchers/", views.vouchers, name="vouchers"), path("vouchers/", views.vouchers, name="vouchers"),
path("event/lists/generate", views.generate_lists, name="generate_lists"), path("event/lists/generate", views.generate_lists, name="generate_lists"),
path("event/registrations/list", views.registrations, name="registrations"),
path( path(
"event/registrations/<int:pk>", "event/registrations/<int:pk>",
views.EventRegistrationDetailView.as_view(), views.EventRegistrationDetailView.as_view(),
......
...@@ -25,11 +25,11 @@ from templated_email import send_templated_mail ...@@ -25,11 +25,11 @@ from templated_email import send_templated_mail
from aleksis.apps.postbuero.models import MailAddress from aleksis.apps.postbuero.models import MailAddress
from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView
from aleksis.core.models import Activity, Person from aleksis.core.models import Activity, Person
from aleksis.core.tables import AdditionalFieldsTable, GroupsTable
from aleksis.core.util import messages from aleksis.core.util import messages
from aleksis.core.util.core_helpers import get_site_preferences, objectgetter_optional from aleksis.core.util.core_helpers import get_site_preferences, objectgetter_optional
from aleksis.core.util.predicates import queryset_rules_filter
from .filters import EventFilter, EventRegistrationFilter, VoucherFilter from .filters import EventFilter, VoucherFilter
from .forms import ( from .forms import (
EditEventForm, EditEventForm,
EditEventRegistrationForm, EditEventRegistrationForm,
...@@ -135,28 +135,6 @@ def generate_lists(request: HttpRequest) -> HttpResponse: ...@@ -135,28 +135,6 @@ def generate_lists(request: HttpRequest) -> HttpResponse:
return render(request, "paweljong/print/manage.html", context) return render(request, "paweljong/print/manage.html", context)
@permission_required("paweljong.view_registrations_rule")
def registrations(request: HttpRequest) -> HttpResponse:
"""List view listing all registrations."""
context = {}
# Get all registrations
registrations = queryset_rules_filter(
request.user, EventRegistration.objects.all(), "paweljong.view_registration_rule"
)
# Get filter
registrations_filter = EventRegistrationFilter(request.GET, queryset=registrations)
context["registrations_filter"] = registrations_filter
# Build table
registrations_table = EventRegistrationsTable(registrations_filter.qs)
RequestConfig(request).configure(registrations_table)
context["registrations_table"] = registrations_table
return render(request, "paweljong/event_registration/list.html", context)
@method_decorator(never_cache, name="dispatch") @method_decorator(never_cache, name="dispatch")
class EventRegistrationCreateView(PermissionRequiredMixin, AdvancedCreateView): class EventRegistrationCreateView(PermissionRequiredMixin, AdvancedCreateView):
"""Create view for event registrations.""" """Create view for event registrations."""
...@@ -899,3 +877,40 @@ class RegistrationStateEditView(PermissionRequiredMixin, AdvancedEditView): ...@@ -899,3 +877,40 @@ class RegistrationStateEditView(PermissionRequiredMixin, AdvancedEditView):
template_name = "paweljong/registration_state/edit.html" template_name = "paweljong/registration_state/edit.html"
success_url = reverse_lazy("registration_states") success_url = reverse_lazy("registration_states")
success_message = _("The term has been saved.") success_message = _("The term has been saved.")
class EventDetailView(PermissionRequiredMixin, DetailView):
"""Detail view for an event instance."""
context_object_name = "event"
permission_required = "paweljong.view_event_rule"
template_name = "paweljong/event/detail.html"
model = Event
slug_field = "slug"
def get_queryset(self):
return Event.objects.all()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Registrations table
registrations = EventRegistration.objects.filter(event=self.object)
registrations_table = EventRegistrationsTable(registrations)
RequestConfig(self.request).configure(registrations_table)
context["registrations_table"] = registrations_table
# Child groups table
child_groups = self.object.linked_group.child_groups.all()
child_groups_table = GroupsTable(child_groups)
RequestConfig(self.request).configure(child_groups_table)
context["child_groups_table"] = child_groups_table
# Additional fields table
additional_fields = self.object.linked_group.additional_fields.all()
additional_fields_table = AdditionalFieldsTable(additional_fields)
RequestConfig(self.request).configure(additional_fields_table)
context["additional_fields_table"] = additional_fields_table
return context
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment