From 964f99697635255ff9c6840b05ed89671baeafd4 Mon Sep 17 00:00:00 2001 From: Tom Teichler <tom.teichler@teckids.org> Date: Wed, 4 May 2022 23:00:49 +0200 Subject: [PATCH] Add event detail page --- aleksis/apps/paweljong/menus.py | 11 --- .../apps/paweljong/static/css/paweljong.css | 9 ++ aleksis/apps/paweljong/tables.py | 2 +- .../templates/paweljong/event/detail.html | 89 +++++++++++++++++++ .../paweljong/event_registration/list.html | 25 ------ aleksis/apps/paweljong/urls.py | 2 +- aleksis/apps/paweljong/views.py | 63 ++++++++----- 7 files changed, 139 insertions(+), 62 deletions(-) create mode 100644 aleksis/apps/paweljong/templates/paweljong/event/detail.html delete mode 100644 aleksis/apps/paweljong/templates/paweljong/event_registration/list.html diff --git a/aleksis/apps/paweljong/menus.py b/aleksis/apps/paweljong/menus.py index bc3e904..2d9cc4f 100644 --- a/aleksis/apps/paweljong/menus.py +++ b/aleksis/apps/paweljong/menus.py @@ -88,17 +88,6 @@ MENUS = { ) ], }, - { - "name": _("Registrations"), - "url": "registrations", - "icon": "how_to_reg", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "paweljong.view_registrations_rule", - ) - ], - }, ], }, ], diff --git a/aleksis/apps/paweljong/static/css/paweljong.css b/aleksis/apps/paweljong/static/css/paweljong.css index 99c7a34..bbbd62b 100644 --- a/aleksis/apps/paweljong/static/css/paweljong.css +++ b/aleksis/apps/paweljong/static/css/paweljong.css @@ -50,3 +50,12 @@ time.icon span { padding-top: 0.8em; color: #0606FA; } + +#owners-chip { + width: 16px; + height: 16px; +} + +#event-detail-table { + table-layout: fixed; +} diff --git a/aleksis/apps/paweljong/tables.py b/aleksis/apps/paweljong/tables.py index 63d4f7c..0005641 100644 --- a/aleksis/apps/paweljong/tables.py +++ b/aleksis/apps/paweljong/tables.py @@ -21,7 +21,7 @@ class ManageEventsTable(tables.Table): text=_("Edit"), ) view = tables.LinkColumn( - "event_by_name", + "event_detail_by_name", args=[A("slug")], verbose_name=_("View"), text=_("View"), diff --git a/aleksis/apps/paweljong/templates/paweljong/event/detail.html b/aleksis/apps/paweljong/templates/paweljong/event/detail.html new file mode 100644 index 0000000..7561621 --- /dev/null +++ b/aleksis/apps/paweljong/templates/paweljong/event/detail.html @@ -0,0 +1,89 @@ +{# -*- 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 %} diff --git a/aleksis/apps/paweljong/templates/paweljong/event_registration/list.html b/aleksis/apps/paweljong/templates/paweljong/event_registration/list.html deleted file mode 100644 index cb9184d..0000000 --- a/aleksis/apps/paweljong/templates/paweljong/event_registration/list.html +++ /dev/null @@ -1,25 +0,0 @@ -{% 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 %} diff --git a/aleksis/apps/paweljong/urls.py b/aleksis/apps/paweljong/urls.py index 5568600..647f564 100644 --- a/aleksis/apps/paweljong/urls.py +++ b/aleksis/apps/paweljong/urls.py @@ -43,6 +43,7 @@ urlpatterns = [ name="register_event_by_slug", ), 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( "event/<slug:slug>/start", views.RegisterEventStart.as_view(), @@ -71,7 +72,6 @@ urlpatterns = [ path("vouchers/<int:pk>/print", views.print_voucher, name="print_voucher_by_pk"), path("vouchers/", views.vouchers, name="vouchers"), path("event/lists/generate", views.generate_lists, name="generate_lists"), - path("event/registrations/list", views.registrations, name="registrations"), path( "event/registrations/<int:pk>", views.EventRegistrationDetailView.as_view(), diff --git a/aleksis/apps/paweljong/views.py b/aleksis/apps/paweljong/views.py index a16c8f8..74abc60 100644 --- a/aleksis/apps/paweljong/views.py +++ b/aleksis/apps/paweljong/views.py @@ -25,11 +25,11 @@ from templated_email import send_templated_mail from aleksis.apps.postbuero.models import MailAddress from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView from aleksis.core.models import Activity, Person +from aleksis.core.tables import AdditionalFieldsTable, GroupsTable from aleksis.core.util import messages 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 ( EditEventForm, EditEventRegistrationForm, @@ -135,28 +135,6 @@ def generate_lists(request: HttpRequest) -> HttpResponse: 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") class EventRegistrationCreateView(PermissionRequiredMixin, AdvancedCreateView): """Create view for event registrations.""" @@ -899,3 +877,40 @@ class RegistrationStateEditView(PermissionRequiredMixin, AdvancedEditView): template_name = "paweljong/registration_state/edit.html" success_url = reverse_lazy("registration_states") 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 -- GitLab