diff --git a/AKModel/views/status.py b/AKModel/views/status.py index 11b62083ab7683a5eead25f5ecba4117df5081b9..e14ce2fbbcc7c662f71d1711a6fa14b372fb3595 100644 --- a/AKModel/views/status.py +++ b/AKModel/views/status.py @@ -1,6 +1,5 @@ from django.apps import apps from django.urls import reverse_lazy -from django.utils.html import format_html from django.utils.translation import gettext_lazy as _ from AKModel.metaviews import status_manager @@ -112,12 +111,6 @@ class EventAKsWidget(TemplateStatusWidget): ] if apps.is_installed("AKScheduling"): actions.extend([ - { - "text": format_html('{} <span class="badge bg-secondary">{}</span>', - _("Constraint Violations"), - context["event"].constraintviolation_set.count()), - "url": reverse_lazy("admin:constraint-violations", kwargs={"slug": context["event"].slug}), - }, { "text": _("AKs requiring special attention"), "url": reverse_lazy("admin:special-attention", kwargs={"slug": context["event"].slug}), diff --git a/AKScheduling/locale/de_DE/LC_MESSAGES/django.po b/AKScheduling/locale/de_DE/LC_MESSAGES/django.po index 98bda60437d7408d8d716fc7f2fee6c994801e2d..e66d8d55bcda42f3271b2400d6b98cf84f64ee1d 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: 2023-08-16 16:30+0200\n" +"POT-Creation-Date: 2024-04-25 00:24+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -61,52 +61,52 @@ msgid "Constraint Violations for" msgstr "" #: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:44 -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:100 -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:236 -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:371 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:105 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:240 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:375 msgid "No violations" msgstr "Keine Verletzungen" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:77 -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:342 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:82 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:346 msgid "Violation(s)" msgstr "Verletzung(en)" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:80 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:85 msgid "Auto reload?" msgstr "Automatisch neu laden?" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:84 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:89 msgid "Reload now" msgstr "Jetzt neu laden" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:90 -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:225 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:95 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:228 msgid "Violation" msgstr "Verletzung" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:91 -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:365 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:96 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:369 msgid "Problem" msgstr "Problem" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:92 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:97 msgid "Details" msgstr "Details" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:93 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:98 msgid "Since" msgstr "Seit" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:106 -#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:238 -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:328 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:111 +#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:256 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:332 #: AKScheduling/templates/admin/AKScheduling/special_attention.html:48 #: AKScheduling/templates/admin/AKScheduling/unscheduled.html:34 msgid "Event Status" msgstr "Event-Status" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:108 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:113 msgid "Scheduling" msgstr "Scheduling" @@ -116,39 +116,39 @@ msgstr "Abschicken" #: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:11 #: AKScheduling/templates/admin/AKScheduling/scheduling.html:21 -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:325 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:329 msgid "Scheduling for" msgstr "Scheduling für" -#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:124 +#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:135 msgid "Name of new ak track" msgstr "Name des neuen AK-Tracks" -#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:140 +#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:151 msgid "Could not create ak track" msgstr "Konnte neuen AK-Track nicht anlegen" -#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:166 +#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:177 msgid "Could not update ak track name" msgstr "Konnte Namen des AK-Tracks nicht ändern" -#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:172 +#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:183 msgid "Do you really want to delete this ak track?" msgstr "Soll dieser AK-Track wirklich gelöscht werden?" -#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:186 +#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:197 msgid "Could not delete ak track" msgstr "AK-Track konnte nicht gelöscht werden" -#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:198 +#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:216 msgid "Manage AK Tracks" msgstr "AK-Tracks verwalten" -#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:199 +#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:217 msgid "Add ak track" msgstr "AK-Track hinzufügen" -#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:204 +#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:222 msgid "AKs without track" msgstr "AKs ohne Track" @@ -168,31 +168,31 @@ msgstr "Event (horizontal)" msgid "Event (Vertical)" msgstr "Event (vertikal)" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:267 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:271 msgid "Please choose AK" msgstr "Bitte AK auswählen" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:287 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:291 msgid "Could not create slot" msgstr "Konnte Slot nicht anlegen" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:303 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:307 msgid "Add slot" msgstr "Slot hinzufügen" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:311 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:315 msgid "Add" msgstr "Hinzufügen" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:312 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:316 msgid "Cancel" msgstr "Abbrechen" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:339 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:343 msgid "Unscheduled" msgstr "Nicht gescheduled" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:364 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:368 msgid "Level" msgstr "Level" @@ -220,6 +220,24 @@ msgstr "" msgid "AKs without slots" msgstr "AKs ohne Slots" +#: AKScheduling/templates/admin/AKScheduling/status/cvs.html:6 +msgid "" +"\n" +" <h3>Constraint Violation</h3>\n" +" " +msgid_plural "" +"\n" +" <h3>Constraint Violations</h3>\n" +" " +msgstr[0] "" +"\n" +" <h3>Constraintverletzung</h3>\n" +" " +msgstr[1] "" +"\n" +" <h3>Constraintverletzungen</h3>\n" +" " + #: AKScheduling/templates/admin/AKScheduling/unscheduled.html:7 msgid "Unscheduled AK Slots" msgstr "Noch nicht geschedulte AK-Slots" @@ -228,19 +246,19 @@ msgstr "Noch nicht geschedulte AK-Slots" msgid "Count" msgstr "Anzahl" -#: AKScheduling/views.py:148 +#: AKScheduling/views.py:150 msgid "Interest updated" msgstr "Interesse aktualisiert" -#: AKScheduling/views.py:199 +#: AKScheduling/views.py:201 msgid "Wishes" msgstr "Wünsche" -#: AKScheduling/views.py:217 +#: AKScheduling/views.py:219 msgid "Cleanup: Delete unscheduled slots for wishes" msgstr "Aufräumen: Noch nicht geplante Slots für Wünsche löschen" -#: AKScheduling/views.py:224 +#: AKScheduling/views.py:226 #, python-brace-format msgid "" "The following {count} unscheduled slots of wishes will be deleted:\n" @@ -252,15 +270,15 @@ msgstr "" "\n" " {slots}" -#: AKScheduling/views.py:231 +#: AKScheduling/views.py:233 msgid "Unscheduled slots for wishes successfully deleted" msgstr "Noch nicht geplante Slots für Wünsche erfolgreich gelöscht" -#: AKScheduling/views.py:245 +#: AKScheduling/views.py:247 msgid "Create default availabilities for AKs" msgstr "Standardverfügbarkeiten für AKs anlegen" -#: AKScheduling/views.py:252 +#: AKScheduling/views.py:254 #, python-brace-format msgid "" "The following {count} AKs don't have any availability information. Create " @@ -273,16 +291,20 @@ msgstr "" "\n" " {aks}" -#: AKScheduling/views.py:272 +#: AKScheduling/views.py:274 #, python-brace-format msgid "Could not create default availabilities for AK: {ak}" msgstr "Konnte keine Verfügbarkeit anlegen für AK: {ak}" -#: AKScheduling/views.py:277 +#: AKScheduling/views.py:279 #, python-brace-format msgid "Created default availabilities for {count} AKs" msgstr "Standardverfügbarkeiten für {count} AKs angelegt" +#: AKScheduling/views.py:290 +msgid "Constraint Violations" +msgstr "Constraintverletzungen" + #~ msgid "Bitte AK auswählen" #~ msgstr "Please sel" diff --git a/AKScheduling/templates/admin/AKScheduling/status/cvs.html b/AKScheduling/templates/admin/AKScheduling/status/cvs.html new file mode 100644 index 0000000000000000000000000000000000000000..e4eab5a9c5ce962a2af5866b84c69e63a5306807 --- /dev/null +++ b/AKScheduling/templates/admin/AKScheduling/status/cvs.html @@ -0,0 +1,12 @@ +{% load i18n %} + +<div class="text-center"> + <a href="{% url 'admin:constraint-violations' slug=event.slug %}"> + <h1>{{ constraint_violations_count }}</h1> + {% blocktrans count constraint_violations_count=constraint_violations_count %} + <h3>Constraint Violation</h3> + {% plural %} + <h3>Constraint Violations</h3> + {% endblocktrans %} + </a> +</div> diff --git a/AKScheduling/views.py b/AKScheduling/views.py index f0be637f0ec4129507d08129e4b2801eeb671f90..c7ecd4fc3d419c00857d6f53d4e8abc1893f61c6 100644 --- a/AKScheduling/views.py +++ b/AKScheduling/views.py @@ -5,6 +5,8 @@ from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ from django.views.generic import ListView, DetailView, UpdateView +from AKModel.metaviews import status_manager +from AKModel.metaviews.status import TemplateStatusWidget from AKModel.models import AKSlot, AKTrack, Event, AK, AKCategory from AKModel.metaviews.admin import EventSlugMixin, FilterByEventSlugMixin, AdminViewMixin, IntermediateAdminView from AKScheduling.forms import AKInterestForm, AKAddSlotForm @@ -277,3 +279,22 @@ class AvailabilityAutocreateView(EventSlugMixin, IntermediateAdminView): _("Created default availabilities for {count} AKs").format(count=success_count) ) return super().form_valid(form) + + +@status_manager.register(name="scheduling_constraint_violations") +class CVWidget(TemplateStatusWidget): + """ + Status page widget: Constraint violations + """ + required_context_type = "event" + title = _("Constraint Violations") + template_name = "admin/AKScheduling/status/cvs.html" + + def render_status(self, context: {}) -> str: + return "success" if context["constraint_violations_count"] == 0 else "warning" + + def get_context_data(self, context) -> dict: + context = super().get_context_data(context) + context["constraint_violations_count"] = (context["event"].constraintviolation_set + .filter(manually_resolved=False).count()) + return context