Skip to content
Snippets Groups Projects
Commit f520b547 authored by Nadja Geisler's avatar Nadja Geisler :sunny:
Browse files

Merge branch 'feature-wiki-wishes' into 'main'

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

Closes #126

See merge request kif/akplanning!103
parents fca383af dac1cf38
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