diff --git a/AKModel/admin.py b/AKModel/admin.py index 16fe017f6a083ce54d658b30842d9ef0558fb497..01a450cbf4b3a4c92a35e09b3085de7f596524d9 100644 --- a/AKModel/admin.py +++ b/AKModel/admin.py @@ -57,7 +57,7 @@ class EventAdmin(admin.ModelAdmin): path('<slug:slug>/status/', self.admin_site.admin_view(EventStatusView.as_view()), name="event_status"), path('<slug:event_slug>/requirements/', self.admin_site.admin_view(AKRequirementOverview.as_view()), name="event_requirement_overview"), path('<slug:event_slug>/ak-csv-export/', self.admin_site.admin_view(AKCSVExportView.as_view()), name="ak_csv_export"), - path('<slug:event_slug>/ak-wiki-export/', self.admin_site.admin_view(AKWikiExportView.as_view()), name="ak_wiki_export"), + path('<slug:slug>/ak-wiki-export/', self.admin_site.admin_view(AKWikiExportView.as_view()), name="ak_wiki_export"), path('<slug:event_slug>/ak-slide-export/', export_slides, name="ak_slide_export"), path('<slug:slug>/delete-orga-messages/', self.admin_site.admin_view(AKMessageDeleteView.as_view()), name="ak_delete_orga_messages"), diff --git a/AKModel/models.py b/AKModel/models.py index dcb1d45775e341c91553578885f32801042f3081..ee27d4f95cfce116ad9f26729cec599099f9bb3e 100644 --- a/AKModel/models.py +++ b/AKModel/models.py @@ -64,6 +64,41 @@ class Event(models.Model): event = Event.objects.order_by('start').filter(start__gt=datetime.now()).first() return event + def get_categories_with_aks(self, wishes_seperately=False, filter=lambda ak: True): + """ + Get AKCategories as well as a list of AKs belonging to the category for this event + + :param wishes_seperately: Return wishes as individual list. + :type wishes_seperately: bool + :param filter: Optional filter predicate, only include AK in list if filter returns True + :type filter: (AK)->bool + :return: list of category-AK-list-tuples, optionally the additional list of AK wishes + :rtype: list[(AKCategory, list[AK])] [, list[AK]] + """ + categories = self.akcategory_set.all() + categories_with_aks = [] + ak_wishes = [] + + if wishes_seperately: + for category in categories: + ak_list = [] + for ak in category.ak_set.all(): + if ak.wish: + ak_wishes.append(ak) + else: + if filter(ak): + ak_list.append(ak) + categories_with_aks.append((category, ak_list)) + return categories_with_aks, ak_wishes + else: + for category in categories: + ak_list = [] + for ak in category.ak_set.all(): + if filter(ak): + ak_list.append(ak) + categories_with_aks.append((category, ak_list)) + return categories_with_aks + class AKOwner(models.Model): """ An AKOwner describes the person organizing/holding an AK. diff --git a/AKModel/templates/admin/AKModel/status.html b/AKModel/templates/admin/AKModel/status.html index dd269c83db03f118bb5f2c72447e437d8c856042..0f5369fac2d89e1d444a98f0855a2b1234148e2e 100644 --- a/AKModel/templates/admin/AKModel/status.html +++ b/AKModel/templates/admin/AKModel/status.html @@ -79,7 +79,7 @@ <a class="btn btn-success" href="{% url 'admin:ak_csv_export' event_slug=event.slug %}">{% trans "Export AKs as CSV" %}</a> <a class="btn btn-success" - href="{% url 'admin:ak_wiki_export' event_slug=event.slug %}">{% trans "Export AKs for Wiki" %}</a> + href="{% url 'admin:ak_wiki_export' slug=event.slug %}">{% trans "Export AKs for Wiki" %}</a> <a class="btn btn-success" href="{% url 'admin:ak_slide_export' event_slug=event.slug %}">{% trans "Export AK Slides" %}</a> {% endif %} diff --git a/AKModel/templates/admin/AKModel/wiki_export.html b/AKModel/templates/admin/AKModel/wiki_export.html index 03512c675f3373e65eec52b634f245a8cebdb572..f3aa98000d88e66c5f7c03a181a7507d200af864 100644 --- a/AKModel/templates/admin/AKModel/wiki_export.html +++ b/AKModel/templates/admin/AKModel/wiki_export.html @@ -4,11 +4,9 @@ {% block content %} -{% regroup AKs by category as ak_list %} - -{% for category_aks in ak_list %} -<h3>{{ category_aks.grouper }}</h3> -<textarea style="width: 100%;height:30vh;">{% for ak in category_aks.list %} +{% for category_name, ak_list in categories_with_aks %} +<h3>{{ category_name }}</h3> +<textarea style="width: 100%;height:30vh;" class="mb-3">{% for ak in ak_list %} {% verbatim %}{{{% endverbatim %} {{ ak.event.wiki_export_template_name }} | name={{ ak.name }} diff --git a/AKModel/views.py b/AKModel/views.py index c1926d7de07f97678e3051c6b80d82d01f5c05e5..63b0e7d2fab1d7a6c9076b6355580f7660467f14 100644 --- a/AKModel/views.py +++ b/AKModel/views.py @@ -10,7 +10,6 @@ from django.views.generic import TemplateView, DetailView, ListView, DeleteView, from rest_framework import viewsets, permissions, mixins from django_tex.shortcuts import render_to_pdf - from AKModel.forms import NewEventWizardStartForm, NewEventWizardSettingsForm, NewEventWizardPrepareImportForm, \ NewEventWizardImportForm, NewEventWizardActivateForm from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage, AKRequirement @@ -98,7 +97,8 @@ class AKCategoryViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListMo return AKCategory.objects.filter(event=self.event) -class AKTrackViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): +class AKTrackViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin, + mixins.DestroyModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,) serializer_class = AKTrackSerializer @@ -106,7 +106,8 @@ class AKTrackViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.CreateMod return AKTrack.objects.filter(event=self.event) -class AKViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): +class AKViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.ListModelMixin, + viewsets.GenericViewSet): permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,) serializer_class = AKSerializer @@ -175,14 +176,21 @@ class AKCSVExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): return context -class AKWikiExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): +class AKWikiExportView(AdminViewMixin, DetailView): template_name = "admin/AKModel/wiki_export.html" - model = AK - context_object_name = "AKs" + model = Event + context_object_name = "event" title = _("AK Wiki Export") - def get_queryset(self): - return super().get_queryset().order_by("category") + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + categories_with_aks, ak_wishes = context["event"].get_categories_with_aks(wishes_seperately=True) + + context["categories_with_aks"] = [(category.name, ak_list) for category, ak_list in categories_with_aks] + context["categories_with_aks"].append((_("Wishes"), ak_wishes)) + + return context class AKMessageDeleteView(AdminViewMixin, DeleteView): @@ -220,7 +228,7 @@ class WizardViewMixin: return context -class NewEventWizardStartView(AdminViewMixin, WizardViewMixin, CreateView): +class NewEventWizardStartView(AdminViewMixin, WizardViewMixin, CreateView): model = Event form_class = NewEventWizardStartForm template_name = "admin/AKModel/event_wizard/start.html" @@ -249,7 +257,8 @@ class NewEventWizardPrepareImportView(WizardViewMixin, EventSlugMixin, FormView) def form_valid(self, form): # Selected a valid event to import from? Use this to go to next step of wizard - return redirect("admin:new_event_wizard_import", event_slug=self.event.slug, import_slug=form.cleaned_data["import_event"].slug) + return redirect("admin:new_event_wizard_import", event_slug=self.event.slug, + import_slug=form.cleaned_data["import_event"].slug) class NewEventWizardImportView(EventSlugMixin, WizardViewMixin, FormView): @@ -272,7 +281,9 @@ class NewEventWizardImportView(EventSlugMixin, WizardViewMixin, FormView): import_obj.save() messages.add_message(self.request, messages.SUCCESS, _("Copied '%(obj)s'" % {'obj': import_obj})) except BaseException as e: - messages.add_message(self.request, messages.ERROR, _("Could not copy '%(obj)s' (%(error)s)" % {'obj': import_obj, "error": str(e)})) + messages.add_message(self.request, messages.ERROR, + _("Could not copy '%(obj)s' (%(error)s)" % {'obj': import_obj, + "error": str(e)})) return redirect("admin:new_event_wizard_activate", slug=self.event.slug) @@ -314,26 +325,17 @@ def export_slides(request, event_slug): next_aks_list = zip_longest(*[ak_list[i + 1:] for i in range(NEXT_AK_LIST_LENGTH)], fillvalue=None) return [(ak, next_aks) for ak, next_aks in zip_longest(ak_list, next_aks_list, fillvalue=list())] - categories = event.akcategory_set.all() - categories_with_aks = [] - ak_wishes = [] - for category in categories: - ak_list = [] - for ak in category.ak_set.all(): # order_by("owners").distinct(): - if ak.wish: - ak_wishes.append(ak) - else: - if not RESULT_PRESENTATION_MODE or ak.present: - ak_list.append(ak) - categories_with_aks.append((category, build_ak_list_with_next_aks(ak_list))) + categories_with_aks, ak_wishes = event.get_categories_with_aks(wishes_seperately=True, filter=lambda + ak: not RESULT_PRESENTATION_MODE or ak.present) context = { 'title': event.name, - 'categories_with_aks': categories_with_aks, + 'categories_with_aks': [(category, build_ak_list_with_next_aks(ak_list)) for category, ak_list in + categories_with_aks], 'subtitle': _("AKs"), "wishes": build_ak_list_with_next_aks(ak_wishes), "translations": translations, "result_presentation_mode": RESULT_PRESENTATION_MODE, - } + } return render_to_pdf(request, template_name, context, filename='slides.pdf')