diff --git a/AKModel/admin.py b/AKModel/admin.py index ae8da12f3a60f47c64cb21b6611ead2b7b099059..39fc678db42611d3b2192a006179a46524805f6a 100644 --- a/AKModel/admin.py +++ b/AKModel/admin.py @@ -1,8 +1,9 @@ from django import forms from django.apps import apps -from django.contrib import admin -from django.contrib.admin import SimpleListFilter, RelatedFieldListFilter +from django.contrib import admin, messages +from django.contrib.admin import SimpleListFilter, RelatedFieldListFilter, action from django.db.models import Count, F +from django.db.models.functions import Now from django.shortcuts import render, redirect from django.urls import reverse_lazy from django.utils import timezone @@ -31,11 +32,12 @@ class EventRelatedFieldListFilter(RelatedFieldListFilter): @admin.register(Event) class EventAdmin(admin.ModelAdmin): model = Event - list_display = ['name', 'status_url', 'place', 'start', 'end', 'active'] + list_display = ['name', 'status_url', 'place', 'start', 'end', 'active', 'plan_hidden'] list_filter = ['active'] list_editable = ['active'] ordering = ['-start'] - readonly_fields = ['status_url'] + readonly_fields = ['status_url', 'plan_hidden', 'plan_published_at'] + actions = ['publish', 'unpublish'] def add_view(self, request, form_url='', extra_context=None): # Always use wizard to create new events (the built-in form wouldn't work anyways since the timezone cannot @@ -62,6 +64,16 @@ class EventAdmin(admin.ModelAdmin): timezone.activate(obj.timezone) return super().get_form(request, obj, change, **kwargs) + @action(description=_('Publish plan')) + def publish(self, request, queryset): + queryset.update(plan_published_at=Now(), plan_hidden=False) + self.message_user(request, _('Plan published'), messages.SUCCESS) + + @action(description=_('Unpublish plan')) + def unpublish(self, request, queryset): + queryset.update(plan_published_at=None, plan_hidden=True) + self.message_user(request, _('Plan unpublished'), messages.SUCCESS) + @admin.register(AKOwner) class AKOwnerAdmin(admin.ModelAdmin): diff --git a/AKModel/forms.py b/AKModel/forms.py index 0f897cd5dff24c0fe7c8d7e492e0f9616cb74dbc..e756c611f8f97e693ea739cf5e2ba8f992fbcb6b 100644 --- a/AKModel/forms.py +++ b/AKModel/forms.py @@ -29,6 +29,7 @@ class NewEventWizardSettingsForm(forms.ModelForm): 'start': DateTimePickerInput(options={"format": "YYYY-MM-DD HH:mm"}), 'end': DateTimePickerInput(options={"format": "YYYY-MM-DD HH:mm"}), 'reso_deadline': DateTimePickerInput(options={"format": "YYYY-MM-DD HH:mm"}), + 'plan_hidden': forms.HiddenInput(), } diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po index 6e3bc74de86b2df3c5f0acc1e3d65fcfe5fbf0bf..3cb7485906c5752a2f0f033c53ea3bc641aaad89 100644 --- a/AKModel/locale/de_DE/LC_MESSAGES/django.po +++ b/AKModel/locale/de_DE/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-08-17 22:41+0200\n" +"POT-Creation-Date: 2022-10-15 12:52+0200\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,7 +11,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: .\AKModel\admin.py:56 .\AKModel\admin.py:58 +#: .\AKModel\admin.py:58 .\AKModel\admin.py:60 #: .\AKModel\templates\admin\AKModel\event_wizard\activate.html:32 #: .\AKModel\templates\admin\AKModel\event_wizard\created_prepare_import.html:48 #: .\AKModel\templates\admin\AKModel\event_wizard\finish.html:21 @@ -21,23 +21,39 @@ msgstr "" msgid "Status" msgstr "Status" -#: .\AKModel\admin.py:132 +#: .\AKModel\admin.py:67 +msgid "Publish plan" +msgstr "Plan veröffentlichen" + +#: .\AKModel\admin.py:70 +msgid "Plan published" +msgstr "Plan veröffentlicht" + +#: .\AKModel\admin.py:72 +msgid "Unpublish plan" +msgstr "Plan verbergen" + +#: .\AKModel\admin.py:75 +msgid "Plan unpublished" +msgstr "Plan verborgen" + +#: .\AKModel\admin.py:144 msgid "Wish" msgstr "AK-Wunsch" -#: .\AKModel\admin.py:138 +#: .\AKModel\admin.py:150 msgid "Is wish" msgstr "Ist ein Wunsch" -#: .\AKModel\admin.py:139 +#: .\AKModel\admin.py:151 msgid "Is not a wish" msgstr "Ist kein Wunsch" -#: .\AKModel\admin.py:185 +#: .\AKModel\admin.py:197 msgid "Export to wiki syntax" msgstr "In Wiki-Syntax exportieren" -#: .\AKModel\admin.py:279 +#: .\AKModel\admin.py:291 msgid "AK Details" msgstr "AK-Details" @@ -65,17 +81,17 @@ msgstr "Die eingegebene Verfügbarkeit enthält ein ungültiges Datum." msgid "Please fill in your availabilities!" msgstr "Bitte Verfügbarkeiten eintragen!" -#: .\AKModel\availability\models.py:38 .\AKModel\models.py:53 -#: .\AKModel\models.py:117 .\AKModel\models.py:172 .\AKModel\models.py:191 -#: .\AKModel\models.py:223 .\AKModel\models.py:277 .\AKModel\models.py:343 -#: .\AKModel\models.py:376 .\AKModel\models.py:447 .\AKModel\models.py:488 +#: .\AKModel\availability\models.py:38 .\AKModel\models.py:55 +#: .\AKModel\models.py:119 .\AKModel\models.py:174 .\AKModel\models.py:193 +#: .\AKModel\models.py:225 .\AKModel\models.py:279 .\AKModel\models.py:345 +#: .\AKModel\models.py:378 .\AKModel\models.py:449 .\AKModel\models.py:490 msgid "Event" msgstr "Event" -#: .\AKModel\availability\models.py:39 .\AKModel\models.py:118 -#: .\AKModel\models.py:173 .\AKModel\models.py:192 .\AKModel\models.py:224 -#: .\AKModel\models.py:278 .\AKModel\models.py:344 .\AKModel\models.py:377 -#: .\AKModel\models.py:448 .\AKModel\models.py:489 +#: .\AKModel\availability\models.py:39 .\AKModel\models.py:120 +#: .\AKModel\models.py:175 .\AKModel\models.py:194 .\AKModel\models.py:226 +#: .\AKModel\models.py:280 .\AKModel\models.py:346 .\AKModel\models.py:379 +#: .\AKModel\models.py:450 .\AKModel\models.py:491 msgid "Associated event" msgstr "Zugehöriges Event" @@ -87,8 +103,8 @@ msgstr "Person" msgid "Person whose availability this is" msgstr "Person deren Verfügbarkeit hier abgebildet wird" -#: .\AKModel\availability\models.py:56 .\AKModel\models.py:347 -#: .\AKModel\models.py:366 .\AKModel\models.py:497 +#: .\AKModel\availability\models.py:56 .\AKModel\models.py:349 +#: .\AKModel\models.py:368 .\AKModel\models.py:499 msgid "Room" msgstr "Raum" @@ -96,8 +112,8 @@ msgstr "Raum" msgid "Room whose availability this is" msgstr "Raum dessen Verfügbarkeit hier abgebildet wird" -#: .\AKModel\availability\models.py:65 .\AKModel\models.py:283 -#: .\AKModel\models.py:365 .\AKModel\models.py:442 +#: .\AKModel\availability\models.py:65 .\AKModel\models.py:285 +#: .\AKModel\models.py:367 .\AKModel\models.py:444 msgid "AK" msgstr "AK" @@ -105,8 +121,8 @@ msgstr "AK" msgid "AK whose availability this is" msgstr "Verfügbarkeiten" -#: .\AKModel\availability\models.py:74 .\AKModel\models.py:176 -#: .\AKModel\models.py:503 +#: .\AKModel\availability\models.py:74 .\AKModel\models.py:178 +#: .\AKModel\models.py:505 msgid "AK Category" msgstr "AK-Kategorie" @@ -118,26 +134,26 @@ msgstr "AK-Kategorie, deren Verfügbarkeit hier abgebildet wird" msgid "Availabilities" msgstr "Verfügbarkeiten" -#: .\AKModel\forms.py:38 +#: .\AKModel\forms.py:39 msgid "Copy ak requirements and ak categories of existing event" msgstr "AK-Anforderungen und AK-Kategorien eines existierenden Events kopieren" -#: .\AKModel\forms.py:39 +#: .\AKModel\forms.py:40 msgid "You can choose what to copy in the next step" msgstr "" "Im nächsten Schritt kann ausgewählt werden, was genau kopiert werden soll" -#: .\AKModel\forms.py:47 +#: .\AKModel\forms.py:48 msgid "Copy ak categories" msgstr "AK-Kategorien kopieren" -#: .\AKModel\forms.py:54 +#: .\AKModel\forms.py:55 msgid "Copy ak requirements" msgstr "AK-Anforderungen kopieren" -#: .\AKModel\models.py:17 .\AKModel\models.py:164 .\AKModel\models.py:188 -#: .\AKModel\models.py:207 .\AKModel\models.py:221 .\AKModel\models.py:239 -#: .\AKModel\models.py:335 +#: .\AKModel\models.py:17 .\AKModel\models.py:166 .\AKModel\models.py:190 +#: .\AKModel\models.py:209 .\AKModel\models.py:223 .\AKModel\models.py:241 +#: .\AKModel\models.py:337 msgid "Name" msgstr "Name" @@ -235,31 +251,39 @@ msgstr "Plan verborgen" msgid "Hides plan for non-staff users" msgstr "Verbirgt den Plan für Nutzer*innen ohne erweiterte Rechte" +#: .\AKModel\models.py:42 +msgid "Plan published at" +msgstr "Plan veröffentlicht am/um" + #: .\AKModel\models.py:43 +msgid "Timestamp at which the plan was published" +msgstr "Zeitpunkt, zu dem der Plan veröffentlicht wurde" + +#: .\AKModel\models.py:45 msgid "Base URL" msgstr "URL-Prefix" -#: .\AKModel\models.py:43 +#: .\AKModel\models.py:45 msgid "Prefix for wiki link construction" msgstr "Prefix für die automatische Generierung von Wiki-Links" -#: .\AKModel\models.py:44 +#: .\AKModel\models.py:46 msgid "Wiki Export Template Name" msgstr "Wiki-Export Templatename" -#: .\AKModel\models.py:45 +#: .\AKModel\models.py:47 msgid "Default Slot Length" msgstr "Standardslotlänge" -#: .\AKModel\models.py:46 +#: .\AKModel\models.py:48 msgid "Default length in hours that is assumed for AKs in this event." msgstr "Standardlänge von Slots (in Stunden) für dieses Event" -#: .\AKModel\models.py:48 +#: .\AKModel\models.py:50 msgid "Contact email address" msgstr "E-Mail Kontaktadresse" -#: .\AKModel\models.py:50 +#: .\AKModel\models.py:52 msgid "" "An email address that is displayed on every page and can be used for all " "kinds of questions" @@ -267,75 +291,75 @@ msgstr "" "Eine Mailadresse die auf jeder Seite angezeigt wird und für alle Arten von " "Fragen genutzt werden kann" -#: .\AKModel\models.py:54 +#: .\AKModel\models.py:56 msgid "Events" msgstr "Events" -#: .\AKModel\models.py:112 +#: .\AKModel\models.py:114 msgid "Nickname" msgstr "Spitzname" -#: .\AKModel\models.py:112 +#: .\AKModel\models.py:114 msgid "Name to identify an AK owner by" msgstr "Name, durch den eine AK-Leitung identifiziert wird" -#: .\AKModel\models.py:113 +#: .\AKModel\models.py:115 msgid "Slug" msgstr "Slug" -#: .\AKModel\models.py:113 +#: .\AKModel\models.py:115 msgid "Slug for URL generation" msgstr "Slug für URL-Generierung" -#: .\AKModel\models.py:114 +#: .\AKModel\models.py:116 msgid "Institution" msgstr "Instutution" -#: .\AKModel\models.py:114 +#: .\AKModel\models.py:116 msgid "Uni etc." msgstr "Universität o.ä." -#: .\AKModel\models.py:115 .\AKModel\models.py:248 +#: .\AKModel\models.py:117 .\AKModel\models.py:250 msgid "Web Link" msgstr "Internet Link" -#: .\AKModel\models.py:115 +#: .\AKModel\models.py:117 msgid "Link to Homepage" msgstr "Link zu Homepage oder Webseite" -#: .\AKModel\models.py:121 .\AKModel\models.py:496 +#: .\AKModel\models.py:123 .\AKModel\models.py:498 msgid "AK Owner" msgstr "AK-Leitung" -#: .\AKModel\models.py:122 +#: .\AKModel\models.py:124 msgid "AK Owners" msgstr "AK-Leitungen" -#: .\AKModel\models.py:164 +#: .\AKModel\models.py:166 msgid "Name of the AK Category" msgstr "Name der AK-Kategorie" -#: .\AKModel\models.py:165 .\AKModel\models.py:189 +#: .\AKModel\models.py:167 .\AKModel\models.py:191 msgid "Color" msgstr "Farbe" -#: .\AKModel\models.py:165 .\AKModel\models.py:189 +#: .\AKModel\models.py:167 .\AKModel\models.py:191 msgid "Color for displaying" msgstr "Farbe für die Anzeige" -#: .\AKModel\models.py:166 .\AKModel\models.py:242 +#: .\AKModel\models.py:168 .\AKModel\models.py:244 msgid "Description" msgstr "Beschreibung" -#: .\AKModel\models.py:167 +#: .\AKModel\models.py:169 msgid "Short description of this AK Category" msgstr "Beschreibung der AK-Kategorie" -#: .\AKModel\models.py:168 +#: .\AKModel\models.py:170 msgid "Present by default" msgstr "Defaultmäßig präsentieren" -#: .\AKModel\models.py:170 +#: .\AKModel\models.py:172 msgid "" "Present AKs of this category by default if AK owner did not specify whether " "this AK should be presented?" @@ -343,152 +367,152 @@ msgstr "" "AKs dieser Kategorie standardmäßig vorstellen, wenn die Leitungen das für " "ihren AK nicht explizit spezifiziert haben?" -#: .\AKModel\models.py:177 +#: .\AKModel\models.py:179 msgid "AK Categories" msgstr "AK-Kategorien" -#: .\AKModel\models.py:188 +#: .\AKModel\models.py:190 msgid "Name of the AK Track" msgstr "Name des AK-Tracks" -#: .\AKModel\models.py:195 +#: .\AKModel\models.py:197 msgid "AK Track" msgstr "AK-Track" -#: .\AKModel\models.py:196 +#: .\AKModel\models.py:198 msgid "AK Tracks" msgstr "AK-Tracks" -#: .\AKModel\models.py:207 +#: .\AKModel\models.py:209 msgid "Name of the AK Tag" msgstr "Name das AK-Tags" -#: .\AKModel\models.py:210 +#: .\AKModel\models.py:212 msgid "AK Tag" msgstr "AK-Tag" -#: .\AKModel\models.py:211 +#: .\AKModel\models.py:213 msgid "AK Tags" msgstr "AK-Tags" -#: .\AKModel\models.py:221 +#: .\AKModel\models.py:223 msgid "Name of the Requirement" msgstr "Name der Anforderung" -#: .\AKModel\models.py:227 .\AKModel\models.py:500 +#: .\AKModel\models.py:229 .\AKModel\models.py:502 msgid "AK Requirement" msgstr "AK-Anforderung" -#: .\AKModel\models.py:228 +#: .\AKModel\models.py:230 msgid "AK Requirements" msgstr "AK-Anforderungen" -#: .\AKModel\models.py:239 +#: .\AKModel\models.py:241 msgid "Name of the AK" msgstr "Name des AKs" -#: .\AKModel\models.py:240 +#: .\AKModel\models.py:242 msgid "Short Name" msgstr "Kurzer Name" -#: .\AKModel\models.py:241 +#: .\AKModel\models.py:243 msgid "Name displayed in the schedule" msgstr "Name zur Anzeige im AK-Plan" -#: .\AKModel\models.py:242 +#: .\AKModel\models.py:244 msgid "Description of the AK" msgstr "Beschreibung des AKs" -#: .\AKModel\models.py:244 +#: .\AKModel\models.py:246 msgid "Owners" msgstr "Leitungen" -#: .\AKModel\models.py:245 +#: .\AKModel\models.py:247 msgid "Those organizing the AK" msgstr "Menschen, die den AK organisieren und halten" -#: .\AKModel\models.py:248 +#: .\AKModel\models.py:250 msgid "Link to wiki page" msgstr "Link zur Wiki Seite" -#: .\AKModel\models.py:249 +#: .\AKModel\models.py:251 msgid "Protocol Link" msgstr "Protokolllink" -#: .\AKModel\models.py:249 +#: .\AKModel\models.py:251 msgid "Link to protocol" msgstr "Link zum Protokoll" -#: .\AKModel\models.py:251 +#: .\AKModel\models.py:253 msgid "Category" msgstr "Kategorie" -#: .\AKModel\models.py:252 +#: .\AKModel\models.py:254 msgid "Category of the AK" msgstr "Kategorie des AKs" -#: .\AKModel\models.py:253 +#: .\AKModel\models.py:255 msgid "Tags" msgstr "Tags" -#: .\AKModel\models.py:253 +#: .\AKModel\models.py:255 msgid "Tags provided by owners" msgstr "Tags, die durch die AK-Leitung vergeben wurden" -#: .\AKModel\models.py:254 +#: .\AKModel\models.py:256 msgid "Track" msgstr "Track" -#: .\AKModel\models.py:255 +#: .\AKModel\models.py:257 msgid "Track the AK belongs to" msgstr "Track zu dem der AK gehört" -#: .\AKModel\models.py:257 +#: .\AKModel\models.py:259 msgid "Resolution Intention" msgstr "Resolutionsabsicht" -#: .\AKModel\models.py:258 +#: .\AKModel\models.py:260 msgid "Intends to submit a resolution" msgstr "Beabsichtigt eine Resolution einzureichen" -#: .\AKModel\models.py:259 +#: .\AKModel\models.py:261 msgid "Present this AK" msgstr "AK präsentieren" -#: .\AKModel\models.py:260 +#: .\AKModel\models.py:262 msgid "Present results of this AK" msgstr "Die Ergebnisse dieses AKs vorstellen" -#: .\AKModel\models.py:262 .\AKModel\templates\admin\AKModel\status.html:97 +#: .\AKModel\models.py:264 .\AKModel\templates\admin\AKModel\status.html:97 msgid "Requirements" msgstr "Anforderungen" -#: .\AKModel\models.py:263 +#: .\AKModel\models.py:265 msgid "AK's Requirements" msgstr "Anforderungen des AKs" -#: .\AKModel\models.py:265 +#: .\AKModel\models.py:267 msgid "Conflicting AKs" msgstr "AK-Konflikte" -#: .\AKModel\models.py:266 +#: .\AKModel\models.py:268 msgid "AKs that conflict and thus must not take place at the same time" msgstr "" "AKs, die Konflikte haben und deshalb nicht gleichzeitig stattfinden dürfen" -#: .\AKModel\models.py:267 +#: .\AKModel\models.py:269 msgid "Prerequisite AKs" msgstr "Vorausgesetzte AKs" -#: .\AKModel\models.py:268 +#: .\AKModel\models.py:270 msgid "AKs that should precede this AK in the schedule" msgstr "AKs die im AK-Plan vor diesem AK stattfinden müssen" -#: .\AKModel\models.py:270 +#: .\AKModel\models.py:272 msgid "Organizational Notes" msgstr "Notizen zur Organisation" -#: .\AKModel\models.py:271 +#: .\AKModel\models.py:273 #, fuzzy #| msgid "" #| "Notes to organizers. These are public. For private notes, please send an " @@ -502,258 +526,258 @@ msgstr "" "Anmerkungen bitte den Button für Direktnachrichten verwenden (nach dem " "Anlegen/Bearbeiten)." -#: .\AKModel\models.py:273 +#: .\AKModel\models.py:275 msgid "Interest" msgstr "Interesse" -#: .\AKModel\models.py:273 +#: .\AKModel\models.py:275 msgid "Expected number of people" msgstr "Erwartete Personenzahl" -#: .\AKModel\models.py:274 +#: .\AKModel\models.py:276 msgid "Interest Counter" msgstr "Interessenszähler" -#: .\AKModel\models.py:275 +#: .\AKModel\models.py:277 msgid "People who have indicated interest online" msgstr "Anzahl Personen, die online Interesse bekundet haben" -#: .\AKModel\models.py:284 .\AKModel\models.py:491 +#: .\AKModel\models.py:286 .\AKModel\models.py:493 #: .\AKModel\templates\admin\AKModel\status.html:49 #: .\AKModel\templates\admin\AKModel\status.html:56 .\AKModel\views.py:337 msgid "AKs" msgstr "AKs" -#: .\AKModel\models.py:335 +#: .\AKModel\models.py:337 msgid "Name or number of the room" msgstr "Name oder Nummer des Raums" -#: .\AKModel\models.py:336 +#: .\AKModel\models.py:338 msgid "Location" msgstr "Ort" -#: .\AKModel\models.py:337 +#: .\AKModel\models.py:339 msgid "Name or number of the location" msgstr "Name oder Nummer des Ortes" -#: .\AKModel\models.py:338 +#: .\AKModel\models.py:340 msgid "Capacity" msgstr "Kapazität" -#: .\AKModel\models.py:339 +#: .\AKModel\models.py:341 msgid "Maximum number of people (-1 for unlimited)." msgstr "Maximale Personenzahl (-1 wenn unbeschränkt)." -#: .\AKModel\models.py:340 +#: .\AKModel\models.py:342 msgid "Properties" msgstr "Eigenschaften" -#: .\AKModel\models.py:341 +#: .\AKModel\models.py:343 msgid "AK requirements fulfilled by the room" msgstr "AK-Anforderungen, die dieser Raum erfüllt" -#: .\AKModel\models.py:348 .\AKModel\templates\admin\AKModel\status.html:33 +#: .\AKModel\models.py:350 .\AKModel\templates\admin\AKModel\status.html:33 msgid "Rooms" msgstr "Räume" -#: .\AKModel\models.py:365 +#: .\AKModel\models.py:367 msgid "AK being mapped" msgstr "AK, der zugeordnet wird" -#: .\AKModel\models.py:367 +#: .\AKModel\models.py:369 msgid "Room the AK will take place in" msgstr "Raum in dem der AK stattfindet" -#: .\AKModel\models.py:368 +#: .\AKModel\models.py:370 msgid "Slot Begin" msgstr "Beginn des Slots" -#: .\AKModel\models.py:368 +#: .\AKModel\models.py:370 msgid "Time and date the slot begins" msgstr "Zeit und Datum zu der der AK beginnt" -#: .\AKModel\models.py:370 +#: .\AKModel\models.py:372 msgid "Duration" msgstr "Dauer" -#: .\AKModel\models.py:371 +#: .\AKModel\models.py:373 msgid "Length in hours" msgstr "Länge in Stunden" -#: .\AKModel\models.py:373 +#: .\AKModel\models.py:375 msgid "Scheduling fixed" msgstr "Planung fix" -#: .\AKModel\models.py:374 +#: .\AKModel\models.py:376 msgid "Length and time of this AK should not be changed" msgstr "Dauer und Zeit dieses AKs sollten nicht verändert werden" -#: .\AKModel\models.py:379 +#: .\AKModel\models.py:381 msgid "Last update" msgstr "Letzte Aktualisierung" -#: .\AKModel\models.py:382 +#: .\AKModel\models.py:384 msgid "AK Slot" msgstr "AK-Slot" -#: .\AKModel\models.py:383 .\AKModel\models.py:493 +#: .\AKModel\models.py:385 .\AKModel\models.py:495 msgid "AK Slots" msgstr "AK-Slot" -#: .\AKModel\models.py:405 .\AKModel\models.py:414 +#: .\AKModel\models.py:407 .\AKModel\models.py:416 msgid "Not scheduled yet" msgstr "Noch nicht geplant" -#: .\AKModel\models.py:443 +#: .\AKModel\models.py:445 msgid "AK this message belongs to" msgstr "AK zu dem die Nachricht gehört" -#: .\AKModel\models.py:444 +#: .\AKModel\models.py:446 msgid "Message text" msgstr "Nachrichtentext" -#: .\AKModel\models.py:445 +#: .\AKModel\models.py:447 msgid "Message to the organizers. This is not publicly visible." msgstr "" "Nachricht an die Organisator*innen. Diese ist nicht öffentlich sichtbar." -#: .\AKModel\models.py:451 +#: .\AKModel\models.py:453 msgid "AK Orga Message" msgstr "AK-Organachricht" -#: .\AKModel\models.py:452 +#: .\AKModel\models.py:454 msgid "AK Orga Messages" msgstr "AK-Organachrichten" -#: .\AKModel\models.py:461 +#: .\AKModel\models.py:463 msgid "Constraint Violation" msgstr "Constraintverletzung" -#: .\AKModel\models.py:462 .\AKModel\templates\admin\AKModel\status.html:79 +#: .\AKModel\models.py:464 .\AKModel\templates\admin\AKModel\status.html:79 msgid "Constraint Violations" msgstr "Constraintverletzungen" -#: .\AKModel\models.py:466 +#: .\AKModel\models.py:468 msgid "Owner has two parallel slots" msgstr "Leitung hat zwei Slots parallel" -#: .\AKModel\models.py:467 +#: .\AKModel\models.py:469 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:468 +#: .\AKModel\models.py:470 msgid "Room has two AK slots scheduled at the same time" msgstr "Raum hat zwei AK Slots gleichzeitig" -#: .\AKModel\models.py:469 +#: .\AKModel\models.py:471 msgid "Room does not satisfy the requirement of the scheduled AK" msgstr "Room erfüllt die Anforderungen des platzierten AKs nicht" -#: .\AKModel\models.py:470 +#: .\AKModel\models.py:472 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" -#: .\AKModel\models.py:471 +#: .\AKModel\models.py:473 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:473 +#: .\AKModel\models.py:475 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" -#: .\AKModel\models.py:474 +#: .\AKModel\models.py:476 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:475 +#: .\AKModel\models.py:477 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:476 +#: .\AKModel\models.py:478 msgid "Room does not have enough space for interest in scheduled AK Slot" msgstr "Room hat nicht genug Platz für das Interesse am geplanten AK-Slot" -#: .\AKModel\models.py:477 +#: .\AKModel\models.py:479 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:480 +#: .\AKModel\models.py:482 msgid "Warning" msgstr "Warnung" -#: .\AKModel\models.py:481 +#: .\AKModel\models.py:483 msgid "Violation" msgstr "Verletzung" -#: .\AKModel\models.py:483 +#: .\AKModel\models.py:485 msgid "Type" msgstr "Art" -#: .\AKModel\models.py:484 +#: .\AKModel\models.py:486 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:485 +#: .\AKModel\models.py:487 msgid "Level" msgstr "Level" -#: .\AKModel\models.py:486 +#: .\AKModel\models.py:488 msgid "Severity level of the violation" msgstr "Schweregrad der Verletzung" -#: .\AKModel\models.py:492 +#: .\AKModel\models.py:494 msgid "AK(s) belonging to this constraint" msgstr "AK(s), die zu diesem Constraint gehören" -#: .\AKModel\models.py:494 +#: .\AKModel\models.py:496 msgid "AK Slot(s) belonging to this constraint" msgstr "AK Slot(s), die zu diesem Constraint gehören" -#: .\AKModel\models.py:496 +#: .\AKModel\models.py:498 msgid "AK Owner belonging to this constraint" msgstr "AK Leitung(en), die zu diesem Constraint gehören" -#: .\AKModel\models.py:498 +#: .\AKModel\models.py:500 msgid "Room belonging to this constraint" msgstr "Raum, der zu diesem Constraint gehört" -#: .\AKModel\models.py:501 +#: .\AKModel\models.py:503 msgid "AK Requirement belonging to this constraint" msgstr "AK Anforderung, die zu diesem Constraint gehört" -#: .\AKModel\models.py:503 +#: .\AKModel\models.py:505 msgid "AK Category belonging to this constraint" msgstr "AK Kategorie, di zu diesem Constraint gehört" -#: .\AKModel\models.py:505 +#: .\AKModel\models.py:507 msgid "Comment" msgstr "Kommentar" -#: .\AKModel\models.py:505 +#: .\AKModel\models.py:507 msgid "Comment or further details for this violation" msgstr "Kommentar oder weitere Details zu dieser Vereletzung" -#: .\AKModel\models.py:508 +#: .\AKModel\models.py:510 msgid "Timestamp" msgstr "Timestamp" -#: .\AKModel\models.py:508 +#: .\AKModel\models.py:510 msgid "Time of creation" msgstr "Zeitpunkt der ERstellung" -#: .\AKModel\models.py:509 +#: .\AKModel\models.py:511 msgid "Manually Resolved" msgstr "Manuell behoben" -#: .\AKModel\models.py:510 +#: .\AKModel\models.py:512 msgid "Mark this violation manually as resolved" msgstr "Markiere diese Verletzung manuell als behoben" -#: .\AKModel\models.py:537 +#: .\AKModel\models.py:539 #: .\AKModel\templates\admin\AKModel\requirements_overview.html:27 msgid "Details" msgstr "Details" @@ -967,15 +991,15 @@ msgstr "Alle Nachrichten löschen" msgid "Active Events" msgstr "Aktive Events" -#: .\AKModel\templates\admin\login.html:23 +#: .\AKModel\templates\admin\login.html:8 msgid "Please correct the error below." msgstr "Bitte den untenstehenden Fehler korrigieren." -#: .\AKModel\templates\admin\login.html:23 +#: .\AKModel\templates\admin\login.html:8 msgid "Please correct the errors below." msgstr "Bitte die unten stehenden Fehler korrigieren." -#: .\AKModel\templates\admin\login.html:39 +#: .\AKModel\templates\admin\login.html:24 #, python-format msgid "" "You are authenticated as %(username)s, but are not authorized to access this " @@ -984,15 +1008,15 @@ msgstr "" "Du bist als %(username)s eingeloggt, aber bist nicht authorisiert, auf diese " "Seite zuzugreifen. Möchtest du dich mit einem anderem Account einloggen?" -#: .\AKModel\templates\admin\login.html:59 +#: .\AKModel\templates\admin\login.html:44 msgid "Forgotten your password or username?" msgstr "Passwort oder Username vergessen" -#: .\AKModel\templates\admin\login.html:63 +#: .\AKModel\templates\admin\login.html:48 msgid "Log in" msgstr "Login" -#: .\AKModel\templates\admin\login.html:66 +#: .\AKModel\templates\admin\login.html:51 msgid "Register" msgstr "Registrieren" diff --git a/AKModel/migrations/0053_plan_published_at.py b/AKModel/migrations/0053_plan_published_at.py new file mode 100644 index 0000000000000000000000000000000000000000..80e8eb8e463b6a1c63797b9326fb117ef166c836 --- /dev/null +++ b/AKModel/migrations/0053_plan_published_at.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.16 on 2022-10-15 10:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('AKModel', '0052_history_upgrade'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='plan_published_at', + field=models.DateTimeField(blank=True, help_text='Timestamp at which the plan was published', null=True, verbose_name='Plan published at'), + ), + ] diff --git a/AKModel/models.py b/AKModel/models.py index 7f82cbd6ec510736265d6238a39417327c936675..a9b2089d936205fb92bac21410362d65844b888b 100644 --- a/AKModel/models.py +++ b/AKModel/models.py @@ -39,6 +39,8 @@ class Event(models.Model): active = models.BooleanField(verbose_name=_('Active State'), help_text=_('Marks currently active events')) plan_hidden = models.BooleanField(verbose_name=_('Plan Hidden'), help_text=_('Hides plan for non-staff users'), default=True) + plan_published_at = models.DateTimeField(verbose_name=_('Plan published at'), blank=True, null=True, + help_text=_('Timestamp at which the plan was published')) base_url = models.URLField(verbose_name=_("Base URL"), help_text=_("Prefix for wiki link construction"), blank=True) wiki_export_template_name = models.CharField(verbose_name=_("Wiki Export Template Name"), blank=True, max_length=50) diff --git a/AKPlan/templatetags/tags_AKPlan.py b/AKPlan/templatetags/tags_AKPlan.py index c4d5b32bf0d704703680eb3b74f96fdcad403e4a..8b30bfabd34b501a858351d6b1e384b4fe39e5bb 100644 --- a/AKPlan/templatetags/tags_AKPlan.py +++ b/AKPlan/templatetags/tags_AKPlan.py @@ -11,6 +11,11 @@ register = template.Library() @register.filter def highlight_change_colors(akslot): + # Do not highlight in preview mode or when changes occurred before the plan was published + if akslot.event.plan_hidden or (akslot.event.plan_published_at is not None + and akslot.event.plan_published_at > akslot.updated): + return akslot.ak.category.color + seconds_since_update = akslot.seconds_since_last_update # Last change long ago? Use default color