From 8c4d97b5d15d859ccf1d32a6da46c501dd802943 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sun, 24 Nov 2024 02:55:24 +0100 Subject: [PATCH] members: seminar report mode selection --- jdav_web/members/admin.py | 56 +++++++----- .../members/locale/de/LC_MESSAGES/django.po | 88 ++++++++++++++++--- .../admin/generate_seminar_report.html | 57 ++++++++++++ .../templates/members/seminar_report.tex | 9 +- 4 files changed, 175 insertions(+), 35 deletions(-) create mode 100644 jdav_web/members/templates/admin/generate_seminar_report.html diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index 921a074..3a487f5 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -762,13 +762,18 @@ class MemberNoteListAdmin(admin.ModelAdmin): summary.short_description = _('Generate PDF summary') +class GenerateSeminarReportForm(forms.Form): + modes = (('full', _('Full report')), + ('basic', _('Costs and participants only'))) + mode = forms.ChoiceField(choices=modes, label=_('Mode')) + + class FreizeitAdmin(FilteredMemberFieldMixin, CommonAdminMixin, nested_admin.NestedModelAdmin): #inlines = [MemberOnListInline, LJPOnListInline, StatementOnListInline] form = FreizeitAdminForm list_display = ['__str__', 'date'] search_fields = ('name',) ordering = ('-date',) - actions = ['crisis_intervention_list', 'notes_list', 'seminar_report', 'sjr_application'] view_on_site = False #formfield_overrides = { # ManyToManyField: {'widget': forms.CheckboxSelectMultiple}, @@ -800,18 +805,14 @@ class FreizeitAdmin(FilteredMemberFieldMixin, CommonAdminMixin, nested_admin.Nes _("You are not allowed to view all members on excursion %(name)s.") % {'name': memberlist.name}) return HttpResponseRedirect(reverse('admin:%s_%s_changelist' % (self.opts.app_label, self.opts.model_name))) - def crisis_intervention_list(self, request, queryset): - # this ensures legacy compatibilty - memberlist = queryset[0] + def crisis_intervention_list(self, request, memberlist): if not self.may_view_excursion(request, memberlist): return self.not_allowed_view(request, memberlist) context = dict(memberlist=memberlist, settings=settings) return render_tex(memberlist.name + "_Krisenliste", 'members/crisis_intervention_list.tex', context) crisis_intervention_list.short_description = _('Generate crisis intervention list') - def notes_list(self, request, queryset): - # this ensures legacy compatibilty - memberlist = queryset[0] + def notes_list(self, request, memberlist): if not self.may_view_excursion(request, memberlist): return self.not_allowed_view(request, memberlist) people, skills = memberlist.skill_summary @@ -819,19 +820,34 @@ class FreizeitAdmin(FilteredMemberFieldMixin, CommonAdminMixin, nested_admin.Nes return render_tex(memberlist.name + "_Notizen", 'members/notes_list.tex', context) notes_list.short_description = _('Generate overview') - def seminar_report(self, request, queryset): - # this ensures legacy compatibilty - memberlist = queryset[0] + def render_seminar_report_options(self, request, memberlist, form): + context = dict(self.admin_site.each_context(request), + title=_('Generate seminar report'), + opts=self.opts, + memberlist=memberlist, + form=form, + object=memberlist) + return render(request, 'admin/generate_seminar_report.html', context=context) + + def seminar_report(self, request, memberlist): if not self.may_view_excursion(request, memberlist): return self.not_allowed_view(request, memberlist) - context = dict(memberlist=memberlist, settings=settings) - title = memberlist.ljpproposal.title if hasattr(memberlist, 'ljpproposal') else memberlist.name - return render_tex(title + "_Seminarbericht", 'members/seminar_report.tex', context) + if "apply" in request.POST: + form = GenerateSeminarReportForm(request.POST) + if not form.is_valid(): + messages.error(request, _('Please select a mode.')) + return self.render_seminar_report_options(request, memberlist, form) + mode = form.cleaned_data['mode'] + if mode == 'full' and not hasattr(memberlist, 'ljpproposal'): + messages.error(request, _('Full mode is only available, if the seminar report section is filled out.')) + return self.render_seminar_report_options(request, memberlist, form) + context = dict(memberlist=memberlist, settings=settings, mode=mode) + title = memberlist.ljpproposal.title if hasattr(memberlist, 'ljpproposal') else memberlist.name + return render_tex(title + '_Seminarbericht', 'members/seminar_report.tex', context) + return self.render_seminar_report_options(request, memberlist, GenerateSeminarReportForm()) seminar_report.short_description = _('Generate seminar report') - def sjr_application(self, request, queryset): - # this ensures legacy compatibilty - memberlist = queryset[0] + def sjr_application(self, request, memberlist): if not self.may_view_excursion(request, memberlist): return self.not_allowed_view(request, memberlist) context = memberlist.sjr_application_fields() @@ -864,13 +880,13 @@ class FreizeitAdmin(FilteredMemberFieldMixin, CommonAdminMixin, nested_admin.Nes def action_view(self, request, object_id): if "sjr_application" in request.POST: - return self.sjr_application(request, [Freizeit.objects.get(pk=object_id)]) + return self.sjr_application(request, Freizeit.objects.get(pk=object_id)) if "seminar_report" in request.POST: - return self.seminar_report(request, [Freizeit.objects.get(pk=object_id)]) + return self.seminar_report(request, Freizeit.objects.get(pk=object_id)) if "notes_list" in request.POST: - return self.notes_list(request, [Freizeit.objects.get(pk=object_id)]) + return self.notes_list(request, Freizeit.objects.get(pk=object_id)) if "crisis_intervention_list" in request.POST: - return self.crisis_intervention_list(request, [Freizeit.objects.get(pk=object_id)]) + return self.crisis_intervention_list(request, Freizeit.objects.get(pk=object_id)) return HttpResponseRedirect(reverse('admin:%s_%s_change' % (self.opts.app_label, self.opts.model_name), args=(object_id,))) diff --git a/jdav_web/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po index 467126d..5e81b32 100644 --- a/jdav_web/members/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/members/locale/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-11-24 01:14+0100\n" +"POT-Creation-Date: 2024-11-24 02:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -212,26 +212,50 @@ msgstr "" msgid "Generate PDF summary" msgstr "Übersicht erstellen" -#: members/admin.py:800 +#: members/admin.py:766 +msgid "Full report" +msgstr "Vollständiger Seminarbericht" + +#: members/admin.py:767 +msgid "Costs and participants only" +msgstr "Nur Kosten und Teilnehmende" + +#: members/admin.py:768 +msgid "Mode" +msgstr "Modus" + +#: members/admin.py:805 #, python-format msgid "You are not allowed to view all members on excursion %(name)s." msgstr "" "Du hast nicht die nötigen Rechte um alle Teilnehmer:innen der Ausfahrt " "%(name)s anzusehen." -#: members/admin.py:810 +#: members/admin.py:813 msgid "Generate crisis intervention list" msgstr "Kriseninterventionsliste erstellen" -#: members/admin.py:820 +#: members/admin.py:821 msgid "Generate overview" msgstr "Hinweise für Jugendleiter erstellen" -#: members/admin.py:830 +#: members/admin.py:825 members/admin.py:848 +#: members/templates/admin/generate_seminar_report.html:21 msgid "Generate seminar report" msgstr "Seminarbericht erstellen" -#: members/admin.py:844 +#: members/admin.py:838 +msgid "Please select a mode." +msgstr "Bitte wähle einen Modus aus." + +#: members/admin.py:842 +msgid "" +"Full mode is only available, if the seminar report section is filled out." +msgstr "" +"Der vollständiger Modus ist nur verfügbar, wenn der Seminarbericht " +"ausgefüllt ist. " + +#: members/admin.py:860 msgid "Generate SJR application" msgstr "SJR Antrag erstellen" @@ -807,6 +831,7 @@ msgstr "Fortbildung" msgid "Trainings" msgstr "Fortbildungen" +#: members/templates/admin/generate_seminar_report.html:17 #: members/templates/admin/invite_as_user.html:17 #: members/templates/admin/invite_for_group.html:17 #: members/templates/admin/invite_selected_as_user.html:17 @@ -814,6 +839,50 @@ msgstr "Fortbildungen" msgid "Home" msgstr "Start" +#: members/templates/admin/generate_seminar_report.html:27 +msgid "" +"Here you can generate a seminar report suitable for the LJP. A report\n" +"always contains a head page with the basic information on the seminar." +msgstr "" +"Hier kannst du einen Seminarbericht für den Landesjugendplan erstellen. " +"Ein Bericht enthält immer einen Kopf mit den Stammdaten des Seminars." + +#: members/templates/admin/generate_seminar_report.html:32 +msgid "" +"Full report: Include learning goals and a detailed, tabularized time " +"schedule. This requires\n" +"the seminar report section to be filled out." +msgstr "" +"Vollständiger Bericht: Stelle Lernziele und einen detaillierte, " +"tabellierten Zeitplan dar. Dies benötigt, dass der Seminarbericht " +"in der Ausfahrt ausgefüllt ist." + +#: members/templates/admin/generate_seminar_report.html:36 +msgid "" +"Costs and participants only: Only show a list of participants and costs. In " +"this case you\n" +"have to add learning goals and a time schedule manually." +msgstr "" +"Nur Kosten und Teilnehmende: Zeige nur eine Liste von Teilnehmenden und " +"Kosten an. In diesem Fall musst du Lernziele und einen Zeitplan manuell " +"hinzufügen." + +#: members/templates/admin/generate_seminar_report.html:42 +msgid "Please choose one of the listed modes." +msgstr "Bitte wähle einen der obigen Modi." + +#: members/templates/admin/generate_seminar_report.html:53 +msgid "Generate" +msgstr "Erstellen" + +#: members/templates/admin/generate_seminar_report.html:54 +#: members/templates/admin/invite_as_user.html:37 +#: members/templates/admin/invite_for_group.html:52 +#: members/templates/admin/invite_selected_as_user.html:49 +#: members/templates/admin/invite_selected_for_group.html:53 +msgid "Cancel" +msgstr "Abbrechen" + #: members/templates/admin/invite_as_user.html:27 #, python-format msgid "" @@ -834,13 +903,6 @@ msgstr "" msgid "Invite" msgstr "Einladen" -#: members/templates/admin/invite_as_user.html:37 -#: members/templates/admin/invite_for_group.html:52 -#: members/templates/admin/invite_selected_as_user.html:49 -#: members/templates/admin/invite_selected_for_group.html:53 -msgid "Cancel" -msgstr "Abbrechen" - #: members/templates/admin/invite_for_group.html:21 msgid "Invite to group" msgstr "Zu Gruppe einladen" diff --git a/jdav_web/members/templates/admin/generate_seminar_report.html b/jdav_web/members/templates/admin/generate_seminar_report.html new file mode 100644 index 0000000..8b4cfa0 --- /dev/null +++ b/jdav_web/members/templates/admin/generate_seminar_report.html @@ -0,0 +1,57 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls static %} + +{% block extrahead %} + {{ block.super }} + {{ media }} + + + +{% endblock %} + +{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} invite-waiter +{% endblock %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block content %} +

+{% blocktrans %}Here you can generate a seminar report suitable for the LJP. A report +always contains a head page with the basic information on the seminar.{% endblocktrans %} +

+
    +
  • +{% blocktrans %}Full report: Include learning goals and a detailed, tabularized time schedule. This requires +the seminar report section to be filled out.{% endblocktrans %} +
  • +
  • +{% blocktrans %}Costs and participants only: Only show a list of participants and costs. In this case you +have to add learning goals and a time schedule manually.{% endblocktrans %} +
  • +
+ +
+

{% blocktrans %}Please choose one of the listed modes.{% endblocktrans %}

+ +
+ {% csrf_token %} +

+ {{form}} +

+
+ + + + {% translate "Cancel" %} +
+ +{% endblock %} diff --git a/jdav_web/members/templates/members/seminar_report.tex b/jdav_web/members/templates/members/seminar_report.tex index ce2ae06..ea0160b 100644 --- a/jdav_web/members/templates/members/seminar_report.tex +++ b/jdav_web/members/templates/members/seminar_report.tex @@ -79,6 +79,7 @@ \end{tabular} \end{table} +{% if mode == 'full' %} {% if memberlist.ljpproposal %} \section{Alpintechnische Ziele} @@ -115,17 +116,21 @@ \end{tabularx} \end{table} +{% endif %} {% endif %} \section{Teilnehmer:innenliste} \begin{table}[H] - \begin{tabularx}{1\linewidth}{@{\extracolsep{\fill}}lLl|l|l|l} + \begin{tabularx}{1\linewidth}{@{\extracolsep{\fill}}lLl|c|c|c} \hline \textbf{Name} & \textbf{Anschrift} & \textbf{Geburtsdatum} & \textbf{m} & \textbf{w} & \textbf{d} \\ \hline %\midrule {% for m in memberlist.membersonlist.all %} - {{ m.member.name|esc_all }} & {{ m.member.address|esc_all }} & {{ m.member.birth_date_str|esc_all }} & & & \\ + {{ m.member.name|esc_all }} & {{ m.member.address|esc_all }} & {{ m.member.birth_date_str|esc_all }} + & {% if m.member.gender == 0 %} x {% endif %} + & {% if m.member.gender == 1 %} x {% endif %} + & {% if m.member.gender == 2 %} x {% endif %} \\ {% endfor %} %\bottomrule \end{tabularx}