diff --git a/AKModel/admin.py b/AKModel/admin.py index 64c56c1a0541a914c72602e5551d8afc8c6736cd..a039742d61987702cc5fa8e6736c5d1951305d20 100644 --- a/AKModel/admin.py +++ b/AKModel/admin.py @@ -10,8 +10,8 @@ from django.utils.translation import gettext_lazy as _ from simple_history.admin import SimpleHistoryAdmin from AKModel.availability.models import Availability -from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequirement, AK, AKSlot, Room -from AKModel.views import EventStatusView, AKCSVExportView +from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequirement, AK, AKSlot, Room, AKOrgaMessage +from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView, AKMessageDeleteView @admin.register(Event) @@ -26,7 +26,10 @@ class EventAdmin(admin.ModelAdmin): urls = super().get_urls() custom_urls = [ path('<slug:slug>/status/', self.admin_site.admin_view(EventStatusView.as_view()), name="event_status"), - path('<slug:event_slug>/ak-csv-export/', self.admin_site.admin_view(AKCSVExportView.as_view()), name="ak_csv_export") + path('<slug:event_slug>/ak-csv-export/', self.admin_site.admin_view(AKCSVExportView.as_view()), name="ak_csv_export"), + path('<slug:event_slug>/ak-wiki-export/', self.admin_site.admin_view(AKWikiExportView.as_view()), name="ak_wiki_export"), + path('<slug:slug>/delete-orga-messages/', self.admin_site.admin_view(AKMessageDeleteView.as_view()), + name="ak_delete_orga_messages"), ] return custom_urls + urls @@ -218,3 +221,10 @@ class AvailabilityAdmin(admin.ModelAdmin): else: timezone.activate("UTC") return super().get_form(request, obj, change, **kwargs) + + +@admin.register(AKOrgaMessage) +class AKOrgaMessageAdmin(admin.ModelAdmin): + list_display = ['timestamp', 'ak', 'text'] + list_filter = ['ak__event'] + readonly_fields = ['timestamp', 'ak', 'text'] diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po index 7d0434ae1fa728a4d64d8cf6b6fedae8afa261e4..91b245972eae61340e93f91b362ea61924edd84e 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: 2020-07-12 16:17+0000\n" +"POT-Creation-Date: 2020-09-29 23:27+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -11,24 +11,24 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: AKModel/admin.py:35 AKModel/admin.py:36 +#: AKModel/admin.py:38 AKModel/admin.py:39 #: AKModel/templates/admin/AKModel/status.html:7 msgid "Status" msgstr "Status" -#: AKModel/admin.py:114 +#: AKModel/admin.py:117 msgid "Wish" msgstr "AK-Wunsch" -#: AKModel/admin.py:120 +#: AKModel/admin.py:123 msgid "Is wish" msgstr "Ist ein Wunsch" -#: AKModel/admin.py:121 +#: AKModel/admin.py:124 msgid "Is not a wish" msgstr "Ist kein Wunsch" -#: AKModel/admin.py:148 +#: AKModel/admin.py:151 msgid "Export to wiki syntax" msgstr "In Wiki-Syntax exportieren" @@ -56,15 +56,15 @@ 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:44 AKModel/models.py:73 -#: AKModel/models.py:125 AKModel/models.py:144 AKModel/models.py:176 -#: AKModel/models.py:230 AKModel/models.py:276 AKModel/models.py:306 +#: AKModel/availability/models.py:38 AKModel/models.py:45 AKModel/models.py:74 +#: AKModel/models.py:126 AKModel/models.py:145 AKModel/models.py:177 +#: AKModel/models.py:231 AKModel/models.py:277 AKModel/models.py:307 msgid "Event" msgstr "Event" -#: AKModel/availability/models.py:39 AKModel/models.py:74 AKModel/models.py:126 -#: AKModel/models.py:145 AKModel/models.py:177 AKModel/models.py:231 -#: AKModel/models.py:277 AKModel/models.py:307 +#: AKModel/availability/models.py:39 AKModel/models.py:75 AKModel/models.py:127 +#: AKModel/models.py:146 AKModel/models.py:178 AKModel/models.py:232 +#: AKModel/models.py:278 AKModel/models.py:308 msgid "Associated event" msgstr "Zugehöriges Event" @@ -76,8 +76,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:280 -#: AKModel/models.py:299 +#: AKModel/availability/models.py:56 AKModel/models.py:281 +#: AKModel/models.py:300 msgid "Room" msgstr "Raum" @@ -85,8 +85,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:236 -#: AKModel/models.py:298 +#: AKModel/availability/models.py:65 AKModel/models.py:237 +#: AKModel/models.py:299 AKModel/models.py:349 msgid "AK" msgstr "AK" @@ -94,7 +94,7 @@ msgstr "AK" msgid "AK whose availability this is" msgstr "Verfügbarkeiten" -#: AKModel/availability/models.py:74 AKModel/models.py:129 +#: AKModel/availability/models.py:74 AKModel/models.py:130 msgid "AK Category" msgstr "AK Kategorie" @@ -106,9 +106,9 @@ msgstr "AK Kategorie dessen Verfügbarkeit hier abgebildet wird" msgid "Availabilities" msgstr "Verfügbarkeiten" -#: AKModel/models.py:16 AKModel/models.py:120 AKModel/models.py:141 -#: AKModel/models.py:160 AKModel/models.py:174 AKModel/models.py:192 -#: AKModel/models.py:269 +#: AKModel/models.py:16 AKModel/models.py:121 AKModel/models.py:142 +#: AKModel/models.py:161 AKModel/models.py:175 AKModel/models.py:193 +#: AKModel/models.py:270 msgid "Name" msgstr "Name" @@ -191,18 +191,22 @@ msgid "Prefix for wiki link construction" msgstr "Prefix für die automatische Generierung von Wiki-Links" #: AKModel/models.py:36 +msgid "Wiki Export Template Name" +msgstr "Wiki-Export Templatename" + +#: AKModel/models.py:37 msgid "Default Slot Length" msgstr "Standardslotlänge" -#: AKModel/models.py:37 +#: AKModel/models.py:38 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:39 +#: AKModel/models.py:40 msgid "Contact email address" msgstr "E-Mail Kontaktadresse" -#: AKModel/models.py:41 +#: AKModel/models.py:42 msgid "" "An email address that is displayed on every page and can be used for all " "kinds of questions" @@ -210,216 +214,216 @@ msgstr "" "Eine Mailadresse die auf jeder Seite angezeigt wird und für alle Arten von " "Fragen genutzt werden kann" -#: AKModel/models.py:45 +#: AKModel/models.py:46 msgid "Events" msgstr "Events" -#: AKModel/models.py:68 +#: AKModel/models.py:69 msgid "Nickname" msgstr "Spitzname" -#: AKModel/models.py:68 +#: AKModel/models.py:69 msgid "Name to identify an AK owner by" msgstr "Name durch den eine AK Leitung identifiziert wird" -#: AKModel/models.py:69 +#: AKModel/models.py:70 msgid "Slug" msgstr "Slug" -#: AKModel/models.py:69 +#: AKModel/models.py:70 msgid "Slug for URL generation" msgstr "Slug für URL-Generierung" -#: AKModel/models.py:70 +#: AKModel/models.py:71 msgid "Institution" msgstr "Instutution" -#: AKModel/models.py:70 +#: AKModel/models.py:71 msgid "Uni etc." msgstr "Universität o.ä." -#: AKModel/models.py:71 AKModel/models.py:201 +#: AKModel/models.py:72 AKModel/models.py:202 msgid "Web Link" msgstr "Internet Link" -#: AKModel/models.py:71 +#: AKModel/models.py:72 msgid "Link to Homepage" msgstr "Link zu Homepage oder Webseite" -#: AKModel/models.py:77 +#: AKModel/models.py:78 msgid "AK Owner" msgstr "AK Leitung" -#: AKModel/models.py:78 +#: AKModel/models.py:79 msgid "AK Owners" msgstr "AK Leitungen" -#: AKModel/models.py:120 +#: AKModel/models.py:121 msgid "Name of the AK Category" msgstr "Name des AK Kategorie" -#: AKModel/models.py:121 AKModel/models.py:142 +#: AKModel/models.py:122 AKModel/models.py:143 msgid "Color" msgstr "Farbe" -#: AKModel/models.py:121 AKModel/models.py:142 +#: AKModel/models.py:122 AKModel/models.py:143 msgid "Color for displaying" msgstr "Farbe für die Anzeige" -#: AKModel/models.py:122 AKModel/models.py:195 +#: AKModel/models.py:123 AKModel/models.py:196 msgid "Description" msgstr "Beschreibung" -#: AKModel/models.py:123 +#: AKModel/models.py:124 msgid "Short description of this AK Category" msgstr "Beschreibung der AK-Kategorie" -#: AKModel/models.py:130 +#: AKModel/models.py:131 msgid "AK Categories" msgstr "AK Kategorien" -#: AKModel/models.py:141 +#: AKModel/models.py:142 msgid "Name of the AK Track" msgstr "Name des AK Tracks" -#: AKModel/models.py:148 +#: AKModel/models.py:149 msgid "AK Track" msgstr "AK Track" -#: AKModel/models.py:149 +#: AKModel/models.py:150 msgid "AK Tracks" msgstr "AK Tracks" -#: AKModel/models.py:160 +#: AKModel/models.py:161 msgid "Name of the AK Tag" msgstr "Name das AK Tags" -#: AKModel/models.py:163 +#: AKModel/models.py:164 msgid "AK Tag" msgstr "AK Tag" -#: AKModel/models.py:164 +#: AKModel/models.py:165 msgid "AK Tags" msgstr "AK Tags" -#: AKModel/models.py:174 +#: AKModel/models.py:175 msgid "Name of the Requirement" msgstr "Name der Anforderung" -#: AKModel/models.py:180 +#: AKModel/models.py:181 msgid "AK Requirement" msgstr "AK Anforderung" -#: AKModel/models.py:181 +#: AKModel/models.py:182 msgid "AK Requirements" msgstr "AK Anforderungen" -#: AKModel/models.py:192 +#: AKModel/models.py:193 msgid "Name of the AK" msgstr "Name des AKs" -#: AKModel/models.py:193 +#: AKModel/models.py:194 msgid "Short Name" msgstr "Kurzer Name" -#: AKModel/models.py:194 +#: AKModel/models.py:195 msgid "Name displayed in the schedule" msgstr "Name zur Anzeige im AK Plan" -#: AKModel/models.py:195 +#: AKModel/models.py:196 msgid "Description of the AK" msgstr "Beschreibung des AKs" -#: AKModel/models.py:197 +#: AKModel/models.py:198 msgid "Owners" msgstr "Leitungen" -#: AKModel/models.py:198 +#: AKModel/models.py:199 msgid "Those organizing the AK" msgstr "Menschen, die den AK organisieren und halten" -#: AKModel/models.py:201 +#: AKModel/models.py:202 msgid "Link to wiki page" msgstr "Link zur Wiki Seite" -#: AKModel/models.py:202 +#: AKModel/models.py:203 msgid "Protocol Link" msgstr "Protokolllink" -#: AKModel/models.py:202 +#: AKModel/models.py:203 msgid "Link to protocol" msgstr "Link zum Protokoll" -#: AKModel/models.py:204 +#: AKModel/models.py:205 msgid "Category" msgstr "Kategorie" -#: AKModel/models.py:205 +#: AKModel/models.py:206 msgid "Category of the AK" msgstr "Kategorie des AKs" -#: AKModel/models.py:206 +#: AKModel/models.py:207 msgid "Tags" msgstr "Tags" -#: AKModel/models.py:206 +#: AKModel/models.py:207 msgid "Tags provided by owners" msgstr "Tags, die durch die AK Leitung vergeben wurden" -#: AKModel/models.py:207 +#: AKModel/models.py:208 msgid "Track" msgstr "Track" -#: AKModel/models.py:208 +#: AKModel/models.py:209 msgid "Track the AK belongs to" msgstr "Track zu dem der AK gehört" -#: AKModel/models.py:210 +#: AKModel/models.py:211 msgid "Resolution Intention" msgstr "Resolutionsabsicht" -#: AKModel/models.py:211 +#: AKModel/models.py:212 msgid "Intends to submit a resolution" msgstr "Beabsichtigt eine Resolution einzureichen" -#: AKModel/models.py:212 +#: AKModel/models.py:213 msgid "Present this AK" msgstr "AK Präsentieren" -#: AKModel/models.py:213 +#: AKModel/models.py:214 msgid "Present results of this AK" msgstr "Die Ergebnisse dieses AKs vorstellen" -#: AKModel/models.py:215 AKModel/templates/admin/AKModel/status.html:76 +#: AKModel/models.py:216 AKModel/templates/admin/AKModel/status.html:79 msgid "Requirements" msgstr "Anforderungen" -#: AKModel/models.py:216 +#: AKModel/models.py:217 msgid "AK's Requirements" msgstr "Anforderungen des AKs" -#: AKModel/models.py:218 +#: AKModel/models.py:219 msgid "Conflicting AKs" msgstr "AK Konflikte" -#: AKModel/models.py:219 +#: AKModel/models.py:220 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:220 +#: AKModel/models.py:221 msgid "Prerequisite AKs" msgstr "Vorausgesetzte AKs" -#: AKModel/models.py:221 +#: AKModel/models.py:222 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:223 +#: AKModel/models.py:224 msgid "Organizational Notes" msgstr "Notizen zur Organisation" -#: AKModel/models.py:224 +#: AKModel/models.py:225 msgid "" "Notes to organizers. These are public. For private notes, please send an e-" "mail." @@ -427,99 +431,122 @@ msgstr "" "Notizen an die Organisator*innen. Diese sind öffentlich, für private " "Anmerkungen bitte eine E-Mail schicken." -#: AKModel/models.py:226 +#: AKModel/models.py:227 msgid "Interest" msgstr "Interesse" -#: AKModel/models.py:226 +#: AKModel/models.py:227 msgid "Expected number of people" msgstr "Erwartete Personenzahl" -#: AKModel/models.py:227 +#: AKModel/models.py:228 msgid "Interest Counter" msgstr "Interessenszähler" -#: AKModel/models.py:228 +#: AKModel/models.py:229 msgid "People who have indicated interest online" msgstr "Anzahl Personen, die online Interesse bekundet haben" -#: AKModel/models.py:237 AKModel/templates/admin/AKModel/status.html:47 -#: AKModel/templates/admin/AKModel/status.html:54 +#: AKModel/models.py:238 AKModel/templates/admin/AKModel/status.html:49 +#: AKModel/templates/admin/AKModel/status.html:56 msgid "AKs" msgstr "AKs" -#: AKModel/models.py:269 +#: AKModel/models.py:270 msgid "Name or number of the room" msgstr "Name oder Nummer des Raums" -#: AKModel/models.py:270 +#: AKModel/models.py:271 msgid "Location" msgstr "Ort" -#: AKModel/models.py:271 +#: AKModel/models.py:272 msgid "Name or number of the location" msgstr "Name oder Nummer des Ortes" -#: AKModel/models.py:272 +#: AKModel/models.py:273 msgid "Capacity" msgstr "Kapazität" -#: AKModel/models.py:272 +#: AKModel/models.py:273 msgid "Maximum number of people" msgstr "Maximale Personenzahl" -#: AKModel/models.py:273 +#: AKModel/models.py:274 msgid "Properties" msgstr "Eigenschaften" -#: AKModel/models.py:274 +#: AKModel/models.py:275 msgid "AK requirements fulfilled by the room" msgstr "AK Anforderungen, die dieser Raum erfüllt" -#: AKModel/models.py:281 AKModel/templates/admin/AKModel/status.html:31 +#: AKModel/models.py:282 AKModel/templates/admin/AKModel/status.html:33 msgid "Rooms" msgstr "Räume" -#: AKModel/models.py:298 +#: AKModel/models.py:299 msgid "AK being mapped" msgstr "AK, der zugeordnet wird" -#: AKModel/models.py:300 +#: AKModel/models.py:301 msgid "Room the AK will take place in" msgstr "Raum in dem der AK stattfindet" -#: AKModel/models.py:301 +#: AKModel/models.py:302 msgid "Slot Begin" msgstr "Beginn des Slots" -#: AKModel/models.py:301 +#: AKModel/models.py:302 msgid "Time and date the slot begins" msgstr "Zeit und Datum zu der der AK beginnt" -#: AKModel/models.py:303 +#: AKModel/models.py:304 msgid "Duration" msgstr "Dauer" -#: AKModel/models.py:304 +#: AKModel/models.py:305 msgid "Length in hours" msgstr "Länge in Stunden" -#: AKModel/models.py:309 +#: AKModel/models.py:310 msgid "Last update" msgstr "Letzte Aktualisierung" -#: AKModel/models.py:312 +#: AKModel/models.py:313 msgid "AK Slot" msgstr "AK Slot" -#: AKModel/models.py:313 +#: AKModel/models.py:314 msgid "AK Slots" msgstr "AK Slot" -#: AKModel/models.py:327 +#: AKModel/models.py:328 msgid "Not scheduled yet" msgstr "Noch nicht geplant" +#: AKModel/models.py:349 +#, fuzzy +#| msgid "Track the AK belongs to" +msgid "AK this message belongs to" +msgstr "Track zu dem der AK gehört" + +#: AKModel/models.py:350 +msgid "Message text" +msgstr "Nachrichtentext" + +#: AKModel/models.py:350 +msgid "Message to the organizers. This is not publicly visible." +msgstr "" +"Nachricht an die Organisator*innen. Diese ist nicht öffentlich sichtbar." + +#: AKModel/models.py:354 +msgid "AK Orga Message" +msgstr "AK-Organachricht" + +#: AKModel/models.py:355 +msgid "AK Orga Messages" +msgstr "AK-Organachrichten" + #: AKModel/site.py:10 msgid "Administration" msgstr "Verwaltung" @@ -541,65 +568,117 @@ msgstr "" msgid "Logout" msgstr "Ausloggen" -#: AKModel/templates/admin/AKModel/status.html:14 +#: AKModel/templates/admin/AKModel/message_delete.html:7 +msgid "Delete Orga-Messages" +msgstr "Organachrichten löschen" + +#: AKModel/templates/admin/AKModel/message_delete.html:10 +msgid "Delete AK Orga Messages" +msgstr "AK-Organachrichten löschen" + +#: AKModel/templates/admin/AKModel/message_delete.html:11 +#, fuzzy, python-format +#| msgid "Are you sure you want to delete all orga messages for " +msgid "" +"Are you sure you want to delete all orga messages for %(event)s? This will " +"permanently delete %(message_count)s message(s):" +msgstr "" +"Sollen wirklich alle Organachrichten für %(event)s gelöscht werden? Dadurch " +"werden %(message_count)s Nachricht(en) dauerhaft gelöscht:" + +#: AKModel/templates/admin/AKModel/message_delete.html:17 +msgid "Delete" +msgstr "Löschen" + +#: AKModel/templates/admin/AKModel/message_delete.html:21 +msgid "Cancel" +msgstr "Abbrechen" + +#: AKModel/templates/admin/AKModel/status.html:16 #, fuzzy #| msgid "AK Categories" msgid "Categories" msgstr "AK Kategorien" -#: AKModel/templates/admin/AKModel/status.html:16 +#: AKModel/templates/admin/AKModel/status.html:18 #, fuzzy #| msgid "No categories yet" msgid "No categroies yet" msgstr "Bisher keine Kategorien" -#: AKModel/templates/admin/AKModel/status.html:29 +#: AKModel/templates/admin/AKModel/status.html:31 msgid "Add category" msgstr "Kategorie hinzufügen" -#: AKModel/templates/admin/AKModel/status.html:33 +#: AKModel/templates/admin/AKModel/status.html:35 msgid "No rooms yet" msgstr "Bisher keine Räume" -#: AKModel/templates/admin/AKModel/status.html:45 +#: AKModel/templates/admin/AKModel/status.html:47 msgid "Add Room" msgstr "Raum hinzufügen" -#: AKModel/templates/admin/AKModel/status.html:49 +#: AKModel/templates/admin/AKModel/status.html:51 msgid "No AKs yet" msgstr "Bisher keine AKs" -#: AKModel/templates/admin/AKModel/status.html:57 +#: AKModel/templates/admin/AKModel/status.html:59 msgid "Slots" msgstr "Slots" -#: AKModel/templates/admin/AKModel/status.html:60 +#: AKModel/templates/admin/AKModel/status.html:62 msgid "Unscheduled Slots" msgstr "Ungeplante Slots" -#: AKModel/templates/admin/AKModel/status.html:73 +#: AKModel/templates/admin/AKModel/status.html:75 msgid "Export AKs as CSV" msgstr "AKs als CSV exportieren" -#: AKModel/templates/admin/AKModel/status.html:78 +#: AKModel/templates/admin/AKModel/status.html:76 +msgid "Export AKs for Wiki" +msgstr "AKs im Wiki-Format exportieren" + +#: AKModel/templates/admin/AKModel/status.html:81 msgid "No requirements yet" msgstr "Bisher keine Anforderungen" -#: AKModel/templates/admin/AKModel/status.html:91 +#: AKModel/templates/admin/AKModel/status.html:94 msgid "Add Requirement" msgstr "Anforderungen hinzufügen" +#: AKModel/templates/admin/AKModel/status.html:97 +msgid "Messages" +msgstr "Nachrichten" + +#: AKModel/templates/admin/AKModel/status.html:99 +msgid "Delete all messages" +msgstr "Alle Nachrichten löschen" + #: AKModel/templates/admin/ak_index.html:7 msgid "Active Events" msgstr "Aktive Events" -#: AKModel/views.py:129 +#: AKModel/views.py:130 msgid "Event Status" msgstr "Eventstatus" -#: AKModel/views.py:142 +#: AKModel/views.py:144 msgid "AK CSV Export" msgstr "AK CSV Export" +#: AKModel/views.py:158 +msgid "AK Wiki Export" +msgstr "AK Wiki Export" + +#: AKModel/views.py:178 +msgid "AK Orga Messages successfully deleted" +msgstr "AK-Organachrichten erfolgreich gelöscht" + +#~ msgid "Confirm" +#~ msgstr "Bestätigen" + +#~ msgid "messages will be permanently deleted:" +#~ msgstr "Nachrichten werden dauerhaft gelöscht:" + #~ msgid "Notes to organizers" #~ msgstr "Notizen an die Organisator*innen" diff --git a/AKModel/migrations/0038_akorgamessage.py b/AKModel/migrations/0038_akorgamessage.py new file mode 100644 index 0000000000000000000000000000000000000000..2f4f5eb73a2b8663e6d7047e1d257a48938e76f6 --- /dev/null +++ b/AKModel/migrations/0038_akorgamessage.py @@ -0,0 +1,28 @@ +# Generated by Django 3.0.6 on 2020-09-28 21:52 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('AKModel', '0037_event_public'), + ] + + operations = [ + migrations.CreateModel( + name='AKOrgaMessage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.TextField(help_text='Message to the organizers. This is not publicly visible.', verbose_name='Message text')), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('ak', models.ForeignKey(help_text='AK this message belongs to', on_delete=django.db.models.deletion.CASCADE, to='AKModel.AK', verbose_name='AK')), + ], + options={ + 'verbose_name': 'AK Orga Message', + 'verbose_name_plural': 'AK Orga Messages', + 'ordering': ['-timestamp'], + }, + ), + ] diff --git a/AKModel/migrations/0039_event_wiki_template_name.py b/AKModel/migrations/0039_event_wiki_template_name.py new file mode 100644 index 0000000000000000000000000000000000000000..4bc23fc2415af44a184af1e6e5868d5b64291a21 --- /dev/null +++ b/AKModel/migrations/0039_event_wiki_template_name.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.6 on 2020-09-29 22:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('AKModel', '0038_akorgamessage'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='wiki_export_template_name', + field=models.CharField(blank=True, max_length=50, verbose_name='Wiki Export Template Name'), + ), + ] diff --git a/AKModel/models.py b/AKModel/models.py index 70435185756e2fac2b68dc373c0affb9a9ef5bf1..58e1abd2c1d0dc34cabf3396829e431f6bc979d6 100644 --- a/AKModel/models.py +++ b/AKModel/models.py @@ -33,6 +33,7 @@ class Event(models.Model): default=True) base_url = models.URLField(verbose_name=_("Base URL"), help_text=_("Prefix for wiki link construction"), blank=True) + wiki_export_template_name = models.CharField(verbose_name=_("Wiki Export Template Name"), blank=True, max_length=50) default_slot = models.DecimalField(max_digits=4, decimal_places=2, default=2, verbose_name=_('Default Slot Length'), help_text=_('Default length in hours that is assumed for AKs in this event.')) @@ -342,3 +343,17 @@ class AKSlot(models.Model): :rtype: float """ return (timezone.now() - self.updated).total_seconds() + + +class AKOrgaMessage(models.Model): + ak = models.ForeignKey(to=AK, on_delete=models.CASCADE, verbose_name=_('AK'), help_text=_('AK this message belongs to')) + text = models.TextField(verbose_name=_("Message text"), help_text=_("Message to the organizers. This is not publicly visible.")) + timestamp = models.DateTimeField(auto_now_add=True) + + class Meta: + verbose_name = _('AK Orga Message') + verbose_name_plural = _('AK Orga Messages') + ordering = ['-timestamp'] + + def __str__(self): + return f'AK Orga Message for "{self.ak}" @ {self.timestamp}' diff --git a/AKModel/templates/admin/AKModel/message_delete.html b/AKModel/templates/admin/AKModel/message_delete.html new file mode 100644 index 0000000000000000000000000000000000000000..df8ac3cbb6541a536cdcb661dc438d2535eb84eb --- /dev/null +++ b/AKModel/templates/admin/AKModel/message_delete.html @@ -0,0 +1,24 @@ +{% extends "admin_base.html" %} +{% load tags_AKModel %} + +{% load i18n %} +{% load fontawesome_5 %} + +{% block title %}{{event}}: {% trans "Delete Orga-Messages" %}{% endblock %} + +{% block content %} + <h2>{% trans "Delete AK Orga Messages" %}</h2> + <p>{% blocktrans with message_count=ak_messages.count %}Are you sure you want to delete all orga messages for {{ event }}? This will permanently delete {{ message_count }} message(s):{% endblocktrans %}</p> + + {% include "admin/AKModel/render_ak_messages.html" %} + + <form method="post">{% csrf_token %} + <button type="submit" class="save btn btn-danger float-right" value="Confirm"> + {% fa5_icon "check" 'fas' %} {% trans "Delete" %} + </button> + + <a href="{% url 'admin:event_status' slug=event.slug %}" class="btn btn-info"> + {% fa5_icon "times" 'fas' %} {% trans "Cancel" %} + </a> + </form> +{% endblock %} diff --git a/AKModel/templates/admin/AKModel/render_ak_messages.html b/AKModel/templates/admin/AKModel/render_ak_messages.html new file mode 100644 index 0000000000000000000000000000000000000000..62dec082f547a43ddbc927cf4a528b11a2a6e25b --- /dev/null +++ b/AKModel/templates/admin/AKModel/render_ak_messages.html @@ -0,0 +1,11 @@ +<table class="table table-striped"> +{% for message in ak_messages %} + <tr><td> + <span class="text-secondary float-right"> + {{ message.timestamp|date:"Y-m-d H:i:s" }} + </span> + <h5><a href="{% url 'submit:ak_detail' event_slug=message.ak.event.slug pk=message.ak.pk %}">{{ message.ak }}</a></h5> + <p>{{ message.text }}</p> + </td></tr> +{% endfor %} +</table> diff --git a/AKModel/templates/admin/AKModel/status.html b/AKModel/templates/admin/AKModel/status.html index 58b0590bc842e35430bd401de61745f113df9c29..338706209434529a6ddc569b1bb39c75c7eae9d2 100644 --- a/AKModel/templates/admin/AKModel/status.html +++ b/AKModel/templates/admin/AKModel/status.html @@ -7,88 +7,97 @@ {% block title %}{% trans "Status" %}: {{event}}{% endblock %} {% block content %} - <h2><a href="{% url 'admin:AKModel_event_change' event.pk %}">{{event}}</a></h2> {% timezone event.timezone %} - <h5>{{ event.start }} - {{ event.end }}</h5> + <h2><a href="{% url 'admin:AKModel_event_change' event.pk %}">{{event}}</a></h2> + <h5>{{ event.start }} - {{ event.end }}</h5> - <h3 class="block-header">{% trans "Categories" %}</h3> - {% if event.akcategory_set.count == 0 %} - <p class="text-danger">{% trans "No categroies yet" %}</p> - {% else %} - <p> - {{ event.akcategory_set.count }}: - {% for category in event.akcategory_set.all %} - {% if forloop.counter0 > 0 %} - · + <div class="row"> + <div class="col-md-8"> + <h3 class="block-header">{% trans "Categories" %}</h3> + {% if event.akcategory_set.count == 0 %} + <p class="text-danger">{% trans "No categroies yet" %}</p> + {% else %} + <p> + {{ event.akcategory_set.count }}: + {% for category in event.akcategory_set.all %} + {% if forloop.counter0 > 0 %} + · + {% endif %} + <a href="{% url 'admin:AKModel_akcategory_change' category.pk %}">{{ category }}</a> + ({{ category.ak_set.count }}) + {% endfor %} + </p> {% endif %} - <a href="{% url 'admin:AKModel_akcategory_change' category.pk %}">{{ category }}</a> - ({{ category.ak_set.count }}) - {% endfor %} - </p> - {% endif %} - <a class="btn btn-success" href="{% url 'admin:AKModel_akcategory_add' %}">{% trans "Add category" %}</a> + <a class="btn btn-success" href="{% url 'admin:AKModel_akcategory_add' %}">{% trans "Add category" %}</a> - <h3 class="block-header">{% trans "Rooms" %}</h3> - {% if event.room_set.count == 0 %} - <p class="text-danger">{% trans "No rooms yet" %}</p> - {% else %} - <p> - {{ event.room_set.count }}: - {% for room in event.room_set.all %} - {% if forloop.counter0 > 0 %} - · + <h3 class="block-header">{% trans "Rooms" %}</h3> + {% if event.room_set.count == 0 %} + <p class="text-danger">{% trans "No rooms yet" %}</p> + {% else %} + <p> + {{ event.room_set.count }}: + {% for room in event.room_set.all %} + {% if forloop.counter0 > 0 %} + · + {% endif %} + <a href="{% url 'admin:AKModel_room_change' room.pk %}">{{ room }}</a> + {% endfor %} + </p> {% endif %} - <a href="{% url 'admin:AKModel_room_change' room.pk %}">{{ room }}</a> - {% endfor %} - </p> - {% endif %} - <a class="btn btn-success" href="{% url 'admin:AKModel_room_add' %}">{% trans "Add Room" %}</a> + <a class="btn btn-success" href="{% url 'admin:AKModel_room_add' %}">{% trans "Add Room" %}</a> - <h3 class="block-header">{% trans "AKs" %}</h3> - {% if event.ak_set.count == 0 %} - <p class="text-danger">{% trans "No AKs yet" %}</p> - {% else %} - <table> - <tbody> - <tr> - <td>{% trans "AKs" %}</td><td>{{ event.ak_set.count }}</td> - </tr> - <tr> - <td>{% trans "Slots" %}</td><td>{{ event.akslot_set.count }}</td> - </tr> - <tr> - <td>{% trans "Unscheduled Slots" %}</td><td> - {% if "AKScheduling"|check_app_installed %} - <a href="{% url 'admin:slots_unscheduled' event_slug=event.slug %}"> - {{ unscheduled_slots_count }} - </a> - {% else %} - {{ unscheduled_slots_count }} - {% endif %} - </td> - </tr> - </tbody> - </table> + <h3 class="block-header">{% trans "AKs" %}</h3> + {% if event.ak_set.count == 0 %} + <p class="text-danger">{% trans "No AKs yet" %}</p> + {% else %} + <table> + <tbody> + <tr> + <td>{% trans "AKs" %}</td><td>{{ event.ak_set.count }}</td> + </tr> + <tr> + <td>{% trans "Slots" %}</td><td>{{ event.akslot_set.count }}</td> + </tr> + <tr> + <td>{% trans "Unscheduled Slots" %}</td><td> + {% if "AKScheduling"|check_app_installed %} + <a href="{% url 'admin:slots_unscheduled' event_slug=event.slug %}"> + {{ unscheduled_slots_count }} + </a> + {% else %} + {{ unscheduled_slots_count }} + {% endif %} + </td> + </tr> + </tbody> + </table> - <a class="btn btn-success" href="{% url 'admin:ak_csv_export' event_slug=event.slug %}">{% trans "Export AKs as CSV" %}</a> - {% endif %} - - <h3 class="block-header">{% trans "Requirements" %}</h3> - {% if event.akrequirement_set.count == 0 %} - <p class="text-danger">{% trans "No requirements yet" %}</p> - {% else %} - <p> - {{ event.akrequirement_set.count }}: - {% for requirement in event.akrequirement_set.all %} - {% if forloop.counter0 > 0 %} - · + <a class="btn btn-success" href="{% url 'admin:ak_csv_export' event_slug=event.slug %}">{% trans "Export AKs as CSV" %}</a> + <a class="btn btn-success" href="{% url 'admin:ak_wiki_export' event_slug=event.slug %}">{% trans "Export AKs for Wiki" %}</a> {% endif %} - <a href="{% url 'admin:AKModel_akrequirement_change' requirement.pk %}">{{ requirement }}</a> - ({{ requirement.ak_set.count }}) - {% endfor %} - </p> - {% endif %} - <a class="btn btn-success" href="{% url 'admin:AKModel_akrequirement_add' %}">{% trans "Add Requirement" %}</a> + <h3 class="block-header">{% trans "Requirements" %}</h3> + {% if event.akrequirement_set.count == 0 %} + <p class="text-danger">{% trans "No requirements yet" %}</p> + {% else %} + <p> + {{ event.akrequirement_set.count }}: + {% for requirement in event.akrequirement_set.all %} + {% if forloop.counter0 > 0 %} + · + {% endif %} + <a href="{% url 'admin:AKModel_akrequirement_change' requirement.pk %}">{{ requirement }}</a> + ({{ requirement.ak_set.count }}) + {% endfor %} + </p> + {% endif %} + <a class="btn btn-success" href="{% url 'admin:AKModel_akrequirement_add' %}">{% trans "Add Requirement" %}</a> + </div> + <div class="col-md-4"> + <h3 class="block-header">{% trans "Messages" %}</h3> + {% include "admin/AKModel/render_ak_messages.html" %} + <a class="btn btn-danger" href="{% url 'admin:ak_delete_orga_messages' slug=event.slug %}">{% trans "Delete all messages" %}</a> + </div> + </div> {% endtimezone %} {% endblock %} diff --git a/AKModel/templates/admin/AKModel/wiki_export.html b/AKModel/templates/admin/AKModel/wiki_export.html index d754ae79762ad7e07785ad8d421e5cbed32890e7..03512c675f3373e65eec52b634f245a8cebdb572 100644 --- a/AKModel/templates/admin/AKModel/wiki_export.html +++ b/AKModel/templates/admin/AKModel/wiki_export.html @@ -1,18 +1,26 @@ {% extends "admin/base_site.html" %} +{% load tags_AKModel %} + {% block content %} -<pre> -{% for ak in AKs %} -{% verbatim %}{{Ak Spalte 480{% endverbatim %} + +{% regroup AKs by category as ak_list %} + +{% for category_aks in ak_list %} +<h3>{{ category_aks.grouper }}</h3> +<textarea style="width: 100%;height:30vh;">{% for ak in category_aks.list %} +{% verbatim %}{{{% endverbatim %} +{{ ak.event.wiki_export_template_name }} | name={{ ak.name }} | beschreibung= {{ ak.description }} | wieviele={{ ak.interest_counter }} -| wer={{ ak.owners_list }} +| wer={{ ak.owners|wiki_owners_export:ak.event }} | wann= | dauer={{ ak.durations_list }} | reso={{ ak.reso }} | vorstellung={{ ak.present }} {% verbatim %}}}{% endverbatim %} +{% endfor %}</textarea> {% endfor %} -</pre> + {% endblock %} diff --git a/AKModel/templatetags/tags_AKModel.py b/AKModel/templatetags/tags_AKModel.py index 6913391392105810177bc5799b1600f09986a1d6..3bec0320f9f0be2c909ca9fbd758f02d59268d3c 100644 --- a/AKModel/templatetags/tags_AKModel.py +++ b/AKModel/templatetags/tags_AKModel.py @@ -25,3 +25,17 @@ def message_bootstrap_class(tag): elif tag == "warning": return "alert-warning" return "alert-info" + + +@register.filter +def wiki_owners_export(owners, event): + def to_link(owner): + if owner.link != '': + event_link_prefix, _ = event.base_url.rsplit("/", 1) + link_prefix, link_end = owner.link.rsplit("/", 1) + if event_link_prefix == link_prefix: + return f"[[{link_end}|{str(owner)}]]" + return f"[{owner.link} {str(owner)}]" + return str(owner) + + return ", ".join(to_link(owner) for owner in owners.all()) diff --git a/AKModel/views.py b/AKModel/views.py index 4d79628c8b3e2c8e9e49dcb23595e266dc4dcd16..d560e9f644cffce4952993f97b8db0dff0cb8e7b 100644 --- a/AKModel/views.py +++ b/AKModel/views.py @@ -1,12 +1,13 @@ -from django.contrib import admin +from django.contrib import admin, messages +from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ -from django.views.generic import TemplateView, DetailView, ListView +from django.views.generic import TemplateView, DetailView, ListView, DeleteView from rest_framework import viewsets, permissions, mixins -from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner +from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage from AKModel.serializers import AKSerializer, AKSlotSerializer, RoomSerializer, AKTrackSerializer, AKCategorySerializer, \ AKOwnerSerializer @@ -132,6 +133,7 @@ class EventStatusView(AdminViewMixin, DetailView): context = super().get_context_data(**kwargs) context["unscheduled_slots_count"] = context["event"].akslot_set.filter(start=None).count context["site_url"] = reverse_lazy("dashboard:dashboard_event", kwargs={'slug': context["event"].slug}) + context["ak_messages"] = AKOrgaMessage.objects.filter(ak__event=context["event"]) return context @@ -147,3 +149,31 @@ class AKCSVExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) return context + + +class AKWikiExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): + template_name = "admin/AKModel/wiki_export.html" + model = AK + context_object_name = "AKs" + title = _("AK Wiki Export") + + def get_queryset(self): + return super().get_queryset().order_by("category") + + +class AKMessageDeleteView(AdminViewMixin, DeleteView): + model = Event + template_name = "admin/AKModel/message_delete.html" + + def get_orga_messages_for_event(self, event): + return AKOrgaMessage.objects.filter(ak__event=event) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["ak_messages"] = self.get_orga_messages_for_event(self.get_object()) + return context + + def post(self, request, *args, **kwargs): + self.get_orga_messages_for_event(self.get_object()).delete() + messages.add_message(self.request, messages.SUCCESS, _("AK Orga Messages successfully deleted")) + return HttpResponseRedirect(reverse_lazy('admin:event_status', kwargs={'slug': self.get_object().slug})) diff --git a/AKSubmission/forms.py b/AKSubmission/forms.py index 2861adc4c4eb6a3f72ebc071e76de9afbca72fab..e52cdbcd9246bc5929f0c306b371ed5155febf8d 100644 --- a/AKSubmission/forms.py +++ b/AKSubmission/forms.py @@ -6,7 +6,7 @@ from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ from AKModel.availability.forms import AvailabilitiesFormMixin -from AKModel.models import AK, AKOwner, AKCategory, AKRequirement, AKSlot +from AKModel.models import AK, AKOwner, AKCategory, AKRequirement, AKSlot, AKOrgaMessage class AKForm(AvailabilitiesFormMixin, forms.ModelForm): @@ -161,3 +161,13 @@ class AKDurationForm(forms.ModelForm): 'ak': forms.HiddenInput, 'event': forms.HiddenInput } + + +class AKOrgaMessageForm(forms.ModelForm): + class Meta: + model = AKOrgaMessage + fields = ['ak', 'text'] + widgets = { + 'ak': forms.HiddenInput, + 'text': forms.Textarea, + } diff --git a/AKSubmission/locale/de_DE/LC_MESSAGES/django.po b/AKSubmission/locale/de_DE/LC_MESSAGES/django.po index 187fde1dc2377f18dfbfc75cdebb30d4ffba7d8a..1285a437ac431978e7b42bbbde0a83b6db500e81 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: 2020-07-12 16:17+0000\n" +"POT-Creation-Date: 2020-09-28 22:17+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" @@ -44,6 +44,7 @@ msgstr "" #: 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 @@ -65,6 +66,7 @@ msgstr "AK" #: AKSubmission/templates/AKSubmission/ak_edit.html:13 #: AKSubmission/templates/AKSubmission/ak_history.html:16 #: AKSubmission/templates/AKSubmission/ak_overview.html:27 +#: AKSubmission/templates/AKSubmission/akmessage_add.html:12 #: AKSubmission/templates/AKSubmission/akowner_create_update.html:12 #: AKSubmission/templates/AKSubmission/akslot_add_update.html:12 #: AKSubmission/templates/AKSubmission/akslot_delete.html:12 @@ -102,101 +104,105 @@ msgid "History" msgstr "Versionsgeschichte" #: AKSubmission/templates/AKSubmission/ak_detail.html:59 -#: AKSubmission/templates/AKSubmission/ak_detail.html:174 +msgid "Add confident message to organizers" +msgstr "" + +#: AKSubmission/templates/AKSubmission/ak_detail.html:62 +#: AKSubmission/templates/AKSubmission/ak_detail.html:177 #: AKSubmission/templates/AKSubmission/ak_edit.html:16 #: AKSubmission/templates/AKSubmission/ak_table.html:53 msgid "Edit" msgstr "Bearbeiten" -#: AKSubmission/templates/AKSubmission/ak_detail.html:64 +#: AKSubmission/templates/AKSubmission/ak_detail.html:67 #: 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:68 +#: AKSubmission/templates/AKSubmission/ak_detail.html:71 #: AKSubmission/templates/AKSubmission/ak_table.html:10 msgid "Who?" msgstr "Wer?" -#: AKSubmission/templates/AKSubmission/ak_detail.html:74 +#: AKSubmission/templates/AKSubmission/ak_detail.html:77 #: AKSubmission/templates/AKSubmission/ak_history.html:36 #: AKSubmission/templates/AKSubmission/ak_table.html:11 msgid "Category" msgstr "Kategorie" -#: AKSubmission/templates/AKSubmission/ak_detail.html:81 +#: AKSubmission/templates/AKSubmission/ak_detail.html:84 #: AKSubmission/templates/AKSubmission/ak_history.html:37 msgid "Track" msgstr "Track" -#: AKSubmission/templates/AKSubmission/ak_detail.html:86 +#: AKSubmission/templates/AKSubmission/ak_detail.html:89 msgid "Present this AK" msgstr "Diesen AK vorstellen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:90 +#: AKSubmission/templates/AKSubmission/ak_detail.html:93 #: AKSubmission/templates/AKSubmission/ak_table.html:12 msgid "Tags" msgstr "Tags" -#: AKSubmission/templates/AKSubmission/ak_detail.html:96 +#: AKSubmission/templates/AKSubmission/ak_detail.html:99 msgid "Reso?" msgstr "Reso?" -#: AKSubmission/templates/AKSubmission/ak_detail.html:103 +#: AKSubmission/templates/AKSubmission/ak_detail.html:106 msgid "Requirements" msgstr "Anforderungen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:116 +#: AKSubmission/templates/AKSubmission/ak_detail.html:119 msgid "Conflicting AKs" msgstr "AK Konflikte" -#: AKSubmission/templates/AKSubmission/ak_detail.html:124 +#: AKSubmission/templates/AKSubmission/ak_detail.html:127 msgid "Prerequisite AKs" msgstr "AK Voraussetzungen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:132 +#: AKSubmission/templates/AKSubmission/ak_detail.html:135 msgid "Notes" msgstr "Notizen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:149 +#: AKSubmission/templates/AKSubmission/ak_detail.html:152 #: AKSubmission/templates/AKSubmission/akslot_delete.html:35 msgid "Duration" msgstr "Dauer" -#: AKSubmission/templates/AKSubmission/ak_detail.html:151 +#: AKSubmission/templates/AKSubmission/ak_detail.html:154 msgid "When?" msgstr "Wann?" -#: AKSubmission/templates/AKSubmission/ak_detail.html:152 +#: AKSubmission/templates/AKSubmission/ak_detail.html:155 msgid "Room" msgstr "Raum" -#: AKSubmission/templates/AKSubmission/ak_detail.html:177 +#: AKSubmission/templates/AKSubmission/ak_detail.html:180 msgid "Delete" msgstr "Löschen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:182 +#: AKSubmission/templates/AKSubmission/ak_detail.html:185 msgid "Go to virtual room" msgstr "Zum virtuellen Raum" -#: AKSubmission/templates/AKSubmission/ak_detail.html:188 +#: AKSubmission/templates/AKSubmission/ak_detail.html:191 msgid "Schedule" msgstr "Schedule" -#: AKSubmission/templates/AKSubmission/ak_detail.html:200 +#: AKSubmission/templates/AKSubmission/ak_detail.html:203 msgid "Add another slot" msgstr "Einen neuen AK-Slot hinzufügen" -#: AKSubmission/templates/AKSubmission/ak_detail.html:204 +#: AKSubmission/templates/AKSubmission/ak_detail.html:207 msgid "Possible Times" msgstr "Mögliche Zeiten" -#: AKSubmission/templates/AKSubmission/ak_detail.html:208 +#: AKSubmission/templates/AKSubmission/ak_detail.html:211 msgid "Start" msgstr "Start" -#: AKSubmission/templates/AKSubmission/ak_detail.html:209 +#: AKSubmission/templates/AKSubmission/ak_detail.html:212 msgid "End" msgstr "Ende" @@ -252,23 +258,24 @@ msgstr "Details" msgid "There are no AKs in this category yet" msgstr "Es gibt noch keine AKs in dieser Kategorie" -#: AKSubmission/templates/AKSubmission/akowner_create_update.html:7 -#: AKSubmission/templates/AKSubmission/akowner_create_update.html:13 -#: AKSubmission/templates/AKSubmission/akowner_create_update.html:18 -msgid "AK Owner" -msgstr "AK-Leitung" +#: AKSubmission/templates/AKSubmission/akmessage_add.html:7 +#: AKSubmission/templates/AKSubmission/akmessage_add.html:15 +#: AKSubmission/templates/AKSubmission/akmessage_add.html:21 +msgid "Add message to organizers" +msgstr "" -#: AKSubmission/templates/AKSubmission/akowner_create_update.html:24 -#: AKSubmission/templates/AKSubmission/akslot_add_update.html:26 -msgid "Continue" -msgstr "Weiter" +#: AKSubmission/templates/AKSubmission/akmessage_add.html:27 +msgid "Send" +msgstr "Senden" +#: AKSubmission/templates/AKSubmission/akmessage_add.html:31 #: AKSubmission/templates/AKSubmission/akowner_create_update.html:27 #: AKSubmission/templates/AKSubmission/akslot_add_update.html:30 #: AKSubmission/templates/AKSubmission/submit_new.html:45 msgid "Reset Form" msgstr "Formular leeren" +#: AKSubmission/templates/AKSubmission/akmessage_add.html:35 #: AKSubmission/templates/AKSubmission/akowner_create_update.html:31 #: AKSubmission/templates/AKSubmission/akslot_add_update.html:34 #: AKSubmission/templates/AKSubmission/akslot_delete.html:46 @@ -276,6 +283,17 @@ msgstr "Formular leeren" msgid "Cancel" msgstr "Abbrechen" +#: AKSubmission/templates/AKSubmission/akowner_create_update.html:7 +#: AKSubmission/templates/AKSubmission/akowner_create_update.html:13 +#: AKSubmission/templates/AKSubmission/akowner_create_update.html:18 +msgid "AK Owner" +msgstr "AK-Leitung" + +#: AKSubmission/templates/AKSubmission/akowner_create_update.html:24 +#: AKSubmission/templates/AKSubmission/akslot_add_update.html:26 +msgid "Continue" +msgstr "Weiter" + #: AKSubmission/templates/AKSubmission/akslot_add_update.html:7 #: AKSubmission/templates/AKSubmission/akslot_add_update.html:15 #: AKSubmission/templates/AKSubmission/akslot_add_update.html:20 @@ -405,3 +423,7 @@ msgstr "Bereits geplante AK-Slots können nicht mehr gelöscht werden" #: AKSubmission/views.py:403 msgid "AK Slot successfully deleted" msgstr "AK-Slot erfolgreich angelegt" + +#: AKSubmission/views.py:424 +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 bef54a41168d2f53204aa5ba9da7db63047b899f..0819f04a44865080cee5ec7c5f1fc05eee76ebfc 100644 --- a/AKSubmission/templates/AKSubmission/ak_detail.html +++ b/AKSubmission/templates/AKSubmission/ak_detail.html @@ -55,6 +55,9 @@ data-toggle="tooltip" title="{% trans 'History' %}" class="btn btn-light">{% fa5_icon 'clock' 'fas' %}</a> {% if ak.event.active %} + <a href="{% url 'submit:akmessage_add' event_slug=ak.event.slug pk=ak.pk %}" data-toggle="tooltip" + title="{% trans 'Add confident message to organizers' %}" + class="btn btn-warning">{% fa5_icon 'envelope' 'fas' %}</a> <a href="{% url 'submit:ak_edit' event_slug=ak.event.slug pk=ak.pk %}" data-toggle="tooltip" title="{% trans 'Edit' %}" class="btn btn-success">{% fa5_icon 'pencil-alt' 'fas' %}</a> diff --git a/AKSubmission/templates/AKSubmission/akmessage_add.html b/AKSubmission/templates/AKSubmission/akmessage_add.html new file mode 100644 index 0000000000000000000000000000000000000000..f7c99c766adda9aa0b7320681902f851815f7a35 --- /dev/null +++ b/AKSubmission/templates/AKSubmission/akmessage_add.html @@ -0,0 +1,39 @@ +{% extends 'AKSubmission/submission_base.html' %} + +{% load i18n %} +{% load bootstrap4 %} +{% load fontawesome_5 %} + +{% block title %}{% trans "AKs" %}: {{ event.name }} - {% trans "Add message to organizers" %}{% endblock %} + +{% block breadcrumbs %} + {% include "AKSubmission/submission_breadcrumbs.html" %} + <li class="breadcrumb-item"><a + href="{% url 'submit:submission_overview' event_slug=event.slug %}">{% trans "AK Submission" %}</a></li> + <li class="breadcrumb-item"><a + href="{% url 'submit:ak_detail' event_slug=event.slug pk=ak.pk %}">{{ ak.short_name }}</a></li> + <li class="breadcrumb-item active">{% trans "Add message to organizers" %}</li> +{% endblock %} + +{% block content %} + {% block headline %} + <h2>{{ ak }}</h2> + <h3>{% trans 'Add message to organizers' %}</h3> + {% endblock %} + <form method="POST" class="post-form">{% csrf_token %} + {% bootstrap_form form %} + {% buttons %} + <button type="submit" class="save btn btn-primary float-right"> + {% fa5_icon "check" 'fas' %} {% trans "Send" %} + </button> + + <button type="reset" class="btn btn-danger"> + {% fa5_icon "undo-alt" 'fas' %} {% trans "Reset Form" %} + </button> + + <a href="{% url 'submit:ak_detail' event_slug=event.slug pk=ak.pk %}" class="btn btn-secondary"> + {% fa5_icon "times" 'fas' %} {% trans "Cancel" %} + </a> + {% endbuttons %} + </form> +{% endblock %} diff --git a/AKSubmission/urls.py b/AKSubmission/urls.py index 57dd16efbfd1d0f09a86545c7a3b81a1dcf03886..0e08c5b00e7d5c9dbec6930e4941891ff1b8d0bc 100644 --- a/AKSubmission/urls.py +++ b/AKSubmission/urls.py @@ -14,6 +14,7 @@ urlpatterns = [ 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>/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'), path('akslot/<int:pk>/delete/', views.AKSlotDeleteView.as_view(), name='akslot_delete'), path('aks/', views.AKOverviewView.as_view(), name='ak_list'), diff --git a/AKSubmission/views.py b/AKSubmission/views.py index a3997ba3a44ccc273f7e66ea9f310d9d7b7e95f4..f2e1a160c9184643ff660d15eb36ef24a5dda856 100644 --- a/AKSubmission/views.py +++ b/AKSubmission/views.py @@ -8,10 +8,10 @@ from django.views import View from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView, RedirectView, TemplateView from AKModel.availability.models import Availability -from AKModel.models import AK, AKCategory, AKTag, AKOwner, AKSlot, AKTrack +from AKModel.models import AK, AKCategory, AKTag, AKOwner, AKSlot, AKTrack, AKOrgaMessage from AKModel.views import EventSlugMixin from AKModel.views import FilterByEventSlugMixin -from AKSubmission.forms import AKWishForm, AKOwnerForm, AKEditForm, AKSubmissionForm, AKDurationForm +from AKSubmission.forms import AKWishForm, AKOwnerForm, AKEditForm, AKSubmissionForm, AKDurationForm, AKOrgaMessageForm class SubmissionErrorNotConfiguredView(EventSlugMixin, TemplateView): @@ -403,3 +403,24 @@ class AKSlotDeleteView(EventSlugMixin, EventInactiveRedirectMixin, DeleteView): messages.add_message(self.request, messages.SUCCESS, _("AK Slot successfully deleted")) return reverse_lazy('submit:ak_detail', kwargs={'event_slug': self.kwargs['event_slug'], 'pk': self.object.ak.pk}) + + +class AKAddOrgaMessageView(EventSlugMixin, CreateView): + model = AKOrgaMessage + form_class = AKOrgaMessageForm + template_name = "AKSubmission/akmessage_add.html" + + def get_initial(self): + initials = super(AKAddOrgaMessageView, self).get_initial() + initials['ak'] = get_object_or_404(AK, pk=self.kwargs['pk']) + return initials + + def get_context_data(self, *, object_list=None, **kwargs): + context = super().get_context_data(object_list=object_list, **kwargs) + context['ak'] = get_object_or_404(AK, pk=self.kwargs['pk']) + return context + + def get_success_url(self): + messages.add_message(self.request, messages.SUCCESS, _("Message to organizers successfully saved")) + return reverse_lazy('submit:ak_detail', + kwargs={'event_slug': self.kwargs['event_slug'], 'pk': self.object.ak.pk})