refactor: move all specific configurations to settings

v1-0-stable
Christian Merten 3 years ago
parent 175311eccd
commit 33a07f8730
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: 2023-03-17 23:19+0100\n" "POT-Creation-Date: 2023-03-20 18:48+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"
@ -18,12 +18,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin.py:69 #: finance/admin.py:69
#, python-format #, python-format
msgid "%(name)s is already submitted." msgid "%(name)s is already submitted."
msgstr "%(name)s ist bereits eingereicht." msgstr "%(name)s ist bereits eingereicht."
#: admin.py:75 #: finance/admin.py:75
#, python-format #, python-format
msgid "" msgid ""
"Successfully submited %(name)s. The finance department will notify the " "Successfully submited %(name)s. The finance department will notify the "
@ -32,23 +32,23 @@ msgstr ""
"Rechnung %(name)s erfolgreich eingereicht. Das Finanzreferat wird auf dich " "Rechnung %(name)s erfolgreich eingereicht. Das Finanzreferat wird auf dich "
"sobald wie möglich zukommen." "sobald wie möglich zukommen."
#: admin.py:78 #: finance/admin.py:78
msgid "Submit statement" msgid "Submit statement"
msgstr "Rechnung einreichen" msgstr "Rechnung einreichen"
#: admin.py:152 #: finance/admin.py:152
#, python-format #, python-format
msgid "%(name)s is not yet submitted." msgid "%(name)s is not yet submitted."
msgstr "%(name)s ist noch nicht eingereicht." msgstr "%(name)s ist noch nicht eingereicht."
#: admin.py:159 #: finance/admin.py:159
#, python-format #, python-format
msgid "An error occured while trying to confirm %(name)s. Please try again." msgid "An error occured while trying to confirm %(name)s. Please try again."
msgstr "" msgstr ""
"Beim Abwickeln von %(name)s ist ein Fehler aufgetreten. Bitte versuche es " "Beim Abwickeln von %(name)s ist ein Fehler aufgetreten. Bitte versuche es "
"erneut." "erneut."
#: admin.py:163 #: finance/admin.py:163
#, python-format #, python-format
msgid "" msgid ""
"Successfully confirmed %(name)s. I hope you executed the associated " "Successfully confirmed %(name)s. I hope you executed the associated "
@ -57,11 +57,11 @@ msgstr ""
"Erfolgreich %(name)s abgewickelt. Ich hoffe du hast die zugehörigen " "Erfolgreich %(name)s abgewickelt. Ich hoffe du hast die zugehörigen "
"Überweisungen ausgeführt, ich werde dich nicht nochmal erinnern." "Überweisungen ausgeführt, ich werde dich nicht nochmal erinnern."
#: admin.py:170 #: finance/admin.py:170
msgid "Statement confirmed" msgid "Statement confirmed"
msgstr "Abrechnung abgewickelt" msgstr "Abrechnung abgewickelt"
#: admin.py:176 #: finance/admin.py:176
msgid "" msgid ""
"Transactions do not match the covered expenses. Please correct the mistakes " "Transactions do not match the covered expenses. Please correct the mistakes "
"listed below." "listed below."
@ -69,19 +69,19 @@ msgstr ""
"Überweisungen stimmen nicht mit den übernommenen Kosten überein. Bitte " "Überweisungen stimmen nicht mit den übernommenen Kosten überein. Bitte "
"korrigiere die unten aufgeführten Fehler." "korrigiere die unten aufgeführten Fehler."
#: admin.py:181 #: finance/admin.py:181
msgid "Some transactions have no ledger configured. Please fill in the gaps." msgid "Some transactions have no ledger configured. Please fill in the gaps."
msgstr "" msgstr ""
"Manche Überweisungen haben kein Geldtopf eingestellt. Bitte trage das nach." "Manche Überweisungen haben kein Geldtopf eingestellt. Bitte trage das nach."
#: admin.py:190 #: finance/admin.py:190
#, python-format #, python-format
msgid "Successfully rejected %(name)s. The requestor can reapply, when needed." msgid "Successfully rejected %(name)s. The requestor can reapply, when needed."
msgstr "" msgstr ""
"Die Rechnung %(name)s wurde abgelehnt. Die Person kann die Rechnung erneut " "Die Rechnung %(name)s wurde abgelehnt. Die Person kann die Rechnung erneut "
"einstellen, wenn es benötigt wird." "einstellen, wenn es benötigt wird."
#: admin.py:197 #: finance/admin.py:197
#, python-format #, python-format
msgid "" msgid ""
"%(name)s already has transactions. Please delete them first, if you want to " "%(name)s already has transactions. Please delete them first, if you want to "
@ -90,194 +90,198 @@ msgstr ""
"%(name)s hat bereits Überweisungen. Bitte lösche diese zunächst, bevor du " "%(name)s hat bereits Überweisungen. Bitte lösche diese zunächst, bevor du "
"neue generierst." "neue generierst."
#: admin.py:201 #: finance/admin.py:201
#, python-format #, python-format
msgid "Successfully generated transactions for %(name)s" msgid "Successfully generated transactions for %(name)s"
msgstr "Automatisch Überweisungsträger für %(name)s generiert." msgstr "Automatisch Überweisungsträger für %(name)s generiert."
#: admin.py:204 #: finance/admin.py:204
msgid "View submitted statement" msgid "View submitted statement"
msgstr "Eingereichte Abrechnung einsehen" msgstr "Eingereichte Abrechnung einsehen"
#: admin.py:230 #: finance/admin.py:230
#, python-format #, python-format
msgid "Successfully reduced transactions for %(name)s." msgid "Successfully reduced transactions for %(name)s."
msgstr "Überweisungsträger für %(name)s minimiert." msgstr "Überweisungsträger für %(name)s minimiert."
#: apps.py:8 #: finance/apps.py:8
msgid "Finance" msgid "Finance"
msgstr "Finanzen" msgstr "Finanzen"
#: models.py:13 #: finance/models.py:13
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: models.py:19 models.py:352 models.py:376 #: finance/models.py:19 finance/models.py:372 finance/models.py:396
#: templates/admin/confirmed_statement.html:38 #: finance/templates/admin/confirmed_statement.html:38
#: templates/admin/overview_submitted_statement.html:100 #: finance/templates/admin/overview_submitted_statement.html:100
msgid "Ledger" msgid "Ledger"
msgstr "Geldtopf" msgstr "Geldtopf"
#: models.py:20 #: finance/models.py:20
msgid "Ledgers" msgid "Ledgers"
msgstr "Geldtöpfe" msgstr "Geldtöpfe"
#: models.py:42 models.py:323 models.py:375 #: finance/models.py:42 finance/models.py:343 finance/models.py:395
msgid "Short description" msgid "Short description"
msgstr "Kurzbeschreibung" msgstr "Kurzbeschreibung"
#: models.py:45 models.py:324 #: finance/models.py:45 finance/models.py:344
msgid "Explanation" msgid "Explanation"
msgstr "Erklärung" msgstr "Erklärung"
#: models.py:47 #: finance/models.py:47
msgid "Associated excursion" msgid "Associated excursion"
msgstr "Zugehörige Freizeit" msgstr "Zugehörige Freizeit"
#: models.py:52 #: finance/models.py:52
msgid "Price per night" msgid "Price per night"
msgstr "Preis pro Nacht" msgstr "Preis pro Nacht"
#: models.py:54 #: finance/models.py:54
msgid "Submitted" msgid "Submitted"
msgstr "Eingericht" msgstr "Eingericht"
#: models.py:55 #: finance/models.py:55
msgid "Submitted on" msgid "Submitted on"
msgstr "Eingereicht am" msgstr "Eingereicht am"
#: models.py:56 #: finance/models.py:56
msgid "Confirmed" msgid "Confirmed"
msgstr "Abgewickelt" msgstr "Abgewickelt"
#: models.py:57 models.py:359 #: finance/models.py:57 finance/models.py:379
msgid "Paid on" msgid "Paid on"
msgstr "Bezahlt am" msgstr "Bezahlt am"
#: models.py:59 #: finance/models.py:59
msgid "Submitted by" msgid "Submitted by"
msgstr "Eingereicht bei" msgstr "Eingereicht bei"
#: models.py:64 models.py:360 #: finance/models.py:64 finance/models.py:380
msgid "Authorized by" msgid "Authorized by"
msgstr "Autorisiert von" msgstr "Autorisiert von"
#: models.py:71 models.py:322 models.py:355 #: finance/models.py:71 finance/models.py:342 finance/models.py:375
msgid "Statement" msgid "Statement"
msgstr "Abrechnung" msgstr "Abrechnung"
#: models.py:72 #: finance/models.py:72
msgid "Statements" msgid "Statements"
msgstr "Abrechnungen" msgstr "Abrechnungen"
#: models.py:77 #: finance/models.py:77
#, python-format #, python-format
msgid "Statement: %(excursion)s" msgid "Statement: %(excursion)s"
msgstr "Abrechnung: %(excursion)s" msgstr "Abrechnung: %(excursion)s"
#: models.py:123 #: finance/models.py:123
msgid "Ready to confirm" msgid "Ready to confirm"
msgstr "Bereit zur Abwicklung" msgstr "Bereit zur Abwicklung"
#: models.py:162 #: finance/models.py:162
#, 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"
#: models.py:274 templates/admin/overview_submitted_statement.html:78 #: finance/models.py:294
#: finance/templates/admin/overview_submitted_statement.html:78
msgid "Total" msgid "Total"
msgstr "Gesamtbetrag" msgstr "Gesamtbetrag"
#: models.py:287 #: finance/models.py:307
msgid "Statement in preparation" msgid "Statement in preparation"
msgstr "Abrechnung in Vorbereitung" msgstr "Abrechnung in Vorbereitung"
#: models.py:288 #: finance/models.py:308
msgid "Statements in preparation" msgid "Statements in preparation"
msgstr "Abrechnungen in Vorbereitung" msgstr "Abrechnungen in Vorbereitung"
#: models.py:301 #: finance/models.py:321
msgid "Submitted statement" msgid "Submitted statement"
msgstr "Eingereichte Abrechnung" msgstr "Eingereichte Abrechnung"
#: models.py:302 #: finance/models.py:322
msgid "Submitted statements" msgid "Submitted statements"
msgstr "Eingereichte Abrechnungen" msgstr "Eingereichte Abrechnungen"
#: models.py:316 #: finance/models.py:336
msgid "Paid statement" msgid "Paid statement"
msgstr "Bezahlte Abrechnung" msgstr "Bezahlte Abrechnung"
#: models.py:317 #: finance/models.py:337
msgid "Paid statements" msgid "Paid statements"
msgstr "Bezahlte Abrechnungen" msgstr "Bezahlte Abrechnungen"
#: models.py:327 #: finance/models.py:347
msgid "Paid by" msgid "Paid by"
msgstr "Bezahlt von" msgstr "Bezahlt von"
#: models.py:329 #: finance/models.py:349
msgid "Covered" msgid "Covered"
msgstr "Übernommen" msgstr "Übernommen"
#: models.py:330 #: finance/models.py:350
msgid "Refunded" msgid "Refunded"
msgstr "Ausgezahlt" msgstr "Ausgezahlt"
#: models.py:332 #: finance/models.py:352
msgid "Proof" msgid "Proof"
msgstr "Beleg" msgstr "Beleg"
#: models.py:340 models.py:349 templates/admin/confirmed_statement.html:36 #: finance/models.py:360 finance/models.py:369
#: templates/admin/overview_submitted_statement.html:31 #: finance/templates/admin/confirmed_statement.html:36
#: templates/admin/overview_submitted_statement.html:98 #: finance/templates/admin/overview_submitted_statement.html:31
#: finance/templates/admin/overview_submitted_statement.html:98
msgid "Amount" msgid "Amount"
msgstr "Betrag" msgstr "Betrag"
#: models.py:343 #: finance/models.py:363
msgid "Bill" msgid "Bill"
msgstr "Quittung" msgstr "Quittung"
#: models.py:344 templates/admin/overview_submitted_statement.html:26 #: finance/models.py:364
#: finance/templates/admin/overview_submitted_statement.html:26
msgid "Bills" msgid "Bills"
msgstr "Quittungen" msgstr "Quittungen"
#: models.py:348 templates/admin/confirmed_statement.html:37 #: finance/models.py:368 finance/templates/admin/confirmed_statement.html:37
#: templates/admin/overview_submitted_statement.html:99 #: finance/templates/admin/overview_submitted_statement.html:99
msgid "Reference" msgid "Reference"
msgstr "Verwendungszweck" msgstr "Verwendungszweck"
#: models.py:350 #: finance/models.py:370
msgid "Recipient" msgid "Recipient"
msgstr "Empfänger" msgstr "Empfänger"
#: models.py:358 #: finance/models.py:378
msgid "Paid" msgid "Paid"
msgstr "Bezahlt" msgstr "Bezahlt"
#: models.py:370 #: finance/models.py:390
msgid "Transaction" msgid "Transaction"
msgstr "Überweisung" msgstr "Überweisung"
#: models.py:371 templates/admin/overview_submitted_statement.html:84 #: finance/models.py:391
#: finance/templates/admin/overview_submitted_statement.html:84
msgid "Transactions" msgid "Transactions"
msgstr "Überweisungen" msgstr "Überweisungen"
#: templates/admin/confirmed_statement.html:17 #: finance/templates/admin/confirmed_statement.html:17
#: templates/admin/overview_submitted_statement.html:17 #: finance/templates/admin/overview_submitted_statement.html:17
#: templates/admin/submit_statement.html:17 #: finance/templates/admin/submit_statement.html:17
msgid "Home" msgid "Home"
msgstr "Start" msgstr "Start"
#: templates/admin/confirmed_statement.html:21 #: finance/templates/admin/confirmed_statement.html:21
msgid "Paiment" msgid "Paiment"
msgstr "Bezahlung" msgstr "Bezahlung"
#: templates/admin/confirmed_statement.html:26 #: finance/templates/admin/confirmed_statement.html:26
msgid "Paying statement" msgid "Paying statement"
msgstr "Rechnung bezahlen" msgstr "Rechnung bezahlen"
#: templates/admin/confirmed_statement.html:29 #: finance/templates/admin/confirmed_statement.html:29
msgid "" msgid ""
"The statement is valid. Please execute the following transactions and then " "The statement is valid. Please execute the following transactions and then "
"proceed by finalizing the confirmation." "proceed by finalizing the confirmation."
@ -285,43 +289,43 @@ msgstr ""
"Die Abrechnung ist gültig. Bitte führe die folgenden Überweisungen aus und " "Die Abrechnung ist gültig. Bitte führe die folgenden Überweisungen aus und "
"fahre dann fort, indem du die Abwicklung bestätigst." "fahre dann fort, indem du die Abwicklung bestätigst."
#: templates/admin/confirmed_statement.html:35 #: finance/templates/admin/confirmed_statement.html:35
msgid "IBAN" msgid "IBAN"
msgstr "IBAN" msgstr "IBAN"
#: templates/admin/confirmed_statement.html:66 #: finance/templates/admin/confirmed_statement.html:66
msgid "I did execute the listed transactions." msgid "I did execute the listed transactions."
msgstr "Ich habe die aufgeführten Überweisungen ausgeführt." msgstr "Ich habe die aufgeführten Überweisungen ausgeführt."
#: templates/admin/confirmed_statement.html:68 #: finance/templates/admin/confirmed_statement.html:68
msgid "Confirm" msgid "Confirm"
msgstr "Bestätigen" msgstr "Bestätigen"
#: templates/admin/overview_submitted_statement.html:21 #: finance/templates/admin/overview_submitted_statement.html:21
msgid "Overview" msgid "Overview"
msgstr "Übersicht" msgstr "Übersicht"
#: templates/admin/overview_submitted_statement.html:32 #: finance/templates/admin/overview_submitted_statement.html:32
msgid "Covered by association" msgid "Covered by association"
msgstr "Vom Verein übernommen" msgstr "Vom Verein übernommen"
#: templates/admin/overview_submitted_statement.html:50 #: finance/templates/admin/overview_submitted_statement.html:50
#, python-format #, python-format
msgid "The total amount is %(total_bills)s €." msgid "The total amount is %(total_bills)s €."
msgstr "Der Gesamtbetrag beträgt %(total_bills)s €." msgstr "Der Gesamtbetrag beträgt %(total_bills)s €."
#: templates/admin/overview_submitted_statement.html:54 #: finance/templates/admin/overview_submitted_statement.html:54
msgid "Excursion" msgid "Excursion"
msgstr "Freizeit" msgstr "Freizeit"
#: templates/admin/overview_submitted_statement.html:57 #: finance/templates/admin/overview_submitted_statement.html:57
#, python-format #, python-format
msgid "This excursion featured %(staff_count)s youth leader(s), each costing" msgid "This excursion featured %(staff_count)s youth leader(s), each costing"
msgstr "" msgstr ""
"Diese Freizeit hatte %(staff_count)s Jugendleiter:innen. Auf jede:n " "Diese Freizeit hatte %(staff_count)s Jugendleiter:innen. Auf jede:n "
"entfallen die folgenden Kosten:" "entfallen die folgenden Kosten:"
#: templates/admin/overview_submitted_statement.html:62 #: finance/templates/admin/overview_submitted_statement.html:62
#, python-format #, python-format
msgid "" msgid ""
"%(nights)s nights for %(price_per_night)s€ per night making a total of " "%(nights)s nights for %(price_per_night)s€ per night making a total of "
@ -330,7 +334,7 @@ msgstr ""
"%(nights)s Nächte zum Preis von %(price_per_night)s€ pro Nacht. Das ergibt " "%(nights)s Nächte zum Preis von %(price_per_night)s€ pro Nacht. Das ergibt "
"eine Gesamtsumme von %(nights_per_yl)s€." "eine Gesamtsumme von %(nights_per_yl)s€."
#: templates/admin/overview_submitted_statement.html:65 #: finance/templates/admin/overview_submitted_statement.html:65
#, python-format #, python-format
msgid "" msgid ""
"%(duration)s days for %(allowance_per_day)s€ per day making a total of " "%(duration)s days for %(allowance_per_day)s€ per day making a total of "
@ -339,7 +343,7 @@ msgstr ""
"%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine " "%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine "
"Gesamtsumme von %(allowance_per_yl)s€." "Gesamtsumme von %(allowance_per_yl)s€."
#: templates/admin/overview_submitted_statement.html:68 #: finance/templates/admin/overview_submitted_statement.html:68
#, python-format #, python-format
msgid "" msgid ""
"%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / " "%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / "
@ -348,7 +352,7 @@ msgstr ""
"%(kilometers_traveled)s km mit %(means_of_transport)s (%(euro_per_km)s€ / " "%(kilometers_traveled)s km mit %(means_of_transport)s (%(euro_per_km)s€ / "
"km). Das ergibt eine Gesamtsumme von %(transportation_per_yl)s€." "km). Das ergibt eine Gesamtsumme von %(transportation_per_yl)s€."
#: templates/admin/overview_submitted_statement.html:73 #: finance/templates/admin/overview_submitted_statement.html:73
#, python-format #, python-format
msgid "" msgid ""
"In total this is %(total_per_yl)s€ times %(staff_count)s, giving " "In total this is %(total_per_yl)s€ times %(staff_count)s, giving "
@ -357,12 +361,12 @@ msgstr ""
"Insgesamt sind das Kosten von %(total_per_yl)s€ mal %(staff_count)s, " "Insgesamt sind das Kosten von %(total_per_yl)s€ mal %(staff_count)s, "
"insgesamt also %(total_staff)s€." "insgesamt also %(total_staff)s€."
#: templates/admin/overview_submitted_statement.html:81 #: finance/templates/admin/overview_submitted_statement.html:81
#, python-format #, python-format
msgid "This results in a total amount of %(total)s€" msgid "This results in a total amount of %(total)s€"
msgstr "Das resultiert in einem Gesamtbetrag von %(total)s€" msgstr "Das resultiert in einem Gesamtbetrag von %(total)s€"
#: templates/admin/overview_submitted_statement.html:87 #: finance/templates/admin/overview_submitted_statement.html:87
msgid "" msgid ""
"Currently, no transactions are planned. You can auto generate them from the " "Currently, no transactions are planned. You can auto generate them from the "
"data, by clicking the following button." "data, by clicking the following button."
@ -370,19 +374,19 @@ msgstr ""
"Aktuell sind keine Überweisungen vorgesehen. Du kannst die erforderlichen " "Aktuell sind keine Überweisungen vorgesehen. Du kannst die erforderlichen "
"durch Klicken auf den folgenden Knopf generieren." "durch Klicken auf den folgenden Knopf generieren."
#: templates/admin/overview_submitted_statement.html:90 #: finance/templates/admin/overview_submitted_statement.html:90
msgid "Generate transactions" msgid "Generate transactions"
msgstr "Erzeuge Überweisungsträger" msgstr "Erzeuge Überweisungsträger"
#: templates/admin/overview_submitted_statement.html:94 #: finance/templates/admin/overview_submitted_statement.html:94
msgid "Currently the following transactions are planned." msgid "Currently the following transactions are planned."
msgstr "Aktuell sind die folgenden Überweisungen vorgesehen." msgstr "Aktuell sind die folgenden Überweisungen vorgesehen."
#: templates/admin/overview_submitted_statement.html:137 #: finance/templates/admin/overview_submitted_statement.html:137
msgid "These transactions match the calculated costs." msgid "These transactions match the calculated costs."
msgstr "Diese Überweisungen stimmen mit den berechneten Kosten überein." msgstr "Diese Überweisungen stimmen mit den berechneten Kosten überein."
#: templates/admin/overview_submitted_statement.html:140 #: finance/templates/admin/overview_submitted_statement.html:140
msgid "" msgid ""
"The current transactions do not reflect all costs in this statement. Please " "The current transactions do not reflect all costs in this statement. Please "
"fix the following issues:" "fix the following issues:"
@ -390,41 +394,41 @@ msgstr ""
"Die aktuell vorgesehenen Überweisungen stimmen nicht mit den berechneten " "Die aktuell vorgesehenen Überweisungen stimmen nicht mit den berechneten "
"Kosten überein. Bitte korrigiere die folgenden Fehler:" "Kosten überein. Bitte korrigiere die folgenden Fehler:"
#: templates/admin/overview_submitted_statement.html:145 #: finance/templates/admin/overview_submitted_statement.html:145
msgid "Currently receiving" msgid "Currently receiving"
msgstr "Erhält aktuell" msgstr "Erhält aktuell"
#: templates/admin/overview_submitted_statement.html:146 #: finance/templates/admin/overview_submitted_statement.html:146
msgid "Actual costs" msgid "Actual costs"
msgstr "Tatsächliche Kosten" msgstr "Tatsächliche Kosten"
#: templates/admin/overview_submitted_statement.html:147 #: finance/templates/admin/overview_submitted_statement.html:147
msgid "Difference" msgid "Difference"
msgstr "Differenz" msgstr "Differenz"
#: templates/admin/overview_submitted_statement.html:174 #: finance/templates/admin/overview_submitted_statement.html:174
msgid "Accept" msgid "Accept"
msgstr "Annehmen" msgstr "Annehmen"
#: templates/admin/overview_submitted_statement.html:175 #: finance/templates/admin/overview_submitted_statement.html:175
msgid "Reject" msgid "Reject"
msgstr "Ablehnen" msgstr "Ablehnen"
#: templates/admin/overview_submitted_statement.html:178 #: finance/templates/admin/overview_submitted_statement.html:178
#: templates/admin/submit_statement.html:35 #: finance/templates/admin/submit_statement.html:35
msgid "Cancel" msgid "Cancel"
msgstr "Abbruch" msgstr "Abbruch"
#: templates/admin/submit_statement.html:21 #: finance/templates/admin/submit_statement.html:21
#: templates/admin/submit_statement.html:34 #: finance/templates/admin/submit_statement.html:34
msgid "Submit" msgid "Submit"
msgstr "Einreichen" msgstr "Einreichen"
#: templates/admin/submit_statement.html:26 #: finance/templates/admin/submit_statement.html:26
msgid "Submit to the finance department" msgid "Submit to the finance department"
msgstr "Beim Finanzreferat einreichen" msgstr "Beim Finanzreferat einreichen"
#: templates/admin/submit_statement.html:28 #: finance/templates/admin/submit_statement.html:28
msgid "" msgid ""
"Do you want to submit the statement for further processing by the finance " "Do you want to submit the statement for further processing by the finance "
"department? If you proceed, no further changes to the statement are possible." "department? If you proceed, no further changes to the statement are possible."

@ -183,7 +183,7 @@ EMAIL_BACKEND = 'djcelery_email.backends.CeleryEmailBackend'
# Celery Email Setup # Celery Email Setup
CELERY_EMAIL_TASK_CONFIG = { CELERY_EMAIL_TASK_CONFIG = {
'rate_limit' : '1/m' # * CELERY_EMAIL_CHUNK_SIZE (default: 10) 'rate_limit' : '10/m' # * CELERY_EMAIL_CHUNK_SIZE (default: 10)
} }
@ -262,3 +262,141 @@ PASSWORD_HASHERS = [
'django.contrib.auth.hashers.Argon2PasswordHasher', 'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.ScryptPasswordHasher', 'django.contrib.auth.hashers.ScryptPasswordHasher',
] ]
# mail texts
CONFIRM_MAIL_TEXT = """Hallo {name},
du hast bei der JDAV Ludwigsburg eine E-Mail Adresse hinterlegt. Da bei uns alle Kommunikation
per Email funktioniert, brauchen wir eine Bestätigung {whattoconfirm}. Dazu klicke bitte einfach auf
folgenden Link:
{link}
Viele Grüße
Deine JDAV Ludwigsburg"""
NEW_UNCONFIRMED_REGISTRATION = """Hallo {name},
für deine Gruppe {group} liegt eine neue unbestätigte Reservierung vor. Die Person hat bereits ihre
E-Mailadressen bestätigt. Bitte prüfe die Registrierung eingehend und bestätige falls möglich. Zu
der Registrierung kommst du hier:
{link}
Viele Grüße
Dein KOMPASS"""
INVITE_TEXT = """Hallo {name},
wir haben gute Neuigkeiten für dich. Es ist ein Platz in der Jugendgruppe freigeworden. Wir brauchen
jetzt noch ein paar Informationen von dir und deine Anmeldebestätigung. Das kannst du alles über folgenden
Link erledigen:
{link}
Du siehst dort auch die Daten, die du bei deiner Eintragung auf die Warteliste angegeben hast. Bitte
überprüfe, ob die Daten noch stimmen und ändere sie bei Bedarf ab.
Bei Fragen, wende dich gerne an jugendreferent@jdav-ludwigsburg.de.
Viele Grüße
Deine JDAV Ludwigsburg"""
WAIT_CONFIRMATION_TEXT = """Hallo {name},
leider können wir dir zur Zeit noch keinen Platz in einer Jugendgruppe anbieten. Da wir
sehr viele Interessenten haben und wir möglichst vielen die Möglichkeit bieten möchten, an
einer Jugendgruppe teilhaben zu können, fragen wir regelmäßig alle Personen auf der
Warteliste ab, ob sie noch Interesse haben.
Wenn du weiterhin auf der Warteliste bleiben möchtest, klicke auf den folgenden Link:
{link}
Falls du nicht mehr auf der Warteliste bleiben möchtest, musst du nichts machen. Du wirst automatisch entfernt.
Viele Grüße
Deine JDAV Ludwigsburg"""
UNSUBSCRIBE_CONFIRMATION_TEXT = """Klicke auf den Link, um dich vom Newsletter der JDAV Ludwigsburg abzumelden
{link}"""
NOTIFY_MOST_ACTIVE_TEXT = """Hallo {name}!
Herzlichen Glückwunsch, du hast im letzten Jahr zu den {congratulate_max} aktivsten
Mitgliedern der JDAV Ludwigsburg gehört! Um genau zu sein beträgt dein Aktivitäts Wert
des letzten Jahres {score} Punkte. Das entspricht {level} Kletterer:innen. Damit warst du
im letzten Jahr das {position}aktivste Mitglied der JDAV Ludwigsburg.
Auf ein weiteres aktives Jahr in der JDAV Ludwigsburg
Dein:e Jugendreferent:in"""
ECHO_TEXT = """Hallo {name},
um unsere Daten auf dem aktuellen Stand zu halten, brauchen wir eine
kurze Bestätigung von dir. Dafür besuche einfach diesen Link:
{link}
Dort kannst du deine Daten überprüfen und ändern. Falls du nicht innerhalb von
30 Tagen deine Daten bestätigst, wirst du aus unserer Datenbank gelöscht und
erhälst in Zukunft keine Mails mehr von uns.
Bei Fragen, wende dich gerne an jugendreferent@jdav-ludwigsburg.de.
Viele Grüße
Deine JDAV Ludwigsburg"""
PREPEND_INCOMPLETE_REGISTRATION_TEXT = """WICHTIGE MITTEILUNG
Deine Anmeldung ist aktuell nicht vollständig. Bitte fülle umgehend das
Anmeldeformular aus und lasse es Deine*r Jugendleiter*in zukommen! Dieses
kannst Du unter folgendem Link herunterladen:
https://cloud.jdav-ludwigsburg.de/index.php/s/NQfRqA9MTKfPBkC
****************
"""
MAIL_FOOTER = """
****************
Diese Email wurde über die Webseite der JDAV Ludwigsburg
verschickt. Wenn Du in Zukunft keine Emails mehr erhalten möchtest,
kannst Du hier den Newsletter deabonnieren:
{link}"""
# fixed email addresses
RESPONSIBLE_MAIL = "jugendreferent@jdav-ludwigsburg.de"
# contact data
SEKTION = "Ludwigsburg"
SEKTION_STREET = "Fuchshofstr. 66"
SEKTION_TOWN = "71638 Ludwigsburg"
SEKTION_TELEPHONE = "07141 927893"
SEKTION_TELEFAX = "07141 924042"
SEKTION_CONTACT_MAIL = "info@alpenverein-ludwigsburg.de"
# mailutils
HOST = os.environ.get('DJANGO_ALLOWED_HOST', 'localhost:8000').split(",")[0]
PROTOCOL = os.environ.get('DJANGO_PROTOCOL', 'https')
BASE_URL = os.environ.get('DJANGO_BASE_URL', HOST)
DEFAULT_SENDING_MAIL = os.environ.get('EMAIL_SENDING_ADDRESS', 'christian@localhost')
# misc
CONGRATULATE_MEMBERS_MAX = 10

@ -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: 2023-03-17 23:10+0100\n" "POT-Creation-Date: 2023-03-20 18:48+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"
@ -24,7 +24,7 @@ msgstr "Startseite"
#: templates/admin/finance/statementconfirmed/change_form_object_tools.html:8 #: templates/admin/finance/statementconfirmed/change_form_object_tools.html:8
msgid "Unconfirm" msgid "Unconfirm"
msgstr "" msgstr "Bestätigung zurücknehmen"
#: templates/admin/finance/statementsubmitted/change_form_object_tools.html:21 #: templates/admin/finance/statementsubmitted/change_form_object_tools.html:21
msgid "Reduce transactions" msgid "Reduce transactions"
@ -38,7 +38,19 @@ msgstr "Übersicht"
msgid "Submit" msgid "Submit"
msgstr "Einreichen" msgstr "Einreichen"
#: templates/admin/members/freizeit/change_form_object_tools.html:8 #: templates/admin/members/freizeit/change_form_object_tools.html:9
msgid "Generate crisis intervention list"
msgstr "Kriseninterventionsliste erstellen"
#: templates/admin/members/freizeit/change_form_object_tools.html:16
msgid "Generate overview"
msgstr "Übersicht erstellen"
#: templates/admin/members/freizeit/change_form_object_tools.html:23
msgid "Generate seminar report"
msgstr "Seminarbericht erstellen"
#: templates/admin/members/freizeit/change_form_object_tools.html:29
msgid "Submit statement" msgid "Submit statement"
msgstr "Abrechnung einreichen" msgstr "Abrechnung einreichen"
@ -54,24 +66,3 @@ msgstr "Dateityp nicht unterstützt."
#: utils.py:28 #: utils.py:28
msgid "Please keep filesize under {}. Current filesize: {}" msgid "Please keep filesize under {}. Current filesize: {}"
msgstr "Maximale Dateigröße {}. Aktuelle Dateigröße: {}." msgstr "Maximale Dateigröße {}. Aktuelle Dateigröße: {}."
#~ msgid "Welcome,"
#~ msgstr "Willkommen"
#~ msgid "Documentation"
#~ msgstr "Dokumentation"
#~ msgid "Change password"
#~ msgstr "Passwort ändern"
#~ msgid "Log out"
#~ msgstr "Abmelden"
#~ msgid "Home"
#~ msgstr "Start"
#~ msgid "View site"
#~ msgstr "Seite anzeigen"
#~ msgid "JDAV LB Administration"
#~ msgstr "JDAV LB Verwaltung"

@ -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: 2022-01-12 17:38+0100\n" "POT-Creation-Date: 2023-03-20 18:48+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"
@ -38,6 +38,11 @@ msgstr "Email wurde erfolgreich verschickt"
msgid "mailer" msgid "mailer"
msgstr "Verteiler" msgstr "Verteiler"
#: mailer/management/commands/notify_active.py:38
#, python-format
msgid "Congratulation %(name)s"
msgstr "Herzlichen Glückwunsch %(name)s"
#: mailer/models.py:18 #: mailer/models.py:18
msgid "Only alphanumeric characters are allowed" msgid "Only alphanumeric characters are allowed"
msgstr "Nur Buchstaben und Zahlen erlaubt" msgstr "Nur Buchstaben und Zahlen erlaubt"
@ -112,26 +117,26 @@ msgstr "Andere Teilnehmer"
msgid "recipients" msgid "recipients"
msgstr "Empfänger" msgstr "Empfänger"
#: mailer/models.py:168 #: mailer/models.py:182
msgid "message" msgid "message"
msgstr "Nachricht" msgstr "Nachricht"
#: mailer/models.py:169 #: mailer/models.py:183
msgid "messages" msgid "messages"
msgstr "Nachrichten" msgstr "Nachrichten"
#: mailer/models.py:171 #: mailer/models.py:185
msgid "Can submit mails" msgid "Can submit mails"
msgstr "Kann Mails verschicken" msgstr "Kann Mails verschicken"
#: mailer/models.py:187 #: mailer/models.py:201
msgid "" msgid ""
"Either a group, a memberlist or at least one member is required as recipient" "Either a group, a memberlist or at least one member is required as recipient"
msgstr "" msgstr ""
"Es muss entweder eine Gruppe, eine Teilnehmerliste oder mindestens ein " "Es muss entweder eine Gruppe, eine Teilnehmerliste oder mindestens ein "
"Teilnehmer als Empfänger ausgewählt werden." "Teilnehmer als Empfänger ausgewählt werden."
#: mailer/models.py:192 #: mailer/models.py:206
msgid "" msgid ""
"At least one reply-to recipient is required. Use the info mail if you really " "At least one reply-to recipient is required. Use the info mail if you really "
"want no reply-to recipient." "want no reply-to recipient."
@ -139,19 +144,19 @@ msgstr ""
"Es muss mindestens ein Antwort-An Empfänger angegeben werden. Nutze die info " "Es muss mindestens ein Antwort-An Empfänger angegeben werden. Nutze die info "
"Email-Adresse falls du wirklich keinen Antwort-An Empfänger haben möchtest." "Email-Adresse falls du wirklich keinen Antwort-An Empfänger haben möchtest."
#: mailer/models.py:199 #: mailer/models.py:213
msgid "file" msgid "file"
msgstr "Datei" msgstr "Datei"
#: mailer/models.py:205 #: mailer/models.py:219
msgid "Empty" msgid "Empty"
msgstr "Leer" msgstr "Leer"
#: mailer/models.py:208 #: mailer/models.py:222
msgid "attachment" msgid "attachment"
msgstr "Anhang" msgstr "Anhang"
#: mailer/models.py:209 #: mailer/models.py:223
msgid "attachments" msgid "attachments"
msgstr "Anhänge" msgstr "Anhänge"
@ -232,7 +237,7 @@ msgstr "Vorname"
msgid "Lastname" msgid "Lastname"
msgstr "Nachname" msgstr "Nachname"
#: mailer/templates/mailer/subscribe.html:26 mailer/views.py:61 #: mailer/templates/mailer/subscribe.html:26 mailer/views.py:59
msgid "Birthdate" msgid "Birthdate"
msgstr "Geburtsdatum" msgstr "Geburtsdatum"
@ -265,31 +270,14 @@ msgstr "Ungültiger Link. Bitte nochmal versuchen!"
msgid "Please fill in every field" msgid "Please fill in every field"
msgstr "Bitte jedes Feld ausfüllen!" msgstr "Bitte jedes Feld ausfüllen!"
#: mailer/views.py:84 #: mailer/views.py:49
msgid "Unsubscription confirmation"
msgstr "Abmeldebestätigung"
#: mailer/views.py:82
msgid "Please fill in every field!" msgid "Please fill in every field!"
msgstr "Bitte jedes Feld ausfüllen!" msgstr "Bitte jedes Feld ausfüllen!"
#: mailer/views.py:91 #: mailer/views.py:89
msgid "Member already exists" msgid "Member already exists"
msgstr "Mitglied schon vorhanden" msgstr "Mitglied schon vorhanden"
#~ msgid "reply to"
#~ msgstr "Antwort an"
#~ msgid "Message sent"
#~ msgstr "Nachricht gesendet"
#~ msgid "from email"
#~ msgstr "Von Email"
#~ msgid "Confirmation of unsubscription"
#~ msgstr "Abmeldebestätigung"
#~ msgid ""
#~ "Click the link to unsubscribe to the newsletter of the JDAV\n"
#~ "{}"
#~ msgstr ""
#~ "Klicke auf den Link um dich von Newsletter des JDAV Ludwigsburg abzumelden"
#~ msgid "History"
#~ msgstr "Geschichte"

@ -1,13 +1,10 @@
from django.core import mail from django.core import mail
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
from django.conf import settings
import os import os
NOT_SENT, SENT, PARTLY_SENT = 0, 1, 2 NOT_SENT, SENT, PARTLY_SENT = 0, 1, 2
HOST = os.environ.get('DJANGO_ALLOWED_HOST', 'localhost:8000').split(",")[0]
PROTOCOL = os.environ.get('DJANGO_PROTOCOL', 'https')
BASE_URL = os.environ.get('DJANGO_BASE_URL', HOST)
def send(subject, content, sender, recipients, message_id=None, reply_to=None, def send(subject, content, sender, recipients, message_id=None, reply_to=None,
attachments=None): attachments=None):
@ -49,16 +46,11 @@ def send(subject, content, sender, recipients, message_id=None, reply_to=None,
def get_content(content, registration_complete=True): def get_content(content, registration_complete=True):
url = prepend_base_url("/newsletter/unsubscribe") url = prepend_base_url("/newsletter/unsubscribe")
prepend = "WICHTIGE MITTEILUNG\n\n"\ prepend = settings.PREPEND_INCOMPLETE_REGISTRATION_TEXT
"Deine Anmeldung ist aktuell nicht vollständig. Bitte fülle umgehend das"\ footer = settings.MAIL_FOOTER.format(link=url)
" Anmeldeformular aus und lasse es Deine*r Jugendleiter*in zukommen! Dieses"\ text = "{prepend}{content}{footer}".format(prepend="" if registration_complete else prepend,
" kannst Du unter folgendem Link herunterladen:\n"\ content=content,
"https://cloud.jdav-ludwigsburg.de/index.php/s/NQfRqA9MTKfPBkC"\ footer=footer)
"\n\n****************\n\n".format(HOST)
text = "{}{}\n\n\n****************\n\nDiese Email wurde über die Webseite der JDAV Ludwigsburg"\
" verschickt. Wenn Du in Zukunft keine Emails mehr erhalten möchtest,"\
" kannst Du hier den Newsletter deabonnieren:\n{}"\
.format("" if registration_complete else prepend, content, url)
return text return text
@ -87,7 +79,4 @@ def get_mail_confirmation_link(key):
def prepend_base_url(absolutelink): def prepend_base_url(absolutelink):
return "{protocol}://{base}{link}".format(protocol=PROTOCOL, base=BASE_URL, link=absolutelink) return "{protocol}://{base}{link}".format(protocol=settings.PROTOCOL, base=settings.BASE_URL, link=absolutelink)
mail_root = os.environ.get('EMAIL_SENDING_ADDRESS', 'christian@localhost')

@ -2,20 +2,19 @@ from django.core.management.base import BaseCommand
from mailer.models import Message from mailer.models import Message
from members.models import Member, annotate_activity_score from members.models import Member, annotate_activity_score
from django.db.models import Q from django.db.models import Q
from mailer.mailutils import mail_root, send from django.utils.translation import gettext_lazy as _
from mailer.mailutils import send
from django.conf import settings
import re import re
CONGRATULATE_MEMBERS_MAX = 10
SENDING_ADDRESS = mail_root
class Command(BaseCommand): class Command(BaseCommand):
help = 'Congratulates the most active members' help = 'Congratulates the most active members'
requires_system_checks = False requires_system_checks = False
def handle(self, *args, **options): def handle(self, *args, **options):
qs = list(reversed(annotate_activity_score(Member.objects.all()).order_by('_activity_score')))[:CONGRATULATE_MEMBERS_MAX] qs = list(reversed(annotate_activity_score(Member.objects.all()).order_by('_activity_score')))[:settings.CONGRATULATE_MEMBERS_MAX]
for position, member in enumerate(qs): for position, member in enumerate(qs):
positiontext = "{}. ".format(position + 1) if position > 0 else "" positiontext = "{}. ".format(position + 1) if position > 0 else ""
score = member._activity_score score = member._activity_score
@ -29,20 +28,11 @@ class Command(BaseCommand):
level = 4 level = 4
else: else:
level = 5 level = 5
print("sent to ", member.prename) content = settings.NOTIFY_MOST_ACTIVE_TEXT.format(name=member.prename,
content = "Hallo {}!\n\n"\ congratulate_max=CONGRATULATE_MEMBERS_MAX,
"Herzlichen Glückwunsch, du hast im letzten Jahr zu den {} aktivsten "\ score=score,
"Mitgliedern der JDAV Ludwigsburg gehört! Um genau zu sein beträgt "\ level=level,
"dein Aktivitäts Wert "\ position=positiontext)
"des letzten Jahres {} Punkte. Das entspricht {} Kletterer*innen. "\ send(_("Congratulation %(name)s") % { 'name': member.prename },
"Damit warst du im letzten Jahr "\ content, settings.DEFAULT_SENDING_ADDRESS, [member.email],
"das {}aktivste Mitglied der JDAV Ludwigsburg.\n\n"\ reply_to=[settings.RESPONSIBLE_MAIL])
"Auf ein weiteres aktives Jahr in der JDAV Ludwigsburg\n"\
"Dein*e Jugendreferent*in".format(member.prename,
CONGRATULATE_MEMBERS_MAX,
score,
level,
positiontext)
send("Herzlichen Glückwunsch {}".format(member.prename),
content, SENDING_ADDRESS, [member.email],
reply_to=["jugendreferent@jdav-ludwigsburg.de"])

@ -3,17 +3,14 @@ from django.core.exceptions import ValidationError
from django import forms from django import forms
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils.translation import gettext from django.utils.translation import gettext
from .mailutils import send, get_content, NOT_SENT, SENT, PARTLY_SENT, mail_root from .mailutils import send, get_content, NOT_SENT, SENT, PARTLY_SENT
from utils import RestrictedFileField from utils import RestrictedFileField
from jdav_web.celery import app from jdav_web.celery import app
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from django.conf import settings
import os import os
# this is the mail address that is used to send mails
SENDING_ADDRESS = mail_root
HOST = os.environ.get('DJANGO_ALLOWED_HOST', 'localhost:8000').split(",")[0]
alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', _('Only alphanumeric characters are allowed')) alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', _('Only alphanumeric characters are allowed'))
@ -30,7 +27,7 @@ class EmailAddress(models.Model):
@property @property
def email(self): def email(self):
return "{0}@{1}".format(self.name, HOST) return "{0}@{1}".format(self.name, settings.HOST)
@property @property
def forwards(self): def forwards(self):
@ -150,16 +147,16 @@ class Message(models.Model):
reply_to_unfiltered.extend([ml.email for ml in self.reply_to_email_address.all()]) reply_to_unfiltered.extend([ml.email for ml in self.reply_to_email_address.all()])
# remove sending address from reply-to field (probably unnecessary since it's removed by # remove sending address from reply-to field (probably unnecessary since it's removed by
# the mail provider anyways) # the mail provider anyways)
reply_to = [mail for mail in reply_to_unfiltered if mail != SENDING_ADDRESS ] reply_to = [mail for mail in reply_to_unfiltered if mail != settings.DEFAULT_SENDING_MAIL ]
try: try:
success1 = send(self.subject, get_content(self.content, registration_complete=False), success1 = send(self.subject, get_content(self.content, registration_complete=False),
SENDING_ADDRESS, settings.DEFAULT_SENDING_MAIL,
emails_rem, emails_rem,
message_id=message_id, message_id=message_id,
attachments=attach, attachments=attach,
reply_to=reply_to) reply_to=reply_to)
success2 = send(self.subject, get_content(self.content, registration_complete=True), success2 = send(self.subject, get_content(self.content, registration_complete=True),
SENDING_ADDRESS, settings.DEFAULT_SENDING_MAIL,
emails_no_rem, emails_no_rem,
message_id=message_id, message_id=message_id,
attachments=attach, attachments=attach,

@ -3,7 +3,8 @@ from django import forms
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.urls import reverse from django.urls import reverse
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from .mailutils import send as send_mail, mail_root, get_unsubscribe_link from .mailutils import send as send_mail, get_unsubscribe_link
from django.conf import settings
from members.models import Member from members.models import Member
@ -46,11 +47,9 @@ def unsubscribe(request):
except (KeyError, Member.DoesNotExist): except (KeyError, Member.DoesNotExist):
return render_unsubscribe(request, _("Please fill in every field")) return render_unsubscribe(request, _("Please fill in every field"))
else: else:
send_mail("Abmeldebestätigung", send_mail(_("Unsubscription confirmation"),
"Klicke auf den Link, um dich vom Newsletter des JDAV " settings.UNSUBSCRIBE_CONFIRMATION_TEXT.format(link=get_unsubscribe_link(member)),
"Ludwigsburg " settings.DEFAULT_SENDING_MAIL, email)
"abzumelden\n{}".format(get_unsubscribe_link(member)),
mail_root, email)
return render_confirmation_sent(request, email) return render_confirmation_sent(request, email)

@ -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: 2022-01-12 17:38+0100\n" "POT-Creation-Date: 2023-03-20 18:48+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"
@ -34,79 +34,79 @@ msgstr "Zu alt"
msgid "material" msgid "material"
msgstr "Material" msgstr "Material"
#: material/models.py:15 #: material/models.py:16
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: material/models.py:21 material/models.py:38 #: material/models.py:22 material/models.py:39
msgid "Material category" msgid "Material category"
msgstr "Materialtyp" msgstr "Materialtyp"
#: material/models.py:22 #: material/models.py:23
msgid "Material categories" msgid "Material categories"
msgstr "Materialtypen" msgstr "Materialtypen"
#: material/models.py:31 #: material/models.py:32
msgid "name" msgid "name"
msgstr "Name" msgstr "Name"
#: material/models.py:32 #: material/models.py:33
msgid "description" msgid "description"
msgstr "Beschreibung" msgstr "Beschreibung"
#: material/models.py:33 #: material/models.py:34
msgid "quantity" msgid "quantity"
msgstr "Anzahl" msgstr "Anzahl"
#: material/models.py:34 #: material/models.py:35
msgid "purchase date" msgid "purchase date"
msgstr "Kaufdatum" msgstr "Kaufdatum"
#: material/models.py:35 #: material/models.py:36
msgid "lifetime (years)" msgid "lifetime (years)"
msgstr "Lebenszeit (Jahre)" msgstr "Lebenszeit (Jahre)"
#: material/models.py:36 #: material/models.py:37
msgid "photo" msgid "photo"
msgstr "Bild" msgstr "Bild"
#: material/models.py:49 #: material/models.py:50
msgid "Quantity" msgid "Quantity"
msgstr "Anzahl" msgstr "Anzahl"
#: material/models.py:56 #: material/models.py:57
msgid "Thumbnail" msgid "Thumbnail"
msgstr "Bild" msgstr "Bild"
#: material/models.py:65 #: material/models.py:64
msgid "Owners" msgid "Owners"
msgstr "Verantwortliche" msgstr "Verantwortliche"
#: material/models.py:75 #: material/models.py:74
msgid "Not too old?" msgid "Not too old?"
msgstr "Nicht zu alt?" msgstr "Nicht zu alt?"
#: material/models.py:78 #: material/models.py:77
msgid "material part" msgid "material part"
msgstr "Materialteil" msgstr "Materialteil"
#: material/models.py:79 #: material/models.py:78
msgid "material parts" msgid "material parts"
msgstr "Materialteile" msgstr "Materialteile"
#: material/models.py:85 #: material/models.py:84
msgid "owner" msgid "owner"
msgstr "Besitzer" msgstr "Besitzer"
#: material/models.py:86 #: material/models.py:85
msgid "count" msgid "count"
msgstr "Anzahl" msgstr "Anzahl"
#: material/models.py:93 #: material/models.py:92
msgid "ownership" msgid "ownership"
msgstr "Besitzer" msgstr "Besitzer"
#: material/models.py:94 #: material/models.py:93
msgid "ownerships" msgid "ownerships"
msgstr "Verantwortliche" msgstr "Verantwortliche"

@ -33,7 +33,7 @@ from .models import (Member, Group, Freizeit, MemberNoteList, NewMemberOnList, K
KlettertreffAttendee, ActivityCategory, OldMemberOnList, MemberList, KlettertreffAttendee, ActivityCategory, OldMemberOnList, MemberList,
annotate_activity_score, RegistrationPassword, MemberUnconfirmedProxy) annotate_activity_score, RegistrationPassword, MemberUnconfirmedProxy)
from finance.models import Statement, Bill from finance.models import Statement, Bill
from mailer.mailutils import send as send_mail, get_echo_link, mail_root from mailer.mailutils import send as send_mail, get_echo_link
from django.conf import settings from django.conf import settings
#from easy_select2 import apply_select2 #from easy_select2 import apply_select2
@ -127,23 +127,9 @@ class MemberAdmin(admin.ModelAdmin):
for member in queryset: for member in queryset:
if not member.gets_newsletter: if not member.gets_newsletter:
continue continue
send_mail("Wichtig: Rückmeldung erforderlich!", send_mail(_("Echo required"),
"""Hallo {name}, settings.ECHO_TEXT.format(name=member.prename, link=get_echo_link(member)),
settings.DEFAULT_SENDING_MAIL,
um unsere Daten auf dem aktuellen Stand zu halten, brauchen wir eine
kurze Bestätigung von dir. Dafür besuche einfach diesen Link:
{link}
Dort kannst du deine Daten überprüfen und ändern. Falls du nicht innerhalb von
30 Tagen deine Daten bestätigst, wirst du aus unserer Datenbank gelöscht und
erhälst in Zukunft keine Mails mehr von uns.
Bei Fragen, wende dich gerne an jugendreferent@jdav-ludwigsburg.de.
Viele Grüße
Deine JDAV Ludwigsburg""".format(name=member.prename, link=get_echo_link(member)),
mail_root,
[member.email, member.email_parents] if member.email_parents and member.cc_email_parents [member.email, member.email_parents] if member.email_parents and member.cc_email_parents
else member.email) else member.email)
messages.success(request, _("Successfully requested echo from selected members.")) messages.success(request, _("Successfully requested echo from selected members."))

File diff suppressed because it is too large Load Diff

@ -10,7 +10,7 @@ from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelatio
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from utils import RestrictedFileField from utils import RestrictedFileField
import os import os
from mailer.mailutils import send as send_mail, mail_root, get_mail_confirmation_link,\ from mailer.mailutils import send as send_mail, get_mail_confirmation_link,\
prepend_base_url, get_registration_link, get_wait_confirmation_link prepend_base_url, get_registration_link, get_wait_confirmation_link
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.conf import settings from django.conf import settings
@ -113,10 +113,10 @@ class Person(models.Model):
self.confirmed_mail = False self.confirmed_mail = False
self.confirm_mail_key = uuid.uuid4().hex self.confirm_mail_key = uuid.uuid4().hex
send_mail(_('Email confirmation needed'), send_mail(_('Email confirmation needed'),
CONFIRM_MAIL_TEXT.format(name=self.prename, settings.CONFIRM_MAIL_TEXT.format(name=self.prename,
link=get_mail_confirmation_link(self.confirm_mail_key), link=get_mail_confirmation_link(self.confirm_mail_key),
whattoconfirm='deiner Emailadresse'), whattoconfirm='deiner Emailadresse'),
mail_root, settings.DEFAULT_SENDING_MAIL,
self.email) self.email)
if self.email_parents: if self.email_parents:
self.confirmed_mail_parents = False self.confirmed_mail_parents = False
@ -125,7 +125,7 @@ class Person(models.Model):
CONFIRM_MAIL_TEXT.format(name=self.prename, CONFIRM_MAIL_TEXT.format(name=self.prename,
link=get_mail_confirmation_link(self.confirm_mail_parents_key), link=get_mail_confirmation_link(self.confirm_mail_parents_key),
whattoconfirm='der Emailadresse deiner Eltern'), whattoconfirm='der Emailadresse deiner Eltern'),
mail_root, settings.DEFAULT_SENDING_MAIL,
self.email_parents) self.email_parents)
else: else:
self.confirmed_mail_parents = True self.confirmed_mail_parents = True
@ -146,7 +146,7 @@ class Person(models.Model):
def send_mail(self, subject, content): def send_mail(self, subject, content):
send_mail(subject, send_mail(subject,
content, content,
mail_root, settings.DEFAULT_SENDING_MAIL,
[self.email, self.email_parents] if self.email_parents and self.cc_email_parents [self.email, self.email_parents] if self.email_parents and self.cc_email_parents
else self.email) else self.email)
@ -303,10 +303,10 @@ class Member(Person):
link = prepend_base_url(reverse('admin:members_memberunconfirmedproxy_change', link = prepend_base_url(reverse('admin:members_memberunconfirmedproxy_change',
args=[str(self.id)])) args=[str(self.id)]))
send_mail(_('New unconfirmed registration for group %(group)s') % {'group': group}, send_mail(_('New unconfirmed registration for group %(group)s') % {'group': group},
NEW_UNCONFIRMED_REGISTRATION.format(name=jl.prename, settings.NEW_UNCONFIRMED_REGISTRATION.format(name=jl.prename,
group=group, group=group,
link=link), link=link),
mail_root, settings.DEFAULT_SENDING_MAIL,
jl.email) jl.email)
class MemberUnconfirmedManager(models.Manager): class MemberUnconfirmedManager(models.Manager):
@ -375,8 +375,8 @@ class MemberWaitingList(Person):
def ask_for_wait_confirmation(self): def ask_for_wait_confirmation(self):
"""Sends an email to the person asking them to confirm their intention to wait.""" """Sends an email to the person asking them to confirm their intention to wait."""
self.send_mail(_('Waiting confirmation needed'), self.send_mail(_('Waiting confirmation needed'),
WAIT_CONFIRMATION_TEXT.format(name=self.prename, settings.WAIT_CONFIRMATION_TEXT.format(name=self.prename,
link=get_wait_confirmation_link(self))) link=get_wait_confirmation_link(self)))
def confirm_waiting(self, key): def confirm_waiting(self, key):
# if a wrong key is supplied, we return invalid # if a wrong key is supplied, we return invalid
@ -415,10 +415,10 @@ class MemberWaitingList(Person):
return self.registration_key == key and timezone.now() < self.registration_expire return self.registration_key == key and timezone.now() < self.registration_expire
def invite_to_group(self): def invite_to_group(self):
send_mail("Gute Neuigkeiten von der JDAV", send_mail(_("Good news"),
INVITE_TEXT.format(name=self.prename, settings.INVITE_TEXT.format(name=self.prename,
link=get_registration_link(self)), link=get_registration_link(self)),
mail_root, settings.DEFAULT_SENDING_MAIL,
[self.email, self.email_parents] if self.email_parents and self.cc_email_parents [self.email, self.email_parents] if self.email_parents and self.cc_email_parents
else self.email) else self.email)
@ -866,59 +866,3 @@ def annotate_activity_score(queryset):
+ F('_jugendleiter_klettertreff_score') + 3 * F('_jugendleiter_freizeit_score')) + F('_jugendleiter_klettertreff_score') + 3 * F('_jugendleiter_freizeit_score'))
) )
return queryset return queryset
CONFIRM_MAIL_TEXT = """Hallo {name},
du hast bei der JDAV Ludwigsburg eine E-Mail Adresse hinterlegt. Da bei uns alle Kommunikation
per Email funktioniert, brauchen wir eine Bestätigung {whattoconfirm}. Dazu klicke bitte einfach auf
folgenden Link:
{link}
Viele Grüße
Deine JDAV Ludwigsburg"""
NEW_UNCONFIRMED_REGISTRATION = """Hallo {name},
für deine Gruppe {group} liegt eine neue unbestätigte Reservierung vor. Die Person hat bereits ihre
E-Mailadressen bestätigt. Bitte prüfe die Registrierung eingehend und bestätige falls möglich. Zu
der Registrierung kommst du hier:
{link}
Viele Grüße
Dein KOMPASS"""
INVITE_TEXT = """Hallo {name},
wir haben gute Neuigkeiten für dich. Es ist ein Platz in der Jugendgruppe freigeworden. Wir brauchen
jetzt noch ein paar Informationen von dir und deine Anmeldebestätigung. Das kannst du alles über folgenden
Link erledigen:
{link}
Du siehst dort auch die Daten, die du bei deiner Eintragung auf die Warteliste angegeben hast. Bitte
überprüfe, ob die Daten noch stimmen und ändere sie bei Bedarf ab.
Bei Fragen, wende dich gerne an jugendreferent@jdav-ludwigsburg.de.
Viele Grüße
Deine JDAV Ludwigsburg"""
WAIT_CONFIRMATION_TEXT = """Hallo {name},
leider können wir dir zur Zeit noch keinen Platz in einer Jugendgruppe anbieten. Da wir
sehr viele Interessenten haben und wir möglichst vielen die Möglichkeit bieten möchten, an
einer Jugendgruppe teilhaben zu können, fragen wir regelmäßig alle Personen auf der
Warteliste ab, ob sie noch Interesse haben.
Wenn du weiterhin auf der Warteliste bleiben möchtest, klicke auf den folgenden Link:
{link}
Falls du nicht mehr auf der Warteliste bleiben möchtest, musst du nichts machen. Du wirst automatisch entfernt.
Viele Grüße
Deine JDAV Ludwigsburg"""

@ -47,12 +47,12 @@
\begin{flushright} \begin{flushright}
\small \small
\noindent Deutscher Alpenverein e. V. \\ \noindent Deutscher Alpenverein e. V. \\
Sektion Ludwigsburg\\ Sektion {{ settings.SEKTION }} \\
Fuchshofstr. 66\\ {{ settings.SEKTION_STREET }} \\
71638 Ludwigsburg\\ {{ settings.SEKTION_TOWN }} \\
Tel.: 07141 927893\\ Tel.: {{ settings.SEKTION_TELEPHONE }} \\
Fax: 07141 924042\\ Fax: {{ settings.SEKTION_TELEFAX }} \\
info@alpenverein-ludwigsburg.de\\ {{ settings.SEKTION_CONCACT_MAIL }} \\
\end{flushright} \end{flushright}
\end{textblock*} \end{textblock*}

@ -25,9 +25,10 @@
</table> </table>
<p> <p>
<input type="checkbox" required> <input type="checkbox" required>
{% trans "I am member of the DAV Ludwigsburg." %}<br> {% blocktrans %}I am member of the DAV {{ sektion }}.{% endblocktrans %}<br>
<input type="checkbox" required> <input type="checkbox" required>
{% trans "I agree that my data is stored and processed on the server of the JDAV Ludwigsburg." %}</p> {% blocktrans %}I agree that my data is stored and processed on the server of the JDAV {{ sektion }}.{% endblocktrans %}
</p>
<input type="hidden" name="password" value="{{ pwd.password }}"> <input type="hidden" name="password" value="{{ pwd.password }}">
<input type="hidden" name="waiter_key" value="{{ waiter_key }}"> <input type="hidden" name="waiter_key" value="{{ waiter_key }}">
<input type="hidden" name="save"> <input type="hidden" name="save">

@ -10,7 +10,7 @@
<h1>{% trans "Register" %}</h1> <h1>{% trans "Register" %}</h1>
<p>{% trans "Thanks for your interest in participating. Please enter the registration password, your youth leader gave you." %}</p> <p>{% blocktrans %}Thanks for your interest in participating in the JDAV {{ sektion }}. Please enter the registration password, your youth leader gave you.{% endblocktrans %}</p>
{% if error_message %} {% if error_message %}
<p><b>{{ error_message }}</b></p> <p><b>{{ error_message }}</b></p>

@ -25,7 +25,7 @@
</table> </table>
<p> <p>
<input type="checkbox" required> <input type="checkbox" required>
{% trans "I agree that my data is stored and processed on the server of the JDAV Ludwigsburg." %}</p> {% blocktrans %}I agree that my data is stored and processed on the server of the JDAV {{ sektion }}.{% endblocktrans %}
<input type="hidden" name="password" value="{{ pwd.password }}"> <input type="hidden" name="password" value="{{ pwd.password }}">
<input type="hidden" name="save"> <input type="hidden" name="save">
<p><input type="submit" value="{% trans "submit" %}"/></p> <p><input type="submit" value="{% trans "submit" %}"/></p>

@ -54,12 +54,12 @@
\begin{flushright} \begin{flushright}
\small \small
\noindent Deutscher Alpenverein e. V. \\ \noindent Deutscher Alpenverein e. V. \\
Sektion Ludwigsburg\\ Sektion {{ settings.SEKTION }} \\
Fuchshofstr. 66\\ {{ settings.SEKTION_STREET }} \\
71638 Ludwigsburg\\ {{ settings.SEKTION_TOWN }} \\
Tel.: 07141 927893\\ Tel.: {{ settings.SEKTION_TELEPHONE }} \\
Fax: 07141 924042\\ Fax: {{ settings.SEKTION_TELEFAX }} \\
info@alpenverein-ludwigsburg.de\\ {{ settings.SEKTION_CONCACT_MAIL }} \\
\end{flushright} \end{flushright}
\end{textblock*} \end{textblock*}

@ -5,6 +5,7 @@ from django.forms import ModelForm, TextInput, DateInput
from members.models import Member, RegistrationPassword, MemberUnconfirmedProxy, MemberWaitingList, Group from members.models import Member, RegistrationPassword, MemberUnconfirmedProxy, MemberWaitingList, Group
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.conf import settings
class MemberForm(ModelForm): class MemberForm(ModelForm):
@ -105,7 +106,8 @@ def echo(request):
def render_register_password(request): def render_register_password(request):
return render(request, 'members/register_password.html') return render(request, 'members/register_password.html',
context={'sektion': settings.SEKTION})
def render_register_wrong_password(request): def render_register_wrong_password(request):
@ -131,6 +133,7 @@ def render_register(request, group, form=None, pwd=None, waiter_key=''):
'group': group, 'group': group,
'waiter_key': waiter_key, 'waiter_key': waiter_key,
'pwd': pwd, 'pwd': pwd,
'sektion': settings.SEKTION,
}) })
@ -225,7 +228,7 @@ def render_register_waiting_list(request, form=None):
form = MemberRegistrationWaitingListForm() form = MemberRegistrationWaitingListForm()
return render(request, return render(request,
'members/register_waiting_list.html', 'members/register_waiting_list.html',
{'form': form}) {'form': form, 'sektion': settings.SEKTION })
def render_register_waiting_list_success(request, membername): def render_register_waiting_list_success(request, membername):

@ -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: 2022-01-12 17:38+0100\n" "POT-Creation-Date: 2023-03-20 18:48+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"

Loading…
Cancel
Save