From 33a07f873061611f694e79ac3219d391b7226eb5 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Mon, 20 Mar 2023 19:44:31 +0100 Subject: [PATCH] refactor: move all specific configurations to settings --- .../finance/locale/de/LC_MESSAGES/django.po | 190 ++++---- jdav_web/jdav_web/settings.py | 140 +++++- jdav_web/locale/de/LC_MESSAGES/django.po | 39 +- .../mailer/locale/de/LC_MESSAGES/django.po | 56 +-- jdav_web/mailer/mailutils.py | 25 +- .../management/commands/notify_active.py | 34 +- jdav_web/mailer/models.py | 15 +- jdav_web/mailer/views.py | 11 +- .../material/locale/de/LC_MESSAGES/django.po | 40 +- jdav_web/members/admin.py | 22 +- .../members/locale/de/LC_MESSAGES/django.po | 459 +++++++++--------- jdav_web/members/models.py | 90 +--- .../members/crisis_intervention_list.tex | 12 +- .../members/templates/members/register.html | 5 +- .../templates/members/register_password.html | 2 +- .../members/register_waiting_list.html | 2 +- .../templates/members/seminar_report.tex | 12 +- jdav_web/members/views.py | 7 +- .../startpage/locale/de/LC_MESSAGES/django.po | 2 +- 19 files changed, 586 insertions(+), 577 deletions(-) diff --git a/jdav_web/finance/locale/de/LC_MESSAGES/django.po b/jdav_web/finance/locale/de/LC_MESSAGES/django.po index 705dd7a..187f6fe 100644 --- a/jdav_web/finance/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/finance/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,12 +18,12 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: admin.py:69 +#: finance/admin.py:69 #, python-format msgid "%(name)s is already submitted." msgstr "%(name)s ist bereits eingereicht." -#: admin.py:75 +#: finance/admin.py:75 #, python-format msgid "" "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 " "sobald wie möglich zukommen." -#: admin.py:78 +#: finance/admin.py:78 msgid "Submit statement" msgstr "Rechnung einreichen" -#: admin.py:152 +#: finance/admin.py:152 #, python-format msgid "%(name)s is not yet submitted." msgstr "%(name)s ist noch nicht eingereicht." -#: admin.py:159 +#: finance/admin.py:159 #, python-format msgid "An error occured while trying to confirm %(name)s. Please try again." msgstr "" "Beim Abwickeln von %(name)s ist ein Fehler aufgetreten. Bitte versuche es " "erneut." -#: admin.py:163 +#: finance/admin.py:163 #, python-format msgid "" "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 " "Überweisungen ausgeführt, ich werde dich nicht nochmal erinnern." -#: admin.py:170 +#: finance/admin.py:170 msgid "Statement confirmed" msgstr "Abrechnung abgewickelt" -#: admin.py:176 +#: finance/admin.py:176 msgid "" "Transactions do not match the covered expenses. Please correct the mistakes " "listed below." @@ -69,19 +69,19 @@ msgstr "" "Überweisungen stimmen nicht mit den übernommenen Kosten überein. Bitte " "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." msgstr "" "Manche Überweisungen haben kein Geldtopf eingestellt. Bitte trage das nach." -#: admin.py:190 +#: finance/admin.py:190 #, python-format msgid "Successfully rejected %(name)s. The requestor can reapply, when needed." msgstr "" "Die Rechnung %(name)s wurde abgelehnt. Die Person kann die Rechnung erneut " "einstellen, wenn es benötigt wird." -#: admin.py:197 +#: finance/admin.py:197 #, python-format msgid "" "%(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 " "neue generierst." -#: admin.py:201 +#: finance/admin.py:201 #, python-format msgid "Successfully generated transactions for %(name)s" msgstr "Automatisch Überweisungsträger für %(name)s generiert." -#: admin.py:204 +#: finance/admin.py:204 msgid "View submitted statement" msgstr "Eingereichte Abrechnung einsehen" -#: admin.py:230 +#: finance/admin.py:230 #, python-format msgid "Successfully reduced transactions for %(name)s." msgstr "Überweisungsträger für %(name)s minimiert." -#: apps.py:8 +#: finance/apps.py:8 msgid "Finance" msgstr "Finanzen" -#: models.py:13 +#: finance/models.py:13 msgid "Name" msgstr "Name" -#: models.py:19 models.py:352 models.py:376 -#: templates/admin/confirmed_statement.html:38 -#: templates/admin/overview_submitted_statement.html:100 +#: finance/models.py:19 finance/models.py:372 finance/models.py:396 +#: finance/templates/admin/confirmed_statement.html:38 +#: finance/templates/admin/overview_submitted_statement.html:100 msgid "Ledger" msgstr "Geldtopf" -#: models.py:20 +#: finance/models.py:20 msgid "Ledgers" 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" msgstr "Kurzbeschreibung" -#: models.py:45 models.py:324 +#: finance/models.py:45 finance/models.py:344 msgid "Explanation" msgstr "Erklärung" -#: models.py:47 +#: finance/models.py:47 msgid "Associated excursion" msgstr "Zugehörige Freizeit" -#: models.py:52 +#: finance/models.py:52 msgid "Price per night" msgstr "Preis pro Nacht" -#: models.py:54 +#: finance/models.py:54 msgid "Submitted" msgstr "Eingericht" -#: models.py:55 +#: finance/models.py:55 msgid "Submitted on" msgstr "Eingereicht am" -#: models.py:56 +#: finance/models.py:56 msgid "Confirmed" msgstr "Abgewickelt" -#: models.py:57 models.py:359 +#: finance/models.py:57 finance/models.py:379 msgid "Paid on" msgstr "Bezahlt am" -#: models.py:59 +#: finance/models.py:59 msgid "Submitted by" msgstr "Eingereicht bei" -#: models.py:64 models.py:360 +#: finance/models.py:64 finance/models.py:380 msgid "Authorized by" 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" msgstr "Abrechnung" -#: models.py:72 +#: finance/models.py:72 msgid "Statements" msgstr "Abrechnungen" -#: models.py:77 +#: finance/models.py:77 #, python-format msgid "Statement: %(excursion)s" msgstr "Abrechnung: %(excursion)s" -#: models.py:123 +#: finance/models.py:123 msgid "Ready to confirm" msgstr "Bereit zur Abwicklung" -#: models.py:162 +#: finance/models.py:162 #, python-format msgid "Compensation for %(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" msgstr "Gesamtbetrag" -#: models.py:287 +#: finance/models.py:307 msgid "Statement in preparation" msgstr "Abrechnung in Vorbereitung" -#: models.py:288 +#: finance/models.py:308 msgid "Statements in preparation" msgstr "Abrechnungen in Vorbereitung" -#: models.py:301 +#: finance/models.py:321 msgid "Submitted statement" msgstr "Eingereichte Abrechnung" -#: models.py:302 +#: finance/models.py:322 msgid "Submitted statements" msgstr "Eingereichte Abrechnungen" -#: models.py:316 +#: finance/models.py:336 msgid "Paid statement" msgstr "Bezahlte Abrechnung" -#: models.py:317 +#: finance/models.py:337 msgid "Paid statements" msgstr "Bezahlte Abrechnungen" -#: models.py:327 +#: finance/models.py:347 msgid "Paid by" msgstr "Bezahlt von" -#: models.py:329 +#: finance/models.py:349 msgid "Covered" msgstr "Übernommen" -#: models.py:330 +#: finance/models.py:350 msgid "Refunded" msgstr "Ausgezahlt" -#: models.py:332 +#: finance/models.py:352 msgid "Proof" msgstr "Beleg" -#: models.py:340 models.py:349 templates/admin/confirmed_statement.html:36 -#: templates/admin/overview_submitted_statement.html:31 -#: templates/admin/overview_submitted_statement.html:98 +#: finance/models.py:360 finance/models.py:369 +#: finance/templates/admin/confirmed_statement.html:36 +#: finance/templates/admin/overview_submitted_statement.html:31 +#: finance/templates/admin/overview_submitted_statement.html:98 msgid "Amount" msgstr "Betrag" -#: models.py:343 +#: finance/models.py:363 msgid "Bill" 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" msgstr "Quittungen" -#: models.py:348 templates/admin/confirmed_statement.html:37 -#: templates/admin/overview_submitted_statement.html:99 +#: finance/models.py:368 finance/templates/admin/confirmed_statement.html:37 +#: finance/templates/admin/overview_submitted_statement.html:99 msgid "Reference" msgstr "Verwendungszweck" -#: models.py:350 +#: finance/models.py:370 msgid "Recipient" msgstr "Empfänger" -#: models.py:358 +#: finance/models.py:378 msgid "Paid" msgstr "Bezahlt" -#: models.py:370 +#: finance/models.py:390 msgid "Transaction" 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" msgstr "Überweisungen" -#: templates/admin/confirmed_statement.html:17 -#: templates/admin/overview_submitted_statement.html:17 -#: templates/admin/submit_statement.html:17 +#: finance/templates/admin/confirmed_statement.html:17 +#: finance/templates/admin/overview_submitted_statement.html:17 +#: finance/templates/admin/submit_statement.html:17 msgid "Home" msgstr "Start" -#: templates/admin/confirmed_statement.html:21 +#: finance/templates/admin/confirmed_statement.html:21 msgid "Paiment" msgstr "Bezahlung" -#: templates/admin/confirmed_statement.html:26 +#: finance/templates/admin/confirmed_statement.html:26 msgid "Paying statement" msgstr "Rechnung bezahlen" -#: templates/admin/confirmed_statement.html:29 +#: finance/templates/admin/confirmed_statement.html:29 msgid "" "The statement is valid. Please execute the following transactions and then " "proceed by finalizing the confirmation." @@ -285,43 +289,43 @@ msgstr "" "Die Abrechnung ist gültig. Bitte führe die folgenden Überweisungen aus und " "fahre dann fort, indem du die Abwicklung bestätigst." -#: templates/admin/confirmed_statement.html:35 +#: finance/templates/admin/confirmed_statement.html:35 msgid "IBAN" msgstr "IBAN" -#: templates/admin/confirmed_statement.html:66 +#: finance/templates/admin/confirmed_statement.html:66 msgid "I did execute the listed transactions." msgstr "Ich habe die aufgeführten Überweisungen ausgeführt." -#: templates/admin/confirmed_statement.html:68 +#: finance/templates/admin/confirmed_statement.html:68 msgid "Confirm" msgstr "Bestätigen" -#: templates/admin/overview_submitted_statement.html:21 +#: finance/templates/admin/overview_submitted_statement.html:21 msgid "Overview" msgstr "Übersicht" -#: templates/admin/overview_submitted_statement.html:32 +#: finance/templates/admin/overview_submitted_statement.html:32 msgid "Covered by association" msgstr "Vom Verein übernommen" -#: templates/admin/overview_submitted_statement.html:50 +#: finance/templates/admin/overview_submitted_statement.html:50 #, python-format msgid "The total amount is %(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" msgstr "Freizeit" -#: templates/admin/overview_submitted_statement.html:57 +#: finance/templates/admin/overview_submitted_statement.html:57 #, python-format msgid "This excursion featured %(staff_count)s youth leader(s), each costing" msgstr "" "Diese Freizeit hatte %(staff_count)s Jugendleiter:innen. Auf jede:n " "entfallen die folgenden Kosten:" -#: templates/admin/overview_submitted_statement.html:62 +#: finance/templates/admin/overview_submitted_statement.html:62 #, python-format msgid "" "%(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 " "eine Gesamtsumme von %(nights_per_yl)s€." -#: templates/admin/overview_submitted_statement.html:65 +#: finance/templates/admin/overview_submitted_statement.html:65 #, python-format msgid "" "%(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 " "Gesamtsumme von %(allowance_per_yl)s€." -#: templates/admin/overview_submitted_statement.html:68 +#: finance/templates/admin/overview_submitted_statement.html:68 #, python-format msgid "" "%(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€ / " "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 msgid "" "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 also %(total_staff)s€." -#: templates/admin/overview_submitted_statement.html:81 +#: finance/templates/admin/overview_submitted_statement.html:81 #, python-format msgid "This results in a total amount of %(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 "" "Currently, no transactions are planned. You can auto generate them from the " "data, by clicking the following button." @@ -370,19 +374,19 @@ msgstr "" "Aktuell sind keine Überweisungen vorgesehen. Du kannst die erforderlichen " "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" 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." 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." 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 "" "The current transactions do not reflect all costs in this statement. Please " "fix the following issues:" @@ -390,41 +394,41 @@ msgstr "" "Die aktuell vorgesehenen Überweisungen stimmen nicht mit den berechneten " "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" msgstr "Erhält aktuell" -#: templates/admin/overview_submitted_statement.html:146 +#: finance/templates/admin/overview_submitted_statement.html:146 msgid "Actual costs" msgstr "Tatsächliche Kosten" -#: templates/admin/overview_submitted_statement.html:147 +#: finance/templates/admin/overview_submitted_statement.html:147 msgid "Difference" msgstr "Differenz" -#: templates/admin/overview_submitted_statement.html:174 +#: finance/templates/admin/overview_submitted_statement.html:174 msgid "Accept" msgstr "Annehmen" -#: templates/admin/overview_submitted_statement.html:175 +#: finance/templates/admin/overview_submitted_statement.html:175 msgid "Reject" msgstr "Ablehnen" -#: templates/admin/overview_submitted_statement.html:178 -#: templates/admin/submit_statement.html:35 +#: finance/templates/admin/overview_submitted_statement.html:178 +#: finance/templates/admin/submit_statement.html:35 msgid "Cancel" msgstr "Abbruch" -#: templates/admin/submit_statement.html:21 -#: templates/admin/submit_statement.html:34 +#: finance/templates/admin/submit_statement.html:21 +#: finance/templates/admin/submit_statement.html:34 msgid "Submit" msgstr "Einreichen" -#: templates/admin/submit_statement.html:26 +#: finance/templates/admin/submit_statement.html:26 msgid "Submit to the finance department" msgstr "Beim Finanzreferat einreichen" -#: templates/admin/submit_statement.html:28 +#: finance/templates/admin/submit_statement.html:28 msgid "" "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." diff --git a/jdav_web/jdav_web/settings.py b/jdav_web/jdav_web/settings.py index 5aca563..704e64b 100644 --- a/jdav_web/jdav_web/settings.py +++ b/jdav_web/jdav_web/settings.py @@ -183,7 +183,7 @@ EMAIL_BACKEND = 'djcelery_email.backends.CeleryEmailBackend' # Celery Email Setup 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.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 diff --git a/jdav_web/locale/de/LC_MESSAGES/django.po b/jdav_web/locale/de/LC_MESSAGES/django.po index 88fde65..03cf594 100644 --- a/jdav_web/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -24,7 +24,7 @@ msgstr "Startseite" #: templates/admin/finance/statementconfirmed/change_form_object_tools.html:8 msgid "Unconfirm" -msgstr "" +msgstr "Bestätigung zurücknehmen" #: templates/admin/finance/statementsubmitted/change_form_object_tools.html:21 msgid "Reduce transactions" @@ -38,7 +38,19 @@ msgstr "Übersicht" msgid "Submit" 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" msgstr "Abrechnung einreichen" @@ -54,24 +66,3 @@ msgstr "Dateityp nicht unterstützt." #: utils.py:28 msgid "Please keep filesize under {}. Current filesize: {}" 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" diff --git a/jdav_web/mailer/locale/de/LC_MESSAGES/django.po b/jdav_web/mailer/locale/de/LC_MESSAGES/django.po index 23d6de6..2a7502f 100644 --- a/jdav_web/mailer/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/mailer/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,6 +38,11 @@ msgstr "Email wurde erfolgreich verschickt" msgid "mailer" 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 msgid "Only alphanumeric characters are allowed" msgstr "Nur Buchstaben und Zahlen erlaubt" @@ -112,26 +117,26 @@ msgstr "Andere Teilnehmer" msgid "recipients" msgstr "Empfänger" -#: mailer/models.py:168 +#: mailer/models.py:182 msgid "message" msgstr "Nachricht" -#: mailer/models.py:169 +#: mailer/models.py:183 msgid "messages" msgstr "Nachrichten" -#: mailer/models.py:171 +#: mailer/models.py:185 msgid "Can submit mails" msgstr "Kann Mails verschicken" -#: mailer/models.py:187 +#: mailer/models.py:201 msgid "" "Either a group, a memberlist or at least one member is required as recipient" msgstr "" "Es muss entweder eine Gruppe, eine Teilnehmerliste oder mindestens ein " "Teilnehmer als Empfänger ausgewählt werden." -#: mailer/models.py:192 +#: mailer/models.py:206 msgid "" "At least one reply-to recipient is required. Use the info mail if you really " "want no reply-to recipient." @@ -139,19 +144,19 @@ msgstr "" "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." -#: mailer/models.py:199 +#: mailer/models.py:213 msgid "file" msgstr "Datei" -#: mailer/models.py:205 +#: mailer/models.py:219 msgid "Empty" msgstr "Leer" -#: mailer/models.py:208 +#: mailer/models.py:222 msgid "attachment" msgstr "Anhang" -#: mailer/models.py:209 +#: mailer/models.py:223 msgid "attachments" msgstr "Anhänge" @@ -232,7 +237,7 @@ msgstr "Vorname" msgid "Lastname" msgstr "Nachname" -#: mailer/templates/mailer/subscribe.html:26 mailer/views.py:61 +#: mailer/templates/mailer/subscribe.html:26 mailer/views.py:59 msgid "Birthdate" msgstr "Geburtsdatum" @@ -265,31 +270,14 @@ msgstr "Ungültiger Link. Bitte nochmal versuchen!" msgid "Please fill in every field" 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!" msgstr "Bitte jedes Feld ausfüllen!" -#: mailer/views.py:91 +#: mailer/views.py:89 msgid "Member already exists" 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" diff --git a/jdav_web/mailer/mailutils.py b/jdav_web/mailer/mailutils.py index 90219fd..c3c287b 100644 --- a/jdav_web/mailer/mailutils.py +++ b/jdav_web/mailer/mailutils.py @@ -1,13 +1,10 @@ from django.core import mail from django.core.mail import EmailMessage +from django.conf import settings import os 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, 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): url = prepend_base_url("/newsletter/unsubscribe") - prepend = "WICHTIGE MITTEILUNG\n\n"\ - "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:\n"\ - "https://cloud.jdav-ludwigsburg.de/index.php/s/NQfRqA9MTKfPBkC"\ - "\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) + prepend = settings.PREPEND_INCOMPLETE_REGISTRATION_TEXT + footer = settings.MAIL_FOOTER.format(link=url) + text = "{prepend}{content}{footer}".format(prepend="" if registration_complete else prepend, + content=content, + footer=footer) return text @@ -87,7 +79,4 @@ def get_mail_confirmation_link(key): def prepend_base_url(absolutelink): - return "{protocol}://{base}{link}".format(protocol=PROTOCOL, base=BASE_URL, link=absolutelink) - - -mail_root = os.environ.get('EMAIL_SENDING_ADDRESS', 'christian@localhost') + return "{protocol}://{base}{link}".format(protocol=settings.PROTOCOL, base=settings.BASE_URL, link=absolutelink) diff --git a/jdav_web/mailer/management/commands/notify_active.py b/jdav_web/mailer/management/commands/notify_active.py index 46086b1..4a71779 100644 --- a/jdav_web/mailer/management/commands/notify_active.py +++ b/jdav_web/mailer/management/commands/notify_active.py @@ -2,20 +2,19 @@ from django.core.management.base import BaseCommand from mailer.models import Message from members.models import Member, annotate_activity_score 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 -CONGRATULATE_MEMBERS_MAX = 10 -SENDING_ADDRESS = mail_root - class Command(BaseCommand): help = 'Congratulates the most active members' requires_system_checks = False 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): positiontext = "{}. ".format(position + 1) if position > 0 else "" score = member._activity_score @@ -29,20 +28,11 @@ class Command(BaseCommand): level = 4 else: level = 5 - print("sent to ", member.prename) - content = "Hallo {}!\n\n"\ - "Herzlichen Glückwunsch, du hast im letzten Jahr zu den {} aktivsten "\ - "Mitgliedern der JDAV Ludwigsburg gehört! Um genau zu sein beträgt "\ - "dein Aktivitäts Wert "\ - "des letzten Jahres {} Punkte. Das entspricht {} Kletterer*innen. "\ - "Damit warst du im letzten Jahr "\ - "das {}aktivste Mitglied der JDAV Ludwigsburg.\n\n"\ - "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"]) + content = settings.NOTIFY_MOST_ACTIVE_TEXT.format(name=member.prename, + congratulate_max=CONGRATULATE_MEMBERS_MAX, + score=score, + level=level, + position=positiontext) + send(_("Congratulation %(name)s") % { 'name': member.prename }, + content, settings.DEFAULT_SENDING_ADDRESS, [member.email], + reply_to=[settings.RESPONSIBLE_MAIL]) diff --git a/jdav_web/mailer/models.py b/jdav_web/mailer/models.py index d1afb7f..1594377 100644 --- a/jdav_web/mailer/models.py +++ b/jdav_web/mailer/models.py @@ -3,17 +3,14 @@ from django.core.exceptions import ValidationError from django import forms from django.utils.translation import gettext_lazy as _ 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 jdav_web.celery import app from django.core.validators import RegexValidator +from django.conf import settings 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')) @@ -30,7 +27,7 @@ class EmailAddress(models.Model): @property def email(self): - return "{0}@{1}".format(self.name, HOST) + return "{0}@{1}".format(self.name, settings.HOST) @property 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()]) # remove sending address from reply-to field (probably unnecessary since it's removed by # 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: success1 = send(self.subject, get_content(self.content, registration_complete=False), - SENDING_ADDRESS, + settings.DEFAULT_SENDING_MAIL, emails_rem, message_id=message_id, attachments=attach, reply_to=reply_to) success2 = send(self.subject, get_content(self.content, registration_complete=True), - SENDING_ADDRESS, + settings.DEFAULT_SENDING_MAIL, emails_no_rem, message_id=message_id, attachments=attach, diff --git a/jdav_web/mailer/views.py b/jdav_web/mailer/views.py index 6530614..863ef1d 100644 --- a/jdav_web/mailer/views.py +++ b/jdav_web/mailer/views.py @@ -3,7 +3,8 @@ from django import forms from django.utils.translation import gettext_lazy as _ from django.urls import reverse 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 @@ -46,11 +47,9 @@ def unsubscribe(request): except (KeyError, Member.DoesNotExist): return render_unsubscribe(request, _("Please fill in every field")) else: - send_mail("Abmeldebestätigung", - "Klicke auf den Link, um dich vom Newsletter des JDAV " - "Ludwigsburg " - "abzumelden\n{}".format(get_unsubscribe_link(member)), - mail_root, email) + send_mail(_("Unsubscription confirmation"), + settings.UNSUBSCRIBE_CONFIRMATION_TEXT.format(link=get_unsubscribe_link(member)), + settings.DEFAULT_SENDING_MAIL, email) return render_confirmation_sent(request, email) diff --git a/jdav_web/material/locale/de/LC_MESSAGES/django.po b/jdav_web/material/locale/de/LC_MESSAGES/django.po index 8774727..e961dec 100644 --- a/jdav_web/material/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/material/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -34,79 +34,79 @@ msgstr "Zu alt" msgid "material" msgstr "Material" -#: material/models.py:15 +#: material/models.py:16 msgid "Name" msgstr "Name" -#: material/models.py:21 material/models.py:38 +#: material/models.py:22 material/models.py:39 msgid "Material category" msgstr "Materialtyp" -#: material/models.py:22 +#: material/models.py:23 msgid "Material categories" msgstr "Materialtypen" -#: material/models.py:31 +#: material/models.py:32 msgid "name" msgstr "Name" -#: material/models.py:32 +#: material/models.py:33 msgid "description" msgstr "Beschreibung" -#: material/models.py:33 +#: material/models.py:34 msgid "quantity" msgstr "Anzahl" -#: material/models.py:34 +#: material/models.py:35 msgid "purchase date" msgstr "Kaufdatum" -#: material/models.py:35 +#: material/models.py:36 msgid "lifetime (years)" msgstr "Lebenszeit (Jahre)" -#: material/models.py:36 +#: material/models.py:37 msgid "photo" msgstr "Bild" -#: material/models.py:49 +#: material/models.py:50 msgid "Quantity" msgstr "Anzahl" -#: material/models.py:56 +#: material/models.py:57 msgid "Thumbnail" msgstr "Bild" -#: material/models.py:65 +#: material/models.py:64 msgid "Owners" msgstr "Verantwortliche" -#: material/models.py:75 +#: material/models.py:74 msgid "Not too old?" msgstr "Nicht zu alt?" -#: material/models.py:78 +#: material/models.py:77 msgid "material part" msgstr "Materialteil" -#: material/models.py:79 +#: material/models.py:78 msgid "material parts" msgstr "Materialteile" -#: material/models.py:85 +#: material/models.py:84 msgid "owner" msgstr "Besitzer" -#: material/models.py:86 +#: material/models.py:85 msgid "count" msgstr "Anzahl" -#: material/models.py:93 +#: material/models.py:92 msgid "ownership" msgstr "Besitzer" -#: material/models.py:94 +#: material/models.py:93 msgid "ownerships" msgstr "Verantwortliche" diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index cc817fc..fd5a292 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -33,7 +33,7 @@ from .models import (Member, Group, Freizeit, MemberNoteList, NewMemberOnList, K KlettertreffAttendee, ActivityCategory, OldMemberOnList, MemberList, annotate_activity_score, RegistrationPassword, MemberUnconfirmedProxy) 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 easy_select2 import apply_select2 @@ -127,23 +127,9 @@ class MemberAdmin(admin.ModelAdmin): for member in queryset: if not member.gets_newsletter: continue - send_mail("Wichtig: Rückmeldung erforderlich!", - """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""".format(name=member.prename, link=get_echo_link(member)), - mail_root, + send_mail(_("Echo required"), + settings.ECHO_TEXT.format(name=member.prename, link=get_echo_link(member)), + settings.DEFAULT_SENDING_MAIL, [member.email, member.email_parents] if member.email_parents and member.cc_email_parents else member.email) messages.success(request, _("Successfully requested echo from selected members.")) diff --git a/jdav_web/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po index 3612259..ca24287 100644 --- a/jdav_web/members/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/members/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-18 13:25+0100\n" +"POT-Creation-Date: 2023-03-20 18:48+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,602 +18,613 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: admin.py:41 models.py:175 +#: members/admin.py:42 members/models.py:175 msgid "Registration complete" msgstr "Anmeldung vollständig" -#: admin.py:47 +#: members/admin.py:48 msgid "True" msgstr "Ja" -#: admin.py:48 +#: members/admin.py:49 msgid "False" msgstr "Nein" -#: admin.py:49 +#: members/admin.py:50 msgid "All" msgstr "Alle" -#: admin.py:123 +#: members/admin.py:124 msgid "Compose new mail to selected members" msgstr "Neue Nachricht an ausgewählte Teilnehmer verfassen" -#: admin.py:148 +#: members/admin.py:130 +msgid "Echo required" +msgstr "Rückmeldung erforderlich" + +#: members/admin.py:135 msgid "Successfully requested echo from selected members." msgstr "" "Rückmeldungsaufforderung erfolgreich an ausgewählte Teilnehmer verschickt." -#: admin.py:149 +#: members/admin.py:136 msgid "Request echo from selected members" msgstr "Rückmeldungsaufforderung an ausgewählte Teilnehmer verschicken" -#: admin.py:166 +#: members/admin.py:153 msgid "activity" msgstr "Aktivität" -#: admin.py:195 +#: members/admin.py:182 msgid "Successfully requested mail confirmation from selected registrations." msgstr "Aufforderung zur Bestätigung der Email Adresse versendet." -#: admin.py:196 +#: members/admin.py:183 msgid "Request mail confirmation from selected registrations" msgstr "Aufforderung zur Bestätigung der Email Adresse versenden" -#: admin.py:203 admin.py:241 +#: members/admin.py:190 members/admin.py:228 #, python-format msgid "Successfully confirmed %(name)s." msgstr "Registrierung von %(name)s erfolgreich bestätigt." -#: admin.py:207 admin.py:244 +#: members/admin.py:194 members/admin.py:231 #, python-format msgid "Can't confirm. %(name)s has unconfirmed email addresses." msgstr "Bestätigung nicht möglich. %(name)s hat unbestätigte Emailadressen." -#: admin.py:212 +#: members/admin.py:199 msgid "Successfully confirmed multiple registrations." msgstr "Erfolgreich mehrere Registrierungen bestätigt." -#: admin.py:214 +#: members/admin.py:201 msgid "" "Failed to confirm some registrations because of unconfirmed email addresses." msgstr "" "Einige Bestätigungen fehlgeschlagen, weil Emailadressen noch nicht bestätigt " "sind." -#: admin.py:215 +#: members/admin.py:202 msgid "Confirm selected registrations" msgstr "Ausgewählte Registrierungen bestätigen" -#: admin.py:235 +#: members/admin.py:222 #, python-format msgid "Successfully demoted %(name)s to waiter." msgstr "%(name)s zurück auf die Warteliste gesetzt." -#: admin.py:236 +#: members/admin.py:223 msgid "Demote selected registrations to waiters." msgstr "Ausgewählte Registrierungen zurück auf die Warteliste setzen." -#: admin.py:251 models.py:270 models.py:690 +#: members/admin.py:238 members/models.py:270 members/models.py:690 msgid "Group" msgstr "Gruppe" -#: admin.py:271 +#: members/admin.py:258 #, python-format msgid "Successfully asked %(name)s to confirm their waiting status." msgstr "Erfolgreich %(name)s aufgefordert den Wartelistenplatz zu bestätigen." -#: admin.py:272 +#: members/admin.py:259 msgid "Ask selected waiters to confirm their waiting status" msgstr "Wartende auffordern den Wartelistenplatz zu bestätigen" -#: admin.py:281 admin.py:337 +#: members/admin.py:268 members/admin.py:324 msgid "" "An error occurred while trying to invite said members. Please try again." msgstr "" "Beim Einladen dieser Personen ist ein Fehler aufgetreten. Bitte versuche es " "nochmal. " -#: admin.py:289 admin.py:344 +#: members/admin.py:276 members/admin.py:331 #, python-format msgid "Successfully invited %(name)s to %(group)s." msgstr "Erfolgreich %(name)s zu Gruppe %(group)s eingeladen." -#: admin.py:293 admin.py:349 +#: members/admin.py:280 members/admin.py:336 msgid "Select group for invitation" msgstr "Wähle Gruppe für Einladung aus" -#: admin.py:300 +#: members/admin.py:287 msgid "Offer waiter a place in a group." msgstr "Personen auf der Warteliste einen Gruppenplatz anbieten." -#: admin.py:388 +#: members/admin.py:375 msgid "Difficulty" msgstr "Schwierigkeit" -#: admin.py:391 +#: members/admin.py:378 msgid "Tour type" msgstr "Art der Tour" -#: admin.py:394 models.py:551 +#: members/admin.py:381 members/models.py:551 msgid "Means of transportation" msgstr "Verkehrsmittel" -#: admin.py:617 +#: members/admin.py:605 msgid "Generate crisis intervention list" msgstr "Kriseninterventionsliste erstellen" -#: admin.py:624 +#: members/admin.py:612 msgid "Generate overview" msgstr "Hinweise für Jugendleiter erstellen" -#: admin.py:631 +#: members/admin.py:619 msgid "Generate seminar report" msgstr "Seminarbericht erstellen" -#: apps.py:7 models.py:274 +#: members/apps.py:7 members/models.py:274 msgid "members" msgstr "Teilnehmer" -#: models.py:35 +#: members/models.py:35 msgid "Name" msgstr "Name" -#: models.py:36 +#: members/models.py:36 msgid "Description" msgstr "Beschreibung" -#: models.py:42 models.py:432 models.py:531 -#: templates/members/change_member.html:17 +#: members/models.py:42 members/models.py:432 members/models.py:531 +#: members/templates/members/change_member.html:17 msgid "Activity" msgstr "Aktivität" -#: models.py:43 +#: members/models.py:43 msgid "Activities" msgstr "Aktivitäten" -#: models.py:51 +#: members/models.py:51 msgid "name" msgstr "Name" -#: models.py:52 +#: members/models.py:52 msgid "lowest year" msgstr "Ab Jahrgang" -#: models.py:53 +#: members/models.py:53 msgid "highest year" msgstr "Bis Jahrgang" -#: models.py:54 +#: members/models.py:54 msgid "youth leaders" msgstr "Jugendleiter" -#: models.py:62 models.py:166 +#: members/models.py:62 members/models.py:166 msgid "group" msgstr "Gruppe" -#: models.py:63 +#: members/models.py:63 msgid "groups" msgstr "Gruppen" -#: models.py:75 +#: members/models.py:75 msgid "prename" msgstr "Vorname" -#: models.py:76 +#: members/models.py:76 msgid "last name" msgstr "Nachname" -#: models.py:79 +#: members/models.py:79 msgid "Parents' Email" msgstr "Email der Eltern" -#: models.py:80 +#: members/models.py:80 msgid "Also send mails to parents" msgstr "Emails auch an Eltern schicken" -#: models.py:82 +#: members/models.py:82 msgid "birth date" msgstr "Geburtsdatum" -#: models.py:84 +#: members/models.py:84 msgid "comments" msgstr "Kommentare" -#: models.py:86 +#: members/models.py:86 msgid "Email confirmed" msgstr "Emailadresse bestätigt" -#: models.py:87 +#: members/models.py:87 msgid "Parents email confirmed" msgstr "Emailadresse der Eltern bestätigt" -#: models.py:115 models.py:124 +#: members/models.py:115 members/models.py:124 msgid "Email confirmation needed" msgstr "Email Bestätigung erforderlich" -#: models.py:159 +#: members/models.py:159 msgid "street and house number" msgstr "Straße und Hausnummer" -#: models.py:160 +#: members/models.py:160 msgid "Postcode" msgstr "PLZ" -#: models.py:162 +#: members/models.py:162 msgid "town" msgstr "Stadt" -#: models.py:164 +#: members/models.py:164 msgid "phone number" msgstr "Telefonnummer" -#: models.py:165 +#: members/models.py:165 msgid "parents phone number" msgstr "Telefonnummer der Eltern" -#: models.py:170 +#: members/models.py:170 msgid "receives newsletter" msgstr "Erhält den Newsletter" -#: models.py:174 +#: members/models.py:174 msgid "created" msgstr "erstellt" -#: models.py:176 +#: members/models.py:176 msgid "Active" msgstr "Aktiv" -#: models.py:178 +#: members/models.py:178 msgid "registration form" msgstr "Anmeldeformular" -#: models.py:188 +#: members/models.py:188 msgid "Echoed" msgstr "Rückgemeldet" -#: models.py:189 +#: members/models.py:189 msgid "Confirmed" msgstr "Bestätigt" -#: models.py:273 +#: members/models.py:273 msgid "member" msgstr "Teilnehmer" -#: models.py:305 +#: members/models.py:305 #, python-format msgid "New unconfirmed registration for group %(group)s" msgstr "Neue unbestätigte Registrierung für Gruppe %(group)s" -#: models.py:323 +#: members/models.py:323 msgid "Unconfirmed registration" msgstr "Unbestätigte Registrierung" -#: models.py:324 +#: members/models.py:324 msgid "Unconfirmed registrations" msgstr "Unbestätigte Registrierungen" -#: models.py:340 +#: members/models.py:340 msgid "Last wait confirmation" msgstr "Letzte Wartebestätigung" -#: models.py:351 +#: members/models.py:351 msgid "Invited for group" msgstr "Einladung zu Gruppe austehend" -#: models.py:355 +#: members/models.py:355 msgid "Waiter" msgstr "Wartende Person" -#: models.py:356 +#: members/models.py:356 msgid "Waiters" msgstr "Warteliste" -#: models.py:373 +#: members/models.py:373 msgid "Waiting status confirmed" msgstr "Wartelistenplatz bestätigt" -#: models.py:377 +#: members/models.py:377 msgid "Waiting confirmation needed" msgstr "Wartelistenplatzbestätigung erforderlich" -#: models.py:434 models.py:533 +#: members/models.py:418 +msgid "Good news" +msgstr "Gute Neuigkeiten" + +#: members/models.py:434 members/models.py:533 msgid "Place" msgstr "Ort" -#: models.py:435 models.py:534 +#: members/models.py:435 members/models.py:534 msgid "Destination (optional)" msgstr "Ziel (optional)" -#: models.py:437 models.py:668 models.py:686 +#: members/models.py:437 members/models.py:668 members/models.py:686 msgid "Date" msgstr "Datum" -#: models.py:438 models.py:537 +#: members/models.py:438 members/models.py:537 msgid "End (optional)" msgstr "Ende" -#: models.py:440 models.py:539 +#: members/models.py:440 members/models.py:539 msgid "Groups" msgstr "Gruppen" -#: models.py:448 models.py:555 +#: members/models.py:448 members/models.py:555 msgid "Categories" msgstr "Kategorien" -#: models.py:449 models.py:556 +#: members/models.py:449 members/models.py:556 msgid "easy" msgstr "leicht" -#: models.py:449 models.py:556 +#: members/models.py:449 members/models.py:556 msgid "medium" msgstr "mittel" -#: models.py:449 models.py:556 +#: members/models.py:449 members/models.py:556 msgid "hard" msgstr "schwer" -#: models.py:458 +#: members/models.py:458 msgid "Memberlist" msgstr "Teilnehmerliste" -#: models.py:459 +#: members/models.py:459 msgid "Memberlists" msgstr "Teilnehmerlisten" -#: models.py:477 models.py:485 models.py:493 models.py:504 models.py:721 -#: models.py:728 +#: members/models.py:477 members/models.py:485 members/models.py:493 +#: members/models.py:504 members/models.py:721 members/models.py:728 msgid "Member" msgstr "Teilnehmer" -#: models.py:479 models.py:498 +#: members/models.py:479 members/models.py:498 msgid "Comment" msgstr "Kommentar" -#: models.py:486 models.py:505 models.py:729 +#: members/models.py:486 members/models.py:505 members/models.py:729 msgid "Members" msgstr "Teilnehmer" -#: models.py:536 +#: members/models.py:536 msgid "Begin" msgstr "Anfang" -#: models.py:552 +#: members/models.py:552 msgid "Kilometers traveled" msgstr "Fahrstrecke in Kilometer" -#: models.py:667 models.py:743 +#: members/models.py:667 members/models.py:743 msgid "Title" msgstr "Titel" -#: models.py:687 +#: members/models.py:687 msgid "Location" msgstr "Ort" -#: models.py:688 +#: members/models.py:688 msgid "Topic" msgstr "Thema" -#: models.py:712 +#: members/models.py:712 msgid "Jugendleiter" msgstr "Jugendleiter" -#: models.py:715 +#: members/models.py:715 msgid "Klettertreff" msgstr "Klettertreff" -#: models.py:716 +#: members/models.py:716 msgid "Klettertreffs" msgstr "Klettertreffs" -#: models.py:734 +#: members/models.py:734 msgid "Password" msgstr "Passwort" -#: models.py:737 +#: members/models.py:737 msgid "registration password" msgstr "Registrierungspassort" -#: models.py:738 +#: members/models.py:738 msgid "registration passwords" msgstr "Registrierungspasswörter" -#: models.py:745 +#: members/models.py:745 msgid "Alpinistic goals" msgstr "Alpintechnische Ziele" -#: models.py:746 +#: members/models.py:746 msgid "Pedagogic goals" msgstr "Pädagogische Ziele" -#: models.py:747 +#: members/models.py:747 msgid "Content and methods" msgstr "Inhalte und Methoden" -#: models.py:748 +#: members/models.py:748 msgid "Evaluation" msgstr "Wertung" -#: models.py:749 +#: members/models.py:749 msgid "Experiences and possible improvements" msgstr "Erfahrungen und Verbesserungsvorschläge" -#: models.py:752 +#: members/models.py:752 msgid "Excursion" msgstr "Freizeit" -#: models.py:758 models.py:773 +#: members/models.py:758 members/models.py:773 msgid "LJP Proposal" msgstr "Seminarbericht" -#: models.py:759 +#: members/models.py:759 msgid "LJP Proposals" msgstr "Seminarberichte" -#: models.py:766 +#: members/models.py:766 msgid "Starting time" msgstr "Zeitpunkt" -#: models.py:767 +#: members/models.py:767 msgid "Duration in hours" msgstr "Dauer in Stunden" -#: models.py:770 +#: members/models.py:770 msgid "Activity and method" msgstr "Art der Aktion inkl. Methode" -#: models.py:778 +#: members/models.py:778 msgid "Intervention" msgstr "Aktion" -#: models.py:779 +#: members/models.py:779 msgid "Interventions" msgstr "Aktionen" -#: templates/admin/invite_for_group.html:17 -#: templates/admin/invite_selected_for_group.html:17 +#: members/templates/admin/invite_for_group.html:17 +#: members/templates/admin/invite_selected_for_group.html:17 msgid "Home" msgstr "Start" -#: templates/admin/invite_for_group.html:21 +#: members/templates/admin/invite_for_group.html:21 msgid "Invite to group" msgstr "Zu Gruppe einladen" -#: templates/admin/invite_for_group.html:26 -#: templates/admin/invite_selected_for_group.html:25 +#: members/templates/admin/invite_for_group.html:26 +#: members/templates/admin/invite_selected_for_group.html:25 msgid "Invite to a group" msgstr "Zu einer Gruppe einladen" -#: templates/admin/invite_for_group.html:28 +#: members/templates/admin/invite_for_group.html:28 msgid "You are inviting:" msgstr "Du lädst die folgende Person ein:" -#: templates/admin/invite_for_group.html:39 +#: members/templates/admin/invite_for_group.html:39 #, python-format msgid "Please choose the group that you want to invite %(waiter)s to." msgstr "Bitte wähle die Gruppe aus zu der du %(waiter)s einladen möchtest." -#: templates/admin/invite_for_group.html:51 -#: templates/admin/invite_selected_for_group.html:52 +#: members/templates/admin/invite_for_group.html:51 +#: members/templates/admin/invite_selected_for_group.html:52 msgid "Invite" msgstr "Einladen" -#: templates/admin/invite_for_group.html:52 -#: templates/admin/invite_selected_for_group.html:53 +#: members/templates/admin/invite_for_group.html:52 +#: members/templates/admin/invite_selected_for_group.html:53 msgid "Cancel" msgstr "Abbrechen" -#: templates/admin/invite_selected_for_group.html:20 +#: members/templates/admin/invite_selected_for_group.html:20 msgid "Invite multiple waiters" msgstr "Mehrere Wartende einladen" -#: templates/admin/invite_selected_for_group.html:27 +#: members/templates/admin/invite_selected_for_group.html:27 msgid "You selected the following waiters:" msgstr "Du hast die folgenden Wartenden ausgewählt:" -#: templates/admin/invite_selected_for_group.html:40 +#: members/templates/admin/invite_selected_for_group.html:40 msgid "Please choose the group you want these waiters to be invited for." msgstr "" "Bitte wähle die Gruppe aus zu der du die obigen Wartenden einladen möchtest." -#: templates/admin/klettertreff_overview.html:9 +#: members/templates/admin/klettertreff_overview.html:9 msgid "date" msgstr "Datum" -#: templates/members/change_member.html:6 +#: members/templates/members/change_member.html:6 msgid "Participations:" msgstr "Freizeitteilnahmen:" -#: templates/members/change_member.html:14 +#: members/templates/members/change_member.html:14 msgid "Qualities:" msgstr "Fähigkeiten:" -#: templates/members/change_member.html:18 +#: members/templates/members/change_member.html:18 msgid "Skill level" msgstr "Fähigkeitsniveau" -#: templates/members/change_member_unconfirmed.html:11 +#: members/templates/members/change_member_unconfirmed.html:11 msgid "Save and confirm registration" msgstr "Speichern und Registrierung bestätigen" -#: templates/members/echo.html:6 templates/members/echo.html:13 -#: templates/members/echo_failed.html:11 templates/members/echo_success.html:10 +#: members/templates/members/echo.html:6 members/templates/members/echo.html:13 +#: members/templates/members/echo_failed.html:11 +#: members/templates/members/echo_success.html:10 msgid "Echo" msgstr "Rückmeldung" -#: templates/members/echo.html:15 +#: members/templates/members/echo.html:15 msgid "Thanks for echoing back. Here is your current data:" msgstr "" "Vielen Dank, dass du dich rückmeldest. Hier siehst du deine aktuellen Daten. " "Falls sich etwas geändert hat, trage das bitte hier ein." -#: templates/members/echo.html:27 templates/members/register.html:34 -#: templates/members/register_password.html:22 -#: templates/members/register_waiting_list.html:31 +#: members/templates/members/echo.html:27 +#: members/templates/members/register.html:35 +#: members/templates/members/register_password.html:22 +#: members/templates/members/register_waiting_list.html:31 msgid "submit" msgstr "Bestätigen" -#: templates/members/echo_failed.html:6 +#: members/templates/members/echo_failed.html:6 msgid "Echo failed" msgstr "Rückmeldung fehlgeschlagen" -#: templates/members/echo_failed.html:13 -#: templates/members/invited_registration_failed.html:13 +#: members/templates/members/echo_failed.html:13 +#: members/templates/members/invited_registration_failed.html:13 msgid "Something went wrong. The key you supplied is" msgstr "Etwas ist schief gegangen. Der verwendete Code ist" -#: templates/members/echo_failed.html:15 -#: templates/members/invited_registration_failed.html:15 -#: templates/members/register_failed.html:15 +#: members/templates/members/echo_failed.html:15 +#: members/templates/members/invited_registration_failed.html:15 +#: members/templates/members/register_failed.html:15 msgid "If you think this is a mistake, please" msgstr "Wenn du denkst, dass das ein Fehler ist, " -#: templates/members/echo_failed.html:15 -#: templates/members/invited_registration_failed.html:15 -#: templates/members/register_failed.html:15 +#: members/templates/members/echo_failed.html:15 +#: members/templates/members/invited_registration_failed.html:15 +#: members/templates/members/register_failed.html:15 msgid "contact us." msgstr "kontaktiere uns." -#: templates/members/echo_success.html:5 +#: members/templates/members/echo_success.html:5 msgid "Echo successful" msgstr "Rückmeldung erfolgreich" -#: templates/members/echo_success.html:12 +#: members/templates/members/echo_success.html:12 msgid "Thank you" msgstr "Danke" -#: templates/members/echo_success.html:12 +#: members/templates/members/echo_success.html:12 msgid "Your data was successfully updated." msgstr "Deine Daten wurden erfolgreich aktualisiert." -#: templates/members/invited_registration_failed.html:6 -#: templates/members/register_failed.html:6 +#: members/templates/members/invited_registration_failed.html:6 +#: members/templates/members/register_failed.html:6 msgid "Registration failed" msgstr "Registrierung fehlgeschlagen" -#: templates/members/invited_registration_failed.html:11 -#: templates/members/register.html:6 templates/members/register_failed.html:11 -#: templates/members/register_password.html:6 -#: templates/members/register_success.html:6 -#: templates/members/register_wrong_password.html:6 +#: members/templates/members/invited_registration_failed.html:11 +#: members/templates/members/register.html:6 +#: members/templates/members/register_failed.html:11 +#: members/templates/members/register_password.html:6 +#: members/templates/members/register_success.html:6 +#: members/templates/members/register_wrong_password.html:6 msgid "Registration" msgstr "Registrierung" -#: templates/members/mail_confirmation_invalid.html:6 -#: templates/members/mail_confirmation_invalid.html:11 +#: members/templates/members/mail_confirmation_invalid.html:6 +#: members/templates/members/mail_confirmation_invalid.html:11 msgid "Mail confirmation failed" msgstr "Emailbestätigung fehlgeschlagen" -#: templates/members/mail_confirmation_invalid.html:13 -#: templates/members/waiting_confirmation_invalid.html:19 +#: members/templates/members/mail_confirmation_invalid.html:13 +#: members/templates/members/waiting_confirmation_invalid.html:19 msgid "The supplied link is invalid." msgstr "Der verwendete Link ist ungültig." -#: templates/members/mail_confirmation_success.html:6 -#: templates/members/mail_confirmation_success.html:11 +#: members/templates/members/mail_confirmation_success.html:6 +#: members/templates/members/mail_confirmation_success.html:11 msgid "Mail confirmed" msgstr "Emailadresse bestätigt" -#: templates/members/mail_confirmation_success.html:14 +#: members/templates/members/mail_confirmation_success.html:14 #, python-format msgid "" "The email address %(email)s was successfully confirmed as parents email of " @@ -622,7 +633,7 @@ msgstr "" "Die Emailadresse %(email)s wurde erfolgreich als Emailadresse der Eltern von " "%(name)s bestätigt." -#: templates/members/mail_confirmation_success.html:17 +#: members/templates/members/mail_confirmation_success.html:17 #, python-format msgid "" "The email address %(email)s was successfully confirmed as personal email of " @@ -631,51 +642,54 @@ msgstr "" "Die Emailadresse %(email)s wurde erfolgreich als persönliche Emailadresse " "von %(name)s bestätigt." -#: templates/members/register.html:13 -#: templates/members/register_password.html:11 -#: templates/members/register_success.html:11 -#: templates/members/register_wrong_password.html:11 +#: members/templates/members/register.html:13 +#: members/templates/members/register_password.html:11 +#: members/templates/members/register_success.html:11 +#: members/templates/members/register_wrong_password.html:11 msgid "Register" msgstr "Registrieren" -#: templates/members/register.html:15 +#: members/templates/members/register.html:15 msgid "Here you can register for group" msgstr "Hier kannst du dich registrieren für die Gruppe" -#: templates/members/register.html:28 -msgid "I am member of the DAV Ludwigsburg." -msgstr "Ich bin Mitglied des DAV Ludwigsburg." +#: members/templates/members/register.html:28 +#, python-format +msgid "I am member of the DAV %(sektion)s." +msgstr "Ich bin Mitglied des DAV %(sektion)s." -#: templates/members/register.html:30 -#: templates/members/register_waiting_list.html:28 +#: members/templates/members/register.html:30 +#: members/templates/members/register_waiting_list.html:28 +#, python-format msgid "" "I agree that my data is stored and processed on the server of the JDAV " -"Ludwigsburg." +"%(sektion)s." msgstr "" -"Ich bin einverstanden, dass meine Daten auf dem Server der JDAV Ludwigsburg " +"Ich bin einverstanden, dass meine Daten auf dem Server der JDAV %(sektion)s " "gespeichert und verarbeitet werden." -#: templates/members/register_failed.html:13 +#: members/templates/members/register_failed.html:13 msgid "Something went wrong while processing your registration." msgstr "Etwas ist schief gelaufen, bei der Verarbeitung deiner Registrierung." -#: templates/members/register_password.html:13 +#: members/templates/members/register_password.html:13 +#, python-format msgid "" -"Thanks for your interest in participating. Please enter the registration " -"password, your youth leader gave you." +"Thanks for your interest in participating in the JDAV %(sektion)s. Please " +"enter the registration password, your youth leader gave you." msgstr "" -"Danke für dein Interesse bei der JDAV Ludwigsburg teilzunehmen. Bitte gib " +"Danke für dein Interesse bei der JDAV %(sektion)s teilzunehmen. Bitte gib " "das Passwort ein, das du von deinem Jugendleiter erhalten hast." -#: templates/members/register_success.html:13 +#: members/templates/members/register_success.html:13 msgid "Your registration succeeded." msgstr "Deine Registrierung war erfolgreich." -#: templates/members/register_success.html:16 +#: members/templates/members/register_success.html:16 msgid "Please remember to confirm your email address." msgstr "Bitte denk daran, deine E-Mail Adresse(n) zu bestätigen." -#: templates/members/register_success.html:17 +#: members/templates/members/register_success.html:17 msgid "" "The coordinating team will process your registration when your email address " "is confirmed." @@ -683,57 +697,57 @@ msgstr "" "Unser Jugendleiterteam wird deine Registrierung bearbeiten, wenn deine " "Emailadressen bestätigt sind." -#: templates/members/register_success.html:19 +#: members/templates/members/register_success.html:19 msgid "" "The coordinating team will process your registration as soon as possible." msgstr "" "Unser Jugendleiterteam wird deine Registrierung so schnell wie möglich " "bearbeiten." -#: templates/members/register_waiting_list.html:6 +#: members/templates/members/register_waiting_list.html:6 msgid "Registration for waiting list" msgstr "Registrierung für die Warteliste" -#: templates/members/register_waiting_list.html:13 +#: members/templates/members/register_waiting_list.html:13 msgid "Register for waiting list" msgstr "Für die Warteliste registrieren" -#: templates/members/register_waiting_list.html:15 +#: members/templates/members/register_waiting_list.html:15 msgid "Here you can register for the waiting list." msgstr "Hier kannst du dich auf die Warteliste eintragen." -#: templates/members/register_waiting_list_success.html:6 -#: templates/members/register_waiting_list_success.html:11 +#: members/templates/members/register_waiting_list_success.html:6 +#: members/templates/members/register_waiting_list_success.html:11 msgid "Registration for waiting list." msgstr "Registrierung für die Warteliste." -#: templates/members/register_waiting_list_success.html:13 +#: members/templates/members/register_waiting_list_success.html:13 msgid "Your registration for the waiting list was successful." msgstr "Du wurdest auf die Warteliste gesetzt." -#: templates/members/register_waiting_list_success.html:14 +#: members/templates/members/register_waiting_list_success.html:14 msgid "Please remember to confirm all email addresses that you entered." msgstr "Bitte denk daran, deine E-Mail Adresse(n) zu bestätigen." -#: templates/members/register_waiting_list_success.html:15 +#: members/templates/members/register_waiting_list_success.html:15 msgid "We will notify you if there is a vacant place in one of our groups." msgstr "" "Wir werden dich umgehend benachrichtigen, wenn es einen freien Platz in " "einer unserer Gruppen gibt." -#: templates/members/register_wrong_password.html:13 +#: members/templates/members/register_wrong_password.html:13 msgid "" "You entered a wrong password to often. Please ask your youth leader again." msgstr "" "Du hast zu oft ein falsches Passwort eingegeben. Bitte frage deinen " "Jugendleiter nach einem korrekten Passwort." -#: templates/members/waiting_confirmation_invalid.html:6 -#: templates/members/waiting_confirmation_invalid.html:11 +#: members/templates/members/waiting_confirmation_invalid.html:6 +#: members/templates/members/waiting_confirmation_invalid.html:11 msgid "Waiting confirmation failed" msgstr "Wartelistenplatzbestätigung fehlgeschlagen" -#: templates/members/waiting_confirmation_invalid.html:15 +#: members/templates/members/waiting_confirmation_invalid.html:15 msgid "" "Unfortunately, you did not confirm your intention to stay on the waiting " "list in time. You lost your spot on the list. You can" @@ -741,16 +755,16 @@ msgstr "" "Leider hast du deinen Wartelistenplatz nicht rechtzeitig bestätigt und hast " "somit deinen Platz verloren. Du kannst" -#: templates/members/waiting_confirmation_invalid.html:16 +#: members/templates/members/waiting_confirmation_invalid.html:16 msgid "rejoin the waiting list" msgstr "der Warteliste erneut beitreten" -#: templates/members/waiting_confirmation_success.html:6 -#: templates/members/waiting_confirmation_success.html:11 +#: members/templates/members/waiting_confirmation_success.html:6 +#: members/templates/members/waiting_confirmation_success.html:11 msgid "Waiting confirmed" msgstr "Wartelistenplatz bestätigt" -#: templates/members/waiting_confirmation_success.html:14 +#: members/templates/members/waiting_confirmation_success.html:14 #, python-format msgid "" "Thank you %(prename)s for your interest in staying on the waiting list.\n" @@ -759,7 +773,7 @@ msgstr "" "Danke %(prename)s für dein Interesse auf der Warteliste zu bleiben.\n" "Dein Platz ist bereits bestätigt." -#: templates/members/waiting_confirmation_success.html:18 +#: members/templates/members/waiting_confirmation_success.html:18 #, python-format msgid "" "Thank you %(prename)s for your interest in staying on the waiting list.\n" @@ -768,49 +782,14 @@ msgstr "" "Danke %(prename)s für dein Interesse auf der Warteliste zu bleiben.\n" "Dein Platz wurde bestätigt." -#: views.py:83 views.py:104 views.py:268 +#: members/views.py:84 members/views.py:105 members/views.py:270 msgid "invalid" msgstr "ungültig" -#: views.py:85 views.py:270 +#: members/views.py:86 members/views.py:272 msgid "expired" msgstr "abgelaufen" -#: views.py:114 +#: members/views.py:115 msgid "The entered password is wrong." msgstr "Das eingegebene Passwort ist falsch." - -#~ msgid "Convert to PDF" -#~ msgstr "Kriseninterventionsliste erstellen" - -#~ msgid "Generate list for LJP" -#~ msgstr "LJP Liste erstellen" - -#, python-format -#~ msgid "Can't invite %(name)s. No group was specified." -#~ msgstr "" -#~ "Einladen von %(name)s nicht möglich. Es wurde keine Gruppe angegeben." - -#~ msgid "Not waiting" -#~ msgstr "NICHT Warteliste" - -#~ msgid "street" -#~ msgstr "Straße" - -#~ msgid "Can't confirm. " -#~ msgstr "Bestätigung nicht möglich. " - -#~ msgid "minimum age (years)" -#~ msgstr "Mindestalter (Jahre)" - -#~ msgid "queue" -#~ msgstr "Warteliste" - -#~ msgid "Art der Tour" -#~ msgstr "Art der Tour" - -#~ msgid "Listname" -#~ msgstr "Name der Liste" - -#~ msgid "Comments" -#~ msgstr "Kommentare" diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index a8c5a6b..3ba2b82 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -10,7 +10,7 @@ from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelatio from django.contrib.contenttypes.models import ContentType from utils import RestrictedFileField 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 from django.contrib.auth.models import User from django.conf import settings @@ -113,10 +113,10 @@ class Person(models.Model): self.confirmed_mail = False self.confirm_mail_key = uuid.uuid4().hex send_mail(_('Email confirmation needed'), - CONFIRM_MAIL_TEXT.format(name=self.prename, - link=get_mail_confirmation_link(self.confirm_mail_key), - whattoconfirm='deiner Emailadresse'), - mail_root, + settings.CONFIRM_MAIL_TEXT.format(name=self.prename, + link=get_mail_confirmation_link(self.confirm_mail_key), + whattoconfirm='deiner Emailadresse'), + settings.DEFAULT_SENDING_MAIL, self.email) if self.email_parents: self.confirmed_mail_parents = False @@ -125,7 +125,7 @@ class Person(models.Model): CONFIRM_MAIL_TEXT.format(name=self.prename, link=get_mail_confirmation_link(self.confirm_mail_parents_key), whattoconfirm='der Emailadresse deiner Eltern'), - mail_root, + settings.DEFAULT_SENDING_MAIL, self.email_parents) else: self.confirmed_mail_parents = True @@ -146,7 +146,7 @@ class Person(models.Model): def send_mail(self, subject, content): send_mail(subject, content, - mail_root, + settings.DEFAULT_SENDING_MAIL, [self.email, self.email_parents] if self.email_parents and self.cc_email_parents else self.email) @@ -303,10 +303,10 @@ class Member(Person): link = prepend_base_url(reverse('admin:members_memberunconfirmedproxy_change', args=[str(self.id)])) send_mail(_('New unconfirmed registration for group %(group)s') % {'group': group}, - NEW_UNCONFIRMED_REGISTRATION.format(name=jl.prename, - group=group, - link=link), - mail_root, + settings.NEW_UNCONFIRMED_REGISTRATION.format(name=jl.prename, + group=group, + link=link), + settings.DEFAULT_SENDING_MAIL, jl.email) class MemberUnconfirmedManager(models.Manager): @@ -375,8 +375,8 @@ class MemberWaitingList(Person): def ask_for_wait_confirmation(self): """Sends an email to the person asking them to confirm their intention to wait.""" self.send_mail(_('Waiting confirmation needed'), - WAIT_CONFIRMATION_TEXT.format(name=self.prename, - link=get_wait_confirmation_link(self))) + settings.WAIT_CONFIRMATION_TEXT.format(name=self.prename, + link=get_wait_confirmation_link(self))) def confirm_waiting(self, key): # if a wrong key is supplied, we return invalid @@ -415,17 +415,17 @@ class MemberWaitingList(Person): return self.registration_key == key and timezone.now() < self.registration_expire def invite_to_group(self): - send_mail("Gute Neuigkeiten von der JDAV", - INVITE_TEXT.format(name=self.prename, + send_mail(_("Good news"), + settings.INVITE_TEXT.format(name=self.prename, 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 else self.email) class MemberList(models.Model): """Lets the user create a list of members in pdf format. - + DEPRECATED: Replaced by Freizeit and Notizliste """ @@ -866,59 +866,3 @@ def annotate_activity_score(queryset): + F('_jugendleiter_klettertreff_score') + 3 * F('_jugendleiter_freizeit_score')) ) 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""" diff --git a/jdav_web/members/templates/members/crisis_intervention_list.tex b/jdav_web/members/templates/members/crisis_intervention_list.tex index 9dbd369..4434c98 100644 --- a/jdav_web/members/templates/members/crisis_intervention_list.tex +++ b/jdav_web/members/templates/members/crisis_intervention_list.tex @@ -47,12 +47,12 @@ \begin{flushright} \small \noindent Deutscher Alpenverein e. V. \\ - Sektion Ludwigsburg\\ - Fuchshofstr. 66\\ - 71638 Ludwigsburg\\ - Tel.: 07141 927893\\ - Fax: 07141 924042\\ - info@alpenverein-ludwigsburg.de\\ + Sektion {{ settings.SEKTION }} \\ + {{ settings.SEKTION_STREET }} \\ + {{ settings.SEKTION_TOWN }} \\ + Tel.: {{ settings.SEKTION_TELEPHONE }} \\ + Fax: {{ settings.SEKTION_TELEFAX }} \\ + {{ settings.SEKTION_CONCACT_MAIL }} \\ \end{flushright} \end{textblock*} diff --git a/jdav_web/members/templates/members/register.html b/jdav_web/members/templates/members/register.html index 4d724ca..bd5efa9 100644 --- a/jdav_web/members/templates/members/register.html +++ b/jdav_web/members/templates/members/register.html @@ -25,9 +25,10 @@

- {% trans "I am member of the DAV Ludwigsburg." %}
+ {% blocktrans %}I am member of the DAV {{ sektion }}.{% endblocktrans %}
- {% trans "I agree that my data is stored and processed on the server of the JDAV Ludwigsburg." %}

+ {% blocktrans %}I agree that my data is stored and processed on the server of the JDAV {{ sektion }}.{% endblocktrans %} +

diff --git a/jdav_web/members/templates/members/register_password.html b/jdav_web/members/templates/members/register_password.html index cb9ab3f..3ef835a 100644 --- a/jdav_web/members/templates/members/register_password.html +++ b/jdav_web/members/templates/members/register_password.html @@ -10,7 +10,7 @@

{% trans "Register" %}

-

{% trans "Thanks for your interest in participating. Please enter the registration password, your youth leader gave you." %}

+

{% blocktrans %}Thanks for your interest in participating in the JDAV {{ sektion }}. Please enter the registration password, your youth leader gave you.{% endblocktrans %}

{% if error_message %}

{{ error_message }}

diff --git a/jdav_web/members/templates/members/register_waiting_list.html b/jdav_web/members/templates/members/register_waiting_list.html index 223c16e..a178316 100644 --- a/jdav_web/members/templates/members/register_waiting_list.html +++ b/jdav_web/members/templates/members/register_waiting_list.html @@ -25,7 +25,7 @@

- {% trans "I agree that my data is stored and processed on the server of the JDAV Ludwigsburg." %}

+ {% blocktrans %}I agree that my data is stored and processed on the server of the JDAV {{ sektion }}.{% endblocktrans %}

diff --git a/jdav_web/members/templates/members/seminar_report.tex b/jdav_web/members/templates/members/seminar_report.tex index b057e31..83a1593 100644 --- a/jdav_web/members/templates/members/seminar_report.tex +++ b/jdav_web/members/templates/members/seminar_report.tex @@ -54,12 +54,12 @@ \begin{flushright} \small \noindent Deutscher Alpenverein e. V. \\ - Sektion Ludwigsburg\\ - Fuchshofstr. 66\\ - 71638 Ludwigsburg\\ - Tel.: 07141 927893\\ - Fax: 07141 924042\\ - info@alpenverein-ludwigsburg.de\\ + Sektion {{ settings.SEKTION }} \\ + {{ settings.SEKTION_STREET }} \\ + {{ settings.SEKTION_TOWN }} \\ + Tel.: {{ settings.SEKTION_TELEPHONE }} \\ + Fax: {{ settings.SEKTION_TELEFAX }} \\ + {{ settings.SEKTION_CONCACT_MAIL }} \\ \end{flushright} \end{textblock*} diff --git a/jdav_web/members/views.py b/jdav_web/members/views.py index 6bdb49b..f2dc484 100644 --- a/jdav_web/members/views.py +++ b/jdav_web/members/views.py @@ -5,6 +5,7 @@ from django.forms import ModelForm, TextInput, DateInput from members.models import Member, RegistrationPassword, MemberUnconfirmedProxy, MemberWaitingList, Group from django.urls import reverse from django.utils import timezone +from django.conf import settings class MemberForm(ModelForm): @@ -105,7 +106,8 @@ def echo(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): @@ -131,6 +133,7 @@ def render_register(request, group, form=None, pwd=None, waiter_key=''): 'group': group, 'waiter_key': waiter_key, 'pwd': pwd, + 'sektion': settings.SEKTION, }) @@ -225,7 +228,7 @@ def render_register_waiting_list(request, form=None): form = MemberRegistrationWaitingListForm() return render(request, 'members/register_waiting_list.html', - {'form': form}) + {'form': form, 'sektion': settings.SEKTION }) def render_register_waiting_list_success(request, membername): diff --git a/jdav_web/startpage/locale/de/LC_MESSAGES/django.po b/jdav_web/startpage/locale/de/LC_MESSAGES/django.po index 6a8cc5a..d907076 100644 --- a/jdav_web/startpage/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/startpage/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n"