From 57f7794e79a7423663f34d738dbdf9d492fa31e7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Sat, 30 Jan 2021 15:01:48 +0100
Subject: [PATCH] Implement simple AK to slide export

Create template for slides
Add view
Link view from status page
Update translations
---
 AKModel/admin.py                            |  7 +-
 AKModel/locale/de_DE/LC_MESSAGES/django.po  | 10 ++-
 AKModel/templates/AKModel/export/slides.tex | 72 +++++++++++++++++++++
 AKModel/templates/admin/AKModel/status.html |  2 +
 AKModel/views.py                            | 22 ++++++-
 5 files changed, 108 insertions(+), 5 deletions(-)
 create mode 100644 AKModel/templates/AKModel/export/slides.tex

diff --git a/AKModel/admin.py b/AKModel/admin.py
index 9427710f..16fe017f 100644
--- a/AKModel/admin.py
+++ b/AKModel/admin.py
@@ -1,8 +1,8 @@
+from django import forms
 from django.apps import apps
 from django.contrib import admin
 from django.contrib.admin import SimpleListFilter
 from django.db.models import Count, F
-from django import forms
 from django.shortcuts import render, redirect
 from django.urls import path, reverse_lazy
 from django.utils import timezone
@@ -16,9 +16,11 @@ from AKModel.availability.forms import AvailabilitiesFormMixin
 from AKModel.availability.models import Availability
 from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequirement, AK, AKSlot, Room, AKOrgaMessage, \
     ConstraintViolation
-from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView, AKMessageDeleteView, AKRequirementOverview, \
+from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView, AKMessageDeleteView, \
+    AKRequirementOverview, \
     NewEventWizardStartView, NewEventWizardSettingsView, NewEventWizardPrepareImportView, NewEventWizardFinishView, \
     NewEventWizardImportView, NewEventWizardActivateView
+from AKModel.views import export_slides
 
 
 @admin.register(Event)
@@ -56,6 +58,7 @@ class EventAdmin(admin.ModelAdmin):
             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: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/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po
index 0f5209a9..ae977083 100644
--- a/AKModel/locale/de_DE/LC_MESSAGES/django.po
+++ b/AKModel/locale/de_DE/LC_MESSAGES/django.po
@@ -485,7 +485,7 @@ msgstr "Anzahl Personen, die online Interesse bekundet haben"
 
 #: AKModel/models.py:240 AKModel/models.py:440
 #: AKModel/templates/admin/AKModel/status.html:49
-#: AKModel/templates/admin/AKModel/status.html:56
+#: AKModel/templates/admin/AKModel/status.html:56 AKModel/views.py:194
 msgid "AKs"
 msgstr "AKs"
 
@@ -898,6 +898,10 @@ msgstr "AKs als CSV exportieren"
 msgid "Export AKs for Wiki"
 msgstr "AKs im Wiki-Format exportieren"
 
+#: AKModel/templates/admin/AKModel/status.html:82
+msgid "Export AK Slides"
+msgstr "AK-Folien exportieren"
+
 #: AKModel/templates/admin/AKModel/status.html:87
 msgid "No requirements yet"
 msgstr "Bisher keine Anforderungen"
@@ -938,6 +942,10 @@ msgstr "AK-Wiki-Export"
 msgid "AK Orga Messages successfully deleted"
 msgstr "AK-Organachrichten erfolgreich gelöscht"
 
+#: AKModel/views.py:195
+msgid "Wishes"
+msgstr "Wünsche"
+
 #: AKModel/views.py:207
 msgid "Settings"
 msgstr "Einstellungen"
diff --git a/AKModel/templates/AKModel/export/slides.tex b/AKModel/templates/AKModel/export/slides.tex
new file mode 100644
index 00000000..31f8bdcd
--- /dev/null
+++ b/AKModel/templates/AKModel/export/slides.tex
@@ -0,0 +1,72 @@
+\documentclass{beamer}
+\usetheme{metropolis}
+% \usetheme[numbering=fraction, progressbar=foot]{metropolis} TODO Activate when total number of frames bug is resolved
+
+\usepackage[utf8]{inputenc}
+\usepackage{fontawesome5}
+
+\title{ {{- title -}} }
+\subtitle{ {{- subtitle -}} }
+\date{\today}
+
+\begin{document}
+
+\begin{frame}
+\maketitle
+\end{frame}
+
+
+{%for category in categories %}
+
+    \section{ {{- category.name | latex_escape_utf8 -}} }
+
+    {% for ak in category.ak_set.all() %}
+
+        {% if not ak.wish %}
+
+            %\setbeamertemplate{frame footer}{}
+
+            \begin{frame}[shrink=15]
+                \frametitle{ {{- ak.name | latex_escape_utf8 -}} }
+
+                \vspace{1em}
+
+                \faUser~ {{ ak.owners_list | latex_escape_utf8 }}
+
+                \faClock~ {{ak.durations_list}}
+
+                {% if ak.reso %}
+                    \faScroll
+                {% endif %}
+
+                {{ ak.description | latex_escape_utf8 }}
+
+            \end{frame}
+
+        {% endif %}
+
+    {% endfor %}
+
+{% endfor %}
+
+
+\section{ {{- wish_category_title -}} }
+
+{% for ak in wishes %}
+
+    %\setbeamertemplate{frame footer}{}
+
+    \begin{frame}[shrink=15]
+        \frametitle{ {{- ak.name | latex_escape_utf8 -}} }
+
+        \vspace{1em}
+
+        \faFilter~ {{ ak.category.name | latex_escape_utf8 }}
+
+        {{ ak.description | latex_escape_utf8 }}
+
+    \end{frame}
+
+{% endfor %}
+
+\end{document}
diff --git a/AKModel/templates/admin/AKModel/status.html b/AKModel/templates/admin/AKModel/status.html
index ee84a94a..dd269c83 100644
--- a/AKModel/templates/admin/AKModel/status.html
+++ b/AKModel/templates/admin/AKModel/status.html
@@ -80,6 +80,8 @@
                        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>
+                    <a class="btn btn-success"
+                       href="{% url 'admin:ak_slide_export' event_slug=event.slug %}">{% trans "Export AK Slides" %}</a>
                 {% endif %}
 
                 <h3 class="block-header">{% trans "Requirements" %}</h3>
diff --git a/AKModel/views.py b/AKModel/views.py
index cc78a0c5..aeeb7b5c 100644
--- a/AKModel/views.py
+++ b/AKModel/views.py
@@ -1,10 +1,13 @@
 from django.contrib import admin, messages
+from django.contrib.admin.views.decorators import staff_member_required
 from django.http import HttpResponseRedirect
 from django.shortcuts import get_object_or_404, redirect
 from django.urls import reverse_lazy
 from django.utils.translation import gettext_lazy as _
 from django.views.generic import TemplateView, DetailView, ListView, DeleteView, CreateView, FormView, UpdateView
 from rest_framework import viewsets, permissions, mixins
+from django_tex.shortcuts import render_to_pdf
+
 
 from AKModel.forms import NewEventWizardStartForm, NewEventWizardSettingsForm, NewEventWizardPrepareImportForm, \
     NewEventWizardImportForm, NewEventWizardActivateForm
@@ -242,8 +245,6 @@ class NewEventWizardPrepareImportView(WizardViewMixin, EventSlugMixin, FormView)
     template_name = "admin/AKModel/event_wizard/created_prepare_import.html"
     wizard_step = 3
 
-
-
     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)
@@ -287,3 +288,20 @@ class NewEventWizardFinishView(WizardViewMixin, DetailView):
     model = Event
     template_name = "admin/AKModel/event_wizard/finish.html"
     wizard_step = 6
+
+
+@staff_member_required
+def export_slides(request, event_slug):
+    template_name = 'AKModel/export/slides.tex'
+
+    event = get_object_or_404(Event, slug=event_slug)
+
+    context = {
+        'title': event.name,
+        'categories': event.akcategory_set.all(),
+        'subtitle': _("AKs"),
+        'wish_category_title': _("Wishes"),
+        "wishes": [ak for ak in event.ak_set.order_by('category') if ak.wish]
+        }
+
+    return render_to_pdf(request, template_name, context, filename='slides.pdf')
-- 
GitLab