Skip to content
Snippets Groups Projects
Commit dac1cf38 authored by Benjamin Hättasch's avatar Benjamin Hättasch
Browse files

Introduce getting AKs by category as event model function and use for wiki and slide export

This implements #126
parent fca383af
No related branches found
No related tags found
No related merge requests found
...@@ -57,7 +57,7 @@ class EventAdmin(admin.ModelAdmin): ...@@ -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: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>/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-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: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()), path('<slug:slug>/delete-orga-messages/', self.admin_site.admin_view(AKMessageDeleteView.as_view()),
name="ak_delete_orga_messages"), name="ak_delete_orga_messages"),
......
...@@ -64,6 +64,41 @@ class Event(models.Model): ...@@ -64,6 +64,41 @@ class Event(models.Model):
event = Event.objects.order_by('start').filter(start__gt=datetime.now()).first() event = Event.objects.order_by('start').filter(start__gt=datetime.now()).first()
return event 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): class AKOwner(models.Model):
""" An AKOwner describes the person organizing/holding an AK. """ An AKOwner describes the person organizing/holding an AK.
......
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
<a class="btn btn-success" <a class="btn btn-success"
href="{% url 'admin:ak_csv_export' event_slug=event.slug %}">{% trans "Export AKs as CSV" %}</a> href="{% url 'admin:ak_csv_export' event_slug=event.slug %}">{% trans "Export AKs as CSV" %}</a>
<a class="btn btn-success" <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" <a class="btn btn-success"
href="{% url 'admin:ak_slide_export' event_slug=event.slug %}">{% trans "Export AK Slides" %}</a> href="{% url 'admin:ak_slide_export' event_slug=event.slug %}">{% trans "Export AK Slides" %}</a>
{% endif %} {% endif %}
......
...@@ -4,11 +4,9 @@ ...@@ -4,11 +4,9 @@
{% block content %} {% block content %}
{% regroup AKs by category as ak_list %} {% for category_name, ak_list in categories_with_aks %}
<h3>{{ category_name }}</h3>
{% for category_aks in ak_list %} <textarea style="width: 100%;height:30vh;" class="mb-3">{% for ak in ak_list %}
<h3>{{ category_aks.grouper }}</h3>
<textarea style="width: 100%;height:30vh;">{% for ak in category_aks.list %}
{% verbatim %}{{{% endverbatim %} {% verbatim %}{{{% endverbatim %}
{{ ak.event.wiki_export_template_name }} {{ ak.event.wiki_export_template_name }}
| name={{ ak.name }} | name={{ ak.name }}
......
...@@ -10,7 +10,6 @@ from django.views.generic import TemplateView, DetailView, ListView, DeleteView, ...@@ -10,7 +10,6 @@ from django.views.generic import TemplateView, DetailView, ListView, DeleteView,
from rest_framework import viewsets, permissions, mixins from rest_framework import viewsets, permissions, mixins
from django_tex.shortcuts import render_to_pdf from django_tex.shortcuts import render_to_pdf
from AKModel.forms import NewEventWizardStartForm, NewEventWizardSettingsForm, NewEventWizardPrepareImportForm, \ from AKModel.forms import NewEventWizardStartForm, NewEventWizardSettingsForm, NewEventWizardPrepareImportForm, \
NewEventWizardImportForm, NewEventWizardActivateForm NewEventWizardImportForm, NewEventWizardActivateForm
from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage, AKRequirement from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage, AKRequirement
...@@ -98,7 +97,8 @@ class AKCategoryViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListMo ...@@ -98,7 +97,8 @@ class AKCategoryViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListMo
return AKCategory.objects.filter(event=self.event) 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,) permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,)
serializer_class = AKTrackSerializer serializer_class = AKTrackSerializer
...@@ -106,7 +106,8 @@ class AKTrackViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.CreateMod ...@@ -106,7 +106,8 @@ class AKTrackViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.CreateMod
return AKTrack.objects.filter(event=self.event) 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,) permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,)
serializer_class = AKSerializer serializer_class = AKSerializer
...@@ -175,14 +176,21 @@ class AKCSVExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): ...@@ -175,14 +176,21 @@ class AKCSVExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
return context return context
class AKWikiExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): class AKWikiExportView(AdminViewMixin, DetailView):
template_name = "admin/AKModel/wiki_export.html" template_name = "admin/AKModel/wiki_export.html"
model = AK model = Event
context_object_name = "AKs" context_object_name = "event"
title = _("AK Wiki Export") title = _("AK Wiki Export")
def get_queryset(self): def get_context_data(self, **kwargs):
return super().get_queryset().order_by("category") 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): class AKMessageDeleteView(AdminViewMixin, DeleteView):
...@@ -220,7 +228,7 @@ class WizardViewMixin: ...@@ -220,7 +228,7 @@ class WizardViewMixin:
return context return context
class NewEventWizardStartView(AdminViewMixin, WizardViewMixin, CreateView): class NewEventWizardStartView(AdminViewMixin, WizardViewMixin, CreateView):
model = Event model = Event
form_class = NewEventWizardStartForm form_class = NewEventWizardStartForm
template_name = "admin/AKModel/event_wizard/start.html" template_name = "admin/AKModel/event_wizard/start.html"
...@@ -249,7 +257,8 @@ class NewEventWizardPrepareImportView(WizardViewMixin, EventSlugMixin, FormView) ...@@ -249,7 +257,8 @@ class NewEventWizardPrepareImportView(WizardViewMixin, EventSlugMixin, FormView)
def form_valid(self, form): def form_valid(self, form):
# Selected a valid event to import from? Use this to go to next step of wizard # 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): class NewEventWizardImportView(EventSlugMixin, WizardViewMixin, FormView):
...@@ -272,7 +281,9 @@ class NewEventWizardImportView(EventSlugMixin, WizardViewMixin, FormView): ...@@ -272,7 +281,9 @@ class NewEventWizardImportView(EventSlugMixin, WizardViewMixin, FormView):
import_obj.save() import_obj.save()
messages.add_message(self.request, messages.SUCCESS, _("Copied '%(obj)s'" % {'obj': import_obj})) messages.add_message(self.request, messages.SUCCESS, _("Copied '%(obj)s'" % {'obj': import_obj}))
except BaseException as e: 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) return redirect("admin:new_event_wizard_activate", slug=self.event.slug)
...@@ -314,26 +325,17 @@ def export_slides(request, 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) 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())] 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 = event.get_categories_with_aks(wishes_seperately=True, filter=lambda
categories_with_aks = [] ak: not RESULT_PRESENTATION_MODE or ak.present)
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)))
context = { context = {
'title': event.name, '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"), 'subtitle': _("AKs"),
"wishes": build_ak_list_with_next_aks(ak_wishes), "wishes": build_ak_list_with_next_aks(ak_wishes),
"translations": translations, "translations": translations,
"result_presentation_mode": RESULT_PRESENTATION_MODE, "result_presentation_mode": RESULT_PRESENTATION_MODE,
} }
return render_to_pdf(request, template_name, context, filename='slides.pdf') return render_to_pdf(request, template_name, context, filename='slides.pdf')
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