Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • konstantin/akplanning
  • matedealer/akplanning
  • kif/akplanning
  • mirco/akplanning
  • lordofthevoid/akplanning
  • voidptr/akplanning
  • xayomer/akplanning-fork
  • mollux/akplanning
  • neumantm/akplanning
  • mmarx/akplanning
  • nerf/akplanning
  • felix_bonn/akplanning
  • sebastian.uschmann/akplanning
13 results
Show changes
Commits on Source (3)
......@@ -16,7 +16,7 @@ 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
from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView, AKMessageDeleteView, export_slides
@admin.register(Event)
......@@ -33,6 +33,7 @@ class EventAdmin(admin.ModelAdmin):
path('<slug:slug>/status/', self.admin_site.admin_view(EventStatusView.as_view()), name="event_status"),
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"),
]
......
# environment.py
import re
from django_tex.environment import environment
# Used to filter all very special UTF-8 chars that are probably not contained in the LaTeX fonts
# and would hence cause compilation errors
utf8_replace_pattern = re.compile(u'[^\u0000-\u206F]', re.UNICODE)
def latex_escape_utf8(value):
"""
Escape latex special chars and remove invalid utf-8 values
:param value: string to escape
:type value: str
:return: escaped string
:rtype: str
"""
return utf8_replace_pattern.sub('', value).replace('&', '\&').replace('_', '\_').replace('#', '\#').replace('$', '\$').replace('%', '\%').replace('{', '\{').replace('}', '\}')
def improved_tex_environment(**options):
env = environment(**options)
env.filters.update({
'latex_escape_utf8': latex_escape_utf8,
})
return env
......@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-03 20:41+0000\n"
"POT-Creation-Date: 2021-01-30 13:57+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -11,28 +11,32 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: AKModel/admin.py:41 AKModel/admin.py:42
#: AKModel/admin.py:44 AKModel/admin.py:45
#: AKModel/templates/admin/AKModel/status.html:7
#: AKModel/templates/admin/ak_index.html:15
msgid "Status"
msgstr "Status"
#: AKModel/admin.py:120
#: AKModel/admin.py:123
msgid "Wish"
msgstr "AK-Wunsch"
#: AKModel/admin.py:126
#: AKModel/admin.py:129
msgid "Is wish"
msgstr "Ist ein Wunsch"
#: AKModel/admin.py:127
#: AKModel/admin.py:130
msgid "Is not a wish"
msgstr "Ist kein Wunsch"
#: AKModel/admin.py:154
#: AKModel/admin.py:157
msgid "Export to wiki syntax"
msgstr "In Wiki-Syntax exportieren"
#: AKModel/admin.py:253
msgid "AK Details"
msgstr "AK-Details"
#: AKModel/availability/forms.py:20 AKModel/availability/models.py:239
msgid "Availability"
msgstr "Verfügbarkeit"
......@@ -60,13 +64,13 @@ msgstr "Bitte Verfügbarkeiten eintragen!"
#: AKModel/availability/models.py:38 AKModel/models.py:47 AKModel/models.py:76
#: AKModel/models.py:128 AKModel/models.py:147 AKModel/models.py:179
#: AKModel/models.py:233 AKModel/models.py:292 AKModel/models.py:324
#: AKModel/models.py:410
#: AKModel/models.py:431
msgid "Event"
msgstr "Event"
#: AKModel/availability/models.py:39 AKModel/models.py:77 AKModel/models.py:129
#: AKModel/models.py:148 AKModel/models.py:180 AKModel/models.py:234
#: AKModel/models.py:293 AKModel/models.py:325 AKModel/models.py:411
#: AKModel/models.py:293 AKModel/models.py:325 AKModel/models.py:432
msgid "Associated event"
msgstr "Zugehöriges Event"
......@@ -79,7 +83,7 @@ msgid "Person whose availability this is"
msgstr "Person deren Verfügbarkeit hier abgebildet wird"
#: AKModel/availability/models.py:56 AKModel/models.py:296
#: AKModel/models.py:315 AKModel/models.py:419
#: AKModel/models.py:315 AKModel/models.py:440
msgid "Room"
msgstr "Raum"
......@@ -88,7 +92,7 @@ msgid "Room whose availability this is"
msgstr "Raum dessen Verfügbarkeit hier abgebildet wird"
#: AKModel/availability/models.py:65 AKModel/models.py:239
#: AKModel/models.py:314 AKModel/models.py:366
#: AKModel/models.py:314 AKModel/models.py:387
msgid "AK"
msgstr "AK"
......@@ -97,7 +101,7 @@ msgid "AK whose availability this is"
msgstr "Verfügbarkeiten"
#: AKModel/availability/models.py:74 AKModel/models.py:132
#: AKModel/models.py:425
#: AKModel/models.py:446
msgid "AK Category"
msgstr "AK-Kategorie"
......@@ -261,7 +265,7 @@ msgstr "Internet Link"
msgid "Link to Homepage"
msgstr "Link zu Homepage oder Webseite"
#: AKModel/models.py:80 AKModel/models.py:418
#: AKModel/models.py:80 AKModel/models.py:439
msgid "AK Owner"
msgstr "AK-Leitung"
......@@ -321,7 +325,7 @@ msgstr "AK-Tags"
msgid "Name of the Requirement"
msgstr "Name der Anforderung"
#: AKModel/models.py:183 AKModel/models.py:422
#: AKModel/models.py:183 AKModel/models.py:443
msgid "AK Requirement"
msgstr "AK-Anforderung"
......@@ -405,7 +409,7 @@ msgstr "AK präsentieren"
msgid "Present results of this AK"
msgstr "Die Ergebnisse dieses AKs vorstellen"
#: AKModel/models.py:218 AKModel/templates/admin/AKModel/status.html:83
#: AKModel/models.py:218 AKModel/templates/admin/AKModel/status.html:85
msgid "Requirements"
msgstr "Anforderungen"
......@@ -458,9 +462,9 @@ msgstr "Interessenszähler"
msgid "People who have indicated interest online"
msgstr "Anzahl Personen, die online Interesse bekundet haben"
#: AKModel/models.py:240 AKModel/models.py:413
#: AKModel/models.py:240 AKModel/models.py:434
#: 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"
......@@ -536,163 +540,168 @@ msgstr "Letzte Aktualisierung"
msgid "AK Slot"
msgstr "AK-Slot"
#: AKModel/models.py:331 AKModel/models.py:415
#: AKModel/models.py:331 AKModel/models.py:436
msgid "AK Slots"
msgstr "AK-Slot"
#: AKModel/models.py:345
#: AKModel/models.py:353 AKModel/models.py:362
msgid "Not scheduled yet"
msgstr "Noch nicht geplant"
#: AKModel/models.py:367
#: AKModel/models.py:388
#, fuzzy
#| msgid "Track the AK belongs to"
msgid "AK this message belongs to"
msgstr "Track zu dem der AK gehört"
#: AKModel/models.py:368
#: AKModel/models.py:389
msgid "Message text"
msgstr "Nachrichtentext"
#: AKModel/models.py:369
#: AKModel/models.py:390
msgid "Message to the organizers. This is not publicly visible."
msgstr ""
"Nachricht an die Organisator*innen. Diese ist nicht öffentlich sichtbar."
#: AKModel/models.py:373
#: AKModel/models.py:394
msgid "AK Orga Message"
msgstr "AK-Organachricht"
#: AKModel/models.py:374
#: AKModel/models.py:395
msgid "AK Orga Messages"
msgstr "AK-Organachrichten"
#: AKModel/models.py:383
#: AKModel/models.py:404
msgid "Constraint Violation"
msgstr "Constraintverletzung"
#: AKModel/models.py:384
#: AKModel/models.py:405
msgid "Constraint Violations"
msgstr "Constraintverletzungen"
#: AKModel/models.py:388
#: AKModel/models.py:409
msgid "Owner has two parallel slots"
msgstr "Leitung hat zwei Slots parallel"
#: AKModel/models.py:389
#: AKModel/models.py:410
msgid "AK Slot was scheduled outside the AK's availabilities"
msgstr "AK Slot wurde außerhalb der Verfügbarkeit des AKs platziert"
#: AKModel/models.py:390
#: AKModel/models.py:411
msgid "Room has two AK slots scheduled at the same time"
msgstr "Raum hat AK Slots gleichzeitig"
#: AKModel/models.py:391
#: AKModel/models.py:412
msgid "Room does not satisfy the requirement of the scheduled AK"
msgstr "Room erfüllt die Anforderungen des platzierten AKs nicht"
#: AKModel/models.py:392
#: AKModel/models.py:413
msgid "AK Slot is scheduled at the same time as an AK listed as a conflict"
msgstr "AK Slot wurde wurde zur gleichen Zeit wie ein Konflikt des AKs platziert"
msgstr ""
"AK Slot wurde wurde zur gleichen Zeit wie ein Konflikt des AKs platziert"
#: AKModel/models.py:393
#: AKModel/models.py:414
msgid "AK Slot is scheduled before an AK listed as a prerequisite"
msgstr "AK Slot wurde vor einem als Voraussetzung gelisteten AK platziert"
#: AKModel/models.py:395
msgid "AK Slot for AK with intention to submit a resolution is scheduled after "
#: AKModel/models.py:416
msgid ""
"AK Slot for AK with intention to submit a resolution is scheduled after "
"resolution deadline"
msgstr "AK Slot eines AKs mit Resoabsicht wurde nach der Resodeadline platziert"
msgstr ""
"AK Slot eines AKs mit Resoabsicht wurde nach der Resodeadline platziert"
#: AKModel/models.py:396
#: AKModel/models.py:417
msgid "AK Slot in a category is outside that categories availabilities"
msgstr "AK Slot wurde außerhalb der Verfügbarkeiten seiner Kategorie"
#: AKModel/models.py:397
#: AKModel/models.py:418
msgid "Two AK Slots for the same AK scheduled at the same time"
msgstr "Zwei AK Slots eines AKs wurden zur selben Zeit platziert"
#: AKModel/models.py:398
#: AKModel/models.py:419
msgid "AK Slot is scheduled in a room with less space than interest"
msgstr "AK Slot wurde in einem Raum mit weniger Plätzen als am AK Interessierten platziert"
msgstr ""
"AK Slot wurde in einem Raum mit weniger Plätzen als am AK Interessierten "
"platziert"
#: AKModel/models.py:399
#: AKModel/models.py:420
msgid "AK Slot is scheduled outside the event's availabilities"
msgstr "AK Slot wurde außerhalb der Verfügbarkeit des Events platziert"
#: AKModel/models.py:402
#: AKModel/models.py:423
msgid "Warning"
msgstr "Warnung"
#: AKModel/models.py:403
#: AKModel/models.py:424
msgid "Violation"
msgstr "Verletzung"
#: AKModel/models.py:405
#: AKModel/models.py:426
msgid "Type"
msgstr "Art"
#: AKModel/models.py:406
#: AKModel/models.py:427
msgid "Type of violation, i.e. what kind of constraint was violated"
msgstr "Art der Verletzung, gibt an welche Art Constraint verletzt wurde"
#: AKModel/models.py:407
#: AKModel/models.py:428
msgid "Level"
msgstr "Level"
#: AKModel/models.py:408
#: AKModel/models.py:429
msgid "Severity level of the violation"
msgstr "Schweregrad der Verletzung"
#: AKModel/models.py:414
#: AKModel/models.py:435
msgid "AK(s) belonging to this constraint"
msgstr "AK(s), die zu diesem Constraint gehören"
#: AKModel/models.py:416
#: AKModel/models.py:437
msgid "AK Slot(s) belonging to this constraint"
msgstr "AK Slot(s), die zu diesem Constraint gehören"
#: AKModel/models.py:418
#: AKModel/models.py:439
msgid "AK Owner belonging to this constraint"
msgstr "AK Leitung(en), die zu diesem Constraint gehören"
#: AKModel/models.py:420
#: AKModel/models.py:441
msgid "Room belonging to this constraint"
msgstr "Raum, der zu diesem Constraint gehört"
#: AKModel/models.py:423
#: AKModel/models.py:444
msgid "AK Requirement belonging to this constraint"
msgstr "AK Anforderung, die zu diesem Constraint gehört"
#: AKModel/models.py:425
#: AKModel/models.py:446
msgid "AK Category belonging to this constraint"
msgstr "AK Kategorie, di zu diesem Constraint gehört"
#: AKModel/models.py:427
#: AKModel/models.py:448
msgid "Comment"
msgstr "Kommentar"
#: AKModel/models.py:427
#: AKModel/models.py:448
msgid "Comment or further details for this violation"
msgstr "Kommentar oder weitere Details zu dieser Vereletzung"
#: AKModel/models.py:430
#: AKModel/models.py:451
msgid "Timestamp"
msgstr "Timestamp"
#: AKModel/models.py:430
#: AKModel/models.py:451
msgid "Time of creation"
msgstr "Zeitpunkt der ERstellung"
#: AKModel/models.py:431
#: AKModel/models.py:452
msgid "Manually Resolved"
msgstr "Manuell behoben"
#: AKModel/models.py:432
#: AKModel/models.py:453
msgid "Mark this violation manually as resolved"
msgstr "Markiere diese Verletzung manuell als behoben"
#: AKModel/models.py:454
#: AKModel/models.py:475
msgid "Details"
msgstr "Details"
......@@ -790,19 +799,23 @@ msgstr "AKs als CSV exportieren"
msgid "Export AKs for Wiki"
msgstr "AKs im Wiki-Format exportieren"
#: AKModel/templates/admin/AKModel/status.html:85
#: 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"
#: AKModel/templates/admin/AKModel/status.html:98
#: AKModel/templates/admin/AKModel/status.html:100
msgid "Add Requirement"
msgstr "Anforderungen hinzufügen"
#: AKModel/templates/admin/AKModel/status.html:101
#: AKModel/templates/admin/AKModel/status.html:103
msgid "Messages"
msgstr "Nachrichten"
#: AKModel/templates/admin/AKModel/status.html:103
#: AKModel/templates/admin/AKModel/status.html:105
msgid "Delete all messages"
msgstr "Alle Nachrichten löschen"
......@@ -810,22 +823,26 @@ msgstr "Alle Nachrichten löschen"
msgid "Active Events"
msgstr "Aktive Events"
#: AKModel/views.py:130
#: AKModel/views.py:133
msgid "Event Status"
msgstr "Eventstatus"
#: AKModel/views.py:144
#: AKModel/views.py:147
msgid "AK CSV Export"
msgstr "AK-CSV-Export"
#: AKModel/views.py:158
#: AKModel/views.py:161
msgid "AK Wiki Export"
msgstr "AK-Wiki-Export"
#: AKModel/views.py:178
#: AKModel/views.py:181
msgid "AK Orga Messages successfully deleted"
msgstr "AK-Organachrichten erfolgreich gelöscht"
#: AKModel/views.py:195
msgid "Wishes"
msgstr "Wünsche"
#~ msgid "Confirm"
#~ msgstr "Bestätigen"
......
......@@ -264,7 +264,7 @@ class AK(models.Model):
@property
def durations_list(self):
return ", ".join(str(slot.duration) for slot in self.akslot_set.all())
return ", ".join(str(slot.duration_simplified) for slot in self.akslot_set.all())
@property
def wish(self):
......@@ -342,7 +342,7 @@ class AKSlot(models.Model):
Display duration of slot in format hours:minutes, e.g. 1.5 -> "1:30"
"""
hours, minutes = divmod(self.duration * 60, 60)
return f"{hours}:{minutes:2.0f}"
return f"{hours}:{minutes:02.0f}"
@property
def start_simplified(self):
......
\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}
......@@ -78,6 +78,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>
......
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
from django.urls import reverse_lazy
......@@ -6,6 +7,8 @@ from django.utils.translation import gettext_lazy as _
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.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage
from AKModel.serializers import AKSerializer, AKSlotSerializer, RoomSerializer, AKTrackSerializer, AKCategorySerializer, \
......@@ -177,3 +180,20 @@ class AKMessageDeleteView(AdminViewMixin, DeleteView):
self.get_orga_messages_for_event(self.get_object()).delete()
messages.add_message(self.request, messages.SUCCESS, _("AK Orga Messages successfully deleted"))
return HttpResponseRedirect(reverse_lazy('admin:event_status', kwargs={'slug': self.get_object().slug}))
@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')
......@@ -51,6 +51,7 @@ INSTALLED_APPS = [
'rest_framework',
'simple_history',
'registration',
'django_tex',
]
MIDDLEWARE = [
......@@ -84,6 +85,14 @@ TEMPLATES = [
],
},
},
{
'NAME': 'tex',
'BACKEND': 'django_tex.engine.TeXEngine',
'APP_DIRS': True,
'OPTIONS': {
'environment': 'AKModel.environment.improved_tex_environment',
}
},
]
WSGI_APPLICATION = 'AKPlanning.wsgi.application'
......@@ -136,6 +145,8 @@ LANGUAGES = [
INTERNAL_IPS = ['127.0.0.1', '::1']
LATEX_INTERPRETER = 'pdflatex'
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
......
......@@ -12,6 +12,7 @@ AKPlanning has two types of requirements: System requirements are dependent on o
* Python 3.7 incl. development tools
* Virtualenv
* pdflatex & beamer class (`texlive-latex-base texlive-latex-recommended texlive-latex-extra texlive-fonts-extra`)
* for production using uwsgi:
* C compiler e.g. gcc
* uwsgi
......
......@@ -7,4 +7,5 @@ djangorestframework==3.12.2
django-simple-history==2.12.0
django-registration-redux==2.9
django-debug-toolbar==3.2
django-tex==1.1.8.post1
mysqlclient==2.0.3 # for production deployment