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
Select Git revision
  • 520-akowner
  • 520-fix-event-wizard-datepicker
  • 520-fix-scheduling
  • 520-improve-scheduling
  • 520-improve-scheduling-2
  • 520-improve-submission
  • 520-improve-trackmanager
  • 520-improve-wall
  • 520-message-resolved
  • 520-status
  • 520-upgrades
  • add_express_interest_to_ak_overview
  • admin-production-color
  • bugfixes
  • csp
  • featire-ical-export
  • feature-ak-requirement-lists
  • feature-akslide-export-better-filename
  • feature-akslides
  • feature-better-admin
  • feature-better-cv-list
  • feature-colors
  • feature-constraint-checking
  • feature-constraint-checking-wip
  • feature-dashboard-history-button
  • feature-event-status
  • feature-event-wizard
  • feature-export-flag
  • feature-improve-admin
  • feature-improve-filters
  • feature-improved-user-creation-workflow
  • feature-interest-view
  • feature-mails
  • feature-modular-status
  • feature-plan-autoreload
  • feature-present-default
  • feature-register-link
  • feature-remaining-constraint-validation
  • feature-room-import
  • feature-scheduler-improve
  • feature-scheduling-2.0
  • feature-special-attention
  • feature-time-input
  • feature-tracker
  • feature-wiki-wishes
  • feature-wish-slots
  • feature-wizard-buttons
  • features-availabilities
  • fix-ak-times-above-folg
  • fix-api
  • fix-constraint-violation-string
  • fix-cv-checking
  • fix-default-slot-length
  • fix-default-slot-localization
  • fix-doc-minor
  • fix-duration-display
  • fix-event-tz-pytz-update
  • fix-history-interest
  • fix-interest-view
  • fix-js
  • fix-pipeline
  • fix-plan-timezone-now
  • fix-room-add
  • fix-scheduling-drag
  • fix-slot-defaultlength
  • fix-timezone
  • fix-translation-scheduling
  • fix-virtual-room-admin
  • fix-wizard-csp
  • font-locally
  • improve-admin
  • improve-online
  • improve-slides
  • improve-submission-coupling
  • interest_restriction
  • main
  • master
  • meta-debug-toolbar
  • meta-export
  • meta-makemessages
  • meta-performance
  • meta-tests
  • meta-tests-gitlab-test
  • meta-upgrades
  • mollux-master-patch-02906
  • port-availabilites-fullcalendar
  • qs
  • remove-tags
  • renovate/configure
  • renovate/django-4.x
  • renovate/django-5.x
  • renovate/django-bootstrap-datepicker-plus-5.x
  • renovate/django-bootstrap5-23.x
  • renovate/django-bootstrap5-24.x
  • renovate/django-compressor-4.x
  • renovate/django-debug-toolbar-4.x
  • renovate/django-registration-redux-2.x
  • renovate/django-simple-history-3.x
  • renovate/django-split-settings-1.x
  • renovate/django-timezone-field-5.x
100 results

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
Select Git revision
  • komasolver
  • main
  • renovate/django-5.x
  • renovate/django-debug-toolbar-5.x
  • renovate/django_csp-4.x
  • renovate/djangorestframework-3.x
  • renovate/tzdata-2025.x
  • renovate/uwsgi-2.x
8 results
Show changes
Commits on Source (3)
...@@ -16,7 +16,7 @@ from AKModel.availability.forms import AvailabilitiesFormMixin ...@@ -16,7 +16,7 @@ from AKModel.availability.forms import AvailabilitiesFormMixin
from AKModel.availability.models import Availability from AKModel.availability.models import Availability
from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequirement, AK, AKSlot, Room, AKOrgaMessage, \ from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequirement, AK, AKSlot, Room, AKOrgaMessage, \
ConstraintViolation ConstraintViolation
from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView, AKMessageDeleteView from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView, AKMessageDeleteView, export_slides
@admin.register(Event) @admin.register(Event)
...@@ -33,6 +33,7 @@ class EventAdmin(admin.ModelAdmin): ...@@ -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: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-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-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()), path('<slug:slug>/delete-orga-messages/', self.admin_site.admin_view(AKMessageDeleteView.as_view()),
name="ak_delete_orga_messages"), 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 "" ...@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
...@@ -11,28 +11,32 @@ msgstr "" ...@@ -11,28 +11,32 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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/AKModel/status.html:7
#: AKModel/templates/admin/ak_index.html:15 #: AKModel/templates/admin/ak_index.html:15
msgid "Status" msgid "Status"
msgstr "Status" msgstr "Status"
#: AKModel/admin.py:120 #: AKModel/admin.py:123
msgid "Wish" msgid "Wish"
msgstr "AK-Wunsch" msgstr "AK-Wunsch"
#: AKModel/admin.py:126 #: AKModel/admin.py:129
msgid "Is wish" msgid "Is wish"
msgstr "Ist ein Wunsch" msgstr "Ist ein Wunsch"
#: AKModel/admin.py:127 #: AKModel/admin.py:130
msgid "Is not a wish" msgid "Is not a wish"
msgstr "Ist kein Wunsch" msgstr "Ist kein Wunsch"
#: AKModel/admin.py:154 #: AKModel/admin.py:157
msgid "Export to wiki syntax" msgid "Export to wiki syntax"
msgstr "In Wiki-Syntax exportieren" 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 #: AKModel/availability/forms.py:20 AKModel/availability/models.py:239
msgid "Availability" msgid "Availability"
msgstr "Verfügbarkeit" msgstr "Verfügbarkeit"
...@@ -60,13 +64,13 @@ msgstr "Bitte Verfügbarkeiten eintragen!" ...@@ -60,13 +64,13 @@ msgstr "Bitte Verfügbarkeiten eintragen!"
#: AKModel/availability/models.py:38 AKModel/models.py:47 AKModel/models.py:76 #: 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:128 AKModel/models.py:147 AKModel/models.py:179
#: AKModel/models.py:233 AKModel/models.py:292 AKModel/models.py:324 #: AKModel/models.py:233 AKModel/models.py:292 AKModel/models.py:324
#: AKModel/models.py:410 #: AKModel/models.py:431
msgid "Event" msgid "Event"
msgstr "Event" msgstr "Event"
#: AKModel/availability/models.py:39 AKModel/models.py:77 AKModel/models.py:129 #: 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: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" msgid "Associated event"
msgstr "Zugehöriges Event" msgstr "Zugehöriges Event"
...@@ -79,7 +83,7 @@ msgid "Person whose availability this is" ...@@ -79,7 +83,7 @@ msgid "Person whose availability this is"
msgstr "Person deren Verfügbarkeit hier abgebildet wird" msgstr "Person deren Verfügbarkeit hier abgebildet wird"
#: AKModel/availability/models.py:56 AKModel/models.py:296 #: 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" msgid "Room"
msgstr "Raum" msgstr "Raum"
...@@ -88,7 +92,7 @@ msgid "Room whose availability this is" ...@@ -88,7 +92,7 @@ msgid "Room whose availability this is"
msgstr "Raum dessen Verfügbarkeit hier abgebildet wird" msgstr "Raum dessen Verfügbarkeit hier abgebildet wird"
#: AKModel/availability/models.py:65 AKModel/models.py:239 #: 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" msgid "AK"
msgstr "AK" msgstr "AK"
...@@ -97,7 +101,7 @@ msgid "AK whose availability this is" ...@@ -97,7 +101,7 @@ msgid "AK whose availability this is"
msgstr "Verfügbarkeiten" msgstr "Verfügbarkeiten"
#: AKModel/availability/models.py:74 AKModel/models.py:132 #: AKModel/availability/models.py:74 AKModel/models.py:132
#: AKModel/models.py:425 #: AKModel/models.py:446
msgid "AK Category" msgid "AK Category"
msgstr "AK-Kategorie" msgstr "AK-Kategorie"
...@@ -261,7 +265,7 @@ msgstr "Internet Link" ...@@ -261,7 +265,7 @@ msgstr "Internet Link"
msgid "Link to Homepage" msgid "Link to Homepage"
msgstr "Link zu Homepage oder Webseite" 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" msgid "AK Owner"
msgstr "AK-Leitung" msgstr "AK-Leitung"
...@@ -321,7 +325,7 @@ msgstr "AK-Tags" ...@@ -321,7 +325,7 @@ msgstr "AK-Tags"
msgid "Name of the Requirement" msgid "Name of the Requirement"
msgstr "Name der Anforderung" msgstr "Name der Anforderung"
#: AKModel/models.py:183 AKModel/models.py:422 #: AKModel/models.py:183 AKModel/models.py:443
msgid "AK Requirement" msgid "AK Requirement"
msgstr "AK-Anforderung" msgstr "AK-Anforderung"
...@@ -405,7 +409,7 @@ msgstr "AK präsentieren" ...@@ -405,7 +409,7 @@ msgstr "AK präsentieren"
msgid "Present results of this AK" msgid "Present results of this AK"
msgstr "Die Ergebnisse dieses AKs vorstellen" 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" msgid "Requirements"
msgstr "Anforderungen" msgstr "Anforderungen"
...@@ -458,9 +462,9 @@ msgstr "Interessenszähler" ...@@ -458,9 +462,9 @@ msgstr "Interessenszähler"
msgid "People who have indicated interest online" msgid "People who have indicated interest online"
msgstr "Anzahl Personen, die online Interesse bekundet haben" 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:49
#: AKModel/templates/admin/AKModel/status.html:56 #: AKModel/templates/admin/AKModel/status.html:56 AKModel/views.py:194
msgid "AKs" msgid "AKs"
msgstr "AKs" msgstr "AKs"
...@@ -536,163 +540,168 @@ msgstr "Letzte Aktualisierung" ...@@ -536,163 +540,168 @@ msgstr "Letzte Aktualisierung"
msgid "AK Slot" msgid "AK Slot"
msgstr "AK-Slot" msgstr "AK-Slot"
#: AKModel/models.py:331 AKModel/models.py:415 #: AKModel/models.py:331 AKModel/models.py:436
msgid "AK Slots" msgid "AK Slots"
msgstr "AK-Slot" msgstr "AK-Slot"
#: AKModel/models.py:345 #: AKModel/models.py:353 AKModel/models.py:362
msgid "Not scheduled yet" msgid "Not scheduled yet"
msgstr "Noch nicht geplant" msgstr "Noch nicht geplant"
#: AKModel/models.py:367 #: AKModel/models.py:388
#, fuzzy #, fuzzy
#| msgid "Track the AK belongs to" #| msgid "Track the AK belongs to"
msgid "AK this message belongs to" msgid "AK this message belongs to"
msgstr "Track zu dem der AK gehört" msgstr "Track zu dem der AK gehört"
#: AKModel/models.py:368 #: AKModel/models.py:389
msgid "Message text" msgid "Message text"
msgstr "Nachrichtentext" msgstr "Nachrichtentext"
#: AKModel/models.py:369 #: AKModel/models.py:390
msgid "Message to the organizers. This is not publicly visible." msgid "Message to the organizers. This is not publicly visible."
msgstr "" msgstr ""
"Nachricht an die Organisator*innen. Diese ist nicht öffentlich sichtbar." "Nachricht an die Organisator*innen. Diese ist nicht öffentlich sichtbar."
#: AKModel/models.py:373 #: AKModel/models.py:394
msgid "AK Orga Message" msgid "AK Orga Message"
msgstr "AK-Organachricht" msgstr "AK-Organachricht"
#: AKModel/models.py:374 #: AKModel/models.py:395
msgid "AK Orga Messages" msgid "AK Orga Messages"
msgstr "AK-Organachrichten" msgstr "AK-Organachrichten"
#: AKModel/models.py:383 #: AKModel/models.py:404
msgid "Constraint Violation" msgid "Constraint Violation"
msgstr "Constraintverletzung" msgstr "Constraintverletzung"
#: AKModel/models.py:384 #: AKModel/models.py:405
msgid "Constraint Violations" msgid "Constraint Violations"
msgstr "Constraintverletzungen" msgstr "Constraintverletzungen"
#: AKModel/models.py:388 #: AKModel/models.py:409
msgid "Owner has two parallel slots" msgid "Owner has two parallel slots"
msgstr "Leitung hat zwei Slots parallel" msgstr "Leitung hat zwei Slots parallel"
#: AKModel/models.py:389 #: AKModel/models.py:410
msgid "AK Slot was scheduled outside the AK's availabilities" msgid "AK Slot was scheduled outside the AK's availabilities"
msgstr "AK Slot wurde außerhalb der Verfügbarkeit des AKs platziert" 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" msgid "Room has two AK slots scheduled at the same time"
msgstr "Raum hat AK Slots gleichzeitig" 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" msgid "Room does not satisfy the requirement of the scheduled AK"
msgstr "Room erfüllt die Anforderungen des platzierten AKs nicht" 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" 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" msgid "AK Slot is scheduled before an AK listed as a prerequisite"
msgstr "AK Slot wurde vor einem als Voraussetzung gelisteten AK platziert" msgstr "AK Slot wurde vor einem als Voraussetzung gelisteten AK platziert"
#: AKModel/models.py:395 #: AKModel/models.py:416
msgid "AK Slot for AK with intention to submit a resolution is scheduled after " msgid ""
"AK Slot for AK with intention to submit a resolution is scheduled after "
"resolution deadline" "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" msgid "AK Slot in a category is outside that categories availabilities"
msgstr "AK Slot wurde außerhalb der Verfügbarkeiten seiner Kategorie" 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" msgid "Two AK Slots for the same AK scheduled at the same time"
msgstr "Zwei AK Slots eines AKs wurden zur selben Zeit platziert" 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" 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" msgid "AK Slot is scheduled outside the event's availabilities"
msgstr "AK Slot wurde außerhalb der Verfügbarkeit des Events platziert" msgstr "AK Slot wurde außerhalb der Verfügbarkeit des Events platziert"
#: AKModel/models.py:402 #: AKModel/models.py:423
msgid "Warning" msgid "Warning"
msgstr "Warnung" msgstr "Warnung"
#: AKModel/models.py:403 #: AKModel/models.py:424
msgid "Violation" msgid "Violation"
msgstr "Verletzung" msgstr "Verletzung"
#: AKModel/models.py:405 #: AKModel/models.py:426
msgid "Type" msgid "Type"
msgstr "Art" msgstr "Art"
#: AKModel/models.py:406 #: AKModel/models.py:427
msgid "Type of violation, i.e. what kind of constraint was violated" msgid "Type of violation, i.e. what kind of constraint was violated"
msgstr "Art der Verletzung, gibt an welche Art Constraint verletzt wurde" msgstr "Art der Verletzung, gibt an welche Art Constraint verletzt wurde"
#: AKModel/models.py:407 #: AKModel/models.py:428
msgid "Level" msgid "Level"
msgstr "Level" msgstr "Level"
#: AKModel/models.py:408 #: AKModel/models.py:429
msgid "Severity level of the violation" msgid "Severity level of the violation"
msgstr "Schweregrad der Verletzung" msgstr "Schweregrad der Verletzung"
#: AKModel/models.py:414 #: AKModel/models.py:435
msgid "AK(s) belonging to this constraint" msgid "AK(s) belonging to this constraint"
msgstr "AK(s), die zu diesem Constraint gehören" 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" msgid "AK Slot(s) belonging to this constraint"
msgstr "AK Slot(s), die zu diesem Constraint gehören" 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" msgid "AK Owner belonging to this constraint"
msgstr "AK Leitung(en), die zu diesem Constraint gehören" msgstr "AK Leitung(en), die zu diesem Constraint gehören"
#: AKModel/models.py:420 #: AKModel/models.py:441
msgid "Room belonging to this constraint" msgid "Room belonging to this constraint"
msgstr "Raum, der zu diesem Constraint gehört" msgstr "Raum, der zu diesem Constraint gehört"
#: AKModel/models.py:423 #: AKModel/models.py:444
msgid "AK Requirement belonging to this constraint" msgid "AK Requirement belonging to this constraint"
msgstr "AK Anforderung, die zu diesem Constraint gehört" msgstr "AK Anforderung, die zu diesem Constraint gehört"
#: AKModel/models.py:425 #: AKModel/models.py:446
msgid "AK Category belonging to this constraint" msgid "AK Category belonging to this constraint"
msgstr "AK Kategorie, di zu diesem Constraint gehört" msgstr "AK Kategorie, di zu diesem Constraint gehört"
#: AKModel/models.py:427 #: AKModel/models.py:448
msgid "Comment" msgid "Comment"
msgstr "Kommentar" msgstr "Kommentar"
#: AKModel/models.py:427 #: AKModel/models.py:448
msgid "Comment or further details for this violation" msgid "Comment or further details for this violation"
msgstr "Kommentar oder weitere Details zu dieser Vereletzung" msgstr "Kommentar oder weitere Details zu dieser Vereletzung"
#: AKModel/models.py:430 #: AKModel/models.py:451
msgid "Timestamp" msgid "Timestamp"
msgstr "Timestamp" msgstr "Timestamp"
#: AKModel/models.py:430 #: AKModel/models.py:451
msgid "Time of creation" msgid "Time of creation"
msgstr "Zeitpunkt der ERstellung" msgstr "Zeitpunkt der ERstellung"
#: AKModel/models.py:431 #: AKModel/models.py:452
msgid "Manually Resolved" msgid "Manually Resolved"
msgstr "Manuell behoben" msgstr "Manuell behoben"
#: AKModel/models.py:432 #: AKModel/models.py:453
msgid "Mark this violation manually as resolved" msgid "Mark this violation manually as resolved"
msgstr "Markiere diese Verletzung manuell als behoben" msgstr "Markiere diese Verletzung manuell als behoben"
#: AKModel/models.py:454 #: AKModel/models.py:475
msgid "Details" msgid "Details"
msgstr "Details" msgstr "Details"
...@@ -790,19 +799,23 @@ msgstr "AKs als CSV exportieren" ...@@ -790,19 +799,23 @@ msgstr "AKs als CSV exportieren"
msgid "Export AKs for Wiki" msgid "Export AKs for Wiki"
msgstr "AKs im Wiki-Format exportieren" 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" msgid "No requirements yet"
msgstr "Bisher keine Anforderungen" msgstr "Bisher keine Anforderungen"
#: AKModel/templates/admin/AKModel/status.html:98 #: AKModel/templates/admin/AKModel/status.html:100
msgid "Add Requirement" msgid "Add Requirement"
msgstr "Anforderungen hinzufügen" msgstr "Anforderungen hinzufügen"
#: AKModel/templates/admin/AKModel/status.html:101 #: AKModel/templates/admin/AKModel/status.html:103
msgid "Messages" msgid "Messages"
msgstr "Nachrichten" msgstr "Nachrichten"
#: AKModel/templates/admin/AKModel/status.html:103 #: AKModel/templates/admin/AKModel/status.html:105
msgid "Delete all messages" msgid "Delete all messages"
msgstr "Alle Nachrichten löschen" msgstr "Alle Nachrichten löschen"
...@@ -810,22 +823,26 @@ msgstr "Alle Nachrichten löschen" ...@@ -810,22 +823,26 @@ msgstr "Alle Nachrichten löschen"
msgid "Active Events" msgid "Active Events"
msgstr "Aktive Events" msgstr "Aktive Events"
#: AKModel/views.py:130 #: AKModel/views.py:133
msgid "Event Status" msgid "Event Status"
msgstr "Eventstatus" msgstr "Eventstatus"
#: AKModel/views.py:144 #: AKModel/views.py:147
msgid "AK CSV Export" msgid "AK CSV Export"
msgstr "AK-CSV-Export" msgstr "AK-CSV-Export"
#: AKModel/views.py:158 #: AKModel/views.py:161
msgid "AK Wiki Export" msgid "AK Wiki Export"
msgstr "AK-Wiki-Export" msgstr "AK-Wiki-Export"
#: AKModel/views.py:178 #: AKModel/views.py:181
msgid "AK Orga Messages successfully deleted" msgid "AK Orga Messages successfully deleted"
msgstr "AK-Organachrichten erfolgreich gelöscht" msgstr "AK-Organachrichten erfolgreich gelöscht"
#: AKModel/views.py:195
msgid "Wishes"
msgstr "Wünsche"
#~ msgid "Confirm" #~ msgid "Confirm"
#~ msgstr "Bestätigen" #~ msgstr "Bestätigen"
......
...@@ -264,7 +264,7 @@ class AK(models.Model): ...@@ -264,7 +264,7 @@ class AK(models.Model):
@property @property
def durations_list(self): 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 @property
def wish(self): def wish(self):
...@@ -342,7 +342,7 @@ class AKSlot(models.Model): ...@@ -342,7 +342,7 @@ class AKSlot(models.Model):
Display duration of slot in format hours:minutes, e.g. 1.5 -> "1:30" Display duration of slot in format hours:minutes, e.g. 1.5 -> "1:30"
""" """
hours, minutes = divmod(self.duration * 60, 60) hours, minutes = divmod(self.duration * 60, 60)
return f"{hours}:{minutes:2.0f}" return f"{hours}:{minutes:02.0f}"
@property @property
def start_simplified(self): 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 @@ ...@@ -78,6 +78,8 @@
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' 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 %} {% endif %}
<h3 class="block-header">{% trans "Requirements" %}</h3> <h3 class="block-header">{% trans "Requirements" %}</h3>
......
from django.contrib import admin, messages from django.contrib import admin, messages
from django.contrib.admin.views.decorators import staff_member_required
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy from django.urls import reverse_lazy
...@@ -6,6 +7,8 @@ from django.utils.translation import gettext_lazy as _ ...@@ -6,6 +7,8 @@ from django.utils.translation import gettext_lazy as _
from django.views.generic import TemplateView, DetailView, ListView, DeleteView 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 AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage
from AKModel.serializers import AKSerializer, AKSlotSerializer, RoomSerializer, AKTrackSerializer, AKCategorySerializer, \ from AKModel.serializers import AKSerializer, AKSlotSerializer, RoomSerializer, AKTrackSerializer, AKCategorySerializer, \
...@@ -177,3 +180,20 @@ class AKMessageDeleteView(AdminViewMixin, DeleteView): ...@@ -177,3 +180,20 @@ class AKMessageDeleteView(AdminViewMixin, DeleteView):
self.get_orga_messages_for_event(self.get_object()).delete() self.get_orga_messages_for_event(self.get_object()).delete()
messages.add_message(self.request, messages.SUCCESS, _("AK Orga Messages successfully deleted")) 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})) 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 = [ ...@@ -51,6 +51,7 @@ INSTALLED_APPS = [
'rest_framework', 'rest_framework',
'simple_history', 'simple_history',
'registration', 'registration',
'django_tex',
] ]
MIDDLEWARE = [ MIDDLEWARE = [
...@@ -84,6 +85,14 @@ TEMPLATES = [ ...@@ -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' WSGI_APPLICATION = 'AKPlanning.wsgi.application'
...@@ -136,6 +145,8 @@ LANGUAGES = [ ...@@ -136,6 +145,8 @@ LANGUAGES = [
INTERNAL_IPS = ['127.0.0.1', '::1'] INTERNAL_IPS = ['127.0.0.1', '::1']
LATEX_INTERPRETER = 'pdflatex'
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/ # 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 ...@@ -12,6 +12,7 @@ AKPlanning has two types of requirements: System requirements are dependent on o
* Python 3.7 incl. development tools * Python 3.7 incl. development tools
* Virtualenv * Virtualenv
* pdflatex & beamer class (`texlive-latex-base texlive-latex-recommended texlive-latex-extra texlive-fonts-extra`)
* for production using uwsgi: * for production using uwsgi:
* C compiler e.g. gcc * C compiler e.g. gcc
* uwsgi * uwsgi
......
...@@ -7,4 +7,5 @@ djangorestframework==3.12.2 ...@@ -7,4 +7,5 @@ djangorestframework==3.12.2
django-simple-history==2.12.0 django-simple-history==2.12.0
django-registration-redux==2.9 django-registration-redux==2.9
django-debug-toolbar==3.2 django-debug-toolbar==3.2
django-tex==1.1.8.post1
mysqlclient==2.0.3 # for production deployment mysqlclient==2.0.3 # for production deployment