diff --git a/AKModel/admin.py b/AKModel/admin.py index 48c1f87833e0c419f409a253a4e7b8642669c85a..24b24ac2209ac5f166d745f961e25527515cae5c 100644 --- a/AKModel/admin.py +++ b/AKModel/admin.py @@ -16,7 +16,7 @@ from AKModel.availability.forms import AvailabilitiesFormMixin from AKModel.availability.models import Availability from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequirement, AK, AKSlot, Room, AKOrgaMessage, \ ConstraintViolation -from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView, AKMessageDeleteView +from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView, AKMessageDeleteView, AKRequirementOverview @admin.register(Event) @@ -31,6 +31,7 @@ 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>/requirements/', self.admin_site.admin_view(AKRequirementOverview.as_view()), name="event_requirement_overview"), 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()), diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po index ebcaa38424d213de8815bff0745ace84149ceb1a..3438f20cab0cb010cf6574d0d2569ef82b40934e 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-11-03 20:41+0000\n" +"POT-Creation-Date: 2021-04-29 17:43+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,28 +11,33 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: AKModel/admin.py:41 AKModel/admin.py:42 +#: AKModel/admin.py:44 AKModel/admin.py:45 +#: AKModel/templates/admin/AKModel/requirements_overview.html:8 #: AKModel/templates/admin/AKModel/status.html:7 #: AKModel/templates/admin/ak_index.html:15 msgid "Status" msgstr "Status" -#: AKModel/admin.py:120 +#: AKModel/admin.py:123 msgid "Wish" msgstr "AK-Wunsch" -#: AKModel/admin.py:126 +#: AKModel/admin.py:129 msgid "Is wish" msgstr "Ist ein Wunsch" -#: AKModel/admin.py:127 +#: AKModel/admin.py:130 msgid "Is not a wish" msgstr "Ist kein Wunsch" -#: AKModel/admin.py:154 +#: AKModel/admin.py:157 msgid "Export to wiki syntax" msgstr "In Wiki-Syntax exportieren" +#: AKModel/admin.py:253 +msgid "AK Details" +msgstr "AK-Details" + #: AKModel/availability/forms.py:20 AKModel/availability/models.py:239 msgid "Availability" msgstr "Verfügbarkeit" @@ -60,13 +65,13 @@ msgstr "Bitte Verfügbarkeiten eintragen!" #: AKModel/availability/models.py:38 AKModel/models.py:47 AKModel/models.py:76 #: AKModel/models.py:128 AKModel/models.py:147 AKModel/models.py:179 #: AKModel/models.py:233 AKModel/models.py:292 AKModel/models.py:324 -#: AKModel/models.py:410 +#: AKModel/models.py:431 msgid "Event" msgstr "Event" #: AKModel/availability/models.py:39 AKModel/models.py:77 AKModel/models.py:129 #: AKModel/models.py:148 AKModel/models.py:180 AKModel/models.py:234 -#: AKModel/models.py:293 AKModel/models.py:325 AKModel/models.py:411 +#: AKModel/models.py:293 AKModel/models.py:325 AKModel/models.py:432 msgid "Associated event" msgstr "Zugehöriges Event" @@ -79,7 +84,7 @@ msgid "Person whose availability this is" msgstr "Person deren Verfügbarkeit hier abgebildet wird" #: AKModel/availability/models.py:56 AKModel/models.py:296 -#: AKModel/models.py:315 AKModel/models.py:419 +#: AKModel/models.py:315 AKModel/models.py:440 msgid "Room" msgstr "Raum" @@ -88,7 +93,7 @@ msgid "Room whose availability this is" msgstr "Raum dessen Verfügbarkeit hier abgebildet wird" #: AKModel/availability/models.py:65 AKModel/models.py:239 -#: AKModel/models.py:314 AKModel/models.py:366 +#: AKModel/models.py:314 AKModel/models.py:387 msgid "AK" msgstr "AK" @@ -97,7 +102,7 @@ msgid "AK whose availability this is" msgstr "Verfügbarkeiten" #: AKModel/availability/models.py:74 AKModel/models.py:132 -#: AKModel/models.py:425 +#: AKModel/models.py:446 msgid "AK Category" msgstr "AK-Kategorie" @@ -261,7 +266,7 @@ msgstr "Internet Link" msgid "Link to Homepage" msgstr "Link zu Homepage oder Webseite" -#: AKModel/models.py:80 AKModel/models.py:418 +#: AKModel/models.py:80 AKModel/models.py:439 msgid "AK Owner" msgstr "AK-Leitung" @@ -321,7 +326,7 @@ msgstr "AK-Tags" msgid "Name of the Requirement" msgstr "Name der Anforderung" -#: AKModel/models.py:183 AKModel/models.py:422 +#: AKModel/models.py:183 AKModel/models.py:443 msgid "AK Requirement" msgstr "AK-Anforderung" @@ -458,7 +463,7 @@ msgstr "Interessenszähler" msgid "People who have indicated interest online" msgstr "Anzahl Personen, die online Interesse bekundet haben" -#: AKModel/models.py:240 AKModel/models.py:413 +#: AKModel/models.py:240 AKModel/models.py:434 #: AKModel/templates/admin/AKModel/status.html:49 #: AKModel/templates/admin/AKModel/status.html:56 msgid "AKs" @@ -536,163 +541,167 @@ msgstr "Letzte Aktualisierung" msgid "AK Slot" msgstr "AK-Slot" -#: AKModel/models.py:331 AKModel/models.py:415 +#: AKModel/models.py:331 AKModel/models.py:436 msgid "AK Slots" msgstr "AK-Slot" -#: AKModel/models.py:345 +#: AKModel/models.py:353 AKModel/models.py:362 msgid "Not scheduled yet" msgstr "Noch nicht geplant" -#: AKModel/models.py:367 -#, fuzzy -#| msgid "Track the AK belongs to" +#: AKModel/models.py:388 msgid "AK this message belongs to" -msgstr "Track zu dem der AK gehört" +msgstr "AK zu dem die Nachricht gehört" -#: AKModel/models.py:368 +#: AKModel/models.py:389 msgid "Message text" msgstr "Nachrichtentext" -#: AKModel/models.py:369 +#: AKModel/models.py:390 msgid "Message to the organizers. This is not publicly visible." msgstr "" "Nachricht an die Organisator*innen. Diese ist nicht öffentlich sichtbar." -#: AKModel/models.py:373 +#: AKModel/models.py:394 msgid "AK Orga Message" msgstr "AK-Organachricht" -#: AKModel/models.py:374 +#: AKModel/models.py:395 msgid "AK Orga Messages" msgstr "AK-Organachrichten" -#: AKModel/models.py:383 +#: AKModel/models.py:404 msgid "Constraint Violation" msgstr "Constraintverletzung" -#: AKModel/models.py:384 +#: AKModel/models.py:405 msgid "Constraint Violations" msgstr "Constraintverletzungen" -#: AKModel/models.py:388 +#: AKModel/models.py:409 msgid "Owner has two parallel slots" msgstr "Leitung hat zwei Slots parallel" -#: AKModel/models.py:389 +#: AKModel/models.py:410 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:390 +#: AKModel/models.py:411 msgid "Room has two AK slots scheduled at the same time" msgstr "Raum hat AK Slots gleichzeitig" -#: AKModel/models.py:391 +#: AKModel/models.py:412 msgid "Room does not satisfy the requirement of the scheduled AK" msgstr "Room erfüllt die Anforderungen des platzierten AKs nicht" -#: AKModel/models.py:392 +#: AKModel/models.py:413 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" +msgstr "" +"AK Slot wurde wurde zur gleichen Zeit wie ein Konflikt des AKs platziert" -#: AKModel/models.py:393 +#: AKModel/models.py:414 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:395 -msgid "AK Slot for AK with intention to submit a resolution is scheduled after " +#: AKModel/models.py:416 +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" +msgstr "" +"AK Slot eines AKs mit Resoabsicht wurde nach der Resodeadline platziert" -#: AKModel/models.py:396 +#: AKModel/models.py:417 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:397 +#: AKModel/models.py:418 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:398 +#: AKModel/models.py:419 msgid "AK Slot is scheduled in a room with less space than interest" -msgstr "AK Slot wurde in einem Raum mit weniger Plätzen als am AK Interessierten platziert" +msgstr "" +"AK Slot wurde in einem Raum mit weniger Plätzen als am AK Interessierten " +"platziert" -#: AKModel/models.py:399 +#: AKModel/models.py:420 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:402 +#: AKModel/models.py:423 msgid "Warning" msgstr "Warnung" -#: AKModel/models.py:403 +#: AKModel/models.py:424 msgid "Violation" msgstr "Verletzung" -#: AKModel/models.py:405 +#: AKModel/models.py:426 msgid "Type" msgstr "Art" -#: AKModel/models.py:406 +#: AKModel/models.py:427 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:407 +#: AKModel/models.py:428 msgid "Level" msgstr "Level" -#: AKModel/models.py:408 +#: AKModel/models.py:429 msgid "Severity level of the violation" msgstr "Schweregrad der Verletzung" -#: AKModel/models.py:414 +#: AKModel/models.py:435 msgid "AK(s) belonging to this constraint" msgstr "AK(s), die zu diesem Constraint gehören" -#: AKModel/models.py:416 +#: AKModel/models.py:437 msgid "AK Slot(s) belonging to this constraint" msgstr "AK Slot(s), die zu diesem Constraint gehören" -#: AKModel/models.py:418 +#: AKModel/models.py:439 msgid "AK Owner belonging to this constraint" msgstr "AK Leitung(en), die zu diesem Constraint gehören" -#: AKModel/models.py:420 +#: AKModel/models.py:441 msgid "Room belonging to this constraint" msgstr "Raum, der zu diesem Constraint gehört" -#: AKModel/models.py:423 +#: AKModel/models.py:444 msgid "AK Requirement belonging to this constraint" msgstr "AK Anforderung, die zu diesem Constraint gehört" -#: AKModel/models.py:425 +#: AKModel/models.py:446 msgid "AK Category belonging to this constraint" msgstr "AK Kategorie, di zu diesem Constraint gehört" -#: AKModel/models.py:427 +#: AKModel/models.py:448 msgid "Comment" msgstr "Kommentar" -#: AKModel/models.py:427 +#: AKModel/models.py:448 msgid "Comment or further details for this violation" msgstr "Kommentar oder weitere Details zu dieser Vereletzung" -#: AKModel/models.py:430 +#: AKModel/models.py:451 msgid "Timestamp" msgstr "Timestamp" -#: AKModel/models.py:430 +#: AKModel/models.py:451 msgid "Time of creation" msgstr "Zeitpunkt der ERstellung" -#: AKModel/models.py:431 +#: AKModel/models.py:452 msgid "Manually Resolved" msgstr "Manuell behoben" -#: AKModel/models.py:432 +#: AKModel/models.py:453 msgid "Mark this violation manually as resolved" msgstr "Markiere diese Verletzung manuell als behoben" -#: AKModel/models.py:454 +#: AKModel/models.py:475 +#: AKModel/templates/admin/AKModel/requirements_overview.html:27 msgid "Details" msgstr "Details" @@ -743,13 +752,28 @@ msgstr "Löschen" msgid "Cancel" msgstr "Abbrechen" +#: AKModel/templates/admin/AKModel/requirements_overview.html:12 +msgid "Requirements Overview" +msgstr "Übersicht Anforderungen" + +#: AKModel/templates/admin/AKModel/requirements_overview.html:31 +msgid "Edit" +msgstr "Bearbeiten" + +#: AKModel/templates/admin/AKModel/requirements_overview.html:38 +msgid "No AKs with this requirement" +msgstr "Kein AK mit dieser Anforderung" + +#: AKModel/templates/admin/AKModel/requirements_overview.html:45 +#: AKModel/templates/admin/AKModel/status.html:99 +msgid "Add Requirement" +msgstr "Anforderung hinzufügen" + #: AKModel/templates/admin/AKModel/status.html:16 msgid "Categories" msgstr "Kategorien" #: AKModel/templates/admin/AKModel/status.html:18 -#, fuzzy -#| msgid "No categories yet" msgid "No categories yet" msgstr "Bisher keine Kategorien" @@ -795,14 +819,14 @@ msgid "No requirements yet" msgstr "Bisher keine Anforderungen" #: AKModel/templates/admin/AKModel/status.html:98 -msgid "Add Requirement" -msgstr "Anforderungen hinzufügen" +msgid "Show AKs for requirements" +msgstr "Zu Anforderungen gehörige AKs anzeigen" -#: AKModel/templates/admin/AKModel/status.html:101 +#: AKModel/templates/admin/AKModel/status.html:102 msgid "Messages" msgstr "Nachrichten" -#: AKModel/templates/admin/AKModel/status.html:103 +#: AKModel/templates/admin/AKModel/status.html:104 msgid "Delete all messages" msgstr "Alle Nachrichten löschen" @@ -814,15 +838,19 @@ msgstr "Aktive Events" msgid "Event Status" msgstr "Eventstatus" -#: AKModel/views.py:144 +#: AKModel/views.py:143 +msgid "Requirements for Event" +msgstr "Anforderungen für das Event" + +#: AKModel/views.py:157 msgid "AK CSV Export" msgstr "AK-CSV-Export" -#: AKModel/views.py:158 +#: AKModel/views.py:171 msgid "AK Wiki Export" msgstr "AK-Wiki-Export" -#: AKModel/views.py:178 +#: AKModel/views.py:191 msgid "AK Orga Messages successfully deleted" msgstr "AK-Organachrichten erfolgreich gelöscht" diff --git a/AKModel/templates/admin/AKModel/requirements_overview.html b/AKModel/templates/admin/AKModel/requirements_overview.html new file mode 100644 index 0000000000000000000000000000000000000000..a1b41b99bd73d1aa5328d21f34d313201283a813 --- /dev/null +++ b/AKModel/templates/admin/AKModel/requirements_overview.html @@ -0,0 +1,48 @@ +{% extends "admin/base_site.html" %} +{% load tags_AKModel %} + +{% load i18n %} +{% load tz %} +{% load fontawesome_5 %} + +{% block title %}{% trans "Status" %}: {{event}}{% endblock %} + +{% block content %} + {% timezone event.timezone %} + <h2><a href="{% url 'admin:AKModel_event_change' event.pk %}">{{event}}</a> - {% trans "Requirements Overview" %}</h2> + <h5>{{ event.start }} - {{ event.end }}</h5> + + <div class="row mt-4"> + {% for requirement in requirements %} + <div class="col-md-4"> + <h4>{{ requirement }}</h4> + + <table class="table table-striped"> + {% for ak in requirement.ak_set.all %} + <tr> + <td>{{ ak }}</td> + {% if "AKSubmission"|check_app_installed %} + <td class="text-right"> + <a href="{% url 'submit:ak_detail' event_slug=ak.event.slug pk=ak.pk %}" data-toggle="tooltip" + title="{% trans 'Details' %}" + class="btn btn-primary">{% fa5_icon 'info' 'fas' %}</a> + {% if event.active %} + <a href="{% url 'submit:ak_edit' event_slug=event.slug pk=ak.pk %}" data-toggle="tooltip" + title="{% trans 'Edit' %}" + class="btn btn-success">{% fa5_icon 'pencil-alt' 'fas' %}</a> + {% endif %} + {% endif %} + </td> + </tr> + {% empty %} + <tr><td>{% trans "No AKs with this requirement" %}</td></tr> + {% endfor %} + </table> + </div> + {% endfor %} + </div> + + <a class="btn btn-success" href="{% url 'admin:AKModel_akrequirement_add' %}">{% trans "Add Requirement" %}</a> + + {% endtimezone %} +{% endblock %} diff --git a/AKModel/templates/admin/AKModel/status.html b/AKModel/templates/admin/AKModel/status.html index 032181e5ddee65563179b705816378572149249e..4ff7db1c9f87185e41b7e62f9db1d8ebeda93ca9 100644 --- a/AKModel/templates/admin/AKModel/status.html +++ b/AKModel/templates/admin/AKModel/status.html @@ -95,6 +95,7 @@ {% endfor %} </p> {% endif %} + <a class="btn btn-success" href="{% url 'admin:event_requirement_overview' event.slug %}">{% trans "Show AKs for requirements" %}</a> <a class="btn btn-success" href="{% url 'admin:AKModel_akrequirement_add' %}">{% trans "Add Requirement" %}</a> </div> <div class="col-md-4"> diff --git a/AKModel/views.py b/AKModel/views.py index d560e9f644cffce4952993f97b8db0dff0cb8e7b..307a1ef1e075780f30eda589047a5ca29de88d81 100644 --- a/AKModel/views.py +++ b/AKModel/views.py @@ -7,7 +7,7 @@ from django.utils.translation import gettext_lazy as _ 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, AKOrgaMessage +from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage, AKRequirement from AKModel.serializers import AKSerializer, AKSlotSerializer, RoomSerializer, AKTrackSerializer, AKCategorySerializer, \ AKOwnerSerializer @@ -137,6 +137,19 @@ class EventStatusView(AdminViewMixin, DetailView): return context +class AKRequirementOverview(AdminViewMixin, FilterByEventSlugMixin, ListView): + model = AKRequirement + context_object_name = "requirements" + title = _("Requirements for Event") + template_name = "admin/AKModel/requirements_overview.html" + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["event"] = self.event + context["site_url"] = reverse_lazy("dashboard:dashboard_event", kwargs={'slug': context["event"].slug}) + return context + + class AKCSVExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): template_name = "admin/AKModel/ak_csv_export.html" model = AKSlot