diff --git a/AKModel/admin.py b/AKModel/admin.py index 74818764fbb23e82881fe9e0035756a23ebcfae8..d2ba18f334c2f6762f7f7fbde69b8674655b1afc 100644 --- a/AKModel/admin.py +++ b/AKModel/admin.py @@ -159,10 +159,24 @@ class AKOwnerAdmin(PrepopulateWithNextActiveEventMixin, admin.ModelAdmin): Admin interface for AKOwner """ model = AKOwner - list_display = ['name', 'institution', 'event'] + list_display = ['name', 'institution', 'event', 'aks_url'] list_filter = ['event', 'institution'] list_editable = [] ordering = ['name'] + readonly_fields = ['aks_url'] + + @display(description=_("AKs")) + def aks_url(self, obj): + """ + Define a read-only field to go to the list of all AKs by this user + + :param obj: user + :return: AK list page link (HTML) + :rtype: str + """ + return format_html("<a href='{url}'>{text}</a>", + url=reverse_lazy('admin:aks_by_owner', kwargs={'event_slug': obj.event.slug, 'pk': obj.pk}), + text=obj.ak_set.count()) @admin.register(AKCategory) diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po index fe18e5f14831f427f364e99365fad7f598d00dcd..1f3bc6c134325451789d309b207bfc43021e66c9 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-04-24 23:45+0200\n" +"POT-Creation-Date: 2024-04-25 01:29+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" @@ -33,47 +33,54 @@ msgstr "Plan veröffentlichen" msgid "Unpublish plan" msgstr "Plan verbergen" -#: AKModel/admin.py:208 +#: AKModel/admin.py:168 AKModel/models.py:360 AKModel/models.py:682 +#: AKModel/templates/admin/AKModel/aks_by_user.html:12 +#: AKModel/templates/admin/AKModel/status/event_aks.html:10 +#: AKModel/views/manage.py:73 AKModel/views/status.py:98 +msgid "AKs" +msgstr "AKs" + +#: AKModel/admin.py:222 msgid "Wish" msgstr "AK-Wunsch" -#: AKModel/admin.py:214 +#: AKModel/admin.py:228 msgid "Is wish" msgstr "Ist ein Wunsch" -#: AKModel/admin.py:215 +#: AKModel/admin.py:229 msgid "Is not a wish" msgstr "Ist kein Wunsch" -#: AKModel/admin.py:274 +#: AKModel/admin.py:288 msgid "Export to wiki syntax" msgstr "In Wiki-Syntax exportieren" -#: AKModel/admin.py:291 +#: AKModel/admin.py:305 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:306 AKModel/views/ak.py:99 +#: AKModel/admin.py:320 AKModel/views/ak.py:99 msgid "Reset interest in AKs" msgstr "Interesse an AKs zurücksetzen" -#: AKModel/admin.py:316 AKModel/views/ak.py:114 +#: AKModel/admin.py:330 AKModel/views/ak.py:114 msgid "Reset AKs' interest counters" msgstr "Interessenszähler der AKs zurücksetzen" -#: AKModel/admin.py:415 AKModel/admin.py:429 +#: AKModel/admin.py:429 AKModel/admin.py:443 msgid "AK Details" msgstr "AK-Details" -#: AKModel/admin.py:491 AKModel/views/manage.py:99 +#: AKModel/admin.py:505 AKModel/views/manage.py:99 msgid "Mark Constraint Violations as manually resolved" msgstr "Markiere Constraintverletzungen als manuell behoben" -#: AKModel/admin.py:500 AKModel/views/manage.py:112 +#: AKModel/admin.py:514 AKModel/views/manage.py:112 msgid "Set Constraint Violations to level \"violation\"" msgstr "Constraintverletzungen auf Level \"Violation\" setzen" -#: AKModel/admin.py:509 AKModel/views/manage.py:125 +#: AKModel/admin.py:523 AKModel/views/manage.py:125 msgid "Set Constraint Violations to level \"warning\"" msgstr "Constraintverletzungen auf Level \"Warning\" setzen" @@ -588,7 +595,7 @@ msgstr "AK präsentieren" msgid "Present results of this AK" msgstr "Die Ergebnisse dieses AKs vorstellen" -#: AKModel/models.py:334 AKModel/views/status.py:169 +#: AKModel/models.py:334 AKModel/views/status.py:163 msgid "Requirements" msgstr "Anforderungen" @@ -651,12 +658,6 @@ msgstr "Export?" msgid "Include AK in wiki export?" msgstr "AK bei Wiki-Export berücksichtigen?" -#: AKModel/models.py:360 AKModel/models.py:682 -#: AKModel/templates/admin/AKModel/status/event_aks.html:10 -#: AKModel/views/manage.py:73 AKModel/views/status.py:98 -msgid "AKs" -msgstr "AKs" - #: AKModel/models.py:484 msgid "Name or number of the room" msgstr "Name oder Nummer des Raums" @@ -756,7 +757,9 @@ msgstr "Erledigt" #: AKModel/models.py:624 msgid "This message has been resolved (no further action needed)" -msgstr "Diese Nachricht wurde vollständig bearbeitet (keine weiteren Aktionen notwendig" +msgstr "" +"Diese Nachricht wurde vollständig bearbeitet (keine weiteren Aktionen " +"notwendig" #: AKModel/models.py:627 msgid "AK Orga Message" @@ -770,7 +773,7 @@ msgstr "AK-Organachrichten" msgid "Constraint Violation" msgstr "Constraintverletzung" -#: AKModel/models.py:646 AKModel/views/status.py:117 +#: AKModel/models.py:646 msgid "Constraint Violations" msgstr "Constraintverletzungen" @@ -894,7 +897,7 @@ msgstr "Manuell behoben" msgid "Mark this violation manually as resolved" msgstr "Markiere diese Verletzung manuell als behoben" -#: AKModel/models.py:728 +#: AKModel/models.py:728 AKModel/templates/admin/AKModel/aks_by_user.html:22 #: AKModel/templates/admin/AKModel/requirements_overview.html:27 msgid "Details" msgstr "Details" @@ -952,6 +955,19 @@ msgstr "Bestätigen" msgid "Cancel" msgstr "Abbrechen" +#: AKModel/templates/admin/AKModel/aks_by_user.html:8 +msgid "AKs by Owner" +msgstr "AKs der Leitung" + +#: AKModel/templates/admin/AKModel/aks_by_user.html:26 +#: AKModel/templates/admin/AKModel/requirements_overview.html:31 +msgid "Edit" +msgstr "Bearbeiten" + +#: AKModel/templates/admin/AKModel/aks_by_user.html:33 +msgid "This user does not have any AKs currently" +msgstr "Diese Leitung hat aktuell keine AKs" + #: AKModel/templates/admin/AKModel/event_wizard/activate.html:9 #: AKModel/templates/admin/AKModel/event_wizard/created_prepare_import.html:9 #: AKModel/templates/admin/AKModel/event_wizard/finish.html:9 @@ -1018,16 +1034,12 @@ msgstr "" 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/views/status.py:185 +#: AKModel/views/status.py:179 msgid "Add Requirement" msgstr "Anforderung hinzufügen" @@ -1163,7 +1175,7 @@ msgstr "'%(obj)s' kopiert" msgid "Could not copy '%(obj)s' (%(error)s)" msgstr "'%(obj)s' konnte nicht kopiert werden (%(error)s)" -#: AKModel/views/manage.py:35 AKModel/views/status.py:152 +#: AKModel/views/manage.py:35 AKModel/views/status.py:146 msgid "Export AK Slides" msgstr "AK-Folien exportieren" @@ -1231,7 +1243,7 @@ msgstr "Den Plan/die Pläne verbergen von:" msgid "Plan unpublished" msgstr "Plan verborgen" -#: AKModel/views/manage.py:166 AKModel/views/status.py:136 +#: AKModel/views/manage.py:166 AKModel/views/status.py:130 msgid "Edit Default Slots" msgstr "Standardslots bearbeiten" @@ -1286,31 +1298,31 @@ msgstr "Kategorie hinzufügen" msgid "Add Room" msgstr "Raum hinzufügen" -#: AKModel/views/status.py:122 +#: AKModel/views/status.py:116 msgid "AKs requiring special attention" msgstr "AKs, die besondere Aufmerksamkeit benötigen" -#: AKModel/views/status.py:128 +#: AKModel/views/status.py:122 msgid "Enter Interest" msgstr "Interesse erfassen" -#: AKModel/views/status.py:140 +#: AKModel/views/status.py:134 msgid "Manage ak tracks" msgstr "AK-Tracks verwalten" -#: AKModel/views/status.py:144 +#: AKModel/views/status.py:138 msgid "Export AKs as CSV" msgstr "AKs als CSV exportieren" -#: AKModel/views/status.py:148 +#: AKModel/views/status.py:142 msgid "Export AKs for Wiki" msgstr "AKs im Wiki-Format exportieren" -#: AKModel/views/status.py:181 +#: AKModel/views/status.py:175 msgid "Show AKs for requirements" msgstr "Zu Anforderungen gehörige AKs anzeigen" -#: AKModel/views/status.py:195 +#: AKModel/views/status.py:189 msgid "Event Status" msgstr "Eventstatus" diff --git a/AKModel/urls.py b/AKModel/urls.py index 763cc1a22ae73903242abcc2eefe7f2b4ee24209..3abf646058afdf71c7938032236942e7bb0ed995 100644 --- a/AKModel/urls.py +++ b/AKModel/urls.py @@ -4,7 +4,8 @@ from django.urls import include, path from rest_framework.routers import DefaultRouter import AKModel.views.api -from AKModel.views.manage import ExportSlidesView, PlanPublishView, PlanUnpublishView, DefaultSlotEditorView +from AKModel.views.manage import ExportSlidesView, PlanPublishView, PlanUnpublishView, DefaultSlotEditorView, \ + AKsByUserView from AKModel.views.ak import AKRequirementOverview, AKCSVExportView, AKWikiExportView, AKMessageDeleteView from AKModel.views.event_wizard import NewEventWizardStartView, NewEventWizardPrepareImportView, \ NewEventWizardImportView, NewEventWizardActivateView, NewEventWizardFinishView, NewEventWizardSettingsView @@ -91,6 +92,8 @@ def get_admin_urls_event(admin_site): path('<slug:event_slug>/status/', admin_site.admin_view(EventStatusView.as_view()), name="event_status"), path('<slug:event_slug>/requirements/', admin_site.admin_view(AKRequirementOverview.as_view()), name="event_requirement_overview"), + path('<slug:event_slug>/aks/owner/<pk>/', admin_site.admin_view(AKsByUserView.as_view()), + name="aks_by_owner"), path('<slug:event_slug>/ak-csv-export/', admin_site.admin_view(AKCSVExportView.as_view()), name="ak_csv_export"), path('<slug:slug>/ak-wiki-export/', admin_site.admin_view(AKWikiExportView.as_view()), diff --git a/AKModel/views/manage.py b/AKModel/views/manage.py index 6f01c10da3c4f33eeb8075d0f54c09f0dae54db9..64443cb8f7de27832f518df75378f1fc2ea59571 100644 --- a/AKModel/views/manage.py +++ b/AKModel/views/manage.py @@ -8,13 +8,13 @@ from django.contrib import messages from django.db.models.functions import Now from django.utils.dateparse import parse_datetime from django.utils.translation import gettext_lazy as _ -from django.views.generic import TemplateView +from django.views.generic import TemplateView, DetailView from django_tex.core import render_template_with_context, run_tex_in_directory from django_tex.response import PDFResponse from AKModel.forms import SlideExportForm, DefaultSlotEditorForm -from AKModel.metaviews.admin import EventSlugMixin, IntermediateAdminView, IntermediateAdminActionView -from AKModel.models import ConstraintViolation, Event, DefaultSlot +from AKModel.metaviews.admin import EventSlugMixin, IntermediateAdminView, IntermediateAdminActionView, AdminViewMixin +from AKModel.models import ConstraintViolation, Event, DefaultSlot, AKOwner class UserView(TemplateView): @@ -236,3 +236,12 @@ class DefaultSlotEditorView(EventSlugMixin, IntermediateAdminView): .format(u=str(updated_count), c=str(created_count), d=str(deleted_count)) ) return super().form_valid(form) + + +class AKsByUserView(AdminViewMixin, EventSlugMixin, DetailView): + """ + View: Show all AKs of a given user + """ + model = AKOwner + context_object_name = 'owner' + template_name = "admin/AKModel/aks_by_user.html"