diff --git a/AKDashboard/locale/de_DE/LC_MESSAGES/django.po b/AKDashboard/locale/de_DE/LC_MESSAGES/django.po index 0e9393ffc125f57b0aa770fd134a8b884858c5ed..fef5cc127efa9b644fcb7160e7f16465ebf7088b 100644 --- a/AKDashboard/locale/de_DE/LC_MESSAGES/django.po +++ b/AKDashboard/locale/de_DE/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-29 22:48+0000\n" +"POT-Creation-Date: 2021-10-29 09: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" @@ -116,7 +116,7 @@ msgstr "AK \"%(ak)s\" bearbeitet." msgid "AK \"%(ak)s\" deleted." msgstr "AK \"%(ak)s\" gelöscht." -#: AKDashboard/views.py:58 +#: AKDashboard/views.py:61 #, python-format msgid "AK \"%(ak)s\" (re-)scheduled." msgstr "AK \"%(ak)s\" (um-)geplant." diff --git a/AKModel/admin.py b/AKModel/admin.py index c5d067e6c725cf1cc201626b7d23b741f2f1af66..60e38891370d966aaa1cdaf0d65be789307be572 100644 --- a/AKModel/admin.py +++ b/AKModel/admin.py @@ -159,9 +159,9 @@ class AKAdminForm(forms.ModelForm): @admin.register(AK) class AKAdmin(SimpleHistoryAdmin): model = AK - list_display = ['name', 'short_name', 'category', 'track', 'is_wish', 'interest', 'event'] + list_display = ['name', 'short_name', 'category', 'track', 'is_wish', 'interest', 'interest_counter', 'event'] list_filter = ['category', WishFilter, 'event'] - list_editable = ['short_name', 'track', 'interest'] + list_editable = ['short_name', 'track', 'interest', 'interest_counter'] ordering = ['pk'] actions = ['wiki_export'] form = AKAdminForm diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po index 740582d5542aabdd299b4f9ead47e1e4a0299903..713074cd847e2028f706d5559b797c1cbff1c1fe 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: 2021-10-28 20:45+0000\n" +"POT-Creation-Date: 2021-10-29 09: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" @@ -65,17 +65,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:47 AKModel/models.py:111 -#: AKModel/models.py:165 AKModel/models.py:184 AKModel/models.py:216 -#: AKModel/models.py:270 AKModel/models.py:335 AKModel/models.py:368 -#: AKModel/models.py:478 +#: AKModel/availability/models.py:38 AKModel/models.py:52 AKModel/models.py:116 +#: AKModel/models.py:171 AKModel/models.py:190 AKModel/models.py:222 +#: AKModel/models.py:276 AKModel/models.py:342 AKModel/models.py:375 +#: AKModel/models.py:485 msgid "Event" msgstr "Event" -#: AKModel/availability/models.py:39 AKModel/models.py:112 -#: AKModel/models.py:166 AKModel/models.py:185 AKModel/models.py:217 -#: AKModel/models.py:271 AKModel/models.py:336 AKModel/models.py:369 -#: AKModel/models.py:479 +#: AKModel/availability/models.py:39 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:486 msgid "Associated event" msgstr "Zugehöriges Event" @@ -87,8 +87,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:339 -#: AKModel/models.py:358 AKModel/models.py:487 +#: AKModel/availability/models.py:56 AKModel/models.py:346 +#: AKModel/models.py:365 AKModel/models.py:494 msgid "Room" msgstr "Raum" @@ -96,8 +96,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:276 -#: AKModel/models.py:357 AKModel/models.py:434 +#: AKModel/availability/models.py:65 AKModel/models.py:282 +#: AKModel/models.py:364 AKModel/models.py:441 msgid "AK" msgstr "AK" @@ -105,8 +105,8 @@ msgstr "AK" msgid "AK whose availability this is" msgstr "Verfügbarkeiten" -#: AKModel/availability/models.py:74 AKModel/models.py:169 -#: AKModel/models.py:493 +#: AKModel/availability/models.py:74 AKModel/models.py:175 +#: AKModel/models.py:500 msgid "AK Category" msgstr "AK-Kategorie" @@ -135,9 +135,9 @@ msgstr "AK-Kategorien kopieren" msgid "Copy ak requirements" msgstr "AK-Anforderungen kopieren" -#: AKModel/models.py:16 AKModel/models.py:158 AKModel/models.py:181 -#: AKModel/models.py:200 AKModel/models.py:214 AKModel/models.py:232 -#: AKModel/models.py:328 +#: AKModel/models.py:16 AKModel/models.py:163 AKModel/models.py:187 +#: AKModel/models.py:206 AKModel/models.py:220 AKModel/models.py:238 +#: AKModel/models.py:334 msgid "Name" msgstr "Name" @@ -196,54 +196,70 @@ msgid "When should AKs with intention to submit a resolution be done?" msgstr "Wann sollen AKs mit Resolutionsabsicht stattgefunden haben?" #: AKModel/models.py:30 +msgid "Interest Window Start" +msgstr "Beginn Interessensbekundung" + +#: AKModel/models.py:31 +msgid "Opening time for expression of interest." +msgstr "Öffnungszeitpunkt für die Angabe von Interesse an AKs." + +#: AKModel/models.py:32 +msgid "Interest Window End" +msgstr "Ende Interessensbekundung" + +#: AKModel/models.py:33 +msgid "Closing time for expression of interest." +msgstr "Öffnungszeitpunkt für die Angabe von Interesse an AKs." + +#: AKModel/models.py:35 msgid "Public event" msgstr "Öffentliches Event" -#: AKModel/models.py:31 +#: AKModel/models.py:36 msgid "Show this event on overview page." msgstr "Zeige dieses Event auf der Übersichtseite an" -#: AKModel/models.py:33 +#: AKModel/models.py:38 msgid "Active State" msgstr "Aktiver Status" -#: AKModel/models.py:33 +#: AKModel/models.py:38 msgid "Marks currently active events" msgstr "Markiert aktuell aktive Events" -#: AKModel/models.py:34 +#: AKModel/models.py:39 msgid "Plan Hidden" msgstr "Plan verborgen" -#: AKModel/models.py:34 +#: AKModel/models.py:39 msgid "Hides plan for non-staff users" msgstr "Verbirgt den Plan für Nutzer*innen ohne erweiterte Rechte" -#: AKModel/models.py:37 +#: AKModel/models.py:42 msgid "Base URL" msgstr "URL-Prefix" -#: AKModel/models.py:37 +#: AKModel/models.py:42 msgid "Prefix for wiki link construction" msgstr "Prefix für die automatische Generierung von Wiki-Links" -#: AKModel/models.py:38 +#: AKModel/models.py:43 msgid "Wiki Export Template Name" msgstr "Wiki-Export Templatename" -#: AKModel/models.py:39 +#: AKModel/models.py:44 msgid "Default Slot Length" msgstr "Standardslotlänge" -#: AKModel/models.py:40 +#: AKModel/models.py:45 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:42 +#: AKModel/models.py:47 msgid "Contact email address" msgstr "E-Mail Kontaktadresse" -#: AKModel/models.py:44 +#: AKModel/models.py:49 msgid "" "An email address that is displayed on every page and can be used for all " "kinds of questions" @@ -251,75 +267,75 @@ msgstr "" "Eine Mailadresse die auf jeder Seite angezeigt wird und für alle Arten von " "Fragen genutzt werden kann" -#: AKModel/models.py:48 +#: AKModel/models.py:53 msgid "Events" msgstr "Events" -#: AKModel/models.py:106 +#: AKModel/models.py:111 msgid "Nickname" msgstr "Spitzname" -#: AKModel/models.py:106 +#: AKModel/models.py:111 msgid "Name to identify an AK owner by" msgstr "Name, durch den eine AK-Leitung identifiziert wird" -#: AKModel/models.py:107 +#: AKModel/models.py:112 msgid "Slug" msgstr "Slug" -#: AKModel/models.py:107 +#: AKModel/models.py:112 msgid "Slug for URL generation" msgstr "Slug für URL-Generierung" -#: AKModel/models.py:108 +#: AKModel/models.py:113 msgid "Institution" msgstr "Instutution" -#: AKModel/models.py:108 +#: AKModel/models.py:113 msgid "Uni etc." msgstr "Universität o.ä." -#: AKModel/models.py:109 AKModel/models.py:241 +#: AKModel/models.py:114 AKModel/models.py:247 msgid "Web Link" msgstr "Internet Link" -#: AKModel/models.py:109 +#: AKModel/models.py:114 msgid "Link to Homepage" msgstr "Link zu Homepage oder Webseite" -#: AKModel/models.py:115 AKModel/models.py:486 +#: AKModel/models.py:120 AKModel/models.py:493 msgid "AK Owner" msgstr "AK-Leitung" -#: AKModel/models.py:116 +#: AKModel/models.py:121 msgid "AK Owners" msgstr "AK-Leitungen" -#: AKModel/models.py:158 +#: AKModel/models.py:163 msgid "Name of the AK Category" msgstr "Name der AK-Kategorie" -#: AKModel/models.py:159 AKModel/models.py:182 +#: AKModel/models.py:164 AKModel/models.py:188 msgid "Color" msgstr "Farbe" -#: AKModel/models.py:159 AKModel/models.py:182 +#: AKModel/models.py:164 AKModel/models.py:188 msgid "Color for displaying" msgstr "Farbe für die Anzeige" -#: AKModel/models.py:160 AKModel/models.py:235 +#: AKModel/models.py:165 AKModel/models.py:241 msgid "Description" msgstr "Beschreibung" -#: AKModel/models.py:161 +#: AKModel/models.py:166 msgid "Short description of this AK Category" msgstr "Beschreibung der AK-Kategorie" -#: AKModel/models.py:162 +#: AKModel/models.py:167 msgid "Present by default" msgstr "" -#: AKModel/models.py:163 +#: AKModel/models.py:169 msgid "" "Present AKs of this category by default if AK owner did not specify whether " "this AK should be presented?" @@ -327,152 +343,152 @@ msgstr "" "AKs dieser Kategorie standardmäßig vorstellen, wenn die Leitungen das für " "ihren AK nicht explizit spezifiziert haben?" -#: AKModel/models.py:170 +#: AKModel/models.py:176 msgid "AK Categories" msgstr "AK-Kategorien" -#: AKModel/models.py:181 +#: AKModel/models.py:187 msgid "Name of the AK Track" msgstr "Name des AK-Tracks" -#: AKModel/models.py:188 +#: AKModel/models.py:194 msgid "AK Track" msgstr "AK-Track" -#: AKModel/models.py:189 +#: AKModel/models.py:195 msgid "AK Tracks" msgstr "AK-Tracks" -#: AKModel/models.py:200 +#: AKModel/models.py:206 msgid "Name of the AK Tag" msgstr "Name das AK-Tags" -#: AKModel/models.py:203 +#: AKModel/models.py:209 msgid "AK Tag" msgstr "AK-Tag" -#: AKModel/models.py:204 +#: AKModel/models.py:210 msgid "AK Tags" msgstr "AK-Tags" -#: AKModel/models.py:214 +#: AKModel/models.py:220 msgid "Name of the Requirement" msgstr "Name der Anforderung" -#: AKModel/models.py:220 AKModel/models.py:490 +#: AKModel/models.py:226 AKModel/models.py:497 msgid "AK Requirement" msgstr "AK-Anforderung" -#: AKModel/models.py:221 +#: AKModel/models.py:227 msgid "AK Requirements" msgstr "AK-Anforderungen" -#: AKModel/models.py:232 +#: AKModel/models.py:238 msgid "Name of the AK" msgstr "Name des AKs" -#: AKModel/models.py:233 +#: AKModel/models.py:239 msgid "Short Name" msgstr "Kurzer Name" -#: AKModel/models.py:234 +#: AKModel/models.py:240 msgid "Name displayed in the schedule" msgstr "Name zur Anzeige im AK-Plan" -#: AKModel/models.py:235 +#: AKModel/models.py:241 msgid "Description of the AK" msgstr "Beschreibung des AKs" -#: AKModel/models.py:237 +#: AKModel/models.py:243 msgid "Owners" msgstr "Leitungen" -#: AKModel/models.py:238 +#: AKModel/models.py:244 msgid "Those organizing the AK" msgstr "Menschen, die den AK organisieren und halten" -#: AKModel/models.py:241 +#: AKModel/models.py:247 msgid "Link to wiki page" msgstr "Link zur Wiki Seite" -#: AKModel/models.py:242 +#: AKModel/models.py:248 msgid "Protocol Link" msgstr "Protokolllink" -#: AKModel/models.py:242 +#: AKModel/models.py:248 msgid "Link to protocol" msgstr "Link zum Protokoll" -#: AKModel/models.py:244 +#: AKModel/models.py:250 msgid "Category" msgstr "Kategorie" -#: AKModel/models.py:245 +#: AKModel/models.py:251 msgid "Category of the AK" msgstr "Kategorie des AKs" -#: AKModel/models.py:246 +#: AKModel/models.py:252 msgid "Tags" msgstr "Tags" -#: AKModel/models.py:246 +#: AKModel/models.py:252 msgid "Tags provided by owners" msgstr "Tags, die durch die AK-Leitung vergeben wurden" -#: AKModel/models.py:247 +#: AKModel/models.py:253 msgid "Track" msgstr "Track" -#: AKModel/models.py:248 +#: AKModel/models.py:254 msgid "Track the AK belongs to" msgstr "Track zu dem der AK gehört" -#: AKModel/models.py:250 +#: AKModel/models.py:256 msgid "Resolution Intention" msgstr "Resolutionsabsicht" -#: AKModel/models.py:251 +#: AKModel/models.py:257 msgid "Intends to submit a resolution" msgstr "Beabsichtigt eine Resolution einzureichen" -#: AKModel/models.py:252 +#: AKModel/models.py:258 msgid "Present this AK" msgstr "AK präsentieren" -#: AKModel/models.py:253 +#: AKModel/models.py:259 msgid "Present results of this AK" msgstr "Die Ergebnisse dieses AKs vorstellen" -#: AKModel/models.py:255 AKModel/templates/admin/AKModel/status.html:91 +#: AKModel/models.py:261 AKModel/templates/admin/AKModel/status.html:91 msgid "Requirements" msgstr "Anforderungen" -#: AKModel/models.py:256 +#: AKModel/models.py:262 msgid "AK's Requirements" msgstr "Anforderungen des AKs" -#: AKModel/models.py:258 +#: AKModel/models.py:264 msgid "Conflicting AKs" msgstr "AK-Konflikte" -#: AKModel/models.py:259 +#: AKModel/models.py:265 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:260 +#: AKModel/models.py:266 msgid "Prerequisite AKs" msgstr "Vorausgesetzte AKs" -#: AKModel/models.py:261 +#: AKModel/models.py:267 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:263 +#: AKModel/models.py:269 msgid "Organizational Notes" msgstr "Notizen zur Organisation" -#: AKModel/models.py:264 +#: AKModel/models.py:270 msgid "" "Notes to organizers. These are public. For private notes, please send an e-" "mail." @@ -480,258 +496,258 @@ msgstr "" "Notizen an die Organisator*innen. Diese sind öffentlich, für private " "Anmerkungen bitte eine E-Mail schicken." -#: AKModel/models.py:266 +#: AKModel/models.py:272 msgid "Interest" msgstr "Interesse" -#: AKModel/models.py:266 +#: AKModel/models.py:272 msgid "Expected number of people" msgstr "Erwartete Personenzahl" -#: AKModel/models.py:267 +#: AKModel/models.py:273 msgid "Interest Counter" msgstr "Interessenszähler" -#: AKModel/models.py:268 +#: AKModel/models.py:274 msgid "People who have indicated interest online" msgstr "Anzahl Personen, die online Interesse bekundet haben" -#: AKModel/models.py:277 AKModel/models.py:481 +#: AKModel/models.py:283 AKModel/models.py:488 #: AKModel/templates/admin/AKModel/status.html:49 #: AKModel/templates/admin/AKModel/status.html:56 AKModel/views.py:335 msgid "AKs" msgstr "AKs" -#: AKModel/models.py:328 +#: AKModel/models.py:334 msgid "Name or number of the room" msgstr "Name oder Nummer des Raums" -#: AKModel/models.py:329 +#: AKModel/models.py:335 msgid "Location" msgstr "Ort" -#: AKModel/models.py:330 +#: AKModel/models.py:336 msgid "Name or number of the location" msgstr "Name oder Nummer des Ortes" -#: AKModel/models.py:331 +#: AKModel/models.py:337 msgid "Capacity" msgstr "Kapazität" -#: AKModel/models.py:331 +#: AKModel/models.py:338 msgid "Maximum number of people (-1 for unlimited)." msgstr "Maximale Personenzahl (-1 wenn unbeschränkt)." -#: AKModel/models.py:332 +#: AKModel/models.py:339 msgid "Properties" msgstr "Eigenschaften" -#: AKModel/models.py:333 +#: AKModel/models.py:340 msgid "AK requirements fulfilled by the room" msgstr "AK-Anforderungen, die dieser Raum erfüllt" -#: AKModel/models.py:340 AKModel/templates/admin/AKModel/status.html:33 +#: AKModel/models.py:347 AKModel/templates/admin/AKModel/status.html:33 msgid "Rooms" msgstr "Räume" -#: AKModel/models.py:357 +#: AKModel/models.py:364 msgid "AK being mapped" msgstr "AK, der zugeordnet wird" -#: AKModel/models.py:359 +#: AKModel/models.py:366 msgid "Room the AK will take place in" msgstr "Raum in dem der AK stattfindet" -#: AKModel/models.py:360 +#: AKModel/models.py:367 msgid "Slot Begin" msgstr "Beginn des Slots" -#: AKModel/models.py:360 +#: AKModel/models.py:367 msgid "Time and date the slot begins" msgstr "Zeit und Datum zu der der AK beginnt" -#: AKModel/models.py:362 +#: AKModel/models.py:369 msgid "Duration" msgstr "Dauer" -#: AKModel/models.py:363 +#: AKModel/models.py:370 msgid "Length in hours" msgstr "Länge in Stunden" -#: AKModel/models.py:365 +#: AKModel/models.py:372 msgid "Scheduling fixed" msgstr "Planung fix" -#: AKModel/models.py:366 +#: AKModel/models.py:373 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:371 +#: AKModel/models.py:378 msgid "Last update" msgstr "Letzte Aktualisierung" -#: AKModel/models.py:374 +#: AKModel/models.py:381 msgid "AK Slot" msgstr "AK-Slot" -#: AKModel/models.py:375 AKModel/models.py:483 +#: AKModel/models.py:382 AKModel/models.py:490 msgid "AK Slots" msgstr "AK-Slot" -#: AKModel/models.py:397 AKModel/models.py:406 +#: AKModel/models.py:404 AKModel/models.py:413 msgid "Not scheduled yet" msgstr "Noch nicht geplant" -#: AKModel/models.py:435 +#: AKModel/models.py:442 msgid "AK this message belongs to" msgstr "AK zu dem die Nachricht gehört" -#: AKModel/models.py:436 +#: AKModel/models.py:443 msgid "Message text" msgstr "Nachrichtentext" -#: AKModel/models.py:437 +#: AKModel/models.py:444 msgid "Message to the organizers. This is not publicly visible." msgstr "" "Nachricht an die Organisator*innen. Diese ist nicht öffentlich sichtbar." -#: AKModel/models.py:441 +#: AKModel/models.py:448 msgid "AK Orga Message" msgstr "AK-Organachricht" -#: AKModel/models.py:442 +#: AKModel/models.py:449 msgid "AK Orga Messages" msgstr "AK-Organachrichten" -#: AKModel/models.py:451 +#: AKModel/models.py:458 msgid "Constraint Violation" msgstr "Constraintverletzung" -#: AKModel/models.py:452 AKModel/templates/admin/AKModel/status.html:79 +#: AKModel/models.py:459 AKModel/templates/admin/AKModel/status.html:79 msgid "Constraint Violations" msgstr "Constraintverletzungen" -#: AKModel/models.py:456 +#: AKModel/models.py:463 msgid "Owner has two parallel slots" msgstr "Leitung hat zwei Slots parallel" -#: AKModel/models.py:457 +#: AKModel/models.py:464 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:458 +#: AKModel/models.py:465 msgid "Room has two AK slots scheduled at the same time" msgstr "Raum hat zwei AK Slots gleichzeitig" -#: AKModel/models.py:459 +#: AKModel/models.py:466 msgid "Room does not satisfy the requirement of the scheduled AK" msgstr "Room erfüllt die Anforderungen des platzierten AKs nicht" -#: AKModel/models.py:460 +#: AKModel/models.py:467 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:461 +#: AKModel/models.py:468 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:463 +#: AKModel/models.py:470 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:464 +#: AKModel/models.py:471 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:465 +#: AKModel/models.py:472 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:466 +#: AKModel/models.py:473 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:467 +#: AKModel/models.py:474 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:470 +#: AKModel/models.py:477 msgid "Warning" msgstr "Warnung" -#: AKModel/models.py:471 +#: AKModel/models.py:478 msgid "Violation" msgstr "Verletzung" -#: AKModel/models.py:473 +#: AKModel/models.py:480 msgid "Type" msgstr "Art" -#: AKModel/models.py:474 +#: AKModel/models.py:481 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:475 +#: AKModel/models.py:482 msgid "Level" msgstr "Level" -#: AKModel/models.py:476 +#: AKModel/models.py:483 msgid "Severity level of the violation" msgstr "Schweregrad der Verletzung" -#: AKModel/models.py:482 +#: AKModel/models.py:489 msgid "AK(s) belonging to this constraint" msgstr "AK(s), die zu diesem Constraint gehören" -#: AKModel/models.py:484 +#: AKModel/models.py:491 msgid "AK Slot(s) belonging to this constraint" msgstr "AK Slot(s), die zu diesem Constraint gehören" -#: AKModel/models.py:486 +#: AKModel/models.py:493 msgid "AK Owner belonging to this constraint" msgstr "AK Leitung(en), die zu diesem Constraint gehören" -#: AKModel/models.py:488 +#: AKModel/models.py:495 msgid "Room belonging to this constraint" msgstr "Raum, der zu diesem Constraint gehört" -#: AKModel/models.py:491 +#: AKModel/models.py:498 msgid "AK Requirement belonging to this constraint" msgstr "AK Anforderung, die zu diesem Constraint gehört" -#: AKModel/models.py:493 +#: AKModel/models.py:500 msgid "AK Category belonging to this constraint" msgstr "AK Kategorie, di zu diesem Constraint gehört" -#: AKModel/models.py:495 +#: AKModel/models.py:502 msgid "Comment" msgstr "Kommentar" -#: AKModel/models.py:495 +#: AKModel/models.py:502 msgid "Comment or further details for this violation" msgstr "Kommentar oder weitere Details zu dieser Vereletzung" -#: AKModel/models.py:498 +#: AKModel/models.py:505 msgid "Timestamp" msgstr "Timestamp" -#: AKModel/models.py:498 +#: AKModel/models.py:505 msgid "Time of creation" msgstr "Zeitpunkt der ERstellung" -#: AKModel/models.py:499 +#: AKModel/models.py:506 msgid "Manually Resolved" msgstr "Manuell behoben" -#: AKModel/models.py:500 +#: AKModel/models.py:507 msgid "Mark this violation manually as resolved" msgstr "Markiere diese Verletzung manuell als behoben" -#: AKModel/models.py:527 +#: AKModel/models.py:534 #: AKModel/templates/admin/AKModel/requirements_overview.html:27 msgid "Details" msgstr "Details" diff --git a/AKModel/migrations/0049_interest_window.py b/AKModel/migrations/0049_interest_window.py new file mode 100644 index 0000000000000000000000000000000000000000..07448c5496ddb54bc5d0ed85c411a4df5ac8c073 --- /dev/null +++ b/AKModel/migrations/0049_interest_window.py @@ -0,0 +1,24 @@ +# Generated by Django 3.1.8 on 2021-10-29 10:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('AKModel', '0048_constraint_violation_text'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='interest_end', + field=models.DateTimeField(blank=True, help_text='Closing time for expression of interest.', null=True, + verbose_name='Interest Window End'), + ), + migrations.AddField( + model_name='event', + name='interest_start', + field=models.DateTimeField(blank=True, help_text='Opening time for expression of interest.', null=True, + verbose_name='Interest Window Start'), + ), + ] diff --git a/AKModel/models.py b/AKModel/models.py index 98dad77046d3003826a67b0fdf01b644a0e67aa3..2767effb2817e1710ed967119b8dbe306d3fce5b 100644 --- a/AKModel/models.py +++ b/AKModel/models.py @@ -27,6 +27,11 @@ class Event(models.Model): reso_deadline = models.DateTimeField(verbose_name=_('Resolution Deadline'), blank=True, null=True, help_text=_('When should AKs with intention to submit a resolution be done?')) + interest_start = models.DateTimeField(verbose_name=_('Interest Window Start'), blank=True, null=True, + help_text=_('Opening time for expression of interest.')) + interest_end = models.DateTimeField(verbose_name=_('Interest Window End'), blank=True, null=True, + help_text=_('Closing time for expression of interest.')) + public = models.BooleanField(verbose_name=_('Public event'), default=True, help_text=_('Show this event on overview page.')) @@ -160,7 +165,8 @@ class AKCategory(models.Model): description = models.TextField(blank=True, verbose_name=_("Description"), help_text=_("Short description of this AK Category")) present_by_default = models.BooleanField(blank=True, default=True, verbose_name=_("Present by default"), - help_text=_("Present AKs of this category by default if AK owner did not specify whether this AK should be presented?")) + help_text=_( + "Present AKs of this category by default if AK owner did not specify whether this AK should be presented?")) event = models.ForeignKey(to=Event, on_delete=models.CASCADE, verbose_name=_('Event'), help_text=_('Associated event')) @@ -328,7 +334,8 @@ class Room(models.Model): name = models.CharField(max_length=64, verbose_name=_('Name'), help_text=_('Name or number of the room')) location = models.CharField(max_length=256, blank=True, verbose_name=_('Location'), help_text=_('Name or number of the location')) - capacity = models.IntegerField(verbose_name=_('Capacity'), help_text=_('Maximum number of people (-1 for unlimited).')) + capacity = models.IntegerField(verbose_name=_('Capacity'), + help_text=_('Maximum number of people (-1 for unlimited).')) properties = models.ManyToManyField(to=AKRequirement, blank=True, verbose_name=_('Properties'), help_text=_('AK requirements fulfilled by the room')) diff --git a/AKModel/urls.py b/AKModel/urls.py index 64527851d7e613eb19a3fa155403f33d66b4be4e..2071acc9edc56b506eb307f42654e9da1ba82c63 100644 --- a/AKModel/urls.py +++ b/AKModel/urls.py @@ -26,11 +26,13 @@ if apps.is_installed("AKScheduling"): api_router.register('scheduling-constraint-violations', ConstraintViolationsViewSet, basename='scheduling-constraint-violations') - extra_paths = [ - path('api/scheduling-events/', EventsView.as_view(), name='scheduling-events'), - path('api/scheduling-room-availabilities/', RoomAvailabilitiesView.as_view(), - name='scheduling-room-availabilities'), - ] + extra_paths.append(path('api/scheduling-events/', EventsView.as_view(), name='scheduling-events')) + extra_paths.append(path('api/scheduling-room-availabilities/', RoomAvailabilitiesView.as_view(), + name='scheduling-room-availabilities')) +if apps.is_installed("AKSubmission"): + from AKSubmission.api import increment_interest_counter + + extra_paths.append(path('api/ak/<pk>/indicate-interest/', increment_interest_counter, name='submission-ak-indicate-interest')) event_specific_paths = [ path('api/', include(api_router.urls), name='api'), diff --git a/AKPlan/locale/de_DE/LC_MESSAGES/django.po b/AKPlan/locale/de_DE/LC_MESSAGES/django.po index 120f98ec3aa53d92c9834c799ef26b1312363b1c..9000d9d8e01131db0e4f9d822a0d9c519f0fb542 100644 --- a/AKPlan/locale/de_DE/LC_MESSAGES/django.po +++ b/AKPlan/locale/de_DE/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-29 22:48+0000\n" +"POT-Creation-Date: 2021-10-29 09: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" @@ -27,56 +27,56 @@ msgstr "Plan" msgid "Write to organizers of this event for questions and comments" msgstr "Fragen oder Kommentare? Schreib den Orgas dieses Events eine Mail" -#: AKPlan/templates/AKPlan/plan_index.html:31 +#: AKPlan/templates/AKPlan/plan_index.html:32 msgid "Day" msgstr "Tag" -#: AKPlan/templates/AKPlan/plan_index.html:41 +#: AKPlan/templates/AKPlan/plan_index.html:42 msgid "Event" msgstr "Veranstaltung" -#: AKPlan/templates/AKPlan/plan_index.html:53 +#: AKPlan/templates/AKPlan/plan_index.html:55 #: AKPlan/templates/AKPlan/plan_room.html:13 #: AKPlan/templates/AKPlan/plan_room.html:59 -#: AKPlan/templates/AKPlan/plan_wall.html:50 +#: AKPlan/templates/AKPlan/plan_wall.html:52 msgid "Room" msgstr "Raum" -#: AKPlan/templates/AKPlan/plan_index.html:74 +#: AKPlan/templates/AKPlan/plan_index.html:76 #: AKPlan/templates/AKPlan/plan_room.html:11 #: AKPlan/templates/AKPlan/plan_track.html:9 msgid "AK Plan" msgstr "AK-Plan" -#: AKPlan/templates/AKPlan/plan_index.html:86 +#: AKPlan/templates/AKPlan/plan_index.html:88 #: AKPlan/templates/AKPlan/plan_room.html:49 msgid "Rooms" msgstr "Räume" -#: AKPlan/templates/AKPlan/plan_index.html:99 +#: AKPlan/templates/AKPlan/plan_index.html:101 #: AKPlan/templates/AKPlan/plan_track.html:36 msgid "Tracks" msgstr "Tracks" -#: AKPlan/templates/AKPlan/plan_index.html:111 +#: AKPlan/templates/AKPlan/plan_index.html:113 msgid "AK Wall" msgstr "AK-Wall" -#: AKPlan/templates/AKPlan/plan_index.html:124 -#: AKPlan/templates/AKPlan/plan_wall.html:79 +#: AKPlan/templates/AKPlan/plan_index.html:126 +#: AKPlan/templates/AKPlan/plan_wall.html:81 msgid "Current AKs" msgstr "Aktuelle AKs" -#: AKPlan/templates/AKPlan/plan_index.html:131 -#: AKPlan/templates/AKPlan/plan_wall.html:84 +#: AKPlan/templates/AKPlan/plan_index.html:133 +#: AKPlan/templates/AKPlan/plan_wall.html:86 msgid "Next AKs" msgstr "Nächste AKs" -#: AKPlan/templates/AKPlan/plan_index.html:139 +#: AKPlan/templates/AKPlan/plan_index.html:141 msgid "This event is not active." msgstr "Dieses Event ist nicht aktiv." -#: AKPlan/templates/AKPlan/plan_index.html:152 +#: AKPlan/templates/AKPlan/plan_index.html:154 #: AKPlan/templates/AKPlan/plan_room.html:77 #: AKPlan/templates/AKPlan/plan_track.html:58 msgid "Plan is not visible (yet)." diff --git a/AKPlanning/locale/de_DE/LC_MESSAGES/django.po b/AKPlanning/locale/de_DE/LC_MESSAGES/django.po index 7338ca7ceea654920d0e2d499bbd9828fe27a6f1..7e4b27030213f6a24e9dbb3e176dffa270ee3ae3 100644 --- a/AKPlanning/locale/de_DE/LC_MESSAGES/django.po +++ b/AKPlanning/locale/de_DE/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-29 22:48+0000\n" +"POT-Creation-Date: 2021-10-29 09: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" @@ -17,10 +17,10 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: AKPlanning/settings.py:134 +#: AKPlanning/settings.py:144 msgid "German" msgstr "Deutsch" -#: AKPlanning/settings.py:135 +#: AKPlanning/settings.py:145 msgid "English" msgstr "Englisch" diff --git a/AKPlanning/urls.py b/AKPlanning/urls.py index 2386721cbb5bc08f4aa84e1f77a5d0264cb8cfc4..cdbbea559617339113a51427b7b138417680b582 100644 --- a/AKPlanning/urls.py +++ b/AKPlanning/urls.py @@ -13,10 +13,10 @@ Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ +import debug_toolbar from django.apps import apps from django.contrib import admin from django.urls import path, include -import debug_toolbar urlpatterns = [ path('admin/', admin.site.urls), diff --git a/AKScheduling/locale/de_DE/LC_MESSAGES/django.po b/AKScheduling/locale/de_DE/LC_MESSAGES/django.po index dbf3a8a68a102d3e42918a9df20f6a338a662886..071f4f879761ad3b54e0bb9d3b38a473b9499331 100644 --- a/AKScheduling/locale/de_DE/LC_MESSAGES/django.po +++ b/AKScheduling/locale/de_DE/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-28 20:45+0000\n" +"POT-Creation-Date: 2021-10-29 09: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" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: AKScheduling/models.py:507 +#: AKScheduling/models.py:80 #, python-format msgid "" "Not enough space for AK interest (Interest: %(interest)d, Capacity: " @@ -26,7 +26,7 @@ msgstr "" "Nicht genug Platz für AK-Interesse (Interesse: %(interest)d, Kapazität: " "%(capacity)d)" -#: AKScheduling/models.py:519 +#: AKScheduling/models.py:92 #, python-format msgid "" "Space is too close to AK interest (Interest: %(interest)d, Capacity: " diff --git a/AKSubmission/api.py b/AKSubmission/api.py new file mode 100644 index 0000000000000000000000000000000000000000..29a6f42a9f371b53aef98ead6a4d7b2b4d6e20f3 --- /dev/null +++ b/AKSubmission/api.py @@ -0,0 +1,38 @@ +from rest_framework import status +from rest_framework.decorators import api_view +from rest_framework.response import Response +from django.utils.datetime_safe import datetime + +from AKModel.models import AK + + +def ak_interest_indication_active(event, current_timestamp): + """ + Check whether indication of interest is currently allowed for a given event + + :param event: event to check for + :type event: Event + :param current_timestamp: current timestamp + :type current_timestamp: datetime + :return: True if indication is allowed, False if not + :rtype: Bool + """ + return event.active and (event.interest_start is None or (event.interest_start <= current_timestamp and ( + event.interest_end is None or current_timestamp <= event.interest_end))) + + +@api_view(['POST']) +def increment_interest_counter(request, event_slug, pk, **kwargs): + """ + Increment interest counter for AK + """ + ak = AK.objects.get(pk=pk) + if ak: + # Check whether interest indication is currently allowed + current_timestamp = datetime.now().astimezone(ak.event.timezone) + if ak_interest_indication_active(ak.event, current_timestamp): + ak.interest_counter += 1 + ak.save() + return Response({'interest_counter': ak.interest_counter}, status=status.HTTP_200_OK) + return Response(status=status.HTTP_403_FORBIDDEN) + return Response(status=status.HTTP_404_NOT_FOUND) diff --git a/AKSubmission/locale/de_DE/LC_MESSAGES/django.po b/AKSubmission/locale/de_DE/LC_MESSAGES/django.po index 92f1633b6f273d43bd1cd0607aeb903e1d836ea0..c45713c4ec0e00153ccb3b5eda67493f8b90a79e 100644 --- a/AKSubmission/locale/de_DE/LC_MESSAGES/django.po +++ b/AKSubmission/locale/de_DE/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-05-15 14:34+0000\n" +"POT-Creation-Date: 2021-10-29 11:22+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" @@ -38,30 +38,6 @@ msgstr "" "Mindestens eine geplante Dauer (in Stunden) angeben. Wenn der AK mehrere " "Slots haben soll, mehrere Zeilen verwenden" -#: AKSubmission/templates/AKSubmission/ak_detail.html:11 -#: AKSubmission/templates/AKSubmission/ak_edit.html:8 -#: AKSubmission/templates/AKSubmission/ak_history.html:11 -#: AKSubmission/templates/AKSubmission/ak_overview.html:8 -#: AKSubmission/templates/AKSubmission/ak_overview.html:12 -#: AKSubmission/templates/AKSubmission/ak_overview.html:38 -#: AKSubmission/templates/AKSubmission/akmessage_add.html:7 -#: AKSubmission/templates/AKSubmission/akowner_create_update.html:7 -#: AKSubmission/templates/AKSubmission/akslot_add_update.html:7 -#: AKSubmission/templates/AKSubmission/akslot_delete.html:7 -#: AKSubmission/templates/AKSubmission/submission_not_configured.html:7 -#: AKSubmission/templates/AKSubmission/submission_overview.html:7 -#: AKSubmission/templates/AKSubmission/submission_overview.html:43 -#: AKSubmission/templates/AKSubmission/submit_new.html:8 -#: AKSubmission/templates/AKSubmission/submit_new_wish.html:7 -msgid "AKs" -msgstr "AKs" - -#: AKSubmission/templates/AKSubmission/ak_detail.html:11 -#: AKSubmission/templates/AKSubmission/ak_history.html:11 -#: AKSubmission/templates/AKSubmission/akslot_delete.html:31 -msgid "AK" -msgstr "AK" - #: AKSubmission/templates/AKSubmission/ak_detail.html:22 #: AKSubmission/templates/AKSubmission/ak_edit.html:13 #: AKSubmission/templates/AKSubmission/ak_history.html:16 @@ -80,51 +56,59 @@ msgstr "AK" msgid "AK Submission" msgstr "AK-Eintragung" -#: AKSubmission/templates/AKSubmission/ak_detail.html:37 +#: AKSubmission/templates/AKSubmission/ak_detail.html:78 +msgid "Interest indication currently not allowed. Sorry." +msgstr "Interessenangabe aktuell nicht erlaubt. Sorry." + +#: AKSubmission/templates/AKSubmission/ak_detail.html:80 +msgid "Could not save your interest. Sorry." +msgstr "Interesse konnte nicht gespeichert werden. Sorry." + +#: AKSubmission/templates/AKSubmission/ak_detail.html:101 msgid "Interest" msgstr "Interesse" -#: AKSubmission/templates/AKSubmission/ak_detail.html:40 -#: AKSubmission/templates/AKSubmission/ak_table.html:56 +#: AKSubmission/templates/AKSubmission/ak_detail.html:103 +#: AKSubmission/templates/AKSubmission/ak_table.html:57 msgid "Show Interest" msgstr "Interesse bekunden" -#: AKSubmission/templates/AKSubmission/ak_detail.html:46 +#: AKSubmission/templates/AKSubmission/ak_detail.html:109 #: AKSubmission/templates/AKSubmission/ak_table.html:48 msgid "Open external link" msgstr "Externen Link öffnen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:51 +#: AKSubmission/templates/AKSubmission/ak_detail.html:114 msgid "Open protocol link" msgstr "Protokolllink öffnen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:56 +#: AKSubmission/templates/AKSubmission/ak_detail.html:119 #: AKSubmission/templates/AKSubmission/ak_history.html:19 #: AKSubmission/templates/AKSubmission/ak_history.html:31 msgid "History" msgstr "Versionsgeschichte" -#: AKSubmission/templates/AKSubmission/ak_detail.html:59 +#: AKSubmission/templates/AKSubmission/ak_detail.html:122 #: AKSubmission/templates/AKSubmission/akmessage_add.html:8 #: AKSubmission/templates/AKSubmission/akmessage_add.html:16 #: AKSubmission/templates/AKSubmission/akmessage_add.html:22 msgid "Add confidential message to organizers" msgstr "Sende eine private Nachricht an das Organisationsteam" -#: AKSubmission/templates/AKSubmission/ak_detail.html:62 -#: AKSubmission/templates/AKSubmission/ak_detail.html:213 +#: AKSubmission/templates/AKSubmission/ak_detail.html:125 +#: AKSubmission/templates/AKSubmission/ak_detail.html:276 #: AKSubmission/templates/AKSubmission/ak_edit.html:16 #: AKSubmission/templates/AKSubmission/ak_table.html:53 msgid "Edit" msgstr "Bearbeiten" -#: AKSubmission/templates/AKSubmission/ak_detail.html:67 +#: AKSubmission/templates/AKSubmission/ak_detail.html:130 #: AKSubmission/templates/AKSubmission/ak_history.html:31 #: AKSubmission/templates/AKSubmission/ak_table.html:35 msgid "AK Wish" msgstr "AK-Wunsch" -#: AKSubmission/templates/AKSubmission/ak_detail.html:74 +#: AKSubmission/templates/AKSubmission/ak_detail.html:137 #, python-format msgid "" "\n" @@ -138,7 +122,7 @@ msgstr "" "Minute(n) in %(room)s statt. \n" " " -#: AKSubmission/templates/AKSubmission/ak_detail.html:80 +#: AKSubmission/templates/AKSubmission/ak_detail.html:143 #, python-format msgid "" "\n" @@ -151,104 +135,126 @@ msgstr "" "Minute(n) in %(room)s. \n" " " -#: AKSubmission/templates/AKSubmission/ak_detail.html:87 -#: AKSubmission/templates/AKSubmission/ak_detail.html:221 +#: AKSubmission/templates/AKSubmission/ak_detail.html:150 +#: AKSubmission/templates/AKSubmission/ak_detail.html:284 msgid "Go to virtual room" msgstr "Zum virtuellen Raum" -#: AKSubmission/templates/AKSubmission/ak_detail.html:96 +#: AKSubmission/templates/AKSubmission/ak_detail.html:159 #: AKSubmission/templates/AKSubmission/ak_table.html:10 msgid "Who?" msgstr "Wer?" -#: AKSubmission/templates/AKSubmission/ak_detail.html:102 +#: AKSubmission/templates/AKSubmission/ak_detail.html:165 #: AKSubmission/templates/AKSubmission/ak_history.html:36 #: AKSubmission/templates/AKSubmission/ak_table.html:11 msgid "Category" msgstr "Kategorie" -#: AKSubmission/templates/AKSubmission/ak_detail.html:109 +#: AKSubmission/templates/AKSubmission/ak_detail.html:172 #: AKSubmission/templates/AKSubmission/ak_history.html:37 msgid "Track" msgstr "Track" -#: AKSubmission/templates/AKSubmission/ak_detail.html:115 +#: AKSubmission/templates/AKSubmission/ak_detail.html:178 #, fuzzy #| msgid "Present results of this AK" msgid "Present this AK" msgstr "Die Ergebnisse dieses AKs vorstellen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:120 +#: AKSubmission/templates/AKSubmission/ak_detail.html:183 msgid "(Category Default)" msgstr "(Kategorievoreinstellung)" -#: AKSubmission/templates/AKSubmission/ak_detail.html:126 +#: AKSubmission/templates/AKSubmission/ak_detail.html:189 #: AKSubmission/templates/AKSubmission/ak_table.html:12 msgid "Tags" msgstr "Tags" -#: AKSubmission/templates/AKSubmission/ak_detail.html:132 +#: AKSubmission/templates/AKSubmission/ak_detail.html:195 msgid "Reso intention?" msgstr "Resoabsicht?" -#: AKSubmission/templates/AKSubmission/ak_detail.html:139 +#: AKSubmission/templates/AKSubmission/ak_detail.html:202 msgid "Requirements" msgstr "Anforderungen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:152 +#: AKSubmission/templates/AKSubmission/ak_detail.html:215 msgid "Conflicting AKs" msgstr "AK-Konflikte" -#: AKSubmission/templates/AKSubmission/ak_detail.html:160 +#: AKSubmission/templates/AKSubmission/ak_detail.html:223 msgid "Prerequisite AKs" msgstr "Vorausgesetzte AKs" -#: AKSubmission/templates/AKSubmission/ak_detail.html:168 +#: AKSubmission/templates/AKSubmission/ak_detail.html:231 msgid "Notes" msgstr "Notizen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:181 +#: AKSubmission/templates/AKSubmission/ak_detail.html:244 msgid "When?" msgstr "Wann?" -#: AKSubmission/templates/AKSubmission/ak_detail.html:183 +#: AKSubmission/templates/AKSubmission/ak_detail.html:246 #: AKSubmission/templates/AKSubmission/akslot_delete.html:35 msgid "Duration" msgstr "Dauer" -#: AKSubmission/templates/AKSubmission/ak_detail.html:185 +#: AKSubmission/templates/AKSubmission/ak_detail.html:248 msgid "Room" msgstr "Raum" -#: AKSubmission/templates/AKSubmission/ak_detail.html:216 +#: AKSubmission/templates/AKSubmission/ak_detail.html:279 msgid "Delete" msgstr "Löschen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:227 +#: AKSubmission/templates/AKSubmission/ak_detail.html:290 msgid "Schedule" msgstr "Schedule" -#: AKSubmission/templates/AKSubmission/ak_detail.html:239 +#: AKSubmission/templates/AKSubmission/ak_detail.html:302 msgid "Add another slot" msgstr "Einen neuen AK-Slot hinzufügen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:249 +#: AKSubmission/templates/AKSubmission/ak_detail.html:312 msgid "Possible Times" msgstr "Mögliche Zeiten" -#: AKSubmission/templates/AKSubmission/ak_detail.html:253 +#: AKSubmission/templates/AKSubmission/ak_detail.html:316 msgid "Start" msgstr "Start" -#: AKSubmission/templates/AKSubmission/ak_detail.html:254 +#: AKSubmission/templates/AKSubmission/ak_detail.html:317 msgid "End" msgstr "Ende" +#: AKSubmission/templates/AKSubmission/ak_edit.html:8 +#: AKSubmission/templates/AKSubmission/ak_history.html:11 +#: AKSubmission/templates/AKSubmission/ak_overview.html:8 +#: AKSubmission/templates/AKSubmission/ak_overview.html:12 +#: AKSubmission/templates/AKSubmission/ak_overview.html:38 +#: AKSubmission/templates/AKSubmission/akmessage_add.html:7 +#: AKSubmission/templates/AKSubmission/akowner_create_update.html:7 +#: AKSubmission/templates/AKSubmission/akslot_add_update.html:7 +#: AKSubmission/templates/AKSubmission/akslot_delete.html:7 +#: AKSubmission/templates/AKSubmission/submission_not_configured.html:7 +#: AKSubmission/templates/AKSubmission/submission_overview.html:7 +#: AKSubmission/templates/AKSubmission/submission_overview.html:43 +#: AKSubmission/templates/AKSubmission/submit_new.html:8 +#: AKSubmission/templates/AKSubmission/submit_new_wish.html:7 +msgid "AKs" +msgstr "AKs" + #: AKSubmission/templates/AKSubmission/ak_edit.html:8 #: AKSubmission/templates/AKSubmission/ak_edit.html:21 msgid "Edit AK" msgstr "AK bearbeiten" +#: AKSubmission/templates/AKSubmission/ak_history.html:11 +#: AKSubmission/templates/AKSubmission/akslot_delete.html:31 +msgid "AK" +msgstr "AK" + #: AKSubmission/templates/AKSubmission/ak_history.html:27 msgid "Back" msgstr "Zurück" @@ -272,7 +278,7 @@ msgstr "Die Ergebnisse dieses AKs vorstellen" msgid "Intends to submit a resolution" msgstr "Beabsichtigt eine Resolution einzureichen" -#: AKSubmission/templates/AKSubmission/ak_list.html:6 AKSubmission/views.py:39 +#: AKSubmission/templates/AKSubmission/ak_list.html:6 AKSubmission/views.py:40 msgid "All AKs" msgstr "Alle AKs" @@ -292,7 +298,7 @@ msgstr "AK hinzufügen" msgid "Details" msgstr "Details" -#: AKSubmission/templates/AKSubmission/ak_table.html:66 +#: AKSubmission/templates/AKSubmission/ak_table.html:67 msgid "There are no AKs in this category yet" msgstr "Es gibt noch keine AKs in dieser Kategorie" @@ -398,65 +404,65 @@ msgstr "" msgid "Submit" msgstr "Eintragen" -#: AKSubmission/views.py:70 +#: AKSubmission/views.py:71 msgid "Wishes" msgstr "Wünsche" -#: AKSubmission/views.py:70 +#: AKSubmission/views.py:71 msgid "AKs one would like to have" msgstr "" "AKs die sich gewünscht wurden, aber bei denen noch nicht klar ist, wer sie " "macht. Falls du dir das vorstellen kannst, trag dich einfach ein" -#: AKSubmission/views.py:86 +#: AKSubmission/views.py:87 msgid "Currently planned AKs" msgstr "Aktuell geplante AKs" -#: AKSubmission/views.py:184 +#: AKSubmission/views.py:188 msgid "Event inactive. Cannot create or update." msgstr "Event inaktiv. Hinzufügen/Bearbeiten nicht möglich." -#: AKSubmission/views.py:200 +#: AKSubmission/views.py:204 msgid "AK successfully created" msgstr "AK erfolgreich angelegt" -#: AKSubmission/views.py:258 +#: AKSubmission/views.py:262 msgid "AK successfully updated" msgstr "AK erfolgreich aktualisiert" -#: AKSubmission/views.py:289 +#: AKSubmission/views.py:293 msgid "Interest saved" msgstr "Interesse gespeichert" -#: AKSubmission/views.py:348 +#: AKSubmission/views.py:352 msgid "Person Info successfully updated" msgstr "Personen-Info erfolgreich aktualisiert" -#: AKSubmission/views.py:368 +#: AKSubmission/views.py:372 msgid "No user selected" msgstr "Keine Person ausgewählt" -#: AKSubmission/views.py:394 +#: AKSubmission/views.py:398 msgid "AK Slot successfully added" msgstr "AK-Slot erfolgreich angelegt" -#: AKSubmission/views.py:408 +#: AKSubmission/views.py:412 msgid "You cannot edit a slot that has already been scheduled" msgstr "Bereits geplante AK-Slots können nicht mehr bearbeitet werden" -#: AKSubmission/views.py:418 +#: AKSubmission/views.py:422 msgid "AK Slot successfully updated" msgstr "AK-Slot erfolgreich aktualisiert" -#: AKSubmission/views.py:431 +#: AKSubmission/views.py:435 msgid "You cannot delete a slot that has already been scheduled" msgstr "Bereits geplante AK-Slots können nicht mehr gelöscht werden" -#: AKSubmission/views.py:441 +#: AKSubmission/views.py:445 msgid "AK Slot successfully deleted" msgstr "AK-Slot erfolgreich angelegt" -#: AKSubmission/views.py:462 +#: AKSubmission/views.py:466 msgid "Message to organizers successfully saved" msgstr "Nachricht an die Organisator*innen erfolgreich gespeichert" diff --git a/AKSubmission/templates/AKSubmission/ak_detail.html b/AKSubmission/templates/AKSubmission/ak_detail.html index 4eadfd34de24b3d79dd0fcc517048404302444eb..69324b6349e693c8c04fb7b098573f4ed4c5d02c 100644 --- a/AKSubmission/templates/AKSubmission/ak_detail.html +++ b/AKSubmission/templates/AKSubmission/ak_detail.html @@ -26,6 +26,68 @@ {% if 'AKPlan'|check_app_installed %} {% block imports %} {% include "AKPlan/plan_akslot.html" %} + + <script> + document.addEventListener('DOMContentLoaded', function () { + // CSRF Protection/Authentication + function getCookie(name) { + let cookieValue = null; + if (document.cookie && document.cookie !== '') { + const cookies = document.cookie.split(';'); + for (let i = 0; i < cookies.length; i++) { + const cookie = cookies[i].trim(); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) === (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + + const csrftoken = getCookie('csrftoken'); + + function csrfSafeMethod(method) { + // these HTTP methods do not require CSRF protection + return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); + } + + $.ajaxSetup({ + beforeSend: function (xhr, settings) { + if (!csrfSafeMethod(settings.type) && !this.crossDomain) { + xhr.setRequestHeader("X-CSRFToken", csrftoken); + } + } + }); + + function indicate_interest(ak_id, btn) { + $.ajax({ + url: "{% url "model:AK-list" event_slug=event.slug %}" + ak_id + "/indicate-interest/", + type: 'POST', + data: { + }, + success: function (response) { + btn.html('{% fa5_icon 'check' 'fas' %}'); + btn.off('click'); + $('#interest-counter').html(response.interest_counter); + }, + error: function (response) { + if(response.status === 403) + alert("{% trans 'Interest indication currently not allowed. Sorry.' %}"); + else + alert("{% trans 'Could not save your interest. Sorry.' %}"); + } + }); + } + + // Update counter + $('#btn-indicate-interest').click(function () { + indicate_interest({{ ak.pk }}, $(this)); + }); + }); + </script> + {% endblock %} {% endif %} @@ -34,11 +96,11 @@ <div class="text-right"> {% if ak.interest_counter >= 0 %} - {% trans 'Interest' %}: <b class='mx-1 text-muted'>{{ ak.interest_counter }}</b> - {% if ak.event.active %} - <a href="{% url 'submit:inc_interest' event_slug=ak.event.slug pk=ak.pk %}" data-toggle="tooltip" + {% if ak.event.active and interest_indication_active %} + {% trans 'Interest' %}: <b class='mx-1 text-muted' id="interest-counter">{{ ak.interest_counter }}</b> + <a href="#" data-toggle="tooltip" title="{% trans 'Show Interest' %}" - class="btn btn-primary">{% fa5_icon 'thumbs-up' 'fas' %}</a> + class="btn btn-primary" id="btn-indicate-interest">{% fa5_icon 'thumbs-up' 'fas' %}</a> {% endif %} {% endif %} {% if ak.link != "" %} diff --git a/AKSubmission/templates/AKSubmission/ak_interest_script.html b/AKSubmission/templates/AKSubmission/ak_interest_script.html new file mode 100644 index 0000000000000000000000000000000000000000..952f5720d88bee9d1b9411410b722c3a6af12180 --- /dev/null +++ b/AKSubmission/templates/AKSubmission/ak_interest_script.html @@ -0,0 +1,62 @@ +{% load i18n %} +{% load fontawesome_5 %} + +<script> + document.addEventListener('DOMContentLoaded', function () { + // CSRF Protection/Authentication + function getCookie(name) { + let cookieValue = null; + if (document.cookie && document.cookie !== '') { + const cookies = document.cookie.split(';'); + for (let i = 0; i < cookies.length; i++) { + const cookie = cookies[i].trim(); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) === (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + + const csrftoken = getCookie('csrftoken'); + + function csrfSafeMethod(method) { + // these HTTP methods do not require CSRF protection + return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); + } + + $.ajaxSetup({ + beforeSend: function (xhr, settings) { + if (!csrfSafeMethod(settings.type) && !this.crossDomain) { + xhr.setRequestHeader("X-CSRFToken", csrftoken); + } + } + }); + + function indicate_interest(ak_id, btn) { + $.ajax({ + url: "{% url "model:AK-list" event_slug=event.slug %}" + ak_id + "/indicate-interest/", + type: 'POST', + data: { + }, + success: function (response) { + btn.html('{% fa5_icon 'check' 'fas' %}'); + btn.off('click'); + }, + error: function (response) { + if(response.status === 403) + alert("{% trans 'Interest indication currently not allowed. Sorry.' %}"); + else + alert("{% trans 'Could not save your interest. Sorry.' %}"); + } + }); + } + + // Update counter + $('.btn-interest').click(function () { + indicate_interest($(this).data('ak_id'), $(this)); + }); + }); +</script> diff --git a/AKSubmission/templates/AKSubmission/ak_overview.html b/AKSubmission/templates/AKSubmission/ak_overview.html index 01b8ab84316c43a439688a1bd044cbec2eda590b..b487f1688e1386cc7f9a2286eb4bdcd3738e9088 100644 --- a/AKSubmission/templates/AKSubmission/ak_overview.html +++ b/AKSubmission/templates/AKSubmission/ak_overview.html @@ -19,6 +19,8 @@ white-space: nowrap; } </style> + + {% include "AKSubmission/ak_interest_script.html" %} {% endblock %} {% block breadcrumbs %} diff --git a/AKSubmission/templates/AKSubmission/ak_table.html b/AKSubmission/templates/AKSubmission/ak_table.html index 4104709687b464f4b7c7ed37ca58a225cc029233..ba15c2592f5aa71610b98fadf23c1b3ea32390b0 100644 --- a/AKSubmission/templates/AKSubmission/ak_table.html +++ b/AKSubmission/templates/AKSubmission/ak_table.html @@ -52,9 +52,11 @@ <a href="{% url 'submit:ak_edit' event_slug=event.slug pk=ak.pk %}" data-toggle="tooltip" title="{% trans 'Edit' %}" class="btn btn-success">{% fa5_icon 'pencil-alt' 'fas' %}</a> - <a href="{% url 'submit:overview_inc_interest' event_slug=event.slug pk=ak.pk %}" data-toggle="tooltip" - title="{% trans 'Show Interest' %}" - class="btn btn-primary">{% fa5_icon 'thumbs-up' 'fas' %}</a> + {% if interest_indication_active %} + <span data-ak_id="{{ ak.pk }}" data-toggle="tooltip" + title="{% trans 'Show Interest' %}" + class="btn btn-primary btn-interest" style="cursor: pointer">{% fa5_icon 'thumbs-up' 'fas' %}</span> + {% endif %} {% endif %} </td> </tr> diff --git a/AKSubmission/templates/AKSubmission/submission_overview.html b/AKSubmission/templates/AKSubmission/submission_overview.html index e7994b69352314de63860059fdc2f655afc81df6..49782a63e6b69baad69c9672da5cc83d5fab4c60 100644 --- a/AKSubmission/templates/AKSubmission/submission_overview.html +++ b/AKSubmission/templates/AKSubmission/submission_overview.html @@ -28,6 +28,8 @@ } </style> + {% include "AKSubmission/ak_interest_script.html" %} + {% if event.active %} <link href="{% static 'common/vendor/select2/select2.min.css' %}" rel="stylesheet" /> <script src="{% static 'common/vendor/select2/select2.min.js' %}"></script> diff --git a/AKSubmission/urls.py b/AKSubmission/urls.py index e22ffdfda26cc219511ba64b0688803c08dc1e5e..213ea0e1a4fcd0eb3c4c1fad15bf884d23b67029 100644 --- a/AKSubmission/urls.py +++ b/AKSubmission/urls.py @@ -12,8 +12,6 @@ urlpatterns = [ path('ak/<int:pk>/', views.AKDetailView.as_view(), name='ak_detail'), path('ak/<int:pk>/history/', views.AKHistoryView.as_view(), name='ak_history'), path('ak/<int:pk>/edit/', views.AKEditView.as_view(), name='ak_edit'), - path('ak/<int:pk>/interest/', views.AKInterestView.as_view(), name='inc_interest'), - path('ak/<int:pk>/overview_interest/', views.AKOverviewInterestView.as_view(), name='overview_inc_interest'), path('ak/<int:pk>/add_slot/', views.AKSlotAddView.as_view(), name='akslot_add'), path('ak/<int:pk>/add_message/', views.AKAddOrgaMessageView.as_view(), name='akmessage_add'), path('akslot/<int:pk>/edit/', views.AKSlotEditView.as_view(), name='akslot_edit'), diff --git a/AKSubmission/views.py b/AKSubmission/views.py index b0e79389bd34047ec8981bfe57e25c350034792c..077005e2b591daa9230c175367672520064bb540 100644 --- a/AKSubmission/views.py +++ b/AKSubmission/views.py @@ -10,12 +10,13 @@ from django.urls import reverse_lazy from django.utils.datetime_safe import datetime from django.utils.translation import gettext_lazy as _ from django.views import View -from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView, RedirectView, TemplateView +from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView, TemplateView from AKModel.availability.models import Availability from AKModel.models import AK, AKCategory, AKTag, AKOwner, AKSlot, AKTrack, AKOrgaMessage from AKModel.views import EventSlugMixin from AKModel.views import FilterByEventSlugMixin +from AKSubmission.api import ak_interest_indication_active from AKSubmission.forms import AKWishForm, AKOwnerForm, AKEditForm, AKSubmissionForm, AKDurationForm, AKOrgaMessageForm @@ -73,6 +74,10 @@ class AKOverviewView(FilterByEventSlugMixin, ListView): context["active_category"] = self.get_active_category_name(context) context['table_title'] = self.get_table_title(context) + # Display interest indication button? + current_timestamp = datetime.now().astimezone(self.event.timezone) + context['interest_indication_active'] = ak_interest_indication_active(self.event, current_timestamp) + return context @@ -136,10 +141,11 @@ class AKDetailView(EventSlugMixin, DetailView): context = super().get_context_data(object_list=object_list, **kwargs) context["availabilities"] = Availability.objects.filter(ak=context["ak"]) + current_timestamp = datetime.now().astimezone(self.event.timezone) + # Is this AK taking place now or soon (used for top page visualization) context["featured_slot_type"] = "NONE" if apps.is_installed("AKPlan"): - current_timestamp = datetime.now().astimezone(self.event.timezone) in_two_hours = current_timestamp + timedelta(hours=2) slots = context["ak"].akslot_set.filter(start__isnull=False, room__isnull=False) for slot in slots: @@ -157,6 +163,9 @@ class AKDetailView(EventSlugMixin, DetailView): context["featured_slot_remaining"] = floor(remaining.days * 24 * 60 + remaining.seconds / 60) break + # Display interest indication button? + context['interest_indication_active'] = ak_interest_indication_active(self.event, current_timestamp) + return context @@ -277,29 +286,6 @@ class AKEditView(EventSlugMixin, EventInactiveRedirectMixin, UpdateView): return super_form_valid -class AKInterestView(RedirectView): - permanent = False - pattern_name = 'submit:ak_detail' - - def get(self, request, *args, **kwargs): - # Increase interest counter for given AK - ak = get_object_or_404(AK, pk=kwargs['pk']) - if ak.event.active: - ak.increment_interest() - messages.add_message(self.request, messages.SUCCESS, _("Interest saved")) - return super().get(request, *args, **kwargs) - - -# when the interest increase request comes from the AK overview page, redirect to that instead of the AK overview page -class AKOverviewInterestView(AKInterestView): - pattern_name = 'submit:submission_overview' - - def get_redirect_url(self, *args, **kwargs): - # No PK needed for overview page of all AKs - del kwargs['pk'] - return super().get_redirect_url(*args, **kwargs) - - class AKOwnerCreateView(EventSlugMixin, EventInactiveRedirectMixin, CreateView): model = AKOwner template_name = 'AKSubmission/akowner_create_update.html' diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index 08f762b7b7501a236d78898cf696363ebac7c924..84e04f5fbaeb93ae83a75973f4307a73b3131110 100644 --- a/locale/de_DE/LC_MESSAGES/django.po +++ b/locale/de_DE/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-29 22:48+0000\n" +"POT-Creation-Date: 2021-10-29 09: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" diff --git a/templates/base.html b/templates/base.html index 33e00beee25b2f77d704532f9a0b78490a32109d..93cb5be8091a0cc6f20490a7910baef5998c6ba8 100644 --- a/templates/base.html +++ b/templates/base.html @@ -14,7 +14,7 @@ <!-- Load bootstrap, jquery and fontawesome--> {% bootstrap_css %} - {% bootstrap_javascript jquery='slim' %} + {% bootstrap_javascript jquery='full' %} {% fontawesome_5_static %} <link rel="stylesheet" href="{% static 'common/css/custom.css' %}">