members/excursion: add V32 and improve texts

pull/73/head
Christian Merten 1 year ago
parent eaccc5a5ef
commit 7d93a4be0a
Signed by: christian.merten
GPG Key ID: D953D69721B948B3

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-11-30 03:54+0100\n" "POT-Creation-Date: 2024-11-30 15:59+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -132,165 +132,165 @@ msgstr "Bestätigung zurücknehmen"
msgid "Finance" msgid "Finance"
msgstr "Finanzen" msgstr "Finanzen"
#: finance/models.py:20 #: finance/models.py:21
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: finance/models.py:26 finance/models.py:466 finance/models.py:490 #: finance/models.py:27 finance/models.py:472 finance/models.py:496
#: finance/templates/admin/confirmed_statement.html:38 #: finance/templates/admin/confirmed_statement.html:38
#: finance/templates/admin/overview_submitted_statement.html:100 #: finance/templates/admin/overview_submitted_statement.html:100
msgid "Ledger" msgid "Ledger"
msgstr "Geldtopf" msgstr "Geldtopf"
#: finance/models.py:27 #: finance/models.py:28
msgid "Ledgers" msgid "Ledgers"
msgstr "Geldtöpfe" msgstr "Geldtöpfe"
#: finance/models.py:47 finance/models.py:409 finance/models.py:489 #: finance/models.py:48 finance/models.py:415 finance/models.py:495
msgid "Short description" msgid "Short description"
msgstr "Kurzbeschreibung" msgstr "Kurzbeschreibung"
#: finance/models.py:50 finance/models.py:410 #: finance/models.py:51 finance/models.py:416
msgid "Explanation" msgid "Explanation"
msgstr "Erklärung" msgstr "Erklärung"
#: finance/models.py:52 #: finance/models.py:53
msgid "Associated excursion" msgid "Associated excursion"
msgstr "Zugehörige Ausfahrt" msgstr "Zugehörige Ausfahrt"
#: finance/models.py:57 #: finance/models.py:58
msgid "Price per night" msgid "Price per night"
msgstr "Preis pro Nacht" msgstr "Preis pro Nacht"
#: finance/models.py:59 #: finance/models.py:60
msgid "Submitted" msgid "Submitted"
msgstr "Eingericht" msgstr "Eingericht"
#: finance/models.py:60 #: finance/models.py:61
msgid "Submitted on" msgid "Submitted on"
msgstr "Eingereicht am" msgstr "Eingereicht am"
#: finance/models.py:61 #: finance/models.py:62
msgid "Confirmed" msgid "Confirmed"
msgstr "Abgewickelt" msgstr "Abgewickelt"
#: finance/models.py:62 finance/models.py:473 #: finance/models.py:63 finance/models.py:479
msgid "Paid on" msgid "Paid on"
msgstr "Bezahlt am" msgstr "Bezahlt am"
#: finance/models.py:64 #: finance/models.py:65
msgid "Created by" msgid "Created by"
msgstr "Erstellt von" msgstr "Erstellt von"
#: finance/models.py:69 #: finance/models.py:70
msgid "Submitted by" msgid "Submitted by"
msgstr "Eingereicht bei" msgstr "Eingereicht bei"
#: finance/models.py:74 finance/models.py:474 #: finance/models.py:75 finance/models.py:480
msgid "Authorized by" msgid "Authorized by"
msgstr "Autorisiert von" msgstr "Autorisiert von"
#: finance/models.py:81 finance/models.py:408 finance/models.py:469 #: finance/models.py:82 finance/models.py:414 finance/models.py:475
msgid "Statement" msgid "Statement"
msgstr "Abrechnung" msgstr "Abrechnung"
#: finance/models.py:82 #: finance/models.py:83
msgid "Statements" msgid "Statements"
msgstr "Abrechnungen" msgstr "Abrechnungen"
#: finance/models.py:97 #: finance/models.py:98
#, python-format #, python-format
msgid "Statement: %(excursion)s" msgid "Statement: %(excursion)s"
msgstr "Abrechnung: %(excursion)s" msgstr "Abrechnung: %(excursion)s"
#: finance/models.py:149 #: finance/models.py:150
msgid "Ready to confirm" msgid "Ready to confirm"
msgstr "Bereit zur Abwicklung" msgstr "Bereit zur Abwicklung"
#: finance/models.py:193 #: finance/models.py:194
#, python-format #, python-format
msgid "Compensation for %(excu)s" msgid "Compensation for %(excu)s"
msgstr "Entschädigung für %(excu)s" msgstr "Entschädigung für %(excu)s"
#: finance/models.py:326 #: finance/models.py:327
#: finance/templates/admin/overview_submitted_statement.html:78 #: finance/templates/admin/overview_submitted_statement.html:78
msgid "Total" msgid "Total"
msgstr "Gesamtbetrag" msgstr "Gesamtbetrag"
#: finance/models.py:363 #: finance/models.py:369
msgid "Statement in preparation" msgid "Statement in preparation"
msgstr "Abrechnung in Vorbereitung" msgstr "Abrechnung in Vorbereitung"
#: finance/models.py:364 #: finance/models.py:370
msgid "Statements in preparation" msgid "Statements in preparation"
msgstr "Abrechnungen in Vorbereitung" msgstr "Abrechnungen in Vorbereitung"
#: finance/models.py:383 #: finance/models.py:389
msgid "Submitted statement" msgid "Submitted statement"
msgstr "Eingereichte Abrechnung" msgstr "Eingereichte Abrechnung"
#: finance/models.py:384 #: finance/models.py:390
msgid "Submitted statements" msgid "Submitted statements"
msgstr "Eingereichte Abrechnungen" msgstr "Eingereichte Abrechnungen"
#: finance/models.py:400 #: finance/models.py:406
msgid "Paid statement" msgid "Paid statement"
msgstr "Bezahlte Abrechnung" msgstr "Bezahlte Abrechnung"
#: finance/models.py:401 #: finance/models.py:407
msgid "Paid statements" msgid "Paid statements"
msgstr "Bezahlte Abrechnungen" msgstr "Bezahlte Abrechnungen"
#: finance/models.py:412 finance/models.py:426 finance/models.py:463 #: finance/models.py:418 finance/models.py:432 finance/models.py:469
#: finance/templates/admin/confirmed_statement.html:36 #: finance/templates/admin/confirmed_statement.html:36
#: finance/templates/admin/overview_submitted_statement.html:31 #: finance/templates/admin/overview_submitted_statement.html:31
#: finance/templates/admin/overview_submitted_statement.html:98 #: finance/templates/admin/overview_submitted_statement.html:98
msgid "Amount" msgid "Amount"
msgstr "Betrag" msgstr "Betrag"
#: finance/models.py:413 #: finance/models.py:419
msgid "Paid by" msgid "Paid by"
msgstr "Bezahlt von" msgstr "Bezahlt von"
#: finance/models.py:415 #: finance/models.py:421
msgid "Covered" msgid "Covered"
msgstr "Übernommen" msgstr "Übernommen"
#: finance/models.py:416 #: finance/models.py:422
msgid "Refunded" msgid "Refunded"
msgstr "Ausgezahlt" msgstr "Ausgezahlt"
#: finance/models.py:418 #: finance/models.py:424
msgid "Proof" msgid "Proof"
msgstr "Beleg" msgstr "Beleg"
#: finance/models.py:429 finance/models.py:436 finance/models.py:449 #: finance/models.py:435 finance/models.py:442 finance/models.py:455
msgid "Bill" msgid "Bill"
msgstr "Ausgabe" msgstr "Ausgabe"
#: finance/models.py:430 finance/models.py:437 finance/models.py:450 #: finance/models.py:436 finance/models.py:443 finance/models.py:456
#: finance/templates/admin/overview_submitted_statement.html:26 #: finance/templates/admin/overview_submitted_statement.html:26
msgid "Bills" msgid "Bills"
msgstr "Ausgaben" msgstr "Ausgaben"
#: finance/models.py:462 finance/templates/admin/confirmed_statement.html:37 #: finance/models.py:468 finance/templates/admin/confirmed_statement.html:37
#: finance/templates/admin/overview_submitted_statement.html:99 #: finance/templates/admin/overview_submitted_statement.html:99
msgid "Reference" msgid "Reference"
msgstr "Verwendungszweck" msgstr "Verwendungszweck"
#: finance/models.py:464 #: finance/models.py:470
msgid "Recipient" msgid "Recipient"
msgstr "Empfänger" msgstr "Empfänger"
#: finance/models.py:472 #: finance/models.py:478
msgid "Paid" msgid "Paid"
msgstr "Bezahlt" msgstr "Bezahlt"
#: finance/models.py:484 #: finance/models.py:490
msgid "Transaction" msgid "Transaction"
msgstr "Überweisung" msgstr "Überweisung"
#: finance/models.py:485 #: finance/models.py:491
#: finance/templates/admin/overview_submitted_statement.html:84 #: finance/templates/admin/overview_submitted_statement.html:84
msgid "Transactions" msgid "Transactions"
msgstr "Überweisungen" msgstr "Überweisungen"

@ -162,3 +162,8 @@ Bei Fragen, wende dich gerne an %(RESPONSIBLE_MAIL)s.
Viele Grüße Viele Grüße
Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL } Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL }
ADDRESS = """JDAV %(SEKTION)s
%(STREET)s
%(PLACE)s""" % { 'SEKTION': SEKTION, 'STREET': SEKTION_STREET, 'PLACE': SEKTION_TOWN }

@ -8,10 +8,23 @@ SEKTION_TELEFAX = "06221 437338"
SEKTION_CONTACT_MAIL = "geschaeftsstelle@alpenverein-heidelberg.de" SEKTION_CONTACT_MAIL = "geschaeftsstelle@alpenverein-heidelberg.de"
SEKTION_BOARD_MAIL = "vorstand@alpenverein-heidelberg.de" SEKTION_BOARD_MAIL = "vorstand@alpenverein-heidelberg.de"
SEKTION_CRISIS_INTERVENTION_MAIL = "krisenmanagement@alpenverein-heidelberg.de" SEKTION_CRISIS_INTERVENTION_MAIL = "krisenmanagement@alpenverein-heidelberg.de"
SEKTION_IBAN = "DE22 6729 0000 0000 1019 40"
SEKTION_ACCOUNT_HOLDER = "Deutscher Alpenverein Sektion Heidelberg 1869"
RESPONSIBLE_MAIL = "jugendreferat@jdav-hd.de" RESPONSIBLE_MAIL = "jugendreferat@jdav-hd.de"
DIGITAL_MAIL = "digitales@jdav-hd.de" DIGITAL_MAIL = "digitales@jdav-hd.de"
# LJP
V32_HEAD_ORGANISATION = """JDAV Baden-Württemberg
Rotebühlstraße 59A
70178 Stuttgart
info@jdav-bw.de
0711 - 49 09 46 00"""
LJP_CONTRIBUTION_PER_DAY = 25
# echo # echo
ECHO_PASSWORD_BIRTHDATE_FORMAT = '%d.%m.%Y' ECHO_PASSWORD_BIRTHDATE_FORMAT = '%d.%m.%Y'

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-11-30 03:54+0100\n" "POT-Creation-Date: 2024-11-30 15:59+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -258,17 +258,15 @@ msgstr "SJR Antrag erstellen"
#: templates/admin/members/freizeit/change_form_object_tools.html:23 #: templates/admin/members/freizeit/change_form_object_tools.html:23
msgid "Generate overview" msgid "Generate overview"
msgstr "Übersicht erstellen" msgstr "Hinweise für Jugendleiter:innen erstellen"
#: templates/admin/members/freizeit/change_form_object_tools.html:30 #: templates/admin/members/freizeit/change_form_object_tools.html:30
msgid "Generate seminar report" msgid "Generate seminar report"
msgstr "Seminarbericht erstellen" msgstr "Landesjugendplan Antrag erstellen"
#: templates/admin/members/freizeit/change_form_object_tools.html:38 #: templates/admin/members/freizeit/change_form_object_tools.html:38
#, fuzzy
#| msgid "Generate overview"
msgid "Finance overview" msgid "Finance overview"
msgstr "Übersicht erstellen" msgstr "Kostenübersicht"
#: templates/admin/members/member/change_form_object_tools.html:8 #: templates/admin/members/member/change_form_object_tools.html:8
msgid "Invite as user" msgid "Invite as user"

@ -23,10 +23,10 @@ from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.db.models import TextField, ManyToManyField, ForeignKey, Count,\ from django.db.models import TextField, ManyToManyField, ForeignKey, Count,\
Sum, Case, Q, F, When, Value, IntegerField, Subquery, OuterRef Sum, Case, Q, F, When, Value, IntegerField, Subquery, OuterRef
from django.forms import Textarea, RadioSelect, TypedChoiceField from django.forms import Textarea, RadioSelect, TypedChoiceField, CheckboxInput
from django.shortcuts import render from django.shortcuts import render
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from .pdf import render_tex, fill_pdf_form from .pdf import render_tex, fill_pdf_form, merge_pdfs, serve_pdf
from contrib.admin import CommonAdminInlineMixin, CommonAdminMixin from contrib.admin import CommonAdminInlineMixin, CommonAdminMixin
@ -825,6 +825,9 @@ class GenerateSeminarReportForm(forms.Form):
modes = (('full', _('Full report')), modes = (('full', _('Full report')),
('basic', _('Costs and participants only'))) ('basic', _('Costs and participants only')))
mode = forms.ChoiceField(choices=modes, label=_('Mode')) mode = forms.ChoiceField(choices=modes, label=_('Mode'))
prepend_v32 = forms.BooleanField(label=_('Prepend V32'), initial=True,
widget=CheckboxInput(attrs={'style': 'display: inherit'}),
required=False)
class FreizeitAdmin(CommonAdminMixin, nested_admin.NestedModelAdmin): class FreizeitAdmin(CommonAdminMixin, nested_admin.NestedModelAdmin):
@ -904,12 +907,21 @@ class FreizeitAdmin(CommonAdminMixin, nested_admin.NestedModelAdmin):
messages.error(request, _('Please select a mode.')) messages.error(request, _('Please select a mode.'))
return self.render_seminar_report_options(request, memberlist, form) return self.render_seminar_report_options(request, memberlist, form)
mode = form.cleaned_data['mode'] mode = form.cleaned_data['mode']
prepend_v32 = form.cleaned_data['prepend_v32']
if mode == 'full' and not hasattr(memberlist, 'ljpproposal'): if mode == 'full' and not hasattr(memberlist, 'ljpproposal'):
messages.error(request, _('Full mode is only available, if the seminar report section is filled out.')) 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) 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 title = memberlist.ljpproposal.title if hasattr(memberlist, 'ljpproposal') else memberlist.name
return render_tex(title + '_Seminarbericht', 'members/seminar_report.tex', context) context = dict(memberlist=memberlist, settings=settings, mode=mode)
fp = render_tex(title + '_Seminarbericht', 'members/seminar_report.tex', context, save_only=True)
if prepend_v32:
context = memberlist.v32_fields()
v32_fp = fill_pdf_form(title + "_LJP_V32",
'members/V32-1_Themenorientierte_Bildungsmassnahmen.pdf',
context,
save_only=True)
return merge_pdfs(title + 'LJP_Antrag', [v32_fp, fp])
return serve_pdf(fp)
return self.render_seminar_report_options(request, memberlist, GenerateSeminarReportForm()) return self.render_seminar_report_options(request, memberlist, GenerateSeminarReportForm())
seminar_report.short_description = _('Generate seminar report') seminar_report.short_description = _('Generate seminar report')

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-11-30 04:20+0100\n" "POT-Creation-Date: 2024-11-30 15:59+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -109,7 +109,7 @@ msgstr ""
msgid "activity" msgid "activity"
msgstr "Aktivität" msgstr "Aktivität"
#: members/admin.py:374 members/models.py:54 members/models.py:1409 #: members/admin.py:374 members/models.py:54 members/models.py:1475
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
@ -160,7 +160,7 @@ msgid "Successfully demoted %(name)s to waiter."
msgstr "%(name)s zurück auf die Warteliste gesetzt." msgstr "%(name)s zurück auf die Warteliste gesetzt."
#: members/admin.py:542 members/models.py:389 members/models.py:733 #: members/admin.py:542 members/models.py:389 members/models.py:733
#: members/models.py:1154 #: members/models.py:1220
msgid "Group" msgid "Group"
msgstr "Gruppe" msgstr "Gruppe"
@ -273,7 +273,11 @@ msgstr "Nur Kosten und Teilnehmende"
msgid "Mode" msgid "Mode"
msgstr "Modus" msgstr "Modus"
#: members/admin.py:841 #: members/admin.py:828
msgid "Prepend V32"
msgstr "V32 Formblatt einfügen"
#: members/admin.py:844
msgid "" msgid ""
"General information on your excursion. These are partly relevant for the " "General information on your excursion. These are partly relevant for the "
"amount of financial compensation (means of transport, travel distance, etc.)." "amount of financial compensation (means of transport, travel distance, etc.)."
@ -282,48 +286,48 @@ msgstr ""
"teilweise relevant für die Zuschüsse aus dem Jugendetat (Verkehrsmittel, " "teilweise relevant für die Zuschüsse aus dem Jugendetat (Verkehrsmittel, "
"Fahrstrecke in km)." "Fahrstrecke in km)."
#: members/admin.py:871 #: members/admin.py:874
#, python-format #, python-format
msgid "You are not allowed to view all members on excursion %(name)s." msgid "You are not allowed to view all members on excursion %(name)s."
msgstr "" msgstr ""
"Du hast nicht die nötigen Rechte um alle Teilnehmer:innen der Ausfahrt " "Du hast nicht die nötigen Rechte um alle Teilnehmer:innen der Ausfahrt "
"%(name)s anzusehen." "%(name)s anzusehen."
#: members/admin.py:879 #: members/admin.py:882
msgid "Generate crisis intervention list" msgid "Generate crisis intervention list"
msgstr "Kriseninterventionsliste erstellen" msgstr "Kriseninterventionsliste erstellen"
#: members/admin.py:887 #: members/admin.py:890
msgid "Generate overview" msgid "Generate overview"
msgstr "Hinweise für Jugendleiter erstellen" msgstr "Hinweise für Jugendleiter erstellen"
#: members/admin.py:891 members/admin.py:914 #: members/admin.py:894 members/admin.py:926
#: members/templates/admin/generate_seminar_report.html:21 #: members/templates/admin/generate_seminar_report.html:21
msgid "Generate seminar report" msgid "Generate seminar report"
msgstr "Seminarbericht erstellen" msgstr "Landesjugendplan Antrag erstellen"
#: members/admin.py:904 #: members/admin.py:907
msgid "Please select a mode." msgid "Please select a mode."
msgstr "Bitte wähle einen Modus aus." msgstr "Bitte wähle einen Modus aus."
#: members/admin.py:908 #: members/admin.py:912
msgid "" msgid ""
"Full mode is only available, if the seminar report section is filled out." "Full mode is only available, if the seminar report section is filled out."
msgstr "" msgstr ""
"Der vollständiger Modus ist nur verfügbar, wenn der Seminarbericht " "Der vollständiger Modus ist nur verfügbar, wenn der Seminarbericht "
"ausgefüllt ist. " "ausgefüllt ist. "
#: members/admin.py:926 #: members/admin.py:938
msgid "Generate SJR application" msgid "Generate SJR application"
msgstr "SJR Antrag erstellen" msgstr "SJR Antrag erstellen"
#: members/admin.py:930 #: members/admin.py:942
msgid "No statement found. Please add a statement and then retry." msgid "No statement found. Please add a statement and then retry."
msgstr "" msgstr ""
"Keine Abrechnung angelegt. Bitte lege eine Abrechnung and und versuche es " "Keine Abrechnung angelegt. Bitte lege eine Abrechnung and und versuche es "
"erneut." "erneut."
#: members/admin.py:934 #: members/admin.py:946
msgid "" msgid ""
"Successfully submited statement. The finance department will notify you as " "Successfully submited statement. The finance department will notify you as "
"soon as possible." "soon as possible."
@ -331,7 +335,7 @@ msgstr ""
"Abrechnung erfolgreich eingericht. Die Finanzabteilung wird sich bei dir so " "Abrechnung erfolgreich eingericht. Die Finanzabteilung wird sich bei dir so "
"schnell wie möglich melden." "schnell wie möglich melden."
#: members/admin.py:937 #: members/admin.py:949
#: members/templates/admin/freizeit_finance_overview.html:21 #: members/templates/admin/freizeit_finance_overview.html:21
msgid "Finance overview" msgid "Finance overview"
msgstr "Kostenübersicht" msgstr "Kostenübersicht"
@ -409,7 +413,7 @@ msgstr "Jugendleiter"
msgid "week day" msgid "week day"
msgstr "Wochentag" msgstr "Wochentag"
#: members/models.py:78 members/models.py:1236 #: members/models.py:78 members/models.py:1302
msgid "Starting time" msgid "Starting time"
msgstr "Zeitpunkt" msgstr "Zeitpunkt"
@ -599,7 +603,7 @@ msgid "Set login data for Kompass"
msgstr "Zugangsdaten für Kompass wählen" msgstr "Zugangsdaten für Kompass wählen"
#: members/models.py:689 members/models.py:885 members/models.py:896 #: members/models.py:689 members/models.py:885 members/models.py:896
#: members/models.py:1185 members/models.py:1192 #: members/models.py:1251 members/models.py:1258
msgid "Member" msgid "Member"
msgstr "Teilnehmer" msgstr "Teilnehmer"
@ -700,7 +704,7 @@ msgstr "Von der Warteliste abgemeldet"
msgid "Comment" msgid "Comment"
msgstr "Kommentar" msgstr "Kommentar"
#: members/models.py:897 members/models.py:1193 #: members/models.py:897 members/models.py:1259
msgid "Members" msgid "Members"
msgstr "Teilnehmer" msgstr "Teilnehmer"
@ -748,7 +752,7 @@ msgstr "mittel"
msgid "hard" msgid "hard"
msgstr "schwer" msgstr "schwer"
#: members/models.py:966 members/models.py:1216 #: members/models.py:966 members/models.py:1282
#: members/templates/admin/freizeit_finance_overview.html:26 #: members/templates/admin/freizeit_finance_overview.html:26
msgid "Excursion" msgid "Excursion"
msgstr "Ausfahrt" msgstr "Ausfahrt"
@ -757,163 +761,163 @@ msgstr "Ausfahrt"
msgid "Excursions" msgid "Excursions"
msgstr "Ausfahrten" msgstr "Ausfahrten"
#: members/models.py:1131 members/models.py:1207 members/models.py:1423 #: members/models.py:1197 members/models.py:1273 members/models.py:1489
msgid "Title" msgid "Title"
msgstr "Titel" msgstr "Titel"
#: members/models.py:1132 members/models.py:1150 members/models.py:1424 #: members/models.py:1198 members/models.py:1216 members/models.py:1490
msgid "Date" msgid "Date"
msgstr "Datum" msgstr "Datum"
#: members/models.py:1151 #: members/models.py:1217
msgid "Location" msgid "Location"
msgstr "Ort" msgstr "Ort"
#: members/models.py:1152 #: members/models.py:1218
msgid "Topic" msgid "Topic"
msgstr "Thema" msgstr "Thema"
#: members/models.py:1176 #: members/models.py:1242
msgid "Jugendleiter" msgid "Jugendleiter"
msgstr "Jugendleiter" msgstr "Jugendleiter"
#: members/models.py:1179 #: members/models.py:1245
msgid "Klettertreff" msgid "Klettertreff"
msgstr "Klettertreff" msgstr "Klettertreff"
#: members/models.py:1180 #: members/models.py:1246
msgid "Klettertreffs" msgid "Klettertreffs"
msgstr "Klettertreffs" msgstr "Klettertreffs"
#: members/models.py:1198 #: members/models.py:1264
msgid "Password" msgid "Password"
msgstr "Passwort" msgstr "Passwort"
#: members/models.py:1201 #: members/models.py:1267
msgid "registration password" msgid "registration password"
msgstr "Registrierungspassort" msgstr "Registrierungspassort"
#: members/models.py:1202 #: members/models.py:1268
msgid "registration passwords" msgid "registration passwords"
msgstr "Registrierungspasswörter" msgstr "Registrierungspasswörter"
#: members/models.py:1209 #: members/models.py:1275
msgid "Alpinistic goals" msgid "Alpinistic goals"
msgstr "Alpintechnische Ziele" msgstr "Alpintechnische Ziele"
#: members/models.py:1210 #: members/models.py:1276
msgid "Pedagogic goals" msgid "Pedagogic goals"
msgstr "Pädagogische Ziele" msgstr "Pädagogische Ziele"
#: members/models.py:1211 #: members/models.py:1277
msgid "Content and methods" msgid "Content and methods"
msgstr "Inhalte und Methoden" msgstr "Inhalte und Methoden"
#: members/models.py:1212 #: members/models.py:1278
msgid "Evaluation" msgid "Evaluation"
msgstr "Wertung" msgstr "Wertung"
#: members/models.py:1213 #: members/models.py:1279
msgid "Experiences and possible improvements" msgid "Experiences and possible improvements"
msgstr "Erfahrungen und Verbesserungsvorschläge" msgstr "Erfahrungen und Verbesserungsvorschläge"
#: members/models.py:1222 members/models.py:1243 #: members/models.py:1288 members/models.py:1309
msgid "LJP Proposal" msgid "LJP Proposal"
msgstr "Seminarbericht" msgstr "Seminarbericht"
#: members/models.py:1223 #: members/models.py:1289
msgid "LJP Proposals" msgid "LJP Proposals"
msgstr "Seminarberichte" msgstr "Seminarberichte"
#: members/models.py:1237 #: members/models.py:1303
msgid "Duration in hours" msgid "Duration in hours"
msgstr "Dauer in Stunden" msgstr "Dauer in Stunden"
#: members/models.py:1240 #: members/models.py:1306
msgid "Activity and method" msgid "Activity and method"
msgstr "Art der Aktion inkl. Methode" msgstr "Art der Aktion inkl. Methode"
#: members/models.py:1248 #: members/models.py:1314
msgid "Intervention" msgid "Intervention"
msgstr "Aktion" msgstr "Aktion"
#: members/models.py:1249 #: members/models.py:1315
msgid "Interventions" msgid "Interventions"
msgstr "Aktionen" msgstr "Aktionen"
#: members/models.py:1351 members/models.py:1381 #: members/models.py:1417 members/models.py:1447
msgid "May list members" msgid "May list members"
msgstr "Darf folgende Teilnehmer:innen listen" msgstr "Darf folgende Teilnehmer:innen listen"
#: members/models.py:1353 members/models.py:1383 #: members/models.py:1419 members/models.py:1449
msgid "May view members" msgid "May view members"
msgstr "Darf folgende Teilnehmer:innen anzeigen" msgstr "Darf folgende Teilnehmer:innen anzeigen"
#: members/models.py:1355 members/models.py:1385 #: members/models.py:1421 members/models.py:1451
msgid "May change members" msgid "May change members"
msgstr "Darf folgende Teilnehmer:innen ändern" msgstr "Darf folgende Teilnehmer:innen ändern"
#: members/models.py:1357 members/models.py:1387 #: members/models.py:1423 members/models.py:1453
msgid "May delete members" msgid "May delete members"
msgstr "Darf folgende Teilnehmer:innen löschen" msgstr "Darf folgende Teilnehmer:innen löschen"
#: members/models.py:1361 members/models.py:1391 #: members/models.py:1427 members/models.py:1457
msgid "May list members of groups" msgid "May list members of groups"
msgstr "Darf Teilnehmer:innen folgender Gruppen listen" msgstr "Darf Teilnehmer:innen folgender Gruppen listen"
#: members/models.py:1363 members/models.py:1393 #: members/models.py:1429 members/models.py:1459
msgid "May view members of groups" msgid "May view members of groups"
msgstr "Darf Teilnehmer:innen folgender Gruppen anzeigen" msgstr "Darf Teilnehmer:innen folgender Gruppen anzeigen"
#: members/models.py:1365 members/models.py:1395 #: members/models.py:1431 members/models.py:1461
msgid "May change members of groups" msgid "May change members of groups"
msgstr "Darf Teilnehmer:innen folgender Gruppen ändern" msgstr "Darf Teilnehmer:innen folgender Gruppen ändern"
#: members/models.py:1367 members/models.py:1397 #: members/models.py:1433 members/models.py:1463
msgid "May delete members of groups" msgid "May delete members of groups"
msgstr "Darf Teilnehmer:innen folgender Gruppen löschen" msgstr "Darf Teilnehmer:innen folgender Gruppen löschen"
#: members/models.py:1370 members/models.py:1371 members/models.py:1374 #: members/models.py:1436 members/models.py:1437 members/models.py:1440
msgid "Permissions" msgid "Permissions"
msgstr "Berechtigungen" msgstr "Berechtigungen"
#: members/models.py:1400 members/models.py:1401 members/models.py:1404 #: members/models.py:1466 members/models.py:1467 members/models.py:1470
msgid "Group permissions" msgid "Group permissions"
msgstr "Gruppenberechtigungen" msgstr "Gruppenberechtigungen"
#: members/models.py:1410 #: members/models.py:1476
msgid "Permission needed" msgid "Permission needed"
msgstr "Freigabe erforderlich" msgstr "Freigabe erforderlich"
#: members/models.py:1413 #: members/models.py:1479
msgid "Training category" msgid "Training category"
msgstr "Fortbildungstyp" msgstr "Fortbildungstyp"
#: members/models.py:1414 #: members/models.py:1480
msgid "Training categories" msgid "Training categories"
msgstr "Fortbildungstypen" msgstr "Fortbildungstypen"
#: members/models.py:1425 #: members/models.py:1491
msgid "Category" msgid "Category"
msgstr "Kategorien" msgstr "Kategorien"
#: members/models.py:1426 #: members/models.py:1492
msgid "Comments" msgid "Comments"
msgstr "Kommentar" msgstr "Kommentar"
#: members/models.py:1427 #: members/models.py:1493
msgid "Participated" msgid "Participated"
msgstr "Teilgenommmen" msgstr "Teilgenommmen"
#: members/models.py:1428 #: members/models.py:1494
msgid "Passed" msgid "Passed"
msgstr "Bestanden" msgstr "Bestanden"
#: members/models.py:1431 #: members/models.py:1497
msgid "Training" msgid "Training"
msgstr "Fortbildung" msgstr "Fortbildung"
#: members/models.py:1432 #: members/models.py:1498
msgid "Trainings" msgid "Trainings"
msgstr "Fortbildungen" msgstr "Fortbildungen"
@ -943,7 +947,7 @@ msgstr "Zurück auf die Warteliste setzen"
#: members/templates/admin/demote_to_waiter.html:46 #: members/templates/admin/demote_to_waiter.html:46
#: members/templates/admin/freizeit_finance_overview.html:154 #: members/templates/admin/freizeit_finance_overview.html:154
#: members/templates/admin/generate_seminar_report.html:58 #: members/templates/admin/generate_seminar_report.html:60
#: members/templates/admin/invite_as_user.html:37 #: members/templates/admin/invite_as_user.html:37
#: members/templates/admin/invite_for_group.html:52 #: members/templates/admin/invite_for_group.html:52
#: members/templates/admin/invite_selected_as_user.html:49 #: members/templates/admin/invite_selected_as_user.html:49
@ -972,10 +976,8 @@ msgid "You listed the following expenses:"
msgstr "Du hast die folgenden Ausgaben angegeben:" msgstr "Du hast die folgenden Ausgaben angegeben:"
#: members/templates/admin/freizeit_finance_overview.html:39 #: members/templates/admin/freizeit_finance_overview.html:39
#, fuzzy
#| msgid "Evaluation"
msgid "Explanation" msgid "Explanation"
msgstr "Wertung" msgstr "Erklärung"
#: members/templates/admin/freizeit_finance_overview.html:40 #: members/templates/admin/freizeit_finance_overview.html:40
msgid "Amount" msgid "Amount"
@ -1138,8 +1140,12 @@ msgid ""
"Here you can generate a seminar report suitable for the LJP. A report\n" "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." "always contains a head page with the basic information on the seminar."
msgstr "" msgstr ""
"Hier kannst du einen Seminarbericht für den Landesjugendplan erstellen. Ein " "Hier kannst du einen Zuschussantrag für den Landesjugendplan (LJP) "
"Bericht enthält immer einen Kopf mit den Stammdaten des Seminars." "erstellen. Ein solcher Antrag besteht immer aus zwei Teilen: Einem Formblatt "
"und einem Seminarbericht. Ein Bericht enthält immer einen Kopf mit den "
"Stammdaten des Seminars. Darüber hinaus muss der Seminarbericht eine "
"Teilnehemendenliste, eine Kostenübersicht und eine detaillierte didaktische "
"Planung enthalten. "
#: members/templates/admin/generate_seminar_report.html:31 #: members/templates/admin/generate_seminar_report.html:31
msgid "" msgid ""
@ -1147,8 +1153,8 @@ msgid ""
"as one expense in the\n" "as one expense in the\n"
"expense overview." "expense overview."
msgstr "" msgstr ""
"Ausgaben mit der gleichen Kurzbeschreibung werden automatisch aufsummiert " "In der Kostenübersicht werden Ausgaben mit der gleichen Kurzbeschreibung "
"und zu einer Ausgabe zusammengefasst." "automatisch aufsummiert und zu einer Ausgabe zusammengefasst."
#: members/templates/admin/generate_seminar_report.html:36 #: members/templates/admin/generate_seminar_report.html:36
msgid "" msgid ""
@ -1156,7 +1162,7 @@ msgid ""
"schedule. This requires\n" "schedule. This requires\n"
"the seminar report section to be filled out." "the seminar report section to be filled out."
msgstr "" msgstr ""
"Vollständiger Bericht: Stelle Lernziele und einen detaillierte, tabellierten " "Vollständiger Bericht: Stelle Lernziele und einen detaillierten, tabellierten "
"Zeitplan dar. Dies benötigt, dass der Seminarbericht in der Ausfahrt " "Zeitplan dar. Dies benötigt, dass der Seminarbericht in der Ausfahrt "
"ausgefüllt ist." "ausgefüllt ist."
@ -1171,10 +1177,15 @@ msgstr ""
"hinzufügen." "hinzufügen."
#: members/templates/admin/generate_seminar_report.html:46 #: members/templates/admin/generate_seminar_report.html:46
msgid "Please choose one of the listed modes." msgid "You may also choose to include the V32 attachment."
msgstr "Bitte wähle einen der obigen Modi." msgstr ""
"Ein LJP Antrag benötigt immer ein Formblatt (in unserem Fall V32-1 "
"Themenorientierte Bildungsmaßnahmen). Dieses kannst du automatisch "
"vorausfüllen lassen und dem Antrag hinzufügen. "
"Bitte fülle die verbleibenden Felder im Formblatt selbst aus und "
"unterschreibe das PDF."
#: members/templates/admin/generate_seminar_report.html:57 #: members/templates/admin/generate_seminar_report.html:59
msgid "Generate" msgid "Generate"
msgstr "Erstellen" msgstr "Erstellen"
@ -1636,6 +1647,9 @@ msgstr "abgelaufen"
msgid "Invalid emergency contacts" msgid "Invalid emergency contacts"
msgstr "Ungültige Notfallkontakte" msgstr "Ungültige Notfallkontakte"
#~ msgid "Please choose one of the listed modes."
#~ msgstr "Bitte wähle einen der obigen Modi."
#~ msgid "Good conduct certificate presentation needed" #~ msgid "Good conduct certificate presentation needed"
#~ msgstr "Vorlage Führungszeugnis notwendig" #~ msgstr "Vorlage Führungszeugnis notwendig"

@ -1024,9 +1024,21 @@ class Freizeit(CommonModel):
jls = set(self.jugendleiter.distinct()) jls = set(self.jugendleiter.distinct())
return len(ps - jls) return len(ps - jls)
@property
def ljp_participant_count(self):
ps = set(map(lambda x: x.member, self.membersonlist.distinct()))
jls = set(self.jugendleiter.distinct())
count = len(ps.union(jls))
return count
#return count if count >= 5 else 0
@property
def maximal_ljp_contributions(self):
return cvt_to_decimal(settings.LJP_CONTRIBUTION_PER_DAY * self.ljp_participant_count * self.duration)
@property @property
def potential_ljp_contributions(self): def potential_ljp_contributions(self):
return cvt_to_decimal(min(25 * self.participant_count * self.duration, return cvt_to_decimal(min(self.maximal_ljp_contributions,
0.9 * float(self.statement.total_bills_theoretic) + float(self.statement.total_staff))) 0.9 * float(self.statement.total_bills_theoretic) + float(self.statement.total_staff)))
@property @property
@ -1113,6 +1125,60 @@ class Freizeit(CommonModel):
base['Status' + suffix] = str(2) base['Status' + suffix] = str(2)
return base return base
def v32_fields(self):
title = self.ljpproposal.title if hasattr(self, 'ljpproposal') else self.name
base = {
# AntragstellerIn
'Textfeld 2': settings.ADDRESS,
# Dachorganisation
'Textfeld 3': settings.V32_HEAD_ORGANISATION,
# Datum der Maßnahme am/vom
'Textfeld 20': self.date.strftime('%d.%m.%Y'),
# bis
'Textfeld 28': self.end.strftime('%d.%m.%Y'),
# Thema der Maßnahme
'Textfeld 22': title,
# IBAN
'Textfeld 36': settings.SEKTION_IBAN,
# Kontoinhaber
'Textfeld 37': settings.SEKTION_ACCOUNT_HOLDER,
# Zahl der zuwendungsfähigen Teilnehemr
'Textfeld 43': str(self.ljp_participant_count),
# Teilnahmetage
'Textfeld 46': str(round(self.duration * self.ljp_participant_count, 1)).replace('.', ','),
# Euro Tagessatz
'Textfeld 48': str(settings.LJP_CONTRIBUTION_PER_DAY),
# Erbetener Zuschuss
'Textfeld 50': str(self.maximal_ljp_contributions).replace('.', ','),
# Stunden Bildungsprogramm
'Textfeld 52': '??',
# Tage
'Textfeld 53': str(round(self.duration, 1)).replace('.', ','),
# Haushaltsjahr
'Textfeld 54': str(datetime.now().year),
# nicht anrechenbare Teilnahmetage
'Textfeld 55': '0',
# Gesamt-Teilnahmetage
'Textfeld 56': str(round(self.duration * self.ljp_participant_count, 1)).replace('.', ','),
# Ort, Datum
'DatumOrt 2': 'Heidelberg, ' + datetime.now().strftime('%d.%m.%Y')
}
if self.statement:
possible_contributions = self.maximal_ljp_contributions
total_contributions = min(self.statement.total_theoretic, possible_contributions)
self_participation = max(cvt_to_decimal(0), self.statement.total_theoretic - possible_contributions)
# Gesamtkosten von
base['Textfeld 62'] = str(self.statement.total_theoretic).replace('.', ',')
# Eigenmittel und Teilnahmebeiträge
base['Textfeld 59'] = str(self_participation).replace('.', ',')
# Drittmittel
base['Textfeld 60'] = '0,00'
# Erbetener Zuschuss
base['Textfeld 61'] = str(total_contributions).replace('.', ',')
# Ergibt wieder
base['Textfeld 58'] = base['Textfeld 62']
return base
@staticmethod @staticmethod
def filter_queryset_by_permissions(member, queryset=None): def filter_queryset_by_permissions(member, queryset=None):
if queryset is None: if queryset is None:

@ -31,7 +31,17 @@ def media_dir():
return os.path.join(settings.MEDIA_MEMBERLISTS, "memberlists") return os.path.join(settings.MEDIA_MEMBERLISTS, "memberlists")
def render_tex(name, template_path, context): def serve_pdf(filename_pdf):
# provide the user with the resulting pdf file
with open(media_path(filename_pdf), 'rb') as pdf:
response = HttpResponse(FileWrapper(pdf))#, content='application/pdf')
response['Content-Type'] = 'application/pdf'
response['Content-Disposition'] = 'attachment; filename='+filename_pdf
return response
def render_tex(name, template_path, context, save_only=False):
filename = name + "_" + datetime.today().strftime("%d_%m_%Y") filename = name + "_" + datetime.today().strftime("%d_%m_%Y")
filename = filename.replace(' ', '_').replace('&', '').replace('/', '_') filename = filename.replace(' ', '_').replace('&', '').replace('/', '_')
# drop umlauts, accents etc. # drop umlauts, accents etc.
@ -64,16 +74,12 @@ def render_tex(name, template_path, context):
os.chdir(oldwd) os.chdir(oldwd)
# provide the user with the resulting pdf file if save_only:
with open(media_path(filename_pdf), 'rb') as pdf: return filename_pdf
response = HttpResponse(FileWrapper(pdf))#, content='application/pdf') return serve_pdf(filename_pdf)
response['Content-Type'] = 'application/pdf'
response['Content-Disposition'] = 'attachment; filename='+filename_pdf
return response
def fill_pdf_form(name, template_path, fields, attachments=[]): def fill_pdf_form(name, template_path, fields, attachments=[], save_only=False):
filename = name + "_" + datetime.today().strftime("%d_%m_%Y") filename = name + "_" + datetime.today().strftime("%d_%m_%Y")
filename = filename.replace(' ', '_').replace('&', '').replace('/', '_') filename = filename.replace(' ', '_').replace('&', '').replace('/', '_')
# drop umlauts, accents etc. # drop umlauts, accents etc.
@ -104,10 +110,22 @@ def fill_pdf_form(name, template_path, fields, attachments=[]):
with open(media_path(filename_pdf), 'wb') as output_stream: with open(media_path(filename_pdf), 'wb') as output_stream:
writer.write(output_stream) writer.write(output_stream)
# provide the user with the resulting pdf file if save_only:
with open(media_path(filename_pdf), 'rb') as pdf: return filename_pdf
response = HttpResponse(FileWrapper(pdf))#, content='application/pdf') return serve_pdf(filename_pdf)
response['Content-Type'] = 'application/pdf'
response['Content-Disposition'] = 'attachment; filename='+filename_pdf
return response
def merge_pdfs(name, filenames, save_only=False):
merger = PdfWriter()
for pdf in filenames:
merger.append(media_path(pdf))
filename = name + "_" + datetime.today().strftime("%d_%m_%Y")
filename_pdf = filename + ".pdf"
merger.write(media_path(filename_pdf))
merger.close()
if save_only:
return filename_pdf
return serve_pdf(filename_pdf)

@ -43,12 +43,14 @@ have to add learning goals and a time schedule manually.{% endblocktrans %}
</ul> </ul>
<br> <br>
<p>{% blocktrans %}Please choose one of the listed modes.{% endblocktrans %}</p> <p>{% blocktrans %}You may also choose to include the V32 attachment.{% endblocktrans %}</p>
<form action="" method="post"> <form action="" method="post">
{% csrf_token %} {% csrf_token %}
<p> <p>
<table>
{{ form }} {{ form }}
</table>
</p> </p>
<br> <br>
<input type="hidden" name="action" value="seminar_report"> <input type="hidden" name="action" value="seminar_report">

@ -1,6 +1,6 @@
{% load tex_extras %} {% load tex_extras %}
\documentclass{article} \documentclass[a4paper]{article}
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
\usepackage{booktabs} \usepackage{booktabs}

@ -1,6 +1,6 @@
{% load tex_extras %} {% load tex_extras %}
\documentclass{article} \documentclass[a4paper]{article}
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
\usepackage{booktabs} \usepackage{booktabs}

@ -1,6 +1,6 @@
{% load tex_extras %} {% load tex_extras %}
\documentclass{article} \documentclass[a4paper]{article}
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
\usepackage{booktabs} \usepackage{booktabs}

@ -20,14 +20,14 @@
<li> <li>
<form method="post" action="{% url 'admin:members_freizeit_action' original.pk %}"> <form method="post" action="{% url 'admin:members_freizeit_action' original.pk %}">
{% csrf_token %} {% csrf_token %}
<input type="submit" name="notes_list" value="{% trans 'Generate overview' %}"> <input type="submit" name="seminar_report" value="{% trans 'Generate seminar report' %}">
</form> </form>
</li> </li>
<li> <li>
<form method="post" action="{% url 'admin:members_freizeit_action' original.pk %}"> <form method="post" action="{% url 'admin:members_freizeit_action' original.pk %}">
{% csrf_token %} {% csrf_token %}
<input type="submit" name="seminar_report" value="{% trans 'Generate seminar report' %}"> <input type="submit" name="notes_list" value="{% trans 'Generate overview' %}">
</form> </form>
</li> </li>

Loading…
Cancel
Save