diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po index 4fcbd8a8b0d5c9e5dbaab566dd88652847e2058c..42b38565b67a2042eabcdf11b06b6a437d9f6eef 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: 2024-05-31 14:22+0000\n" +"POT-Creation-Date: 2025-01-22 19:00+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" @@ -33,7 +33,8 @@ msgstr "Plan veröffentlichen" msgid "Unpublish plan" msgstr "Plan verbergen" -#: AKModel/admin.py:168 AKModel/models.py:612 AKModel/models.py:1028 +#: AKModel/admin.py:168 AKModel/models.py:689 AKModel/models.py:1114 +#: AKModel/models.py:1150 #: AKModel/templates/admin/AKModel/status/event_aks.html:10 #: AKModel/views/manage.py:75 AKModel/views/status.py:97 msgid "AKs" @@ -59,11 +60,11 @@ msgstr "In Wiki-Syntax exportieren" msgid "Cannot export AKs from more than one event at the same time." msgstr "Kann nicht AKs von mehreren Events zur selben Zeit exportieren." -#: AKModel/admin.py:320 AKModel/views/ak.py:226 +#: AKModel/admin.py:320 AKModel/views/ak.py:237 msgid "Reset interest in AKs" msgstr "Interesse an AKs zurücksetzen" -#: AKModel/admin.py:330 AKModel/views/ak.py:241 +#: AKModel/admin.py:330 AKModel/views/ak.py:252 msgid "Reset AKs' interest counters" msgstr "Interessenszähler der AKs zurücksetzen" @@ -108,17 +109,18 @@ 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:43 AKModel/models.py:91 AKModel/models.py:412 -#: AKModel/models.py:489 AKModel/models.py:522 AKModel/models.py:548 -#: AKModel/models.py:602 AKModel/models.py:744 AKModel/models.py:820 -#: AKModel/models.py:967 AKModel/models.py:1024 AKModel/models.py:1215 +#: AKModel/availability/models.py:43 AKModel/models.py:160 +#: AKModel/models.py:489 AKModel/models.py:566 AKModel/models.py:599 +#: AKModel/models.py:625 AKModel/models.py:679 AKModel/models.py:821 +#: AKModel/models.py:897 AKModel/models.py:1053 AKModel/models.py:1110 +#: AKModel/models.py:1301 msgid "Event" msgstr "Event" -#: AKModel/availability/models.py:44 AKModel/models.py:413 -#: AKModel/models.py:490 AKModel/models.py:523 AKModel/models.py:549 -#: AKModel/models.py:603 AKModel/models.py:745 AKModel/models.py:821 -#: AKModel/models.py:968 AKModel/models.py:1025 AKModel/models.py:1216 +#: AKModel/availability/models.py:44 AKModel/models.py:490 +#: AKModel/models.py:567 AKModel/models.py:600 AKModel/models.py:626 +#: AKModel/models.py:680 AKModel/models.py:822 AKModel/models.py:898 +#: AKModel/models.py:1054 AKModel/models.py:1111 AKModel/models.py:1302 msgid "Associated event" msgstr "Zugehöriges Event" @@ -130,8 +132,8 @@ msgstr "Person" msgid "Person whose availability this is" msgstr "Person deren Verfügbarkeit hier abgebildet wird" -#: AKModel/availability/models.py:61 AKModel/models.py:748 -#: AKModel/models.py:810 AKModel/models.py:1034 +#: AKModel/availability/models.py:61 AKModel/models.py:825 +#: AKModel/models.py:887 AKModel/models.py:1120 msgid "Room" msgstr "Raum" @@ -139,8 +141,8 @@ msgstr "Raum" msgid "Room whose availability this is" msgstr "Raum dessen Verfügbarkeit hier abgebildet wird" -#: AKModel/availability/models.py:70 AKModel/models.py:611 -#: AKModel/models.py:809 AKModel/models.py:962 +#: AKModel/availability/models.py:70 AKModel/models.py:688 +#: AKModel/models.py:886 AKModel/models.py:1048 msgid "AK" msgstr "AK" @@ -148,8 +150,8 @@ msgstr "AK" msgid "AK whose availability this is" msgstr "Verfügbarkeiten" -#: AKModel/availability/models.py:79 AKModel/models.py:493 -#: AKModel/models.py:1040 +#: AKModel/availability/models.py:79 AKModel/models.py:570 +#: AKModel/models.py:1126 msgid "AK Category" msgstr "AK-Kategorie" @@ -157,7 +159,7 @@ msgstr "AK-Kategorie" msgid "AK Category whose availability this is" msgstr "AK-Kategorie, deren Verfügbarkeit hier abgebildet wird" -#: AKModel/availability/models.py:300 +#: AKModel/availability/models.py:300 AKModel/models.py:721 msgid "Availabilities" msgstr "Verfügbarkeiten" @@ -219,7 +221,7 @@ msgstr "" "fürWünsche markieren, z.B. um während der Präsentation auf einem Touchscreen " "ausgefüllt zu werden?" -#: AKModel/forms.py:189 AKModel/models.py:1209 +#: AKModel/forms.py:189 AKModel/models.py:1295 msgid "Default Slots" msgstr "Standardslots" @@ -266,7 +268,7 @@ msgstr "JSON-Daten" msgid "JSON data from the scheduling solver" msgstr "JSON-Daten, die der scheduling-solver produziert hat" -#: AKModel/metaviews/admin.py:156 AKModel/models.py:60 +#: AKModel/metaviews/admin.py:156 AKModel/models.py:129 msgid "Start" msgstr "Start" @@ -291,66 +293,66 @@ msgstr "Aktivieren?" msgid "Finish" msgstr "Abschluss" -#: AKModel/models.py:51 AKModel/models.py:481 AKModel/models.py:519 -#: AKModel/models.py:546 AKModel/models.py:564 AKModel/models.py:736 +#: AKModel/models.py:120 AKModel/models.py:558 AKModel/models.py:596 +#: AKModel/models.py:623 AKModel/models.py:641 AKModel/models.py:813 msgid "Name" msgstr "Name" -#: AKModel/models.py:52 +#: AKModel/models.py:121 msgid "Name or iteration of the event" msgstr "Name oder Iteration des Events" -#: AKModel/models.py:53 +#: AKModel/models.py:122 msgid "Short Form" msgstr "Kurzer Name" -#: AKModel/models.py:54 +#: AKModel/models.py:123 msgid "Short name of letters/numbers/dots/dashes/underscores used in URLs." msgstr "" "Kurzname bestehend aus Buchstaben, Nummern, Punkten und Unterstrichen zur " "Nutzung in URLs" -#: AKModel/models.py:56 +#: AKModel/models.py:125 msgid "Place" msgstr "Ort" -#: AKModel/models.py:57 +#: AKModel/models.py:126 msgid "City etc. the event takes place in" msgstr "Stadt o.ä. in der das Event stattfindet" -#: AKModel/models.py:59 +#: AKModel/models.py:128 msgid "Time Zone" msgstr "Zeitzone" -#: AKModel/models.py:59 +#: AKModel/models.py:128 msgid "Time Zone where this event takes place in" msgstr "Zeitzone in der das Event stattfindet" -#: AKModel/models.py:60 +#: AKModel/models.py:129 msgid "Time the event begins" msgstr "Zeit zu der das Event beginnt" -#: AKModel/models.py:61 +#: AKModel/models.py:130 msgid "End" msgstr "Ende" -#: AKModel/models.py:61 +#: AKModel/models.py:130 msgid "Time the event ends" msgstr "Zeit zu der das Event endet" -#: AKModel/models.py:62 +#: AKModel/models.py:131 msgid "Resolution Deadline" msgstr "Resolutionsdeadline" -#: AKModel/models.py:63 +#: AKModel/models.py:132 msgid "When should AKs with intention to submit a resolution be done?" msgstr "Wann sollen AKs mit Resolutionsabsicht stattgefunden haben?" -#: AKModel/models.py:65 +#: AKModel/models.py:134 msgid "Interest Window Start" msgstr "Beginn Interessensbekundung" -#: AKModel/models.py:67 +#: AKModel/models.py:136 msgid "" "Opening time for expression of interest. When left blank, no interest " "indication will be possible." @@ -358,71 +360,71 @@ msgstr "" "Öffnungszeitpunkt für die Angabe von Interesse an AKs.Wenn das Feld leer " "bleibt, wird keine Abgabe von Interesse möglich sein." -#: AKModel/models.py:69 +#: AKModel/models.py:138 msgid "Interest Window End" msgstr "Ende Interessensbekundung" -#: AKModel/models.py:70 +#: AKModel/models.py:139 msgid "Closing time for expression of interest." msgstr "Öffnungszeitpunkt für die Angabe von Interesse an AKs." -#: AKModel/models.py:72 +#: AKModel/models.py:141 msgid "Public event" msgstr "Öffentliches Event" -#: AKModel/models.py:73 +#: AKModel/models.py:142 msgid "Show this event on overview page." msgstr "Zeige dieses Event auf der Übersichtseite an" -#: AKModel/models.py:75 +#: AKModel/models.py:144 msgid "Active State" msgstr "Aktiver Status" -#: AKModel/models.py:75 +#: AKModel/models.py:144 msgid "Marks currently active events" msgstr "Markiert aktuell aktive Events" -#: AKModel/models.py:76 +#: AKModel/models.py:145 msgid "Plan Hidden" msgstr "Plan verborgen" -#: AKModel/models.py:76 +#: AKModel/models.py:145 msgid "Hides plan for non-staff users" msgstr "Verbirgt den Plan für Nutzer*innen ohne erweiterte Rechte" -#: AKModel/models.py:78 +#: AKModel/models.py:147 msgid "Plan published at" msgstr "Plan veröffentlicht am/um" -#: AKModel/models.py:79 +#: AKModel/models.py:148 msgid "Timestamp at which the plan was published" msgstr "Zeitpunkt, zu dem der Plan veröffentlicht wurde" -#: AKModel/models.py:81 +#: AKModel/models.py:150 msgid "Base URL" msgstr "URL-Prefix" -#: AKModel/models.py:81 +#: AKModel/models.py:150 msgid "Prefix for wiki link construction" msgstr "Prefix für die automatische Generierung von Wiki-Links" -#: AKModel/models.py:82 +#: AKModel/models.py:151 msgid "Wiki Export Template Name" msgstr "Wiki-Export Templatename" -#: AKModel/models.py:83 +#: AKModel/models.py:152 msgid "Default Slot Length" msgstr "Standardslotlänge" -#: AKModel/models.py:84 +#: AKModel/models.py:153 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:86 +#: AKModel/models.py:155 msgid "Contact email address" msgstr "E-Mail Kontaktadresse" -#: AKModel/models.py:87 +#: AKModel/models.py:156 msgid "" "An email address that is displayed on every page and can be used for all " "kinds of questions" @@ -430,75 +432,107 @@ msgstr "" "Eine Mailadresse die auf jeder Seite angezeigt wird und für alle Arten von " "Fragen genutzt werden kann" -#: AKModel/models.py:92 +#: AKModel/models.py:161 msgid "Events" msgstr "Events" -#: AKModel/models.py:407 +#: AKModel/models.py:430 +#, python-brace-format +msgid "AK {ak_name} is not assigned any timeslot by the solver" +msgstr "Dem AK {ak_name} wurde vom Solver kein Zeitslot zugewiesen" + +#: AKModel/models.py:440 +#, python-brace-format +msgid "" +"Duration of AK {ak_name} assigned by solver ({solver_duration} hours) is " +"less than the duration required by the slot ({slot_duration} hours)" +msgstr "" +"Die dem AK {ak_name} vom Solver zugewiesene Dauer ({solver_duration} Stunden) ist " +"kürzer als die aktuell vorgesehene Dauer des Slots ({slot_duration} Stunden)" + +#: AKModel/models.py:454 +#, python-brace-format +msgid "" +"Fixed AK {ak_name} assigned by solver to room {solver_room} is fixed to room " +"{slot_room}" +msgstr "" +"Dem fix geplanten AK {ak_name} wurde vom Solver Raum {solver_room} zugewiesen, " +"dabei ist der AK bereits fix in Raum {slot_room} eingeplant." + +#: AKModel/models.py:465 +#, python-brace-format +msgid "" +"Fixed AK {ak_name} assigned by solver to start at {solver_start} is fixed to " +"start at {slot_start}" +msgstr "" +"Dem fix geplanten AK {ak_name} wurde vom Solver die Startzeit {solver_start} zugewiesen, " +"dabei ist der AK bereits für {slot_start} eingeplant." + +#: AKModel/models.py:484 msgid "Nickname" msgstr "Spitzname" -#: AKModel/models.py:407 +#: AKModel/models.py:484 msgid "Name to identify an AK owner by" msgstr "Name, durch den eine AK-Leitung identifiziert wird" -#: AKModel/models.py:408 +#: AKModel/models.py:485 msgid "Slug" msgstr "Slug" -#: AKModel/models.py:408 +#: AKModel/models.py:485 msgid "Slug for URL generation" msgstr "Slug für URL-Generierung" -#: AKModel/models.py:409 +#: AKModel/models.py:486 msgid "Institution" msgstr "Instutution" -#: AKModel/models.py:409 +#: AKModel/models.py:486 msgid "Uni etc." msgstr "Universität o.ä." -#: AKModel/models.py:410 AKModel/models.py:573 +#: AKModel/models.py:487 AKModel/models.py:650 msgid "Web Link" msgstr "Internet Link" -#: AKModel/models.py:410 +#: AKModel/models.py:487 msgid "Link to Homepage" msgstr "Link zu Homepage oder Webseite" -#: AKModel/models.py:416 AKModel/models.py:1033 +#: AKModel/models.py:493 AKModel/models.py:1119 msgid "AK Owner" msgstr "AK-Leitung" -#: AKModel/models.py:417 +#: AKModel/models.py:494 msgid "AK Owners" msgstr "AK-Leitungen" -#: AKModel/models.py:481 +#: AKModel/models.py:558 msgid "Name of the AK Category" msgstr "Name der AK-Kategorie" -#: AKModel/models.py:482 AKModel/models.py:520 +#: AKModel/models.py:559 AKModel/models.py:597 msgid "Color" msgstr "Farbe" -#: AKModel/models.py:482 AKModel/models.py:520 +#: AKModel/models.py:559 AKModel/models.py:597 msgid "Color for displaying" msgstr "Farbe für die Anzeige" -#: AKModel/models.py:483 AKModel/models.py:567 +#: AKModel/models.py:560 AKModel/models.py:644 msgid "Description" msgstr "Beschreibung" -#: AKModel/models.py:484 +#: AKModel/models.py:561 msgid "Short description of this AK Category" msgstr "Beschreibung der AK-Kategorie" -#: AKModel/models.py:485 +#: AKModel/models.py:562 msgid "Present by default" msgstr "Defaultmäßig präsentieren" -#: AKModel/models.py:486 +#: AKModel/models.py:563 msgid "" "Present AKs of this category by default if AK owner did not specify whether " "this AK should be presented?" @@ -506,132 +540,132 @@ msgstr "" "AKs dieser Kategorie standardmäßig vorstellen, wenn die Leitungen das für " "ihren AK nicht explizit spezifiziert haben?" -#: AKModel/models.py:494 +#: AKModel/models.py:571 msgid "AK Categories" msgstr "AK-Kategorien" -#: AKModel/models.py:519 +#: AKModel/models.py:596 msgid "Name of the AK Track" msgstr "Name des AK-Tracks" -#: AKModel/models.py:526 +#: AKModel/models.py:603 msgid "AK Track" msgstr "AK-Track" -#: AKModel/models.py:527 +#: AKModel/models.py:604 msgid "AK Tracks" msgstr "AK-Tracks" -#: AKModel/models.py:546 +#: AKModel/models.py:623 msgid "Name of the Requirement" msgstr "Name der Anforderung" -#: AKModel/models.py:552 AKModel/models.py:1037 +#: AKModel/models.py:629 AKModel/models.py:1123 msgid "AK Requirement" msgstr "AK-Anforderung" -#: AKModel/models.py:553 +#: AKModel/models.py:630 msgid "AK Requirements" msgstr "AK-Anforderungen" -#: AKModel/models.py:564 +#: AKModel/models.py:641 msgid "Name of the AK" msgstr "Name des AKs" -#: AKModel/models.py:565 +#: AKModel/models.py:642 msgid "Short Name" msgstr "Kurzer Name" -#: AKModel/models.py:566 +#: AKModel/models.py:643 msgid "Name displayed in the schedule" msgstr "Name zur Anzeige im AK-Plan" -#: AKModel/models.py:567 +#: AKModel/models.py:644 msgid "Description of the AK" msgstr "Beschreibung des AKs" -#: AKModel/models.py:569 +#: AKModel/models.py:646 msgid "Owners" msgstr "Leitungen" -#: AKModel/models.py:570 +#: AKModel/models.py:647 msgid "Those organizing the AK" msgstr "Menschen, die den AK organisieren und halten" -#: AKModel/models.py:573 +#: AKModel/models.py:650 msgid "Link to wiki page" msgstr "Link zur Wiki Seite" -#: AKModel/models.py:574 +#: AKModel/models.py:651 msgid "Protocol Link" msgstr "Protokolllink" -#: AKModel/models.py:574 +#: AKModel/models.py:651 msgid "Link to protocol" msgstr "Link zum Protokoll" -#: AKModel/models.py:576 +#: AKModel/models.py:653 msgid "Category" msgstr "Kategorie" -#: AKModel/models.py:577 +#: AKModel/models.py:654 msgid "Category of the AK" msgstr "Kategorie des AKs" -#: AKModel/models.py:578 +#: AKModel/models.py:655 msgid "Track" msgstr "Track" -#: AKModel/models.py:579 +#: AKModel/models.py:656 msgid "Track the AK belongs to" msgstr "Track zu dem der AK gehört" -#: AKModel/models.py:581 +#: AKModel/models.py:658 msgid "Resolution Intention" msgstr "Resolutionsabsicht" -#: AKModel/models.py:582 +#: AKModel/models.py:659 msgid "Intends to submit a resolution" msgstr "Beabsichtigt eine Resolution einzureichen" -#: AKModel/models.py:583 +#: AKModel/models.py:660 msgid "Present this AK" msgstr "AK präsentieren" -#: AKModel/models.py:584 +#: AKModel/models.py:661 msgid "Present results of this AK" msgstr "Die Ergebnisse dieses AKs vorstellen" -#: AKModel/models.py:586 AKModel/views/status.py:170 +#: AKModel/models.py:663 AKModel/models.py:716 AKModel/views/status.py:170 msgid "Requirements" msgstr "Anforderungen" -#: AKModel/models.py:587 +#: AKModel/models.py:664 msgid "AK's Requirements" msgstr "Anforderungen des AKs" -#: AKModel/models.py:589 +#: AKModel/models.py:666 msgid "Conflicting AKs" msgstr "AK-Konflikte" -#: AKModel/models.py:590 +#: AKModel/models.py:667 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:591 +#: AKModel/models.py:668 msgid "Prerequisite AKs" msgstr "Vorausgesetzte AKs" -#: AKModel/models.py:592 +#: AKModel/models.py:669 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:594 +#: AKModel/models.py:671 msgid "Organizational Notes" msgstr "Notizen zur Organisation" -#: AKModel/models.py:595 +#: AKModel/models.py:672 msgid "" "Notes to organizers. These are public. For private notes, please use the " "button for private messages on the detail page of this AK (after creation/" @@ -641,295 +675,303 @@ msgstr "" "Anmerkungen bitte den Button für Direktnachrichten verwenden (nach dem " "Anlegen/Bearbeiten)." -#: AKModel/models.py:598 +#: AKModel/models.py:675 AKModel/models.py:714 msgid "Interest" msgstr "Interesse" -#: AKModel/models.py:598 +#: AKModel/models.py:675 msgid "Expected number of people" msgstr "Erwartete Personenzahl" -#: AKModel/models.py:599 +#: AKModel/models.py:676 msgid "Interest Counter" msgstr "Interessenszähler" -#: AKModel/models.py:600 +#: AKModel/models.py:677 msgid "People who have indicated interest online" msgstr "Anzahl Personen, die online Interesse bekundet haben" -#: AKModel/models.py:605 +#: AKModel/models.py:682 msgid "Export?" msgstr "Export?" -#: AKModel/models.py:606 +#: AKModel/models.py:683 msgid "Include AK in wiki export?" msgstr "AK bei Wiki-Export berücksichtigen?" -#: AKModel/models.py:736 +#: AKModel/models.py:718 +msgid "Conflicts" +msgstr "Konflikte" + +#: AKModel/models.py:720 +msgid "Prerequisites" +msgstr "Voraussetzungen" + +#: AKModel/models.py:813 msgid "Name or number of the room" msgstr "Name oder Nummer des Raums" -#: AKModel/models.py:737 +#: AKModel/models.py:814 msgid "Location" msgstr "Ort" -#: AKModel/models.py:738 +#: AKModel/models.py:815 msgid "Name or number of the location" msgstr "Name oder Nummer des Ortes" -#: AKModel/models.py:739 +#: AKModel/models.py:816 msgid "Capacity" msgstr "Kapazität" -#: AKModel/models.py:740 +#: AKModel/models.py:817 msgid "Maximum number of people (-1 for unlimited)." msgstr "Maximale Personenzahl (-1 wenn unbeschränkt)." -#: AKModel/models.py:741 +#: AKModel/models.py:818 msgid "Properties" msgstr "Eigenschaften" -#: AKModel/models.py:742 +#: AKModel/models.py:819 msgid "AK requirements fulfilled by the room" msgstr "AK-Anforderungen, die dieser Raum erfüllt" -#: AKModel/models.py:749 AKModel/views/status.py:59 +#: AKModel/models.py:826 AKModel/views/status.py:59 msgid "Rooms" msgstr "Räume" -#: AKModel/models.py:809 +#: AKModel/models.py:886 msgid "AK being mapped" msgstr "AK, der zugeordnet wird" -#: AKModel/models.py:811 +#: AKModel/models.py:888 msgid "Room the AK will take place in" msgstr "Raum in dem der AK stattfindet" -#: AKModel/models.py:812 AKModel/models.py:1212 +#: AKModel/models.py:889 AKModel/models.py:1298 msgid "Slot Begin" msgstr "Beginn des Slots" -#: AKModel/models.py:812 AKModel/models.py:1212 +#: AKModel/models.py:889 AKModel/models.py:1298 msgid "Time and date the slot begins" msgstr "Zeit und Datum zu der der AK beginnt" -#: AKModel/models.py:814 +#: AKModel/models.py:891 msgid "Duration" msgstr "Dauer" -#: AKModel/models.py:815 +#: AKModel/models.py:892 msgid "Length in hours" msgstr "Länge in Stunden" -#: AKModel/models.py:817 +#: AKModel/models.py:894 msgid "Scheduling fixed" msgstr "Planung fix" -#: AKModel/models.py:818 +#: AKModel/models.py:895 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:823 +#: AKModel/models.py:900 msgid "Last update" msgstr "Letzte Aktualisierung" -#: AKModel/models.py:826 +#: AKModel/models.py:903 msgid "AK Slot" msgstr "AK-Slot" -#: AKModel/models.py:827 AKModel/models.py:1030 +#: AKModel/models.py:904 AKModel/models.py:1116 AKModel/models.py:1151 msgid "AK Slots" msgstr "AK-Slot" -#: AKModel/models.py:849 AKModel/models.py:858 +#: AKModel/models.py:926 AKModel/models.py:935 msgid "Not scheduled yet" msgstr "Noch nicht geplant" -#: AKModel/models.py:963 +#: AKModel/models.py:1049 msgid "AK this message belongs to" msgstr "AK zu dem die Nachricht gehört" -#: AKModel/models.py:964 +#: AKModel/models.py:1050 msgid "Message text" msgstr "Nachrichtentext" -#: AKModel/models.py:965 +#: AKModel/models.py:1051 msgid "Message to the organizers. This is not publicly visible." msgstr "" "Nachricht an die Organisator*innen. Diese ist nicht öffentlich sichtbar." -#: AKModel/models.py:969 +#: AKModel/models.py:1055 msgid "Resolved" msgstr "Erledigt" -#: AKModel/models.py:970 +#: AKModel/models.py:1056 msgid "This message has been resolved (no further action needed)" msgstr "" "Diese Nachricht wurde vollständig bearbeitet (keine weiteren Aktionen " "notwendig)" -#: AKModel/models.py:973 +#: AKModel/models.py:1059 msgid "AK Orga Message" msgstr "AK-Organachricht" -#: AKModel/models.py:974 +#: AKModel/models.py:1060 msgid "AK Orga Messages" msgstr "AK-Organachrichten" -#: AKModel/models.py:991 +#: AKModel/models.py:1077 msgid "Constraint Violation" msgstr "Constraintverletzung" -#: AKModel/models.py:992 +#: AKModel/models.py:1078 msgid "Constraint Violations" msgstr "Constraintverletzungen" -#: AKModel/models.py:999 +#: AKModel/models.py:1085 msgid "Owner has two parallel slots" msgstr "Leitung hat zwei Slots parallel" -#: AKModel/models.py:1000 +#: AKModel/models.py:1086 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:1001 +#: AKModel/models.py:1087 msgid "Room has two AK slots scheduled at the same time" msgstr "Raum hat zwei AK Slots gleichzeitig" -#: AKModel/models.py:1002 +#: AKModel/models.py:1088 msgid "Room does not satisfy the requirement of the scheduled AK" msgstr "Room erfüllt die Anforderungen des platzierten AKs nicht" -#: AKModel/models.py:1003 +#: AKModel/models.py:1089 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:1004 +#: AKModel/models.py:1090 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:1006 +#: AKModel/models.py:1092 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:1007 +#: AKModel/models.py:1093 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:1008 +#: AKModel/models.py:1094 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:1009 +#: AKModel/models.py:1095 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:1010 +#: AKModel/models.py:1096 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:1016 +#: AKModel/models.py:1102 msgid "Warning" msgstr "Warnung" -#: AKModel/models.py:1017 +#: AKModel/models.py:1103 msgid "Violation" msgstr "Verletzung" -#: AKModel/models.py:1019 +#: AKModel/models.py:1105 msgid "Type" msgstr "Art" -#: AKModel/models.py:1020 +#: AKModel/models.py:1106 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:1021 +#: AKModel/models.py:1107 msgid "Level" msgstr "Level" -#: AKModel/models.py:1022 +#: AKModel/models.py:1108 msgid "Severity level of the violation" msgstr "Schweregrad der Verletzung" -#: AKModel/models.py:1029 +#: AKModel/models.py:1115 msgid "AK(s) belonging to this constraint" msgstr "AK(s), die zu diesem Constraint gehören" -#: AKModel/models.py:1031 +#: AKModel/models.py:1117 msgid "AK Slot(s) belonging to this constraint" msgstr "AK Slot(s), die zu diesem Constraint gehören" -#: AKModel/models.py:1033 +#: AKModel/models.py:1119 msgid "AK Owner belonging to this constraint" msgstr "AK Leitung(en), die zu diesem Constraint gehören" -#: AKModel/models.py:1035 +#: AKModel/models.py:1121 msgid "Room belonging to this constraint" msgstr "Raum, der zu diesem Constraint gehört" -#: AKModel/models.py:1038 +#: AKModel/models.py:1124 msgid "AK Requirement belonging to this constraint" msgstr "AK Anforderung, die zu diesem Constraint gehört" -#: AKModel/models.py:1040 +#: AKModel/models.py:1126 msgid "AK Category belonging to this constraint" msgstr "AK Kategorie, di zu diesem Constraint gehört" -#: AKModel/models.py:1042 +#: AKModel/models.py:1128 msgid "Comment" msgstr "Kommentar" -#: AKModel/models.py:1042 +#: AKModel/models.py:1128 msgid "Comment or further details for this violation" msgstr "Kommentar oder weitere Details zu dieser Vereletzung" -#: AKModel/models.py:1045 +#: AKModel/models.py:1131 msgid "Timestamp" msgstr "Timestamp" -#: AKModel/models.py:1045 +#: AKModel/models.py:1131 msgid "Time of creation" msgstr "Zeitpunkt der ERstellung" -#: AKModel/models.py:1046 +#: AKModel/models.py:1132 msgid "Manually Resolved" msgstr "Manuell behoben" -#: AKModel/models.py:1047 +#: AKModel/models.py:1133 msgid "Mark this violation manually as resolved" msgstr "Markiere diese Verletzung manuell als behoben" -#: AKModel/models.py:1074 +#: AKModel/models.py:1160 #: AKModel/templates/admin/AKModel/requirements_overview.html:27 msgid "Details" msgstr "Details" -#: AKModel/models.py:1208 +#: AKModel/models.py:1294 msgid "Default Slot" msgstr "Standardslot" -#: AKModel/models.py:1213 +#: AKModel/models.py:1299 msgid "Slot End" msgstr "Ende des Slots" -#: AKModel/models.py:1213 +#: AKModel/models.py:1299 msgid "Time and date the slot ends" msgstr "Zeit und Datum zu der der Slot endet" -#: AKModel/models.py:1218 +#: AKModel/models.py:1304 msgid "Primary categories" msgstr "Primäre Kategorien" -#: AKModel/models.py:1219 +#: AKModel/models.py:1305 msgid "Categories that should be assigned to this slot primarily" msgstr "Kategorieren, die diesem Slot primär zugewiesen werden sollen" -#: AKModel/site.py:14 +#: AKModel/site.py:13 AKModel/site.py:14 msgid "Administration" msgstr "Verwaltung" @@ -1135,35 +1177,35 @@ msgstr "AK-CSV-Export" msgid "AK JSON Export" msgstr "AK-JSON-Export" -#: AKModel/views/ak.py:175 +#: AKModel/views/ak.py:186 msgid "AK Wiki Export" msgstr "AK-Wiki-Export" -#: AKModel/views/ak.py:186 AKModel/views/manage.py:55 +#: AKModel/views/ak.py:197 AKModel/views/manage.py:55 msgid "Wishes" msgstr "Wünsche" -#: AKModel/views/ak.py:198 +#: AKModel/views/ak.py:209 msgid "Delete AK Orga Messages" msgstr "AK-Organachrichten löschen" -#: AKModel/views/ak.py:216 +#: AKModel/views/ak.py:227 msgid "AK Orga Messages successfully deleted" msgstr "AK-Organachrichten erfolgreich gelöscht" -#: AKModel/views/ak.py:228 +#: AKModel/views/ak.py:239 msgid "Interest of the following AKs will be set to not filled (-1):" msgstr "Interesse an den folgenden AKs wird auf nicht ausgefüllt (-1) gesetzt:" -#: AKModel/views/ak.py:229 +#: AKModel/views/ak.py:240 msgid "Reset of interest in AKs successful." msgstr "Interesse an AKs erfolgreich zurückgesetzt." -#: AKModel/views/ak.py:243 +#: AKModel/views/ak.py:254 msgid "Interest counter of the following AKs will be set to 0:" msgstr "Interessensbekundungszähler der folgenden AKs wird auf 0 gesetzt:" -#: AKModel/views/ak.py:244 +#: AKModel/views/ak.py:255 msgid "AKs' interest counters set back to 0." msgstr "Interessenszähler der AKs zurückgesetzt" @@ -1265,6 +1307,15 @@ msgstr "" msgid "AK Schedule JSON Import" msgstr "AK-Plan JSON-Import" +#: AKModel/views/manage.py:265 +#, python-brace-format +msgid "Successfully imported {n} slot(s)" +msgstr "Erfolgreich {n} Slot(s) importiert" + +#: AKModel/views/manage.py:271 +msgid "Importing an AK schedule failed! Reason: " +msgstr "AK-Plan importieren fehlgeschlagen! Grund: " + #: AKModel/views/room.py:37 #, python-format msgid "Created Room '%(room)s'" diff --git a/AKModel/models.py b/AKModel/models.py index c51b75566c43840c679de07e3a9231acf6e5365b..1cd3f1ba908d63d5f59ceb0c3d07b33322e500d5 100644 --- a/AKModel/models.py +++ b/AKModel/models.py @@ -6,7 +6,7 @@ from dataclasses import dataclass from datetime import datetime, timedelta from typing import Iterable, Generator -from django.db import models +from django.db import models, transaction from django.apps import apps from django.db.models import Count from django.urls import reverse_lazy @@ -401,7 +401,8 @@ class Event(models.Model): else: yield from self.uniform_time_slots(slots_in_an_hour=slots_in_an_hour) - def schedule_from_json(self, schedule: str) -> None: + @transaction.atomic + def schedule_from_json(self, schedule: str) -> int: """Load AK schedule from a json string. :param schedule: A string that can be decoded to json, describing @@ -419,18 +420,63 @@ class Event(models.Model): for timeslot in block } + slots_updated = 0 for scheduled_slot in schedule["scheduled_aks"]: + scheduled_slot["timeslot_ids"] = list(map(int, scheduled_slot["timeslot_ids"])) slot = AKSlot.objects.get(id=int(scheduled_slot["ak_id"])) - slot.room = Room.objects.get(id=int(scheduled_slot["room_id"])) - scheduled_slot["timeslot_ids"] = list(map(int, scheduled_slot["timeslot_ids"])) + if not scheduled_slot["timeslot_ids"]: + raise ValueError( + _("AK {ak_name} is not assigned any timeslot by the solver").format(ak_name=slot.ak.name) + ) start_timeslot = timeslot_dict[min(scheduled_slot["timeslot_ids"])].avail end_timeslot = timeslot_dict[max(scheduled_slot["timeslot_ids"])].avail + solver_duration = (end_timeslot.end - start_timeslot.start).total_seconds() / 3600.0 + + if solver_duration + 2e-4 < slot.duration: + raise ValueError( + _( + "Duration of AK {ak_name} assigned by solver ({solver_duration} hours) " + "is less than the duration required by the slot ({slot_duration} hours)" + ).format( + ak_name=slot.ak.name, + solver_duration=solver_duration, + slot_duration=slot.duration, + ) + ) + + if slot.fixed: + solver_room = Room.objects.get(id=int(scheduled_slot["room_id"])) + if slot.room != solver_room: + raise ValueError( + _( + "Fixed AK {ak_name} assigned by solver to room {solver_room} " + "is fixed to room {slot_room}" + ).format( + ak_name=slot.ak.name, + solver_room=solver_room.name, + slot_room=slot.room.name, + ) + ) + if slot.start != start_timeslot.start: + raise ValueError( + _( + "Fixed AK {ak_name} assigned by solver to start at {solver_start} " + "is fixed to start at {slot_start}" + ).format( + ak_name=slot.ak.name, + solver_start=start_timeslot.start, + slot_start=slot.start, + ) + ) + else: + slot.room = Room.objects.get(id=int(scheduled_slot["room_id"])) + slot.start = start_timeslot.start + slot.save() + slots_updated += 1 - slot.start = start_timeslot.start - slot.duration = (end_timeslot.end - start_timeslot.start).total_seconds() / 3600.0 - slot.save() + return slots_updated class AKOwner(models.Model): """ An AKOwner describes the person organizing/holding an AK. diff --git a/AKModel/views/manage.py b/AKModel/views/manage.py index 1bad9534efd6fe81fa70ebf30fbdf84aad476967..3acb05fd29a6e91cd17f45e9ed43d889a67da22c 100644 --- a/AKModel/views/manage.py +++ b/AKModel/views/manage.py @@ -257,6 +257,18 @@ class AKScheduleJSONImportView(EventSlugMixin, IntermediateAdminView): title = _("AK Schedule JSON Import") def form_valid(self, form): - self.event.schedule_from_json(form.data["json_data"]) + try: + number_of_slots_changed = self.event.schedule_from_json(form.data["json_data"]) + messages.add_message( + self.request, + messages.SUCCESS, + _("Successfully imported {n} slot(s)").format(n=number_of_slots_changed) + ) + except ValueError as ex: + messages.add_message( + self.request, + messages.ERROR, + _("Importing an AK schedule failed! Reason: ") + str(ex), + ) return redirect("admin:event_status", self.event.slug) diff --git a/AKScheduling/locale/de_DE/LC_MESSAGES/django.po b/AKScheduling/locale/de_DE/LC_MESSAGES/django.po index e66d8d55bcda42f3271b2400d6b98cf84f64ee1d..1e391c1fa08573165d8d02636ffd40027437b583 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: 2024-04-25 00:24+0200\n" +"POT-Creation-Date: 2025-01-22 19:00+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,7 +27,7 @@ msgstr "Ende" #: AKScheduling/forms.py:26 msgid "Duration" -msgstr "" +msgstr "Dauer" #: AKScheduling/forms.py:27 #: AKScheduling/templates/admin/AKScheduling/scheduling.html:171 @@ -107,6 +107,7 @@ msgid "Event Status" msgstr "Event-Status" #: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:113 +#: AKScheduling/views.py:48 msgid "Scheduling" msgstr "Scheduling" @@ -239,6 +240,7 @@ msgstr[1] "" " " #: AKScheduling/templates/admin/AKScheduling/unscheduled.html:7 +#: AKScheduling/views.py:25 msgid "Unscheduled AK Slots" msgstr "Noch nicht geschedulte AK-Slots" @@ -246,10 +248,22 @@ msgstr "Noch nicht geschedulte AK-Slots" msgid "Count" msgstr "Anzahl" +#: AKScheduling/views.py:89 +msgid "Constraint violations for" +msgstr "Constraintverletzungen für" + +#: AKScheduling/views.py:104 +msgid "AKs requiring special attention for" +msgstr "AKs die besondere Aufmerksamkeit erfordern für" + #: AKScheduling/views.py:150 msgid "Interest updated" msgstr "Interesse aktualisiert" +#: AKScheduling/views.py:157 +msgid "Enter interest" +msgstr "Interesse eingeben" + #: AKScheduling/views.py:201 msgid "Wishes" msgstr "Wünsche" diff --git a/AKSubmission/locale/de_DE/LC_MESSAGES/django.po b/AKSubmission/locale/de_DE/LC_MESSAGES/django.po index e8add44b31100539ff4a2b8311b40ffba14c4b8a..e524139c69295e6a85683b3ad2e114714bca7b21 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: 2024-05-27 01:57+0000\n" +"POT-Creation-Date: 2025-01-22 19:00+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" @@ -418,6 +418,10 @@ msgstr "" msgid "Currently planned AKs" msgstr "Aktuell geplante AKs" +#: AKSubmission/views.py:231 +msgid "AKs with Track" +msgstr "AK mit Track" + #: AKSubmission/views.py:300 msgid "Event inactive. Cannot create or update." msgstr "Event inaktiv. Hinzufügen/Bearbeiten nicht möglich."