From 1c191496dd7e83a07d1e7c5a8b63df3d80ca87e4 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Thu, 26 Dec 2024 21:26:57 +0100 Subject: [PATCH 01/18] added iban validation check in members admin form --- jdav_web/members/admin.py | 19 ++++++++++++++++++- requirements.txt | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index 65fa705..2983481 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -26,7 +26,7 @@ from django.db.models import TextField, ManyToManyField, ForeignKey, Count,\ Sum, Case, Q, F, When, Value, IntegerField, Subquery, OuterRef from django.forms import Textarea, RadioSelect, TypedChoiceField, CheckboxInput from django.shortcuts import render -from django.core.exceptions import PermissionDenied +from django.core.exceptions import PermissionDenied, ValidationError from .pdf import render_tex, fill_pdf_form, merge_pdfs, serve_pdf from contrib.admin import CommonAdminInlineMixin, CommonAdminMixin @@ -43,6 +43,7 @@ from finance.models import Statement, BillOnExcursionProxy from mailer.mailutils import send as send_mail, get_echo_link from django.conf import settings from utils import get_member +from schwifty import IBAN #from easy_select2 import apply_select2 @@ -161,6 +162,20 @@ class RegistrationFilter(admin.SimpleListFilter): 'display': title } +class MemberAdminForm(forms.ModelForm): + + class Meta: + model = Member + fields = '__all__' + + # check iban validity using schwifty package + def clean_iban(self): + iban_str = self.cleaned_data.get('iban') + if len(iban_str) > 0: + iban = IBAN(iban_str, allow_invalid=True) + if not iban.is_valid: + raise ValidationError("Die angegebene IBAN ist nicht valide.") + return iban_str # Register your models here. class MemberAdmin(CommonAdminMixin, admin.ModelAdmin): @@ -224,6 +239,8 @@ class MemberAdmin(CommonAdminMixin, admin.ModelAdmin): actions = ['request_echo', 'invite_as_user_action'] list_per_page = 25 + form = MemberAdminForm + sensitive_fields = ['iban', 'registration_form', 'comments'] field_view_permissions = { diff --git a/requirements.txt b/requirements.txt index b490373..747d2f9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -48,6 +48,7 @@ pytz==2021.3 redis==4.1.0 requests==2.32.3 rules==3.3 +schwifty==2024.11.0 six==1.16.0 snowballstemmer==2.2.0 Sphinx==7.4.7 -- 2.38.4 From 100732602fd7b6338537273bc5b5657bc3213c86 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Thu, 26 Dec 2024 21:58:28 +0100 Subject: [PATCH 02/18] added EPC qr code to transaction overview --- jdav_web/finance/models.py | 36 +++++++++++++++++++ .../templates/admin/confirmed_statement.html | 17 +++++++++ 2 files changed, 53 insertions(+) diff --git a/jdav_web/finance/models.py b/jdav_web/finance/models.py index 4ad3196..1cca51a 100644 --- a/jdav_web/finance/models.py +++ b/jdav_web/finance/models.py @@ -15,6 +15,9 @@ from contrib.models import CommonModel from contrib.rules import has_global_perm from utils import cvt_to_decimal +from schwifty import IBAN +import re + # Create your models here. class Ledger(models.Model): @@ -487,6 +490,39 @@ class Transaction(models.Model): def __str__(self): return "T#{}".format(self.pk) + + @staticmethod + def escape_reference(reference): + umlaut_map = { + 'ä': 'ae', 'ö': 'oe', 'ü': 'ue', + 'Ä': 'Ae', 'Ö': 'Oe', 'Ü': 'Ue', + 'ß': 'ss' + } + pattern = re.compile('|'.join(umlaut_map.keys())) + int_reference = pattern.sub(lambda x: umlaut_map[x.group()], reference) + allowed_chars = r"[^a-z0-9 /?: .,'+-]" + clean_reference = re.sub(allowed_chars, '', int_reference, flags=re.IGNORECASE) + return clean_reference + + def code(self): + + if self.amount == 0: + return "" + + reference = self.escape_reference(self.reference) + iban = IBAN(self.member.iban) + bic = iban.bic + return f"""BCD +001 +1 +SCT +{bic} +{self.member.prename} {self.member.lastname} +{iban} +EUR{self.amount} + + +{reference}""" class Meta: verbose_name = _('Transaction') diff --git a/jdav_web/finance/templates/admin/confirmed_statement.html b/jdav_web/finance/templates/admin/confirmed_statement.html index aa2c079..2e6350a 100644 --- a/jdav_web/finance/templates/admin/confirmed_statement.html +++ b/jdav_web/finance/templates/admin/confirmed_statement.html @@ -7,6 +7,8 @@ + + {% endblock %} {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} admin-view @@ -36,6 +38,7 @@ {% trans "Amount" %} {% trans "Reference" %} {% trans "Ledger" %} + {% trans "QR Code" %} {% for transaction in statement.transaction_set.all %} @@ -54,6 +57,20 @@ {{ transaction.ledger }} + +
+ + {% endfor %} -- 2.38.4 From 36b6797adea2fd16038a315bbc1c9793248702ac Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sat, 28 Dec 2024 00:38:11 +0100 Subject: [PATCH 03/18] added validation-check for existing incorrect ibans --- jdav_web/finance/models.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/jdav_web/finance/models.py b/jdav_web/finance/models.py index e8f9f0f..d81539d 100644 --- a/jdav_web/finance/models.py +++ b/jdav_web/finance/models.py @@ -497,7 +497,7 @@ class Transaction(models.Model): def __str__(self): return "T#{}".format(self.pk) - + @staticmethod def escape_reference(reference): umlaut_map = { @@ -510,15 +510,19 @@ class Transaction(models.Model): allowed_chars = r"[^a-z0-9 /?: .,'+-]" clean_reference = re.sub(allowed_chars, '', int_reference, flags=re.IGNORECASE) return clean_reference - + def code(self): - + if self.amount == 0: return "" - - reference = self.escape_reference(self.reference) - iban = IBAN(self.member.iban) + + iban = IBAN(self.member.iban, allow_invalid=True) + if not iban.is_valid: + return "" bic = iban.bic + + reference = self.escape_reference(self.reference) + return f"""BCD 001 1 -- 2.38.4 From 77675dbeef0266fef9efe243424f85d4c8f0841c Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sat, 28 Dec 2024 00:38:43 +0100 Subject: [PATCH 04/18] implemented translations --- .../finance/locale/de/LC_MESSAGES/django.po | 136 +++++++++-------- jdav_web/members/admin.py | 8 +- .../members/locale/de/LC_MESSAGES/django.po | 144 +++++++++--------- 3 files changed, 148 insertions(+), 140 deletions(-) diff --git a/jdav_web/finance/locale/de/LC_MESSAGES/django.po b/jdav_web/finance/locale/de/LC_MESSAGES/django.po index cc5404f..9b9982a 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: 2024-12-01 16:23+0100\n" +"POT-Creation-Date: 2024-12-28 00:29+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" -#: finance/admin.py:76 +#: finance/admin.py:84 #, python-format msgid "%(name)s is already submitted." msgstr "%(name)s ist bereits eingereicht." -#: finance/admin.py:82 +#: finance/admin.py:90 #, 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." -#: finance/admin.py:85 +#: finance/admin.py:93 msgid "Submit statement" msgstr "Rechnung einreichen" -#: finance/admin.py:162 +#: finance/admin.py:177 #, python-format msgid "%(name)s is not yet submitted." msgstr "%(name)s ist noch nicht eingereicht." -#: finance/admin.py:169 +#: finance/admin.py:184 #, 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." -#: finance/admin.py:173 +#: finance/admin.py:188 #, 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." -#: finance/admin.py:180 +#: finance/admin.py:195 msgid "Statement confirmed" msgstr "Abrechnung abgewickelt" -#: finance/admin.py:186 +#: finance/admin.py:201 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." -#: finance/admin.py:191 +#: finance/admin.py:206 msgid "Some transactions have no ledger configured. Please fill in the gaps." msgstr "" "Manche Überweisungen haben kein Geldtopf eingestellt. Bitte trage das nach." -#: finance/admin.py:200 +#: finance/admin.py:215 #, 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." -#: finance/admin.py:207 +#: finance/admin.py:222 #, python-format msgid "" "%(name)s already has transactions. Please delete them first, if you want to " @@ -90,12 +90,12 @@ msgstr "" "%(name)s hat bereits Überweisungen. Bitte lösche diese zunächst, bevor du " "neue generierst." -#: finance/admin.py:212 +#: finance/admin.py:227 #, python-format msgid "Successfully generated transactions for %(name)s" msgstr "Automatisch Überweisungsträger für %(name)s generiert." -#: finance/admin.py:215 +#: finance/admin.py:230 #, python-format msgid "" "Error while generating transactions for %(name)s. Do all bills have a payer?" @@ -103,28 +103,28 @@ msgstr "" "Fehler beim Erzeugen der Überweisungsträger für %(name)s. Sind für alle " "Quittungen eine bezahlende Person eingestellt? " -#: finance/admin.py:218 +#: finance/admin.py:233 msgid "View submitted statement" msgstr "Eingereichte Abrechnung einsehen" -#: finance/admin.py:230 +#: finance/admin.py:245 #, python-format msgid "Successfully reduced transactions for %(name)s." msgstr "Überweisungsträger für %(name)s minimiert." -#: finance/admin.py:274 +#: finance/admin.py:293 #, python-format msgid "%(name)s is not yet confirmed." msgstr "%(name)s ist noch nicht bestätigt." -#: finance/admin.py:283 +#: finance/admin.py:302 #, python-format msgid "Successfully unconfirmed %(name)s. I hope you know what you are doing." msgstr "" "Erfolgreich die Bestätigung von %(name)s zurückgenommen. Ich hoffe du weißt " "was du machst." -#: finance/admin.py:288 finance/templates/admin/unconfirm_statement.html:26 +#: finance/admin.py:307 finance/templates/admin/unconfirm_statement.html:26 msgid "Unconfirm statement" msgstr "Bestätigung zurücknehmen" @@ -132,185 +132,185 @@ msgstr "Bestätigung zurücknehmen" msgid "Finance" msgstr "Finanzen" -#: finance/models.py:21 +#: finance/models.py:24 msgid "Name" msgstr "Name" -#: finance/models.py:27 finance/models.py:472 finance/models.py:496 -#: finance/templates/admin/confirmed_statement.html:38 +#: finance/models.py:30 finance/models.py:484 finance/models.py:545 +#: finance/templates/admin/confirmed_statement.html:40 #: finance/templates/admin/overview_submitted_statement.html:100 msgid "Ledger" msgstr "Geldtopf" -#: finance/models.py:28 +#: finance/models.py:31 msgid "Ledgers" msgstr "Geldtöpfe" -#: finance/models.py:48 finance/models.py:415 finance/models.py:495 +#: finance/models.py:51 finance/models.py:420 finance/models.py:544 msgid "Short description" msgstr "Kurzbeschreibung" -#: finance/models.py:51 finance/models.py:416 +#: finance/models.py:54 finance/models.py:421 msgid "Explanation" msgstr "Erklärung" -#: finance/models.py:53 +#: finance/models.py:56 msgid "Associated excursion" msgstr "Zugehörige Ausfahrt" -#: finance/models.py:58 +#: finance/models.py:61 msgid "Price per night" msgstr "Preis pro Nacht" -#: finance/models.py:60 +#: finance/models.py:63 msgid "Submitted" msgstr "Eingericht" -#: finance/models.py:61 +#: finance/models.py:64 msgid "Submitted on" msgstr "Eingereicht am" -#: finance/models.py:62 +#: finance/models.py:65 msgid "Confirmed" msgstr "Abgewickelt" -#: finance/models.py:63 finance/models.py:479 +#: finance/models.py:66 finance/models.py:491 msgid "Paid on" msgstr "Bezahlt am" -#: finance/models.py:65 +#: finance/models.py:68 msgid "Created by" msgstr "Erstellt von" -#: finance/models.py:70 +#: finance/models.py:73 msgid "Submitted by" msgstr "Eingereicht von" -#: finance/models.py:75 finance/models.py:480 +#: finance/models.py:78 finance/models.py:492 msgid "Authorized by" msgstr "Autorisiert von" -#: finance/models.py:82 finance/models.py:414 finance/models.py:475 +#: finance/models.py:85 finance/models.py:419 finance/models.py:487 msgid "Statement" msgstr "Abrechnung" -#: finance/models.py:83 +#: finance/models.py:86 msgid "Statements" msgstr "Abrechnungen" -#: finance/models.py:98 +#: finance/models.py:101 #, python-format msgid "Statement: %(excursion)s" msgstr "Abrechnung: %(excursion)s" -#: finance/models.py:150 +#: finance/models.py:153 msgid "Ready to confirm" msgstr "Bereit zur Abwicklung" -#: finance/models.py:194 +#: finance/models.py:197 #, python-format msgid "Compensation for %(excu)s" msgstr "Entschädigung für %(excu)s" -#: finance/models.py:327 +#: finance/models.py:330 #: finance/templates/admin/overview_submitted_statement.html:78 msgid "Total" msgstr "Gesamtbetrag" -#: finance/models.py:369 +#: finance/models.py:374 msgid "Statement in preparation" msgstr "Abrechnung in Vorbereitung" -#: finance/models.py:370 +#: finance/models.py:375 msgid "Statements in preparation" msgstr "Abrechnungen in Vorbereitung" -#: finance/models.py:389 +#: finance/models.py:394 msgid "Submitted statement" msgstr "Eingereichte Abrechnung" -#: finance/models.py:390 +#: finance/models.py:395 msgid "Submitted statements" msgstr "Eingereichte Abrechnungen" -#: finance/models.py:406 +#: finance/models.py:411 msgid "Paid statement" msgstr "Bezahlte Abrechnung" -#: finance/models.py:407 +#: finance/models.py:412 msgid "Paid statements" msgstr "Bezahlte Abrechnungen" -#: finance/models.py:418 finance/models.py:432 finance/models.py:469 -#: finance/templates/admin/confirmed_statement.html:36 +#: finance/models.py:423 finance/models.py:444 finance/models.py:481 +#: finance/templates/admin/confirmed_statement.html:38 #: finance/templates/admin/overview_submitted_statement.html:31 #: finance/templates/admin/overview_submitted_statement.html:98 msgid "Amount" msgstr "Betrag" -#: finance/models.py:419 +#: finance/models.py:424 msgid "Paid by" msgstr "Bezahlt von" -#: finance/models.py:421 +#: finance/models.py:426 msgid "Covered" msgstr "Übernommen" -#: finance/models.py:422 +#: finance/models.py:427 msgid "Refunded" msgstr "Ausgezahlt" -#: finance/models.py:424 +#: finance/models.py:429 msgid "Proof" msgstr "Beleg" -#: finance/models.py:435 finance/models.py:442 finance/models.py:455 +#: finance/models.py:447 finance/models.py:454 finance/models.py:467 msgid "Bill" msgstr "Ausgabe" -#: finance/models.py:436 finance/models.py:443 finance/models.py:456 +#: finance/models.py:448 finance/models.py:455 finance/models.py:468 #: finance/templates/admin/overview_submitted_statement.html:26 msgid "Bills" msgstr "Ausgaben" -#: finance/models.py:468 finance/templates/admin/confirmed_statement.html:37 +#: finance/models.py:480 finance/templates/admin/confirmed_statement.html:39 #: finance/templates/admin/overview_submitted_statement.html:99 msgid "Reference" msgstr "Verwendungszweck" -#: finance/models.py:470 +#: finance/models.py:482 msgid "Recipient" msgstr "Empfänger" -#: finance/models.py:478 +#: finance/models.py:490 msgid "Paid" msgstr "Bezahlt" -#: finance/models.py:490 +#: finance/models.py:539 msgid "Transaction" msgstr "Überweisung" -#: finance/models.py:491 +#: finance/models.py:540 #: finance/templates/admin/overview_submitted_statement.html:84 msgid "Transactions" msgstr "Überweisungen" -#: finance/templates/admin/confirmed_statement.html:17 +#: finance/templates/admin/confirmed_statement.html:19 #: finance/templates/admin/overview_submitted_statement.html:17 #: finance/templates/admin/submit_statement.html:17 #: finance/templates/admin/unconfirm_statement.html:17 msgid "Home" msgstr "Start" -#: finance/templates/admin/confirmed_statement.html:21 +#: finance/templates/admin/confirmed_statement.html:23 msgid "Paiment" msgstr "Bezahlung" -#: finance/templates/admin/confirmed_statement.html:26 +#: finance/templates/admin/confirmed_statement.html:28 msgid "Paying statement" msgstr "Rechnung bezahlen" -#: finance/templates/admin/confirmed_statement.html:29 +#: finance/templates/admin/confirmed_statement.html:31 msgid "" "The statement is valid. Please execute the following transactions and then " "proceed by finalizing the confirmation." @@ -318,15 +318,19 @@ msgstr "" "Die Abrechnung ist gültig. Bitte führe die folgenden Überweisungen aus und " "fahre dann fort, indem du die Abwicklung bestätigst." -#: finance/templates/admin/confirmed_statement.html:35 +#: finance/templates/admin/confirmed_statement.html:37 msgid "IBAN" msgstr "IBAN" -#: finance/templates/admin/confirmed_statement.html:66 +#: finance/templates/admin/confirmed_statement.html:41 +msgid "QR Code" +msgstr "QR Code" + +#: finance/templates/admin/confirmed_statement.html:83 msgid "I did execute the listed transactions." msgstr "Ich habe die aufgeführten Überweisungen ausgeführt." -#: finance/templates/admin/confirmed_statement.html:68 +#: finance/templates/admin/confirmed_statement.html:85 msgid "Confirm" msgstr "Bestätigen" diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index 670fc0d..ba54706 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -164,18 +164,18 @@ class RegistrationFilter(admin.SimpleListFilter): } class MemberAdminForm(forms.ModelForm): - + class Meta: model = Member fields = '__all__' - + # check iban validity using schwifty package def clean_iban(self): iban_str = self.cleaned_data.get('iban') if len(iban_str) > 0: iban = IBAN(iban_str, allow_invalid=True) if not iban.is_valid: - raise ValidationError("Die angegebene IBAN ist nicht valide.") + raise ValidationError(_("The entered IBAN is not valid.")) return iban_str # Register your models here. @@ -240,7 +240,7 @@ class MemberAdmin(CommonAdminMixin, admin.ModelAdmin): list_per_page = 25 form = MemberAdminForm - + sensitive_fields = ['iban', 'registration_form', 'comments'] field_view_permissions = { diff --git a/jdav_web/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po index cfd1dbb..46a6474 100644 --- a/jdav_web/members/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/members/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-19 01:21+0100\n" +"POT-Creation-Date: 2024-12-28 00:29+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,190 +18,194 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: members/admin.py:127 members/models.py:412 +#: members/admin.py:129 members/models.py:412 msgid "Registration complete" msgstr "Anmeldung vollständig" -#: members/admin.py:133 +#: members/admin.py:135 msgid "True" msgstr "Ja" -#: members/admin.py:134 +#: members/admin.py:136 msgid "False" msgstr "Nein" -#: members/admin.py:135 +#: members/admin.py:137 msgid "All" msgstr "Alle" -#: members/admin.py:185 members/admin.py:415 +#: members/admin.py:178 +msgid "The entered IBAN is not valid." +msgstr "Die eingegebene IBAN ist ungültig." + +#: members/admin.py:201 members/admin.py:432 msgid "Contact information" msgstr "Kontaktinformationen" -#: members/admin.py:190 members/admin.py:420 +#: members/admin.py:206 members/admin.py:437 msgid "Skills" msgstr "Fähigkeiten" -#: members/admin.py:195 members/admin.py:425 +#: members/admin.py:211 members/admin.py:442 msgid "Others" msgstr "Sonstiges" -#: members/admin.py:201 members/admin.py:430 +#: members/admin.py:217 members/admin.py:447 msgid "Organizational" msgstr "Organisatorisches" -#: members/admin.py:283 +#: members/admin.py:300 msgid "Compose new mail to selected members" msgstr "Neue Nachricht an ausgewählte Teilnehmer*innen verfassen" -#: members/admin.py:289 +#: members/admin.py:306 msgid "Echo required" msgstr "Rückmeldung erforderlich" -#: members/admin.py:291 +#: members/admin.py:308 msgid "Successfully requested echo from selected members." msgstr "" "Rückmeldungsaufforderung erfolgreich an ausgewählte Teilnehmer*innen " "verschickt." -#: members/admin.py:292 +#: members/admin.py:309 msgid "Request echo from selected members" msgstr "Rückmeldungsaufforderung an ausgewählte Teilnehmer*innen verschicken" -#: members/admin.py:301 +#: members/admin.py:318 #, python-format msgid "%(name)s does not have a DAV360 email address or is already registered." msgstr "%(name)s hat keine DAV360 E-Mail Adresse oder ist bereits registriert." -#: members/admin.py:303 +#: members/admin.py:320 #, python-format msgid "Successfully invited %(name)s as user." msgstr "Erfolgreich %(name)s aufgefordert Zugangsdaten zu wählen." -#: members/admin.py:305 +#: members/admin.py:322 msgid "Successfully invited selected members to join as users." msgstr "" "Erfolgreich ausgewählte Teilnehmer*innen aufgefordert Zugangsdaten zu wählen." -#: members/admin.py:307 +#: members/admin.py:324 msgid "Some members have been invited, others could not be invited." msgstr "" "Manche Teilnehmer*innen wurden eingeladen, andere konnten nicht eingeladen " "werden." -#: members/admin.py:314 members/admin.py:331 +#: members/admin.py:331 members/admin.py:348 msgid "Permission denied." msgstr "Fehlende Berechtigungen." -#: members/admin.py:321 members/admin.py:355 +#: members/admin.py:338 members/admin.py:372 #: members/templates/admin/invite_as_user.html:21 msgid "Invite as user" msgstr "Kompass Zugangsdaten wählen lassen" -#: members/admin.py:326 +#: members/admin.py:343 msgid "Invite selected members to join Kompass as users." msgstr "Ausgewählte Teilnehmer*innen Kompass Zugangsdaten wählen lassen." -#: members/admin.py:337 +#: members/admin.py:354 msgid "Member not found." msgstr "Teilnehmer*in nicht gefunden." -#: members/admin.py:341 +#: members/admin.py:358 #, python-format msgid "%(name)s already has login data." msgstr "%(name)s hat schon Zugangsdaten." -#: members/admin.py:346 +#: members/admin.py:363 #, python-format msgid "The configured email address for %(name)s is not an internal one." msgstr "Die für %(name)s eingestellte E-Mail Adresse ist keine DAV360 Adresse." -#: members/admin.py:360 +#: members/admin.py:377 #, python-format msgid "%(name)s already has a pending invitation as user." msgstr "" "%(name)s hat bereits eine ausstehende Aufforderung Zugangsdaten zu wählen." -#: members/admin.py:378 +#: members/admin.py:395 msgid "activity" msgstr "Aktivität" -#: members/admin.py:388 members/models.py:56 members/models.py:1572 +#: members/admin.py:405 members/models.py:56 members/models.py:1572 msgid "Name" msgstr "Name" -#: members/admin.py:479 +#: members/admin.py:496 msgid "Successfully requested mail confirmation from selected registrations." msgstr "Aufforderung zur Bestätigung der Email Adresse versendet." -#: members/admin.py:480 +#: members/admin.py:497 msgid "Request mail confirmation from selected registrations" msgstr "Aufforderung zur Bestätigung der Email Adresse versenden" -#: members/admin.py:487 members/admin.py:552 +#: members/admin.py:504 members/admin.py:569 #, python-format msgid "Successfully confirmed %(name)s." msgstr "Registrierung von %(name)s erfolgreich bestätigt." -#: members/admin.py:491 members/admin.py:555 +#: members/admin.py:508 members/admin.py:572 #, python-format msgid "Can't confirm. %(name)s has unconfirmed email addresses." msgstr "Bestätigung nicht möglich. %(name)s hat unbestätigte Emailadressen." -#: members/admin.py:496 +#: members/admin.py:513 msgid "Successfully confirmed multiple registrations." msgstr "Erfolgreich mehrere Registrierungen bestätigt." -#: members/admin.py:498 +#: members/admin.py:515 msgid "" "Failed to confirm some registrations because of unconfirmed email addresses." msgstr "" "Einige Bestätigungen fehlgeschlagen, weil Emailadressen noch nicht bestätigt " "sind." -#: members/admin.py:499 +#: members/admin.py:516 msgid "Confirm selected registrations" msgstr "Ausgewählte Registrierungen bestätigen" -#: members/admin.py:522 +#: members/admin.py:539 msgid "Demote selected registrations to waiters." msgstr "Ausgewählte Registrierungen zurück auf die Warteliste setzen." -#: members/admin.py:538 +#: members/admin.py:555 msgid "Demote member to waiter" msgstr "Ausgewählte Registrierung zurück auf die Warteliste setzen." -#: members/admin.py:547 +#: members/admin.py:564 #, python-format msgid "Successfully demoted %(name)s to waiter." msgstr "%(name)s zurück auf die Warteliste gesetzt." -#: members/admin.py:562 members/models.py:419 members/models.py:822 +#: members/admin.py:579 members/models.py:419 members/models.py:822 #: members/models.py:1317 msgid "Group" msgstr "Gruppe" -#: members/admin.py:577 +#: members/admin.py:594 msgid "Pending group invitation for group" msgstr "Ausstehende Gruppeneinladung für Gruppe" -#: members/admin.py:610 +#: members/admin.py:627 #, python-format msgid "Successfully asked %(name)s to confirm their waiting status." msgstr "Erfolgreich %(name)s aufgefordert den Wartelistenplatz zu bestätigen." -#: members/admin.py:611 +#: members/admin.py:628 msgid "Ask selected waiters to confirm their waiting status" msgstr "Wartende auffordern den Wartelistenplatz zu bestätigen" -#: members/admin.py:620 members/admin.py:684 +#: members/admin.py:637 members/admin.py:701 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. " -#: members/admin.py:624 members/admin.py:689 +#: members/admin.py:641 members/admin.py:706 msgid "" "The selected group does not have a contact email. Please first set a contact " "email and then try again." @@ -209,43 +213,43 @@ msgstr "" "Die ausgewählte Gruppe hat keine Kontakt E-Mail Adresse. Bitte stelle eine " "Kontakt E-Mail Adresse ein und versuche es erneut." -#: members/admin.py:632 members/admin.py:696 +#: members/admin.py:649 members/admin.py:713 #, python-format msgid "Successfully invited %(name)s to %(group)s." msgstr "Erfolgreich %(name)s zu Gruppe %(group)s eingeladen." -#: members/admin.py:636 members/admin.py:702 +#: members/admin.py:653 members/admin.py:719 msgid "Select group for invitation" msgstr "Wähle Gruppe für Einladung aus" -#: members/admin.py:643 +#: members/admin.py:660 msgid "Offer waiter a place in a group." msgstr "Personen auf der Warteliste einen Gruppenplatz anbieten." -#: members/admin.py:719 members/models.py:72 +#: members/admin.py:736 members/models.py:72 msgid "name" msgstr "Name" -#: members/admin.py:720 +#: members/admin.py:737 msgid "" "The group name may only consist of letters, numerals, _, -, :, * and spaces." msgstr "" "Der Gruppenname darf nur aus Buchstaben, Zahlen, _, -, :, * oder Leerzeichen " "bestehen." -#: members/admin.py:749 +#: members/admin.py:766 msgid "Difficulty" msgstr "Schwierigkeit" -#: members/admin.py:752 +#: members/admin.py:769 msgid "Tour type" msgstr "Art der Tour" -#: members/admin.py:755 members/models.py:1048 +#: members/admin.py:772 members/models.py:1048 msgid "Means of transportation" msgstr "Verkehrsmittel" -#: members/admin.py:781 +#: members/admin.py:799 msgid "" "Please list here all expenses in relation with this excursion and upload " "relevant bills. These have to be permanently stored for the application of " @@ -258,7 +262,7 @@ msgstr "" "einzelnen Posten wird dabei auf der LJP-Kostenübersicht angezeigt (sinnvoll " "wären z.B. Anreise, Verpflegung, Material etc.)." -#: members/admin.py:799 +#: members/admin.py:817 msgid "" "Here you can work on a seminar report for applying for financial " "contributions from Landesjugendplan (LJP). More information on creating a " @@ -271,7 +275,7 @@ msgstr "" "wahlweise nur TN-Liste und Kostenübersicht kannst du anschließend " "herunterladen." -#: members/admin.py:807 +#: members/admin.py:825 msgid "" "Please list all participants (also youth leaders) of this excursion. Here " "you can still make changes just before departure and hence generate the " @@ -282,34 +286,34 @@ msgstr "" "jederzeit die aktuelle Teilnehmer*innenliste für die Krisenintervention " "generieren." -#: members/admin.py:853 +#: members/admin.py:871 #, python-format msgid "You are not allowed to view all members on note list %(name)s." msgstr "" "Du hast nicht die nötigen Rechte um alle Teilnehmer*innen der Notizliste " "%(name)s anzusehen." -#: members/admin.py:863 +#: members/admin.py:881 msgid "Generate PDF summary" msgstr "Übersicht erstellen" -#: members/admin.py:867 +#: members/admin.py:885 msgid "Full report" msgstr "Vollständiger Seminarbericht" -#: members/admin.py:868 +#: members/admin.py:886 msgid "Costs and participants only" msgstr "Nur Kosten und Teilnehmende" -#: members/admin.py:869 +#: members/admin.py:887 msgid "Mode" msgstr "Modus" -#: members/admin.py:870 +#: members/admin.py:888 msgid "Prepend V32" msgstr "V32 Formblatt einfügen" -#: members/admin.py:886 +#: members/admin.py:904 msgid "" "General information on your excursion. These are partly relevant for the " "amount of financial compensation (means of transport, travel distance, etc.)." @@ -318,48 +322,48 @@ msgstr "" "teilweise relevant für die Zuschüsse aus dem Jugendetat (Verkehrsmittel, " "Fahrstrecke in km)." -#: members/admin.py:916 +#: members/admin.py:934 #, python-format msgid "You are not allowed to view all members on excursion %(name)s." msgstr "" "Du hast nicht die nötigen Rechte um alle Teilnehmer*innen der Ausfahrt " "%(name)s anzusehen." -#: members/admin.py:924 +#: members/admin.py:942 msgid "Generate crisis intervention list" msgstr "Kriseninterventionsliste erstellen" -#: members/admin.py:932 +#: members/admin.py:950 msgid "Generate overview" msgstr "Hinweise für Jugendleiter erstellen" -#: members/admin.py:936 members/admin.py:968 +#: members/admin.py:954 members/admin.py:986 #: members/templates/admin/generate_seminar_report.html:21 msgid "Generate seminar report" msgstr "Landesjugendplan Antrag erstellen" -#: members/admin.py:949 +#: members/admin.py:967 msgid "Please select a mode." msgstr "Bitte wähle einen Modus aus." -#: members/admin.py:954 +#: members/admin.py:972 msgid "" "Full mode is only available, if the seminar report section is filled out." msgstr "" "Der vollständiger Modus ist nur verfügbar, wenn der Seminarbericht " "ausgefüllt ist. " -#: members/admin.py:980 +#: members/admin.py:998 msgid "Generate SJR application" msgstr "SJR Antrag erstellen" -#: members/admin.py:984 +#: members/admin.py:1002 msgid "No statement found. Please add a statement and then retry." msgstr "" "Keine Abrechnung angelegt. Bitte lege eine Abrechnung and und versuche es " "erneut." -#: members/admin.py:988 +#: members/admin.py:1006 msgid "" "Successfully submited statement. The finance department will notify you as " "soon as possible." @@ -367,7 +371,7 @@ msgstr "" "Abrechnung erfolgreich eingericht. Die Finanzabteilung wird sich bei dir so " "schnell wie möglich melden." -#: members/admin.py:991 +#: members/admin.py:1009 #: members/templates/admin/freizeit_finance_overview.html:21 msgid "Finance overview" msgstr "Kostenübersicht" -- 2.38.4 From c510453fa98ddd2bb77d0ad51a94ffff7f44b887 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sat, 28 Dec 2024 01:13:43 +0100 Subject: [PATCH 05/18] fixed qr for members with umlaut --- jdav_web/finance/models.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/jdav_web/finance/models.py b/jdav_web/finance/models.py index d81539d..d27b74f 100644 --- a/jdav_web/finance/models.py +++ b/jdav_web/finance/models.py @@ -522,13 +522,15 @@ class Transaction(models.Model): bic = iban.bic reference = self.escape_reference(self.reference) - + + # also escaping receiver as umlaute are also not allowed here + receiver = self.escape_reference(f"{self.member.prename} {self.member.lastname}") return f"""BCD 001 1 SCT {bic} -{self.member.prename} {self.member.lastname} +{receiver} {iban} EUR{self.amount} -- 2.38.4 From 6bcd068b634e43767395bd9cdb981c0863a9acff Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sat, 28 Dec 2024 01:14:48 +0100 Subject: [PATCH 06/18] improved qr code display --- .../finance/locale/de/LC_MESSAGES/django.po | 27 +++++++--- .../templates/admin/confirmed_statement.html | 52 ++++++++++++++----- 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/jdav_web/finance/locale/de/LC_MESSAGES/django.po b/jdav_web/finance/locale/de/LC_MESSAGES/django.po index 9b9982a..5da218d 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: 2024-12-28 00:29+0100\n" +"POT-Creation-Date: 2024-12-28 01:22+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -136,7 +136,7 @@ msgstr "Finanzen" msgid "Name" msgstr "Name" -#: finance/models.py:30 finance/models.py:484 finance/models.py:545 +#: finance/models.py:30 finance/models.py:484 finance/models.py:547 #: finance/templates/admin/confirmed_statement.html:40 #: finance/templates/admin/overview_submitted_statement.html:100 msgid "Ledger" @@ -146,7 +146,7 @@ msgstr "Geldtopf" msgid "Ledgers" msgstr "Geldtöpfe" -#: finance/models.py:51 finance/models.py:420 finance/models.py:544 +#: finance/models.py:51 finance/models.py:420 finance/models.py:546 msgid "Short description" msgstr "Kurzbeschreibung" @@ -286,11 +286,11 @@ msgstr "Empfänger" msgid "Paid" msgstr "Bezahlt" -#: finance/models.py:539 +#: finance/models.py:541 msgid "Transaction" msgstr "Überweisung" -#: finance/models.py:540 +#: finance/models.py:542 #: finance/templates/admin/overview_submitted_statement.html:84 msgid "Transactions" msgstr "Überweisungen" @@ -326,11 +326,24 @@ msgstr "IBAN" msgid "QR Code" msgstr "QR Code" -#: finance/templates/admin/confirmed_statement.html:83 +#: finance/templates/admin/confirmed_statement.html:61 +#: finance/templates/admin/confirmed_statement.html:98 +msgid "Show" +msgstr "Anzeigen" + +#: finance/templates/admin/confirmed_statement.html:86 +msgid "No QR code can be displayed." +msgstr "Es kann kein QR-Code angezeigt werden." + +#: finance/templates/admin/confirmed_statement.html:99 +msgid "Showing" +msgstr "Sichtbar" + +#: finance/templates/admin/confirmed_statement.html:111 msgid "I did execute the listed transactions." msgstr "Ich habe die aufgeführten Überweisungen ausgeführt." -#: finance/templates/admin/confirmed_statement.html:85 +#: finance/templates/admin/confirmed_statement.html:113 msgid "Confirm" msgstr "Bestätigen" diff --git a/jdav_web/finance/templates/admin/confirmed_statement.html b/jdav_web/finance/templates/admin/confirmed_statement.html index 2e6350a..d769ba2 100644 --- a/jdav_web/finance/templates/admin/confirmed_statement.html +++ b/jdav_web/finance/templates/admin/confirmed_statement.html @@ -58,24 +58,52 @@ {{ transaction.ledger }} -
- + {% trans "Show" %} {% endfor %}

+ + + + + + +
{% csrf_token %}

-- 2.38.4 From 0dadb3fc3b0c03470fea22059c79c1a341ca1dd5 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 28 Dec 2024 23:00:38 +0100 Subject: [PATCH 07/18] fix members locale --- .../members/locale/de/LC_MESSAGES/django.po | 150 +++++++++--------- 1 file changed, 77 insertions(+), 73 deletions(-) diff --git a/jdav_web/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po index 76e354b..6f46c53 100644 --- a/jdav_web/members/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/members/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-27 18:18+0100\n" +"POT-Creation-Date: 2024-12-28 22:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: members/admin.py:127 members/models.py:430 +#: members/admin.py:129 members/models.py:430 msgid "Registration complete" msgstr "Anmeldung vollständig" @@ -34,182 +34,186 @@ msgstr "Nein" msgid "All" msgstr "Alle" -#: members/admin.py:185 members/admin.py:414 +#: members/admin.py:178 +msgid "The entered IBAN is not valid." +msgstr "Die eingegebene IBAN ist ungültig." + +#: members/admin.py:201 members/admin.py:432 msgid "Contact information" msgstr "Kontaktinformationen" -#: members/admin.py:190 members/admin.py:419 +#: members/admin.py:206 members/admin.py:437 msgid "Skills" msgstr "Fähigkeiten" -#: members/admin.py:195 members/admin.py:424 +#: members/admin.py:211 members/admin.py:442 msgid "Others" msgstr "Sonstiges" -#: members/admin.py:201 members/admin.py:429 +#: members/admin.py:217 members/admin.py:447 msgid "Organizational" msgstr "Organisatorisches" -#: members/admin.py:282 +#: members/admin.py:300 msgid "Compose new mail to selected members" msgstr "Neue Nachricht an ausgewählte Teilnehmer*innen verfassen" -#: members/admin.py:288 +#: members/admin.py:306 msgid "Echo required" msgstr "Rückmeldung erforderlich" -#: members/admin.py:290 +#: members/admin.py:308 msgid "Successfully requested echo from selected members." msgstr "" "Rückmeldungsaufforderung erfolgreich an ausgewählte Teilnehmer*innen " "verschickt." -#: members/admin.py:291 +#: members/admin.py:309 msgid "Request echo from selected members" msgstr "Rückmeldungsaufforderung an ausgewählte Teilnehmer*innen verschicken" -#: members/admin.py:300 +#: members/admin.py:318 #, python-format msgid "%(name)s does not have a DAV360 email address or is already registered." msgstr "%(name)s hat keine DAV360 E-Mail Adresse oder ist bereits registriert." -#: members/admin.py:302 +#: members/admin.py:320 #, python-format msgid "Successfully invited %(name)s as user." msgstr "Erfolgreich %(name)s aufgefordert Zugangsdaten zu wählen." -#: members/admin.py:304 +#: members/admin.py:322 msgid "Successfully invited selected members to join as users." msgstr "" "Erfolgreich ausgewählte Teilnehmer*innen aufgefordert Zugangsdaten zu wählen." -#: members/admin.py:306 +#: members/admin.py:324 msgid "Some members have been invited, others could not be invited." msgstr "" "Manche Teilnehmer*innen wurden eingeladen, andere konnten nicht eingeladen " "werden." -#: members/admin.py:313 members/admin.py:330 +#: members/admin.py:331 members/admin.py:348 msgid "Permission denied." msgstr "Fehlende Berechtigungen." -#: members/admin.py:320 members/admin.py:354 +#: members/admin.py:338 members/admin.py:372 #: members/templates/admin/invite_as_user.html:21 msgid "Invite as user" msgstr "Kompass Zugangsdaten wählen lassen" -#: members/admin.py:325 +#: members/admin.py:343 msgid "Invite selected members to join Kompass as users." msgstr "Ausgewählte Teilnehmer*innen Kompass Zugangsdaten wählen lassen." -#: members/admin.py:336 +#: members/admin.py:354 msgid "Member not found." msgstr "Teilnehmer*in nicht gefunden." -#: members/admin.py:340 +#: members/admin.py:358 #, python-format msgid "%(name)s already has login data." msgstr "%(name)s hat schon Zugangsdaten." -#: members/admin.py:345 +#: members/admin.py:363 #, python-format msgid "The configured email address for %(name)s is not an internal one." msgstr "Die für %(name)s eingestellte E-Mail Adresse ist keine DAV360 Adresse." -#: members/admin.py:359 +#: members/admin.py:377 #, python-format msgid "%(name)s already has a pending invitation as user." msgstr "" "%(name)s hat bereits eine ausstehende Aufforderung Zugangsdaten zu wählen." -#: members/admin.py:377 +#: members/admin.py:395 msgid "activity" msgstr "Aktivität" -#: members/admin.py:387 members/models.py:56 members/models.py:1584 +#: members/admin.py:405 members/models.py:56 members/models.py:1584 msgid "Name" msgstr "Name" -#: members/admin.py:478 +#: members/admin.py:496 msgid "Successfully requested mail confirmation from selected registrations." msgstr "Aufforderung zur Bestätigung der Email Adresse versendet." -#: members/admin.py:479 +#: members/admin.py:497 msgid "Request mail confirmation from selected registrations" msgstr "Aufforderung zur Bestätigung der Email Adresse versenden" -#: members/admin.py:486 members/admin.py:551 +#: members/admin.py:504 members/admin.py:569 #, python-format msgid "Successfully confirmed %(name)s." msgstr "Registrierung von %(name)s erfolgreich bestätigt." -#: members/admin.py:490 members/admin.py:554 +#: members/admin.py:508 members/admin.py:572 #, python-format msgid "Can't confirm. %(name)s has unconfirmed email addresses." msgstr "Bestätigung nicht möglich. %(name)s hat unbestätigte Emailadressen." -#: members/admin.py:495 +#: members/admin.py:513 msgid "Successfully confirmed multiple registrations." msgstr "Erfolgreich mehrere Registrierungen bestätigt." -#: members/admin.py:497 +#: members/admin.py:515 msgid "" "Failed to confirm some registrations because of unconfirmed email addresses." msgstr "" "Einige Bestätigungen fehlgeschlagen, weil Emailadressen noch nicht bestätigt " "sind." -#: members/admin.py:498 +#: members/admin.py:516 msgid "Confirm selected registrations" msgstr "Ausgewählte Registrierungen bestätigen" -#: members/admin.py:521 +#: members/admin.py:539 msgid "Demote selected registrations to waiters." msgstr "Ausgewählte Registrierungen zurück auf die Warteliste setzen." -#: members/admin.py:537 +#: members/admin.py:555 msgid "Demote member to waiter" msgstr "Ausgewählte Registrierung zurück auf die Warteliste setzen." -#: members/admin.py:546 +#: members/admin.py:564 #, python-format msgid "Successfully demoted %(name)s to waiter." msgstr "%(name)s zurück auf die Warteliste gesetzt." -#: members/admin.py:561 members/models.py:437 members/models.py:840 +#: members/admin.py:579 members/models.py:437 members/models.py:840 #: members/models.py:1329 msgid "Group" msgstr "Gruppe" -#: members/admin.py:566 +#: members/admin.py:584 msgid "Invitation text" msgstr "Einladungstext" -#: members/admin.py:582 +#: members/admin.py:600 msgid "Pending group invitation for group" msgstr "Ausstehende Gruppeneinladung für Gruppe" -#: members/admin.py:615 +#: members/admin.py:633 #, python-format msgid "Successfully asked %(name)s to confirm their waiting status." msgstr "Erfolgreich %(name)s aufgefordert den Wartelistenplatz zu bestätigen." -#: members/admin.py:616 +#: members/admin.py:634 msgid "Ask selected waiters to confirm their waiting status" msgstr "Wartende auffordern den Wartelistenplatz zu bestätigen" -#: members/admin.py:651 members/admin.py:681 +#: members/admin.py:669 msgid "Offer waiter a place in a group." msgstr "Personen auf der Warteliste einen Gruppenplatz anbieten." -#: members/admin.py:660 members/admin.py:698 members/admin.py:726 +#: members/admin.py:686 members/admin.py:714 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. " -#: members/admin.py:664 members/admin.py:703 +#: members/admin.py:691 msgid "" "The selected group does not have a contact email. Please first set a contact " "email and then try again." @@ -217,39 +221,39 @@ msgstr "" "Die ausgewählte Gruppe hat keine Kontakt E-Mail Adresse. Bitte stelle eine " "Kontakt E-Mail Adresse ein und versuche es erneut." -#: members/admin.py:670 members/admin.py:731 +#: members/admin.py:694 members/admin.py:728 +msgid "Select group for invitation" +msgstr "Wähle Gruppe für Einladung aus" + +#: members/admin.py:719 #, python-format msgid "Successfully invited %(name)s to %(group)s." msgstr "Erfolgreich %(name)s zu Gruppe %(group)s eingeladen." -#: members/admin.py:674 members/admin.py:706 members/admin.py:740 -msgid "Select group for invitation" -msgstr "Wähle Gruppe für Einladung aus" - -#: members/admin.py:760 members/models.py:72 +#: members/admin.py:748 members/models.py:72 msgid "name" msgstr "Name" -#: members/admin.py:761 +#: members/admin.py:749 msgid "" "The group name may only consist of letters, numerals, _, -, :, * and spaces." msgstr "" "Der Gruppenname darf nur aus Buchstaben, Zahlen, _, -, :, * oder Leerzeichen " "bestehen." -#: members/admin.py:790 +#: members/admin.py:778 msgid "Difficulty" msgstr "Schwierigkeit" -#: members/admin.py:793 +#: members/admin.py:781 msgid "Tour type" msgstr "Art der Tour" -#: members/admin.py:796 members/models.py:1060 +#: members/admin.py:784 members/models.py:1060 msgid "Means of transportation" msgstr "Verkehrsmittel" -#: members/admin.py:823 +#: members/admin.py:811 msgid "" "Please list here all expenses in relation with this excursion and upload " "relevant bills. These have to be permanently stored for the application of " @@ -262,7 +266,7 @@ msgstr "" "einzelnen Posten wird dabei auf der LJP-Kostenübersicht angezeigt (sinnvoll " "wären z.B. Anreise, Verpflegung, Material etc.)." -#: members/admin.py:841 +#: members/admin.py:829 msgid "" "Here you can work on a seminar report for applying for financial " "contributions from Landesjugendplan (LJP). More information on creating a " @@ -275,7 +279,7 @@ msgstr "" "wahlweise nur TN-Liste und Kostenübersicht kannst du anschließend " "herunterladen." -#: members/admin.py:849 +#: members/admin.py:837 msgid "" "Please list all participants (also youth leaders) of this excursion. Here " "you can still make changes just before departure and hence generate the " @@ -286,34 +290,34 @@ msgstr "" "jederzeit die aktuelle Teilnehmer*innenliste für die Krisenintervention " "generieren." -#: members/admin.py:895 +#: members/admin.py:883 #, python-format msgid "You are not allowed to view all members on note list %(name)s." msgstr "" "Du hast nicht die nötigen Rechte um alle Teilnehmer*innen der Notizliste " "%(name)s anzusehen." -#: members/admin.py:905 +#: members/admin.py:893 msgid "Generate PDF summary" msgstr "Übersicht erstellen" -#: members/admin.py:909 +#: members/admin.py:897 msgid "Full report" msgstr "Vollständiger Seminarbericht" -#: members/admin.py:910 +#: members/admin.py:898 msgid "Costs and participants only" msgstr "Nur Kosten und Teilnehmende" -#: members/admin.py:911 +#: members/admin.py:899 msgid "Mode" msgstr "Modus" -#: members/admin.py:912 +#: members/admin.py:900 msgid "Prepend V32" msgstr "V32 Formblatt einfügen" -#: members/admin.py:928 +#: members/admin.py:916 msgid "" "General information on your excursion. These are partly relevant for the " "amount of financial compensation (means of transport, travel distance, etc.)." @@ -322,48 +326,48 @@ msgstr "" "teilweise relevant für die Zuschüsse aus dem Jugendetat (Verkehrsmittel, " "Fahrstrecke in km)." -#: members/admin.py:958 +#: members/admin.py:946 #, python-format msgid "You are not allowed to view all members on excursion %(name)s." msgstr "" "Du hast nicht die nötigen Rechte um alle Teilnehmer*innen der Ausfahrt " "%(name)s anzusehen." -#: members/admin.py:966 +#: members/admin.py:954 msgid "Generate crisis intervention list" msgstr "Kriseninterventionsliste erstellen" -#: members/admin.py:974 +#: members/admin.py:962 msgid "Generate overview" msgstr "Hinweise für Jugendleiter erstellen" -#: members/admin.py:978 members/admin.py:1010 +#: members/admin.py:966 members/admin.py:998 #: members/templates/admin/generate_seminar_report.html:21 msgid "Generate seminar report" msgstr "Landesjugendplan Antrag erstellen" -#: members/admin.py:991 +#: members/admin.py:979 msgid "Please select a mode." msgstr "Bitte wähle einen Modus aus." -#: members/admin.py:996 +#: members/admin.py:984 msgid "" "Full mode is only available, if the seminar report section is filled out." msgstr "" "Der vollständiger Modus ist nur verfügbar, wenn der Seminarbericht " "ausgefüllt ist. " -#: members/admin.py:1022 +#: members/admin.py:1010 msgid "Generate SJR application" msgstr "SJR Antrag erstellen" -#: members/admin.py:1026 +#: members/admin.py:1014 msgid "No statement found. Please add a statement and then retry." msgstr "" "Keine Abrechnung angelegt. Bitte lege eine Abrechnung and und versuche es " "erneut." -#: members/admin.py:1030 +#: members/admin.py:1018 msgid "" "Successfully submited statement. The finance department will notify you as " "soon as possible." @@ -371,7 +375,7 @@ msgstr "" "Abrechnung erfolgreich eingericht. Die Finanzabteilung wird sich bei dir so " "schnell wie möglich melden." -#: members/admin.py:1033 +#: members/admin.py:1021 #: members/templates/admin/freizeit_finance_overview.html:21 msgid "Finance overview" msgstr "Kostenübersicht" @@ -1316,8 +1320,8 @@ msgid "" msgstr "" "Der folgende Text wird in der Einladungsmail verschickt. Die Platzhalter " "{name}, {link} und {invitation_reject_link} werden beim Senden automatisch " -"durch personalisierte Daten ersetzt. Bitte passe den Text falls nötig an " -"und schicke die Einladung anschließend ab." +"durch personalisierte Daten ersetzt. Bitte passe den Text falls nötig an und " +"schicke die Einladung anschließend ab." #: members/templates/admin/invite_for_group_text.html:62 msgid "Send" -- 2.38.4 From ac1705d72adaf01808ad462ddeac63b29f8dec5d Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sun, 29 Dec 2024 10:48:04 +0100 Subject: [PATCH 08/18] added js qrcode library --- jdav_web/static/js/qrcode.js | 614 +++++++++++++++++++++++++++++++++++ 1 file changed, 614 insertions(+) create mode 100644 jdav_web/static/js/qrcode.js diff --git a/jdav_web/static/js/qrcode.js b/jdav_web/static/js/qrcode.js new file mode 100644 index 0000000..5507c15 --- /dev/null +++ b/jdav_web/static/js/qrcode.js @@ -0,0 +1,614 @@ +/** + * @fileoverview + * - Using the 'QRCode for Javascript library' + * - Fixed dataset of 'QRCode for Javascript library' for support full-spec. + * - this library has no dependencies. + * + * @author davidshimjs + * @see http://www.d-project.com/ + * @see http://jeromeetienne.github.com/jquery-qrcode/ + */ +var QRCode; + +(function () { + //--------------------------------------------------------------------- + // QRCode for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word "QR Code" is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; + this.parsedData = []; + + // Added to support UTF-8 Characters + for (var i = 0, l = this.data.length; i < l; i++) { + var byteArray = []; + var code = this.data.charCodeAt(i); + + if (code > 0x10000) { + byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18); + byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12); + byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[3] = 0x80 | (code & 0x3F); + } else if (code > 0x800) { + byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12); + byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[2] = 0x80 | (code & 0x3F); + } else if (code > 0x80) { + byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6); + byteArray[1] = 0x80 | (code & 0x3F); + } else { + byteArray[0] = code; + } + + this.parsedData.push(byteArray); + } + + this.parsedData = Array.prototype.concat.apply([], this.parsedData); + + if (this.parsedData.length != this.data.length) { + this.parsedData.unshift(191); + this.parsedData.unshift(187); + this.parsedData.unshift(239); + } + } + + QR8bitByte.prototype = { + getLength: function (buffer) { + return this.parsedData.length; + }, + write: function (buffer) { + for (var i = 0, l = this.parsedData.length; i < l; i++) { + buffer.put(this.parsedData[i], 8); + } + } + }; + + function QRCodeModel(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = []; + } + + QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);} + return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row=7){this.setupTypeNumber(test);} + if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);} + this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}} + return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;} + for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}} + for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}} + this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex>>bitIndex)&1)==1);} + var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;} + this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}} + row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;itotalDataCount*8){throw new Error("code length overflow. (" + +buffer.getLengthInBits() + +">" + +totalDataCount*8 + +")");} + if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);} + while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);} + while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;} + buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;} + buffer.put(QRCodeModel.PAD1,8);} + return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r=0)?modPoly.get(modIndex):0;}} + var totalCodeCount=0;for(var i=0;i=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));} + return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));} + return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;} + return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i5){lostPoint+=(3+sameCount-5);}}} + for(var row=0;row=256){n-=255;} + return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);} + if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));} + this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]]; + + function _isSupportCanvas() { + return typeof CanvasRenderingContext2D != "undefined"; + } + + // android 2.x doesn't support Data-URI spec + function _getAndroid() { + var android = false; + var sAgent = navigator.userAgent; + + if (/android/i.test(sAgent)) { // android + android = true; + var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i); + + if (aMat && aMat[1]) { + android = parseFloat(aMat[1]); + } + } + + return android; + } + + var svgDrawer = (function() { + + var Drawing = function (el, htOption) { + this._el = el; + this._htOption = htOption; + }; + + Drawing.prototype.draw = function (oQRCode) { + var _htOption = this._htOption; + var _el = this._el; + var nCount = oQRCode.getModuleCount(); + var nWidth = Math.floor(_htOption.width / nCount); + var nHeight = Math.floor(_htOption.height / nCount); + + this.clear(); + + function makeSVG(tag, attrs) { + var el = document.createElementNS('http://www.w3.org/2000/svg', tag); + for (var k in attrs) + if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]); + return el; + } + + var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight}); + svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); + _el.appendChild(svg); + + svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"})); + svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"})); + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + if (oQRCode.isDark(row, col)) { + var child = makeSVG("use", {"x": String(col), "y": String(row)}); + child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template") + svg.appendChild(child); + } + } + } + }; + Drawing.prototype.clear = function () { + while (this._el.hasChildNodes()) + this._el.removeChild(this._el.lastChild); + }; + return Drawing; + })(); + + var useSVG = document.documentElement.tagName.toLowerCase() === "svg"; + + // Drawing in DOM by using Table tag + var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () { + var Drawing = function (el, htOption) { + this._el = el; + this._htOption = htOption; + }; + + /** + * Draw the QRCode + * + * @param {QRCode} oQRCode + */ + Drawing.prototype.draw = function (oQRCode) { + var _htOption = this._htOption; + var _el = this._el; + var nCount = oQRCode.getModuleCount(); + var nWidth = Math.floor(_htOption.width / nCount); + var nHeight = Math.floor(_htOption.height / nCount); + var aHTML = ['']; + + for (var row = 0; row < nCount; row++) { + aHTML.push(''); + + for (var col = 0; col < nCount; col++) { + aHTML.push(''); + } + + aHTML.push(''); + } + + aHTML.push('
'); + _el.innerHTML = aHTML.join(''); + + // Fix the margin values as real size. + var elTable = _el.childNodes[0]; + var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2; + var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2; + + if (nLeftMarginTable > 0 && nTopMarginTable > 0) { + elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px"; + } + }; + + /** + * Clear the QRCode + */ + Drawing.prototype.clear = function () { + this._el.innerHTML = ''; + }; + + return Drawing; + })() : (function () { // Drawing in Canvas + function _onMakeImage() { + this._elImage.src = this._elCanvas.toDataURL("image/png"); + this._elImage.style.display = "block"; + this._elCanvas.style.display = "none"; + } + + // Android 2.1 bug workaround + // http://code.google.com/p/android/issues/detail?id=5141 + if (this._android && this._android <= 2.1) { + var factor = 1 / window.devicePixelRatio; + var drawImage = CanvasRenderingContext2D.prototype.drawImage; + CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) { + if (("nodeName" in image) && /img/i.test(image.nodeName)) { + for (var i = arguments.length - 1; i >= 1; i--) { + arguments[i] = arguments[i] * factor; + } + } else if (typeof dw == "undefined") { + arguments[1] *= factor; + arguments[2] *= factor; + arguments[3] *= factor; + arguments[4] *= factor; + } + + drawImage.apply(this, arguments); + }; + } + + /** + * Check whether the user's browser supports Data URI or not + * + * @private + * @param {Function} fSuccess Occurs if it supports Data URI + * @param {Function} fFail Occurs if it doesn't support Data URI + */ + function _safeSetDataURI(fSuccess, fFail) { + var self = this; + self._fFail = fFail; + self._fSuccess = fSuccess; + + // Check it just once + if (self._bSupportDataURI === null) { + var el = document.createElement("img"); + var fOnError = function() { + self._bSupportDataURI = false; + + if (self._fFail) { + self._fFail.call(self); + } + }; + var fOnSuccess = function() { + self._bSupportDataURI = true; + + if (self._fSuccess) { + self._fSuccess.call(self); + } + }; + + el.onabort = fOnError; + el.onerror = fOnError; + el.onload = fOnSuccess; + el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data. + return; + } else if (self._bSupportDataURI === true && self._fSuccess) { + self._fSuccess.call(self); + } else if (self._bSupportDataURI === false && self._fFail) { + self._fFail.call(self); + } + }; + + /** + * Drawing QRCode by using canvas + * + * @constructor + * @param {HTMLElement} el + * @param {Object} htOption QRCode Options + */ + var Drawing = function (el, htOption) { + this._bIsPainted = false; + this._android = _getAndroid(); + + this._htOption = htOption; + this._elCanvas = document.createElement("canvas"); + this._elCanvas.width = htOption.width; + this._elCanvas.height = htOption.height; + el.appendChild(this._elCanvas); + this._el = el; + this._oContext = this._elCanvas.getContext("2d"); + this._bIsPainted = false; + this._elImage = document.createElement("img"); + this._elImage.alt = "Scan me!"; + this._elImage.style.display = "none"; + this._el.appendChild(this._elImage); + this._bSupportDataURI = null; + }; + + /** + * Draw the QRCode + * + * @param {QRCode} oQRCode + */ + Drawing.prototype.draw = function (oQRCode) { + var _elImage = this._elImage; + var _oContext = this._oContext; + var _htOption = this._htOption; + + var nCount = oQRCode.getModuleCount(); + var nWidth = _htOption.width / nCount; + var nHeight = _htOption.height / nCount; + var nRoundedWidth = Math.round(nWidth); + var nRoundedHeight = Math.round(nHeight); + + _elImage.style.display = "none"; + this.clear(); + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + var bIsDark = oQRCode.isDark(row, col); + var nLeft = col * nWidth; + var nTop = row * nHeight; + _oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; + _oContext.lineWidth = 1; + _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; + _oContext.fillRect(nLeft, nTop, nWidth, nHeight); + + // 안티 앨리어싱 방지 처리 + _oContext.strokeRect( + Math.floor(nLeft) + 0.5, + Math.floor(nTop) + 0.5, + nRoundedWidth, + nRoundedHeight + ); + + _oContext.strokeRect( + Math.ceil(nLeft) - 0.5, + Math.ceil(nTop) - 0.5, + nRoundedWidth, + nRoundedHeight + ); + } + } + + this._bIsPainted = true; + }; + + /** + * Make the image from Canvas if the browser supports Data URI. + */ + Drawing.prototype.makeImage = function () { + if (this._bIsPainted) { + _safeSetDataURI.call(this, _onMakeImage); + } + }; + + /** + * Return whether the QRCode is painted or not + * + * @return {Boolean} + */ + Drawing.prototype.isPainted = function () { + return this._bIsPainted; + }; + + /** + * Clear the QRCode + */ + Drawing.prototype.clear = function () { + this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height); + this._bIsPainted = false; + }; + + /** + * @private + * @param {Number} nNumber + */ + Drawing.prototype.round = function (nNumber) { + if (!nNumber) { + return nNumber; + } + + return Math.floor(nNumber * 1000) / 1000; + }; + + return Drawing; + })(); + + /** + * Get the type by string length + * + * @private + * @param {String} sText + * @param {Number} nCorrectLevel + * @return {Number} type + */ + function _getTypeNumber(sText, nCorrectLevel) { + var nType = 1; + var length = _getUTF8Length(sText); + + for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) { + var nLimit = 0; + + switch (nCorrectLevel) { + case QRErrorCorrectLevel.L : + nLimit = QRCodeLimitLength[i][0]; + break; + case QRErrorCorrectLevel.M : + nLimit = QRCodeLimitLength[i][1]; + break; + case QRErrorCorrectLevel.Q : + nLimit = QRCodeLimitLength[i][2]; + break; + case QRErrorCorrectLevel.H : + nLimit = QRCodeLimitLength[i][3]; + break; + } + + if (length <= nLimit) { + break; + } else { + nType++; + } + } + + if (nType > QRCodeLimitLength.length) { + throw new Error("Too long data"); + } + + return nType; + } + + function _getUTF8Length(sText) { + var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a'); + return replacedText.length + (replacedText.length != sText ? 3 : 0); + } + + /** + * @class QRCode + * @constructor + * @example + * new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie"); + * + * @example + * var oQRCode = new QRCode("test", { + * text : "http://naver.com", + * width : 128, + * height : 128 + * }); + * + * oQRCode.clear(); // Clear the QRCode. + * oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode. + * + * @param {HTMLElement|String} el target element or 'id' attribute of element. + * @param {Object|String} vOption + * @param {String} vOption.text QRCode link data + * @param {Number} [vOption.width=256] + * @param {Number} [vOption.height=256] + * @param {String} [vOption.colorDark="#000000"] + * @param {String} [vOption.colorLight="#ffffff"] + * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] + */ + QRCode = function (el, vOption) { + this._htOption = { + width : 256, + height : 256, + typeNumber : 4, + colorDark : "#000000", + colorLight : "#ffffff", + correctLevel : QRErrorCorrectLevel.H + }; + + if (typeof vOption === 'string') { + vOption = { + text : vOption + }; + } + + // Overwrites options + if (vOption) { + for (var i in vOption) { + this._htOption[i] = vOption[i]; + } + } + + if (typeof el == "string") { + el = document.getElementById(el); + } + + if (this._htOption.useSVG) { + Drawing = svgDrawer; + } + + this._android = _getAndroid(); + this._el = el; + this._oQRCode = null; + this._oDrawing = new Drawing(this._el, this._htOption); + + if (this._htOption.text) { + this.makeCode(this._htOption.text); + } + }; + + /** + * Make the QRCode + * + * @param {String} sText link data + */ + QRCode.prototype.makeCode = function (sText) { + this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel); + this._oQRCode.addData(sText); + this._oQRCode.make(); + this._el.title = sText; + this._oDrawing.draw(this._oQRCode); + this.makeImage(); + }; + + /** + * Make the Image from Canvas element + * - It occurs automatically + * - Android below 3 doesn't support Data-URI spec. + * + * @private + */ + QRCode.prototype.makeImage = function () { + if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) { + this._oDrawing.makeImage(); + } + }; + + /** + * Clear the QRCode + */ + QRCode.prototype.clear = function () { + this._oDrawing.clear(); + }; + + /** + * @name QRCode.CorrectLevel + */ + QRCode.CorrectLevel = QRErrorCorrectLevel; +})(); -- 2.38.4 From 847638b2b74edb900766ecc5059c58821fa050fe Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sun, 29 Dec 2024 11:55:23 +0100 Subject: [PATCH 09/18] changed js library to local static file --- jdav_web/finance/templates/admin/confirmed_statement.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdav_web/finance/templates/admin/confirmed_statement.html b/jdav_web/finance/templates/admin/confirmed_statement.html index d769ba2..3d35418 100644 --- a/jdav_web/finance/templates/admin/confirmed_statement.html +++ b/jdav_web/finance/templates/admin/confirmed_statement.html @@ -7,7 +7,7 @@ - + {% endblock %} -- 2.38.4 From 9394d5e6af7e2783ddf91f7ed1443af50dc182be Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Mon, 30 Dec 2024 14:14:43 +0100 Subject: [PATCH 10/18] added iban validity to member model --- jdav_web/members/models.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index 0ff3631..c5bb60f 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -29,6 +29,7 @@ from contrib.rules import memberize_user, has_global_perm from utils import cvt_to_decimal from dateutil.relativedelta import relativedelta +from schwifty import IBAN def generate_random_key(): return uuid.uuid4().hex @@ -340,6 +341,10 @@ class Member(Person): """Returning the whole place (plz + town)""" return "{0} {1}".format(self.plz, self.town) + @property + def iban_valid(self): + return IBAN(self.iban, allow_invalid=True).is_valid + @property def address(self): """Returning the whole address""" -- 2.38.4 From edd21e6ac3806cc9d8f7d9ebdcb2b592660c8c33 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Mon, 30 Dec 2024 14:15:10 +0100 Subject: [PATCH 11/18] added iban-valid info to statement submit forms --- .../finance/locale/de/LC_MESSAGES/django.po | 27 +- .../templates/admin/submit_statement.html | 30 ++ .../members/locale/de/LC_MESSAGES/django.po | 368 +++++++++--------- .../admin/freizeit_finance_overview.html | 11 +- 4 files changed, 252 insertions(+), 184 deletions(-) diff --git a/jdav_web/finance/locale/de/LC_MESSAGES/django.po b/jdav_web/finance/locale/de/LC_MESSAGES/django.po index 5da218d..50524d1 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: 2024-12-28 01:22+0100\n" +"POT-Creation-Date: 2024-12-29 13:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -151,6 +151,7 @@ msgid "Short description" msgstr "Kurzbeschreibung" #: finance/models.py:54 finance/models.py:421 +#: finance/templates/admin/submit_statement.html:30 msgid "Explanation" msgstr "Erklärung" @@ -245,10 +246,11 @@ msgstr "Bezahlte Abrechnungen" #: finance/templates/admin/confirmed_statement.html:38 #: finance/templates/admin/overview_submitted_statement.html:31 #: finance/templates/admin/overview_submitted_statement.html:98 +#: finance/templates/admin/submit_statement.html:31 msgid "Amount" msgstr "Betrag" -#: finance/models.py:424 +#: finance/models.py:424 finance/templates/admin/submit_statement.html:32 msgid "Paid by" msgstr "Bezahlt von" @@ -461,13 +463,13 @@ msgid "Reject" msgstr "Ablehnen" #: finance/templates/admin/overview_submitted_statement.html:178 -#: finance/templates/admin/submit_statement.html:35 +#: finance/templates/admin/submit_statement.html:65 #: finance/templates/admin/unconfirm_statement.html:39 msgid "Cancel" msgstr "Abbruch" #: finance/templates/admin/submit_statement.html:21 -#: finance/templates/admin/submit_statement.html:34 +#: finance/templates/admin/submit_statement.html:64 msgid "Submit" msgstr "Einreichen" @@ -475,7 +477,22 @@ msgstr "Einreichen" msgid "Submit to the finance department" msgstr "Beim Finanzreferat einreichen" -#: finance/templates/admin/submit_statement.html:28 +#: finance/templates/admin/submit_statement.html:27 +msgid "" +"Please check if all expenses are documented correctly and if all payers have " +"a valid account code." +msgstr "Bitte überprüfe, ob alle Ausgaben korrekt erfasst sind und ob alle " +"auslegenden Personen eine gültige IBAN haben." + +#: finance/templates/admin/submit_statement.html:33 +msgid "IBAN valid" +msgstr "IBAN gültig" + +#: finance/templates/admin/submit_statement.html:51 +msgid "Change here" +msgstr "Hier ändern" + +#: finance/templates/admin/submit_statement.html:58 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/finance/templates/admin/submit_statement.html b/jdav_web/finance/templates/admin/submit_statement.html index 838c410..7f58deb 100644 --- a/jdav_web/finance/templates/admin/submit_statement.html +++ b/jdav_web/finance/templates/admin/submit_statement.html @@ -24,6 +24,36 @@ {% block content %}

{% translate "Submit to the finance department" %}

+

{% translate "Please check if all expenses are documented correctly and if all payers have a valid account code." %}

+ + + + + + + {% for bill in statement.bill_set.all %} + + + + + + + + {% endfor %} +
+ {% trans "Explanation" %}{% trans "Amount" %}{% trans "Paid by" %}{% trans "IBAN valid" %}
+ {{bill.short_description}} + + {{bill.explanation}} + + {{ bill.amount }}€ + + {{ bill.paid_by.name }} + + + {% if not bill.paid_by.iban_valid %} {% trans "Change here" %} {% endif %} +
+

{% trans "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/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po index 6f46c53..73e948e 100644 --- a/jdav_web/members/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/members/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-28 22:56+0100\n" +"POT-Creation-Date: 2024-12-29 13:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: members/admin.py:129 members/models.py:430 +#: members/admin.py:129 members/models.py:435 msgid "Registration complete" msgstr "Anmeldung vollständig" @@ -130,7 +130,7 @@ msgstr "" msgid "activity" msgstr "Aktivität" -#: members/admin.py:405 members/models.py:56 members/models.py:1584 +#: members/admin.py:405 members/models.py:57 members/models.py:1589 msgid "Name" msgstr "Name" @@ -180,8 +180,8 @@ msgstr "Ausgewählte Registrierung zurück auf die Warteliste setzen." msgid "Successfully demoted %(name)s to waiter." msgstr "%(name)s zurück auf die Warteliste gesetzt." -#: members/admin.py:579 members/models.py:437 members/models.py:840 -#: members/models.py:1329 +#: members/admin.py:579 members/models.py:442 members/models.py:845 +#: members/models.py:1334 msgid "Group" msgstr "Gruppe" @@ -230,7 +230,7 @@ msgstr "Wähle Gruppe für Einladung aus" msgid "Successfully invited %(name)s to %(group)s." msgstr "Erfolgreich %(name)s zu Gruppe %(group)s eingeladen." -#: members/admin.py:748 members/models.py:72 +#: members/admin.py:748 members/models.py:73 msgid "name" msgstr "Name" @@ -249,7 +249,7 @@ msgstr "Schwierigkeit" msgid "Tour type" msgstr "Art der Tour" -#: members/admin.py:784 members/models.py:1060 +#: members/admin.py:784 members/models.py:1065 msgid "Means of transportation" msgstr "Verkehrsmittel" @@ -384,244 +384,244 @@ msgstr "Kostenübersicht" msgid "member administration" msgstr "Teilnehmer*innenverwaltung" -#: members/models.py:42 +#: members/models.py:43 msgid "Monday" msgstr "Montag" -#: members/models.py:43 +#: members/models.py:44 msgid "Tuesday" msgstr "Dienstag" -#: members/models.py:44 +#: members/models.py:45 msgid "Wednesday" msgstr "Mittwoch" -#: members/models.py:45 +#: members/models.py:46 msgid "Thursday" msgstr "Donnerstag" -#: members/models.py:46 +#: members/models.py:47 msgid "Friday" msgstr "Freitag" -#: members/models.py:47 +#: members/models.py:48 msgid "Saturday" msgstr "Samstag" -#: members/models.py:48 +#: members/models.py:49 msgid "Sunday" msgstr "Sonntag" -#: members/models.py:57 members/models.py:1046 +#: members/models.py:58 members/models.py:1051 msgid "Description" msgstr "Beschreibung" -#: members/models.py:63 members/models.py:1038 +#: members/models.py:64 members/models.py:1043 #: members/templates/members/change_member.html:18 msgid "Activity" msgstr "Aktivität" -#: members/models.py:64 +#: members/models.py:65 msgid "Activities" msgstr "Aktivitäten" -#: members/models.py:73 +#: members/models.py:74 msgid "description" msgstr "Beschreibung" -#: members/models.py:74 +#: members/models.py:75 msgid "show on website" msgstr "Auf der Webseite anzeigen" -#: members/models.py:75 +#: members/models.py:76 msgid "lowest year" msgstr "Ab Jahrgang" -#: members/models.py:76 +#: members/models.py:77 msgid "highest year" msgstr "Bis Jahrgang" -#: members/models.py:77 +#: members/models.py:78 msgid "youth leaders" msgstr "Jugendleiter" -#: members/models.py:79 +#: members/models.py:80 msgid "week day" msgstr "Wochentag" -#: members/models.py:80 members/models.py:1411 +#: members/models.py:81 members/models.py:1416 msgid "Starting time" msgstr "Zeitpunkt" -#: members/models.py:81 +#: members/models.py:82 msgid "Ending time" msgstr "Endzeitpunkt" -#: members/models.py:83 +#: members/models.py:84 msgid "Contact email" msgstr "Kontakt Email" -#: members/models.py:93 members/models.py:294 +#: members/models.py:94 members/models.py:295 msgid "group" msgstr "Gruppe" -#: members/models.py:94 +#: members/models.py:95 msgid "groups" msgstr "Gruppen" -#: members/models.py:128 +#: members/models.py:129 msgid "prename" msgstr "Vorname" -#: members/models.py:129 +#: members/models.py:130 msgid "last name" msgstr "Nachname" -#: members/models.py:132 +#: members/models.py:133 msgid "Email confirmed" msgstr "Emailadresse bestätigt" -#: members/models.py:150 members/models.py:221 members/models.py:268 +#: members/models.py:151 members/models.py:222 members/models.py:269 msgid "phone number" msgstr "Telefonnummer (mobil)" -#: members/models.py:181 +#: members/models.py:182 msgid "Email confirmation needed" msgstr "Email Bestätigung erforderlich" -#: members/models.py:231 +#: members/models.py:232 msgid "birth date" msgstr "Geburtsdatum" -#: members/models.py:236 +#: members/models.py:237 msgid "Gender" msgstr "Gender" -#: members/models.py:237 +#: members/models.py:238 msgid "comments" msgstr "Kommentare" -#: members/models.py:265 +#: members/models.py:266 msgid "Alternative email confirmed" msgstr "Alternative E-Mail Adresse bestätigt" -#: members/models.py:269 +#: members/models.py:270 msgid "street and house number" msgstr "Straße und Hausnummer" -#: members/models.py:270 +#: members/models.py:271 msgid "Postcode" msgstr "PLZ" -#: members/models.py:272 +#: members/models.py:273 msgid "town" msgstr "Stadt" -#: members/models.py:273 +#: members/models.py:274 msgid "Address extra" msgstr "Adress-Zusatz" -#: members/models.py:274 +#: members/models.py:275 msgid "Country" msgstr "Land" -#: members/models.py:276 +#: members/models.py:277 msgid "Good conduct certificate presented on" msgstr "Führungszeugnis vorgelegt am" -#: members/models.py:277 +#: members/models.py:278 msgid "Joined on" msgstr "Eintritt" -#: members/models.py:278 +#: members/models.py:279 msgid "Left on" msgstr "Austritt" -#: members/models.py:279 +#: members/models.py:280 msgid "Has key" msgstr "Hat Jugendraumschlüssel" -#: members/models.py:280 +#: members/models.py:281 msgid "Has a free ticket for the climbing gym" msgstr "Hat Freikarte für Kletterhalle" -#: members/models.py:281 +#: members/models.py:282 msgid "DAV badge number" msgstr "DAV Mitgliedsnummer" -#: members/models.py:282 +#: members/models.py:283 msgid "Knows how to swim" msgstr "Kann schwimmen" -#: members/models.py:283 +#: members/models.py:284 msgid "Climbing badge" msgstr "Kletterschein" -#: members/models.py:284 +#: members/models.py:285 msgid "Alpine experience" msgstr "Alpine Erfahrung" -#: members/models.py:285 +#: members/models.py:286 msgid "Allergies" msgstr "Allergieen" -#: members/models.py:286 +#: members/models.py:287 msgid "Medication" msgstr "Medikamente" -#: members/models.py:287 +#: members/models.py:288 msgid "Tetanus vaccination" msgstr "Tetanusimpfung" -#: members/models.py:288 +#: members/models.py:289 msgid "Photos may be taken" msgstr "Fotoerlaubnis" -#: members/models.py:289 +#: members/models.py:290 msgid "Legal guardians" msgstr "Erziehungsberechtigte" -#: members/models.py:291 +#: members/models.py:292 msgid "May cancel a group appointment independently" msgstr "Darf sich allein von der Gruppenstunde abmelden" -#: members/models.py:298 +#: members/models.py:299 msgid "receives newsletter" msgstr "Erhält den Newsletter" -#: members/models.py:302 +#: members/models.py:303 msgid "created" msgstr "erstellt" -#: members/models.py:303 +#: members/models.py:304 msgid "Active" msgstr "Aktiv" -#: members/models.py:304 +#: members/models.py:305 msgid "registration form" msgstr "Anmeldeformular" -#: members/models.py:313 +#: members/models.py:314 msgid "image" msgstr "Bild" -#: members/models.py:322 +#: members/models.py:323 msgid "Echoed" msgstr "Rückgemeldet" -#: members/models.py:323 +#: members/models.py:324 msgid "Confirmed" msgstr "Bestätigt" -#: members/models.py:325 +#: members/models.py:326 msgid "Login data" msgstr "Zugangsdaten" -#: members/models.py:327 +#: members/models.py:328 msgid "waitinglist application date" msgstr "Wartelistenbewerbungsdatum" -#: members/models.py:329 +#: members/models.py:330 msgid "" "If the person registered from the waitinglist, this is their application " "date." @@ -629,351 +629,351 @@ msgstr "" "Falls sich die Person über die Warteliste angemeldet hat ist dies ihr " "Bewerbungsdatum." -#: members/models.py:358 +#: members/models.py:363 msgid "Good conduct certificate valid" msgstr "Führungszeugnis gültig" -#: members/models.py:440 +#: members/models.py:445 msgid "member" msgstr "Teilnehmer*in" -#: members/models.py:441 +#: members/models.py:446 msgid "members" msgstr "Teilnehmer*innen" -#: members/models.py:519 +#: members/models.py:524 msgid "Upload registration form" msgstr "Anmeldeformular hochladen" -#: members/models.py:530 +#: members/models.py:535 #, python-format msgid "New unconfirmed registration for group %(group)s" msgstr "Neue unbestätigte Registrierung für Gruppe %(group)s" -#: members/models.py:756 +#: members/models.py:761 msgid "Set login data for Kompass" msgstr "Zugangsdaten für Kompass wählen" -#: members/models.py:791 members/models.py:994 members/models.py:1005 -#: members/models.py:1360 members/models.py:1367 +#: members/models.py:796 members/models.py:999 members/models.py:1010 +#: members/models.py:1365 members/models.py:1372 msgid "Member" msgstr "Teilnehmer*in" -#: members/models.py:798 +#: members/models.py:803 msgid "Emergency contact" msgstr "Notfallkontakt" -#: members/models.py:799 +#: members/models.py:804 msgid "Emergency contacts" msgstr "Notfallkontakte" -#: members/models.py:819 +#: members/models.py:824 msgid "Unconfirmed registration" msgstr "Unbestätigte Registrierung" -#: members/models.py:820 +#: members/models.py:825 msgid "Unconfirmed registrations" msgstr "Unbestätigte Registrierungen" -#: members/models.py:839 members/models.py:884 +#: members/models.py:844 members/models.py:889 msgid "Waiter" msgstr "Wartende Person" -#: members/models.py:841 +#: members/models.py:846 msgid "Invitation date" msgstr "Einladungsdatum" -#: members/models.py:842 members/templates/members/reject_success.html:6 +#: members/models.py:847 members/templates/members/reject_success.html:6 #: members/templates/members/reject_success.html:11 msgid "Invitation rejected" msgstr "Einladung abgelehnt" -#: members/models.py:846 +#: members/models.py:851 msgid "Invitation to group" msgstr "Gruppeneinladung" -#: members/models.py:847 +#: members/models.py:852 msgid "Invitations to groups" msgstr "Gruppeneinladungen" -#: members/models.py:854 +#: members/models.py:859 msgid "Rejected" msgstr "Abgelehnt" -#: members/models.py:856 +#: members/models.py:861 msgid "Expired" msgstr "Abgelaufen" -#: members/models.py:858 +#: members/models.py:863 msgid "Undecided" msgstr "Ausstehend" -#: members/models.py:859 +#: members/models.py:864 msgid "Status" msgstr "Status" -#: members/models.py:870 +#: members/models.py:875 msgid "Do you want to tell us something else?" msgstr "Möchtest du uns noch etwas mitteilen?" -#: members/models.py:871 +#: members/models.py:876 msgid "application date" msgstr "Bewerbungsdatum" -#: members/models.py:873 +#: members/models.py:878 msgid "Last wait confirmation" msgstr "Letzte Wartebestätigung" -#: members/models.py:877 +#: members/models.py:882 msgid "Last reminder" msgstr "Letzte Erinnerung" -#: members/models.py:878 +#: members/models.py:883 msgid "Missed reminders" msgstr "Verpasste Erinnerungen" -#: members/models.py:885 +#: members/models.py:890 msgid "Waiters" msgstr "Warteliste" -#: members/models.py:900 +#: members/models.py:905 msgid "Latest group invitation" msgstr "Letzte Gruppeneinladung" -#: members/models.py:917 +#: members/models.py:922 msgid "Waiting status confirmed" msgstr "Wartelistenplatz bestätigt" -#: members/models.py:924 +#: members/models.py:929 msgid "Waiting confirmation needed" msgstr "Wartelistenplatzbestätigung erforderlich" -#: members/models.py:977 +#: members/models.py:982 msgid "Invitation to trial group meeting" msgstr "Einladung zu Schnupperstunde" -#: members/models.py:985 +#: members/models.py:990 msgid "Unregistered from waiting list" msgstr "Von der Warteliste abgemeldet" -#: members/models.py:999 +#: members/models.py:1004 msgid "Comment" msgstr "Kommentar" -#: members/models.py:1006 members/models.py:1368 +#: members/models.py:1011 members/models.py:1373 msgid "Members" msgstr "Teilnehmer*innen" -#: members/models.py:1040 +#: members/models.py:1045 msgid "Place" msgstr "Stützpunkt / Ort" -#: members/models.py:1041 +#: members/models.py:1046 msgid "Destination (optional)" msgstr "ggf. Ziel" -#: members/models.py:1043 +#: members/models.py:1048 msgid "e.g. a peak" msgstr "z.B. ein Gipfel" -#: members/models.py:1044 +#: members/models.py:1049 msgid "Begin" msgstr "Anfang" -#: members/models.py:1045 +#: members/models.py:1050 msgid "End (optional)" msgstr "Ende" -#: members/models.py:1048 +#: members/models.py:1053 msgid "Groups" msgstr "Gruppen" -#: members/models.py:1061 +#: members/models.py:1066 msgid "Kilometers traveled" msgstr "Fahrstrecke in Kilometer" -#: members/models.py:1064 +#: members/models.py:1069 msgid "Categories" msgstr "Kategorien" -#: members/models.py:1065 +#: members/models.py:1070 msgid "easy" msgstr "leicht" -#: members/models.py:1065 +#: members/models.py:1070 msgid "medium" msgstr "mittel" -#: members/models.py:1065 +#: members/models.py:1070 msgid "hard" msgstr "schwer" -#: members/models.py:1075 members/models.py:1391 +#: members/models.py:1080 members/models.py:1396 #: members/templates/admin/freizeit_finance_overview.html:26 msgid "Excursion" msgstr "Ausfahrt" -#: members/models.py:1076 +#: members/models.py:1081 msgid "Excursions" msgstr "Ausfahrten" -#: members/models.py:1306 members/models.py:1382 members/models.py:1598 +#: members/models.py:1311 members/models.py:1387 members/models.py:1603 msgid "Title" msgstr "Titel" -#: members/models.py:1307 members/models.py:1325 members/models.py:1599 +#: members/models.py:1312 members/models.py:1330 members/models.py:1604 msgid "Date" msgstr "Datum" -#: members/models.py:1326 +#: members/models.py:1331 msgid "Location" msgstr "Ort" -#: members/models.py:1327 +#: members/models.py:1332 msgid "Topic" msgstr "Thema" -#: members/models.py:1351 +#: members/models.py:1356 msgid "Jugendleiter" msgstr "Jugendleiter" -#: members/models.py:1354 +#: members/models.py:1359 msgid "Klettertreff" msgstr "Klettertreff" -#: members/models.py:1355 +#: members/models.py:1360 msgid "Klettertreffs" msgstr "Klettertreffs" -#: members/models.py:1373 +#: members/models.py:1378 msgid "Password" msgstr "Passwort" -#: members/models.py:1376 +#: members/models.py:1381 msgid "registration password" msgstr "Registrierungspassort" -#: members/models.py:1377 +#: members/models.py:1382 msgid "registration passwords" msgstr "Registrierungspasswörter" -#: members/models.py:1384 +#: members/models.py:1389 msgid "Alpinistic goals" msgstr "Alpintechnische Ziele" -#: members/models.py:1385 +#: members/models.py:1390 msgid "Pedagogic goals" msgstr "Pädagogische Ziele" -#: members/models.py:1386 +#: members/models.py:1391 msgid "Content and methods" msgstr "Inhalte und Methoden" -#: members/models.py:1387 +#: members/models.py:1392 msgid "Evaluation" msgstr "Wertung" -#: members/models.py:1388 +#: members/models.py:1393 msgid "Experiences and possible improvements" msgstr "Erfahrungen und Verbesserungsvorschläge" -#: members/models.py:1397 members/models.py:1418 +#: members/models.py:1402 members/models.py:1423 msgid "LJP Proposal" msgstr "Seminarbericht" -#: members/models.py:1398 +#: members/models.py:1403 msgid "LJP Proposals" msgstr "Seminarberichte" -#: members/models.py:1412 +#: members/models.py:1417 msgid "Duration in hours" msgstr "Dauer in Stunden" -#: members/models.py:1415 +#: members/models.py:1420 msgid "Activity and method" msgstr "Art der Aktion inkl. Methode" -#: members/models.py:1423 +#: members/models.py:1428 msgid "Intervention" msgstr "Aktion" -#: members/models.py:1424 +#: members/models.py:1429 msgid "Interventions" msgstr "Aktionen" -#: members/models.py:1526 members/models.py:1556 +#: members/models.py:1531 members/models.py:1561 msgid "May list members" msgstr "Darf folgende Teilnehmer*innen listen" -#: members/models.py:1528 members/models.py:1558 +#: members/models.py:1533 members/models.py:1563 msgid "May view members" msgstr "Darf folgende Teilnehmer*innen anzeigen" -#: members/models.py:1530 members/models.py:1560 +#: members/models.py:1535 members/models.py:1565 msgid "May change members" msgstr "Darf folgende Teilnehmer*innen ändern" -#: members/models.py:1532 members/models.py:1562 +#: members/models.py:1537 members/models.py:1567 msgid "May delete members" msgstr "Darf folgende Teilnehmer*innen löschen" -#: members/models.py:1536 members/models.py:1566 +#: members/models.py:1541 members/models.py:1571 msgid "May list members of groups" msgstr "Darf Teilnehmer*innen folgender Gruppen listen" -#: members/models.py:1538 members/models.py:1568 +#: members/models.py:1543 members/models.py:1573 msgid "May view members of groups" msgstr "Darf Teilnehmer*innen folgender Gruppen anzeigen" -#: members/models.py:1540 members/models.py:1570 +#: members/models.py:1545 members/models.py:1575 msgid "May change members of groups" msgstr "Darf Teilnehmer*innen folgender Gruppen ändern" -#: members/models.py:1542 members/models.py:1572 +#: members/models.py:1547 members/models.py:1577 msgid "May delete members of groups" msgstr "Darf Teilnehmer*innen folgender Gruppen löschen" -#: members/models.py:1545 members/models.py:1546 members/models.py:1549 +#: members/models.py:1550 members/models.py:1551 members/models.py:1554 msgid "Permissions" msgstr "Berechtigungen" -#: members/models.py:1575 members/models.py:1576 members/models.py:1579 +#: members/models.py:1580 members/models.py:1581 members/models.py:1584 msgid "Group permissions" msgstr "Gruppenberechtigungen" -#: members/models.py:1585 +#: members/models.py:1590 msgid "Permission needed" msgstr "Freigabe erforderlich" -#: members/models.py:1588 +#: members/models.py:1593 msgid "Training category" msgstr "Fortbildungstyp" -#: members/models.py:1589 +#: members/models.py:1594 msgid "Training categories" msgstr "Fortbildungstypen" -#: members/models.py:1600 +#: members/models.py:1605 msgid "Category" msgstr "Kategorien" -#: members/models.py:1601 +#: members/models.py:1606 msgid "Comments" msgstr "Kommentar" -#: members/models.py:1602 +#: members/models.py:1607 msgid "Participated" msgstr "Teilgenommmen" -#: members/models.py:1603 +#: members/models.py:1608 msgid "Passed" msgstr "Bestanden" -#: members/models.py:1606 +#: members/models.py:1611 msgid "Training" msgstr "Fortbildung" -#: members/models.py:1607 +#: members/models.py:1612 msgid "Trainings" msgstr "Fortbildungen" @@ -1003,7 +1003,7 @@ msgid "Demote" msgstr "Zurück auf die Warteliste setzen" #: members/templates/admin/demote_to_waiter.html:46 -#: members/templates/admin/freizeit_finance_overview.html:154 +#: members/templates/admin/freizeit_finance_overview.html:163 #: members/templates/admin/generate_seminar_report.html:60 #: members/templates/admin/invite_as_user.html:37 #: members/templates/admin/invite_for_group.html:64 @@ -1024,7 +1024,7 @@ msgstr "" "kein garantierter Kostenplan.\n" #: members/templates/admin/freizeit_finance_overview.html:34 -#: members/templates/admin/freizeit_finance_overview.html:100 +#: members/templates/admin/freizeit_finance_overview.html:109 msgid "Expenses" msgstr "Ausgaben" @@ -1040,19 +1040,31 @@ msgstr "Erklärung" msgid "Amount" msgstr "Betrag" -#: members/templates/admin/freizeit_finance_overview.html:58 +#: members/templates/admin/freizeit_finance_overview.html:41 +msgid "Paid by" +msgstr "Bezahlt von" + +#: members/templates/admin/freizeit_finance_overview.html:42 +msgid "IBAN valid" +msgstr "IBAN gültig" + +#: members/templates/admin/freizeit_finance_overview.html:60 +msgid "Change here" +msgstr "Hier ändern" + +#: members/templates/admin/freizeit_finance_overview.html:67 #, python-format msgid "The total expected expenses are %(total_bills_theoretic)s €." msgstr "" "Insgesamt belaufen sich die geschätzten Ausgaben auf " "%(total_bills_theoretic)s €." -#: members/templates/admin/freizeit_finance_overview.html:60 -#: members/templates/admin/freizeit_finance_overview.html:108 +#: members/templates/admin/freizeit_finance_overview.html:69 +#: members/templates/admin/freizeit_finance_overview.html:117 msgid "Contributions by the association" msgstr "Sektionszuschüsse" -#: members/templates/admin/freizeit_finance_overview.html:63 +#: members/templates/admin/freizeit_finance_overview.html:72 #, python-format msgid "" "According to the contribution guidelines,\n" @@ -1061,7 +1073,7 @@ msgstr "" "Gemäß den Zuschussrichtlinien erhalten %(staff_count)s Jugendleiter*innen " "Zuschüsse. Jeweils sind das" -#: members/templates/admin/freizeit_finance_overview.html:69 +#: members/templates/admin/freizeit_finance_overview.html:78 #, python-format msgid "" "%(nights)s nights for %(price_per_night)s€ per night making a total of " @@ -1070,7 +1082,7 @@ msgstr "" "%(nights)s Nächte zum Preis von %(price_per_night)s€ pro Nacht. Das ergibt " "eine Gesamtsumme von %(nights_per_yl)s€." -#: members/templates/admin/freizeit_finance_overview.html:72 +#: members/templates/admin/freizeit_finance_overview.html:81 #, python-format msgid "" "%(duration)s days for %(allowance_per_day)s€ per day making a total of " @@ -1079,7 +1091,7 @@ msgstr "" "%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine " "Gesamtsumme von %(allowance_per_yl)s€." -#: members/templates/admin/freizeit_finance_overview.html:75 +#: members/templates/admin/freizeit_finance_overview.html:84 #, python-format msgid "" "%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / " @@ -1088,7 +1100,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€." -#: members/templates/admin/freizeit_finance_overview.html:80 +#: members/templates/admin/freizeit_finance_overview.html:89 #, python-format msgid "" "In total these are contributions of %(total_per_yl)s€ times %(staff_count)s, " @@ -1097,11 +1109,11 @@ msgstr "" "Insgesamt sind das Kosten von %(total_per_yl)s€ mal %(staff_count)s, " "insgesamt also %(total_staff)s€." -#: members/templates/admin/freizeit_finance_overview.html:83 +#: members/templates/admin/freizeit_finance_overview.html:92 msgid "LJP contributions" msgstr "LJP Zuschüsse" -#: members/templates/admin/freizeit_finance_overview.html:86 +#: members/templates/admin/freizeit_finance_overview.html:95 #, python-format msgid "" "By submitting a seminar report, you may apply for LJP contributions. In this " @@ -1116,23 +1128,23 @@ msgstr "" "Gesamtausgaben erhalten. Das resultiert in einem Gesamtzuschuss von " "%(ljp_contributions)s€." -#: members/templates/admin/freizeit_finance_overview.html:91 +#: members/templates/admin/freizeit_finance_overview.html:100 msgid "Summary" msgstr "Zusammenfassung" -#: members/templates/admin/freizeit_finance_overview.html:94 +#: members/templates/admin/freizeit_finance_overview.html:103 msgid "This is the estimated cost and contribution summary:" msgstr "Das ist die geschätzte Kosten- und Zuschussübersicht." -#: members/templates/admin/freizeit_finance_overview.html:116 +#: members/templates/admin/freizeit_finance_overview.html:125 msgid "Potential LJP contributions" msgstr "Mögliche LJP Zuschüsse" -#: members/templates/admin/freizeit_finance_overview.html:124 +#: members/templates/admin/freizeit_finance_overview.html:133 msgid "Remaining costs" msgstr "Verbleibende Kosten" -#: members/templates/admin/freizeit_finance_overview.html:133 +#: members/templates/admin/freizeit_finance_overview.html:142 msgid "" "Positive remaining costs indicate that the estimated costs exceed the " "estimated contributions, while negative\n" @@ -1143,7 +1155,7 @@ msgstr "" "geschätzten Zuschüsse übersteigen, während negative Kosten\n" " bedeuten, dass die geschätzten Zuschüsse die geschätzten Kosten übersteigen." -#: members/templates/admin/freizeit_finance_overview.html:137 +#: members/templates/admin/freizeit_finance_overview.html:146 msgid "" "Note that this cost calculation expects you to apply for LJP contributions. " "On the\n" @@ -1153,11 +1165,11 @@ msgstr "" "beantragst. Auf der Hauptseite dieser Ausfahrt kannst du dir eine Vorlage " "und alle Formblätter für einen solchen Antrag erstellen lassen." -#: members/templates/admin/freizeit_finance_overview.html:142 +#: members/templates/admin/freizeit_finance_overview.html:151 msgid "Submit statement" msgstr "Abrechnung einreichen" -#: members/templates/admin/freizeit_finance_overview.html:144 +#: members/templates/admin/freizeit_finance_overview.html:153 msgid "" "Did you already complete this excursion? If yes, please check if all listed " "expenses are correct\n" @@ -1170,15 +1182,15 @@ msgstr "" "Finanzreferat ein. Wenn du fortschreitest sind keine weiteren Änderungen an " "der Abrechnung mehr möglich." -#: members/templates/admin/freizeit_finance_overview.html:153 +#: members/templates/admin/freizeit_finance_overview.html:162 msgid "Submit" msgstr "Einreichen" -#: members/templates/admin/freizeit_finance_overview.html:158 +#: members/templates/admin/freizeit_finance_overview.html:167 msgid "Statement submitted" msgstr "Abrechnung eingereicht" -#: members/templates/admin/freizeit_finance_overview.html:160 +#: members/templates/admin/freizeit_finance_overview.html:169 msgid "" "The statement for this excursion was already submitted. The finance " "department is currently processing your\n" @@ -1188,7 +1200,7 @@ msgstr "" "Finanzreferat bearbeitet deine Abrechnung zur Zeit und kommt " "schnellstmöglich auf dich zurück." -#: members/templates/admin/freizeit_finance_overview.html:163 +#: members/templates/admin/freizeit_finance_overview.html:172 #: members/templates/admin/invite_for_group_text.html:63 msgid "Back" msgstr "Zurück" diff --git a/jdav_web/members/templates/admin/freizeit_finance_overview.html b/jdav_web/members/templates/admin/freizeit_finance_overview.html index ffba21f..b087ae0 100644 --- a/jdav_web/members/templates/admin/freizeit_finance_overview.html +++ b/jdav_web/members/templates/admin/freizeit_finance_overview.html @@ -38,6 +38,8 @@ cost plan! {% trans "Explanation" %} {% trans "Amount" %} + {% trans "Paid by" %} + {% trans "IBAN valid" %} {% for bill in memberlist.statement.bill_set.all %} @@ -50,6 +52,13 @@ cost plan! {{ bill.amount }}€ + + {{ bill.paid_by.name }} + + + + {% if not bill.paid_by.iban_valid %} {% trans "Change here" %} {% endif %} + {% endfor %} @@ -142,7 +151,7 @@ excursions main page, you can generate a template for a seminar report.{% endblo

{% trans "Submit statement" %}

{% blocktrans %}Did you already complete this excursion? If yes, please check if all listed expenses are correct -and then submit the statement for processing by the finance department. If you proceed, +and people who want their money back have valid bank account numbers. Then submit the statement for processing by the finance department. If you proceed, no further changes to the statement are possible.{% endblocktrans %}

-- 2.38.4 From b665d4ed454acbcace0a1cad8ef54eb3b957a319 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:30:07 +0100 Subject: [PATCH 12/18] abstract true/false renderings --- .../templates/admin/submit_statement.html | 4 ++-- .../admin/freizeit_finance_overview.html | 4 ++-- .../members/templatetags/overview_extras.py | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/jdav_web/finance/templates/admin/submit_statement.html b/jdav_web/finance/templates/admin/submit_statement.html index 7f58deb..01bfe8a 100644 --- a/jdav_web/finance/templates/admin/submit_statement.html +++ b/jdav_web/finance/templates/admin/submit_statement.html @@ -1,5 +1,6 @@ {% extends "admin/base_site.html" %} {% load i18n admin_urls static %} +{% load overview_extras %} {% block extrahead %} {{ block.super }} @@ -47,8 +48,7 @@ {{ bill.paid_by.name }} - - {% if not bill.paid_by.iban_valid %} {% trans "Change here" %} {% endif %} + {{ bill.paid_by.iban_valid|render_bool }} {% endfor %} diff --git a/jdav_web/members/templates/admin/freizeit_finance_overview.html b/jdav_web/members/templates/admin/freizeit_finance_overview.html index b087ae0..81d0b57 100644 --- a/jdav_web/members/templates/admin/freizeit_finance_overview.html +++ b/jdav_web/members/templates/admin/freizeit_finance_overview.html @@ -1,5 +1,6 @@ {% extends "admin/base_site.html" %} {% load i18n admin_urls static %} +{% load overview_extras %} {% block extrahead %} {{ block.super }} @@ -56,8 +57,7 @@ cost plan! {{ bill.paid_by.name }} - - {% if not bill.paid_by.iban_valid %} {% trans "Change here" %} {% endif %} + {{ bill.paid_by.iban_valid|render_bool }} {% endfor %} diff --git a/jdav_web/members/templatetags/overview_extras.py b/jdav_web/members/templatetags/overview_extras.py index 5127167..95d11a4 100644 --- a/jdav_web/members/templatetags/overview_extras.py +++ b/jdav_web/members/templatetags/overview_extras.py @@ -1,4 +1,5 @@ from django import template +from django.utils.html import format_html register = template.Library() @@ -15,3 +16,19 @@ def has_attendee_wrapper(klettertreff, member): @register.simple_tag def has_jugendleiter_wrapper(klettertreff, jugendleiter): return blToColor(klettertreff.has_jugendleiter(jugendleiter)) + +@register.filter +def render_bool(boolean_value): + + if not isinstance(boolean_value, bool): + raise ValueError(f"""Custom Filter 'render_bool': Supplied value '{boolean_value}' is not bool, but {type(boolean_value)}.""") + + if boolean_value: # True is a green tick + color = "#bcd386" + htmlclass = "icon-tick" + else: # False is a red cross + color = "#dba4a4" + htmlclass = "icon-cross" + + return format_html(f"""""") \ No newline at end of file -- 2.38.4 From 0c9579c6069cd0dd44a9fb44dbb704f253de7edc Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:36:48 +0100 Subject: [PATCH 13/18] added translations --- .../finance/locale/de/LC_MESSAGES/django.po | 233 +++-- jdav_web/locale/de/LC_MESSAGES/django.po | 142 +-- .../mailer/locale/de/LC_MESSAGES/django.po | 143 ++- .../material/locale/de/LC_MESSAGES/django.po | 48 +- .../members/locale/de/LC_MESSAGES/django.po | 838 +++++++++--------- .../startpage/locale/de/LC_MESSAGES/django.po | 47 +- 6 files changed, 707 insertions(+), 744 deletions(-) diff --git a/jdav_web/finance/locale/de/LC_MESSAGES/django.po b/jdav_web/finance/locale/de/LC_MESSAGES/django.po index 50524d1..533e564 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: 2024-12-29 13:12+0100\n" +"POT-Creation-Date: 2025-01-19 14:26+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" -#: finance/admin.py:84 +#: finance/admin.py #, python-format msgid "%(name)s is already submitted." msgstr "%(name)s ist bereits eingereicht." -#: finance/admin.py:90 +#: finance/admin.py #, 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." -#: finance/admin.py:93 +#: finance/admin.py msgid "Submit statement" msgstr "Rechnung einreichen" -#: finance/admin.py:177 +#: finance/admin.py #, python-format msgid "%(name)s is not yet submitted." msgstr "%(name)s ist noch nicht eingereicht." -#: finance/admin.py:184 +#: finance/admin.py #, 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." -#: finance/admin.py:188 +#: finance/admin.py #, 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." -#: finance/admin.py:195 +#: finance/admin.py msgid "Statement confirmed" msgstr "Abrechnung abgewickelt" -#: finance/admin.py:201 +#: finance/admin.py 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." -#: finance/admin.py:206 +#: finance/admin.py msgid "Some transactions have no ledger configured. Please fill in the gaps." msgstr "" "Manche Überweisungen haben kein Geldtopf eingestellt. Bitte trage das nach." -#: finance/admin.py:215 +#: finance/admin.py #, 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." -#: finance/admin.py:222 +#: finance/admin.py #, python-format msgid "" "%(name)s already has transactions. Please delete them first, if you want to " @@ -90,12 +90,12 @@ msgstr "" "%(name)s hat bereits Überweisungen. Bitte lösche diese zunächst, bevor du " "neue generierst." -#: finance/admin.py:227 +#: finance/admin.py #, python-format msgid "Successfully generated transactions for %(name)s" msgstr "Automatisch Überweisungsträger für %(name)s generiert." -#: finance/admin.py:230 +#: finance/admin.py #, python-format msgid "" "Error while generating transactions for %(name)s. Do all bills have a payer?" @@ -103,216 +103,209 @@ msgstr "" "Fehler beim Erzeugen der Überweisungsträger für %(name)s. Sind für alle " "Quittungen eine bezahlende Person eingestellt? " -#: finance/admin.py:233 +#: finance/admin.py msgid "View submitted statement" msgstr "Eingereichte Abrechnung einsehen" -#: finance/admin.py:245 +#: finance/admin.py #, python-format msgid "Successfully reduced transactions for %(name)s." msgstr "Überweisungsträger für %(name)s minimiert." -#: finance/admin.py:293 +#: finance/admin.py #, python-format msgid "%(name)s is not yet confirmed." msgstr "%(name)s ist noch nicht bestätigt." -#: finance/admin.py:302 +#: finance/admin.py #, python-format msgid "Successfully unconfirmed %(name)s. I hope you know what you are doing." msgstr "" "Erfolgreich die Bestätigung von %(name)s zurückgenommen. Ich hoffe du weißt " "was du machst." -#: finance/admin.py:307 finance/templates/admin/unconfirm_statement.html:26 +#: finance/admin.py finance/templates/admin/unconfirm_statement.html msgid "Unconfirm statement" msgstr "Bestätigung zurücknehmen" -#: finance/apps.py:8 +#: finance/apps.py msgid "Finance" msgstr "Finanzen" -#: finance/models.py:24 +#: finance/models.py msgid "Name" msgstr "Name" -#: finance/models.py:30 finance/models.py:484 finance/models.py:547 -#: finance/templates/admin/confirmed_statement.html:40 -#: finance/templates/admin/overview_submitted_statement.html:100 +#: finance/models.py finance/templates/admin/confirmed_statement.html +#: finance/templates/admin/overview_submitted_statement.html msgid "Ledger" msgstr "Geldtopf" -#: finance/models.py:31 +#: finance/models.py msgid "Ledgers" msgstr "Geldtöpfe" -#: finance/models.py:51 finance/models.py:420 finance/models.py:546 +#: finance/models.py msgid "Short description" msgstr "Kurzbeschreibung" -#: finance/models.py:54 finance/models.py:421 -#: finance/templates/admin/submit_statement.html:30 +#: finance/models.py finance/templates/admin/submit_statement.html msgid "Explanation" msgstr "Erklärung" -#: finance/models.py:56 +#: finance/models.py msgid "Associated excursion" msgstr "Zugehörige Ausfahrt" -#: finance/models.py:61 +#: finance/models.py msgid "Price per night" msgstr "Preis pro Nacht" -#: finance/models.py:63 +#: finance/models.py msgid "Submitted" -msgstr "Eingericht" +msgstr "Eingereicht" -#: finance/models.py:64 +#: finance/models.py msgid "Submitted on" msgstr "Eingereicht am" -#: finance/models.py:65 +#: finance/models.py msgid "Confirmed" msgstr "Abgewickelt" -#: finance/models.py:66 finance/models.py:491 +#: finance/models.py msgid "Paid on" msgstr "Bezahlt am" -#: finance/models.py:68 +#: finance/models.py msgid "Created by" msgstr "Erstellt von" -#: finance/models.py:73 +#: finance/models.py msgid "Submitted by" msgstr "Eingereicht von" -#: finance/models.py:78 finance/models.py:492 +#: finance/models.py msgid "Authorized by" msgstr "Autorisiert von" -#: finance/models.py:85 finance/models.py:419 finance/models.py:487 +#: finance/models.py msgid "Statement" msgstr "Abrechnung" -#: finance/models.py:86 +#: finance/models.py msgid "Statements" msgstr "Abrechnungen" -#: finance/models.py:101 +#: finance/models.py #, python-format msgid "Statement: %(excursion)s" msgstr "Abrechnung: %(excursion)s" -#: finance/models.py:153 +#: finance/models.py msgid "Ready to confirm" msgstr "Bereit zur Abwicklung" -#: finance/models.py:197 +#: finance/models.py #, python-format msgid "Compensation for %(excu)s" msgstr "Entschädigung für %(excu)s" -#: finance/models.py:330 -#: finance/templates/admin/overview_submitted_statement.html:78 +#: finance/models.py finance/templates/admin/overview_submitted_statement.html msgid "Total" msgstr "Gesamtbetrag" -#: finance/models.py:374 +#: finance/models.py msgid "Statement in preparation" msgstr "Abrechnung in Vorbereitung" -#: finance/models.py:375 +#: finance/models.py msgid "Statements in preparation" msgstr "Abrechnungen in Vorbereitung" -#: finance/models.py:394 +#: finance/models.py msgid "Submitted statement" msgstr "Eingereichte Abrechnung" -#: finance/models.py:395 +#: finance/models.py msgid "Submitted statements" msgstr "Eingereichte Abrechnungen" -#: finance/models.py:411 +#: finance/models.py msgid "Paid statement" msgstr "Bezahlte Abrechnung" -#: finance/models.py:412 +#: finance/models.py msgid "Paid statements" msgstr "Bezahlte Abrechnungen" -#: finance/models.py:423 finance/models.py:444 finance/models.py:481 -#: finance/templates/admin/confirmed_statement.html:38 -#: finance/templates/admin/overview_submitted_statement.html:31 -#: finance/templates/admin/overview_submitted_statement.html:98 -#: finance/templates/admin/submit_statement.html:31 +#: finance/models.py finance/templates/admin/confirmed_statement.html +#: finance/templates/admin/overview_submitted_statement.html +#: finance/templates/admin/submit_statement.html msgid "Amount" msgstr "Betrag" -#: finance/models.py:424 finance/templates/admin/submit_statement.html:32 +#: finance/models.py finance/templates/admin/submit_statement.html msgid "Paid by" msgstr "Bezahlt von" -#: finance/models.py:426 +#: finance/models.py msgid "Covered" msgstr "Übernommen" -#: finance/models.py:427 +#: finance/models.py msgid "Refunded" msgstr "Ausgezahlt" -#: finance/models.py:429 +#: finance/models.py msgid "Proof" msgstr "Beleg" -#: finance/models.py:447 finance/models.py:454 finance/models.py:467 +#: finance/models.py msgid "Bill" msgstr "Ausgabe" -#: finance/models.py:448 finance/models.py:455 finance/models.py:468 -#: finance/templates/admin/overview_submitted_statement.html:26 +#: finance/models.py finance/templates/admin/overview_submitted_statement.html msgid "Bills" msgstr "Ausgaben" -#: finance/models.py:480 finance/templates/admin/confirmed_statement.html:39 -#: finance/templates/admin/overview_submitted_statement.html:99 +#: finance/models.py finance/templates/admin/confirmed_statement.html +#: finance/templates/admin/overview_submitted_statement.html msgid "Reference" msgstr "Verwendungszweck" -#: finance/models.py:482 +#: finance/models.py msgid "Recipient" msgstr "Empfänger" -#: finance/models.py:490 +#: finance/models.py msgid "Paid" msgstr "Bezahlt" -#: finance/models.py:541 +#: finance/models.py msgid "Transaction" msgstr "Überweisung" -#: finance/models.py:542 -#: finance/templates/admin/overview_submitted_statement.html:84 +#: finance/models.py finance/templates/admin/overview_submitted_statement.html msgid "Transactions" msgstr "Überweisungen" -#: finance/templates/admin/confirmed_statement.html:19 -#: finance/templates/admin/overview_submitted_statement.html:17 -#: finance/templates/admin/submit_statement.html:17 -#: finance/templates/admin/unconfirm_statement.html:17 +#: finance/templates/admin/confirmed_statement.html +#: finance/templates/admin/overview_submitted_statement.html +#: finance/templates/admin/submit_statement.html +#: finance/templates/admin/unconfirm_statement.html msgid "Home" msgstr "Start" -#: finance/templates/admin/confirmed_statement.html:23 +#: finance/templates/admin/confirmed_statement.html msgid "Paiment" msgstr "Bezahlung" -#: finance/templates/admin/confirmed_statement.html:28 +#: finance/templates/admin/confirmed_statement.html msgid "Paying statement" msgstr "Rechnung bezahlen" -#: finance/templates/admin/confirmed_statement.html:31 +#: finance/templates/admin/confirmed_statement.html msgid "" "The statement is valid. Please execute the following transactions and then " "proceed by finalizing the confirmation." @@ -320,60 +313,59 @@ msgstr "" "Die Abrechnung ist gültig. Bitte führe die folgenden Überweisungen aus und " "fahre dann fort, indem du die Abwicklung bestätigst." -#: finance/templates/admin/confirmed_statement.html:37 +#: finance/templates/admin/confirmed_statement.html msgid "IBAN" msgstr "IBAN" -#: finance/templates/admin/confirmed_statement.html:41 +#: finance/templates/admin/confirmed_statement.html msgid "QR Code" msgstr "QR Code" -#: finance/templates/admin/confirmed_statement.html:61 -#: finance/templates/admin/confirmed_statement.html:98 +#: finance/templates/admin/confirmed_statement.html msgid "Show" msgstr "Anzeigen" -#: finance/templates/admin/confirmed_statement.html:86 +#: finance/templates/admin/confirmed_statement.html msgid "No QR code can be displayed." msgstr "Es kann kein QR-Code angezeigt werden." -#: finance/templates/admin/confirmed_statement.html:99 +#: finance/templates/admin/confirmed_statement.html msgid "Showing" msgstr "Sichtbar" -#: finance/templates/admin/confirmed_statement.html:111 +#: finance/templates/admin/confirmed_statement.html msgid "I did execute the listed transactions." msgstr "Ich habe die aufgeführten Überweisungen ausgeführt." -#: finance/templates/admin/confirmed_statement.html:113 +#: finance/templates/admin/confirmed_statement.html msgid "Confirm" msgstr "Bestätigen" -#: finance/templates/admin/overview_submitted_statement.html:21 +#: finance/templates/admin/overview_submitted_statement.html msgid "Overview" msgstr "Übersicht" -#: finance/templates/admin/overview_submitted_statement.html:32 +#: finance/templates/admin/overview_submitted_statement.html msgid "Covered by association" msgstr "Vom Verein übernommen" -#: finance/templates/admin/overview_submitted_statement.html:50 +#: finance/templates/admin/overview_submitted_statement.html #, python-format msgid "The total amount is %(total_bills)s €." msgstr "Der Gesamtbetrag beträgt %(total_bills)s €." -#: finance/templates/admin/overview_submitted_statement.html:54 +#: finance/templates/admin/overview_submitted_statement.html msgid "Excursion" msgstr "Ausfahrt" -#: finance/templates/admin/overview_submitted_statement.html:57 +#: finance/templates/admin/overview_submitted_statement.html #, python-format msgid "This excursion featured %(staff_count)s youth leader(s), each costing" msgstr "" "Diese Ausfahrt hatte %(staff_count)s Jugendleiter*innen. Auf jede*n " "entfallen die folgenden Kosten:" -#: finance/templates/admin/overview_submitted_statement.html:62 +#: finance/templates/admin/overview_submitted_statement.html #, python-format msgid "" "%(nights)s nights for %(price_per_night)s€ per night making a total of " @@ -382,7 +374,7 @@ msgstr "" "%(nights)s Nächte zum Preis von %(price_per_night)s€ pro Nacht. Das ergibt " "eine Gesamtsumme von %(nights_per_yl)s€." -#: finance/templates/admin/overview_submitted_statement.html:65 +#: finance/templates/admin/overview_submitted_statement.html #, python-format msgid "" "%(duration)s days for %(allowance_per_day)s€ per day making a total of " @@ -391,7 +383,7 @@ msgstr "" "%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine " "Gesamtsumme von %(allowance_per_yl)s€." -#: finance/templates/admin/overview_submitted_statement.html:68 +#: finance/templates/admin/overview_submitted_statement.html #, python-format msgid "" "%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / " @@ -400,7 +392,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€." -#: finance/templates/admin/overview_submitted_statement.html:73 +#: finance/templates/admin/overview_submitted_statement.html #, python-format msgid "" "In total this is %(total_per_yl)s€ times %(staff_count)s, giving " @@ -409,12 +401,12 @@ msgstr "" "Insgesamt sind das Kosten von %(total_per_yl)s€ mal %(staff_count)s, " "insgesamt also %(total_staff)s€." -#: finance/templates/admin/overview_submitted_statement.html:81 +#: finance/templates/admin/overview_submitted_statement.html #, python-format msgid "This results in a total amount of %(total)s€" msgstr "Das resultiert in einem Gesamtbetrag von %(total)s€" -#: finance/templates/admin/overview_submitted_statement.html:87 +#: finance/templates/admin/overview_submitted_statement.html msgid "" "Currently, no transactions are planned. You can auto generate them from the " "data, by clicking the following button." @@ -422,19 +414,19 @@ msgstr "" "Aktuell sind keine Überweisungen vorgesehen. Du kannst die erforderlichen " "durch Klicken auf den folgenden Knopf generieren." -#: finance/templates/admin/overview_submitted_statement.html:90 +#: finance/templates/admin/overview_submitted_statement.html msgid "Generate transactions" msgstr "Erzeuge Überweisungsträger" -#: finance/templates/admin/overview_submitted_statement.html:94 +#: finance/templates/admin/overview_submitted_statement.html msgid "Currently the following transactions are planned." msgstr "Aktuell sind die folgenden Überweisungen vorgesehen." -#: finance/templates/admin/overview_submitted_statement.html:137 +#: finance/templates/admin/overview_submitted_statement.html msgid "These transactions match the calculated costs." msgstr "Diese Überweisungen stimmen mit den berechneten Kosten überein." -#: finance/templates/admin/overview_submitted_statement.html:140 +#: finance/templates/admin/overview_submitted_statement.html msgid "" "The current transactions do not reflect all costs in this statement. Please " "fix the following issues:" @@ -442,57 +434,53 @@ msgstr "" "Die aktuell vorgesehenen Überweisungen stimmen nicht mit den berechneten " "Kosten überein. Bitte korrigiere die folgenden Fehler:" -#: finance/templates/admin/overview_submitted_statement.html:145 +#: finance/templates/admin/overview_submitted_statement.html msgid "Currently receiving" msgstr "Erhält aktuell" -#: finance/templates/admin/overview_submitted_statement.html:146 +#: finance/templates/admin/overview_submitted_statement.html msgid "Actual costs" msgstr "Tatsächliche Kosten" -#: finance/templates/admin/overview_submitted_statement.html:147 +#: finance/templates/admin/overview_submitted_statement.html msgid "Difference" msgstr "Differenz" -#: finance/templates/admin/overview_submitted_statement.html:174 +#: finance/templates/admin/overview_submitted_statement.html msgid "Accept" msgstr "Annehmen" -#: finance/templates/admin/overview_submitted_statement.html:175 +#: finance/templates/admin/overview_submitted_statement.html msgid "Reject" msgstr "Ablehnen" -#: finance/templates/admin/overview_submitted_statement.html:178 -#: finance/templates/admin/submit_statement.html:65 -#: finance/templates/admin/unconfirm_statement.html:39 +#: finance/templates/admin/overview_submitted_statement.html +#: finance/templates/admin/submit_statement.html +#: finance/templates/admin/unconfirm_statement.html msgid "Cancel" msgstr "Abbruch" -#: finance/templates/admin/submit_statement.html:21 -#: finance/templates/admin/submit_statement.html:64 +#: finance/templates/admin/submit_statement.html msgid "Submit" msgstr "Einreichen" -#: finance/templates/admin/submit_statement.html:26 +#: finance/templates/admin/submit_statement.html msgid "Submit to the finance department" msgstr "Beim Finanzreferat einreichen" -#: finance/templates/admin/submit_statement.html:27 +#: finance/templates/admin/submit_statement.html msgid "" "Please check if all expenses are documented correctly and if all payers have " "a valid account code." -msgstr "Bitte überprüfe, ob alle Ausgaben korrekt erfasst sind und ob alle " +msgstr "" +"Bitte überprüfe, ob alle Ausgaben korrekt erfasst sind und ob alle " "auslegenden Personen eine gültige IBAN haben." -#: finance/templates/admin/submit_statement.html:33 +#: finance/templates/admin/submit_statement.html msgid "IBAN valid" msgstr "IBAN gültig" -#: finance/templates/admin/submit_statement.html:51 -msgid "Change here" -msgstr "Hier ändern" - -#: finance/templates/admin/submit_statement.html:58 +#: finance/templates/admin/submit_statement.html 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." @@ -500,12 +488,11 @@ msgstr "" "Möchtest du die Abrechnung beim Finanzreferat einreichen? Wenn du " "fortschreitest, sind keine weiteren Änderungen an der Abrechnung möglich." -#: finance/templates/admin/unconfirm_statement.html:21 -#: finance/templates/admin/unconfirm_statement.html:38 +#: finance/templates/admin/unconfirm_statement.html msgid "Unconfirm" msgstr "Bestätigung zurücknehmen" -#: finance/templates/admin/unconfirm_statement.html:29 +#: finance/templates/admin/unconfirm_statement.html msgid "" "You are entering risk zone! Do you really want to manually set this " "statement back to unconfirmed?" @@ -513,7 +500,7 @@ msgstr "" "Du bewegst dich in einer Risiko Zone! Möchtest du wirklich manuell die " "Bestätigung dieser Abrechnung zurücknehmen?" -#: finance/templates/admin/unconfirm_statement.html:36 +#: finance/templates/admin/unconfirm_statement.html msgid "" "I am aware that this is not a standard procedure and this might cause data " "integrity issues." diff --git a/jdav_web/locale/de/LC_MESSAGES/django.po b/jdav_web/locale/de/LC_MESSAGES/django.po index 14cfefa..c4738bd 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: 2024-12-01 16:23+0100\n" +"POT-Creation-Date: 2025-01-19 14:26+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,103 +18,103 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: contrib/admin.py:59 +#: contrib/admin.py #, python-format msgid "You are not allowed to view %(name)s." msgstr "Du hast nicht die notwendigen Berechtigungen um %(name)s zu sehen." -#: jdav_web/urls.py:26 +#: jdav_web/urls.py msgid "Startpage" msgstr "Startseite" -#: logindata/admin.py:25 +#: logindata/admin.py msgid "Permissions" msgstr "Berechtigungen" -#: logindata/admin.py:36 +#: logindata/admin.py msgid "Important dates" msgstr "Wichtigen Daten" -#: logindata/apps.py:8 +#: logindata/apps.py msgid "Authentication" msgstr "Authentifizierung" -#: logindata/models.py:10 +#: logindata/models.py msgid "Permission group" msgstr "Berechtigungsgruppe" -#: logindata/models.py:11 +#: logindata/models.py msgid "Permission groups" msgstr "Berechtigungsgruppen" -#: logindata/models.py:17 +#: logindata/models.py msgid "Login Datum" msgstr "Zugangsdaten" -#: logindata/models.py:18 +#: logindata/models.py msgid "Login Data" msgstr "Zugangsdaten" -#: logindata/models.py:25 +#: logindata/models.py msgid "Password" msgstr "Passwort" -#: logindata/models.py:31 +#: logindata/models.py msgid "Active registration password" msgstr "Aktives Registrierungspasswort" -#: logindata/models.py:32 +#: logindata/models.py msgid "Active registration passwords" msgstr "Aktive Registrierungspasswörter" -#: logindata/templates/logindata/register_failed.html:5 +#: logindata/templates/logindata/register_failed.html msgid "Registration" msgstr "Registrierung" -#: logindata/templates/logindata/register_failed.html:10 -#: logindata/templates/logindata/register_form.html:13 -#: logindata/templates/logindata/register_password.html:11 -#: logindata/templates/logindata/register_success.html:10 +#: logindata/templates/logindata/register_failed.html +#: logindata/templates/logindata/register_form.html +#: logindata/templates/logindata/register_password.html +#: logindata/templates/logindata/register_success.html msgid "Set login data" msgstr "Zugangsdaten wählen" -#: logindata/templates/logindata/register_failed.html:12 +#: logindata/templates/logindata/register_failed.html msgid "Something went wrong. The registration key is invalid or has expired." msgstr "" "Etwas ist schief gegangen. Der Registrierungscode ist ungültig oder ist " "abgelaufen." -#: logindata/templates/logindata/register_failed.html:14 +#: logindata/templates/logindata/register_failed.html msgid "If you think this is a mistake, please" msgstr "Falls du denkst, dass das ein Fehler ist, bitte" -#: logindata/templates/logindata/register_failed.html:14 +#: logindata/templates/logindata/register_failed.html msgid "contact us." msgstr "kontaktiere uns." -#: logindata/templates/logindata/register_form.html:6 -#: logindata/templates/logindata/register_password.html:6 +#: logindata/templates/logindata/register_form.html +#: logindata/templates/logindata/register_password.html msgid "Register" msgstr "Registrieren" -#: logindata/templates/logindata/register_form.html:15 -#: logindata/templates/logindata/register_password.html:13 +#: logindata/templates/logindata/register_form.html +#: logindata/templates/logindata/register_password.html msgid "Welcome, " msgstr "Willkommen, " -#: logindata/templates/logindata/register_form.html:16 +#: logindata/templates/logindata/register_form.html msgid "" "To set your personal login data, please enter the password that you received." msgstr "" "Um deine persönlichen Zugansdaten festzulegen, gib bitte das Passwort ein, " "das du erhalten hast." -#: logindata/templates/logindata/register_form.html:30 -#: logindata/templates/logindata/register_password.html:23 +#: logindata/templates/logindata/register_form.html +#: logindata/templates/logindata/register_password.html msgid "submit" msgstr "Einreichen" -#: logindata/templates/logindata/register_password.html:13 +#: logindata/templates/logindata/register_password.html msgid "" "To set your personal login data for Kompass, please enter the password that " "you received." @@ -122,20 +122,20 @@ msgstr "" "Um deine persönlichen Zugangsdaten festzulegen, gib bitte das Passwort ein, " "das du erhalten hast." -#: logindata/templates/logindata/register_success.html:5 +#: logindata/templates/logindata/register_success.html msgid "Registration successful" msgstr "Zugangsdaten erfolgreich festgelegt" -#: logindata/templates/logindata/register_success.html:12 +#: logindata/templates/logindata/register_success.html msgid "You successfully set your login data. You can now proceed to" msgstr "" "Du hast deine Zugangsdaten erfolgreich festgelegt. Du kannst nun weiter zum" -#: logindata/views.py:59 +#: logindata/views.py msgid "You entered a wrong password." msgstr "Das eingegebene Passwort ist falsch." -#: templates/admin/delete_confirmation.html:7 +#: templates/admin/delete_confirmation.html #, python-format msgid "" "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " @@ -146,7 +146,7 @@ msgstr "" "folgenden verknüpften Objekte führen, aber du hast nicht die Berechtigung " "die folgenden Typen von Objekten zu löschen:" -#: templates/admin/delete_confirmation.html:12 +#: templates/admin/delete_confirmation.html #, python-format msgid "" "Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " @@ -155,7 +155,7 @@ msgstr "" "Löschen von %(object_name)s '%(escaped_object)s' würde zur Löschung der " "folgenden geschützten verknüpften Objekte führen:" -#: templates/admin/delete_confirmation.html:17 +#: templates/admin/delete_confirmation.html #, python-format msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"?" @@ -163,17 +163,17 @@ msgstr "" "Bist du sicher, dass du %(object_name)s \"%(escaped_object)s\" und alle " "davon abhängigen Objekte löschen möchtest? " -#: templates/admin/delete_confirmation.html:29 -#: templates/admin/delete_selected_confirmation.html:34 +#: templates/admin/delete_confirmation.html +#: templates/admin/delete_selected_confirmation.html msgid "Yes, I’m sure" msgstr "Ja, ich bin sicher" -#: templates/admin/delete_confirmation.html:30 -#: templates/admin/delete_selected_confirmation.html:35 +#: templates/admin/delete_confirmation.html +#: templates/admin/delete_selected_confirmation.html msgid "No, take me back" msgstr "Nein, bitte abbrechen" -#: templates/admin/delete_selected_confirmation.html:6 +#: templates/admin/delete_selected_confirmation.html #, python-format msgid "" "Deleting the selected %(objects_name)s would result in deleting related " @@ -184,7 +184,7 @@ msgstr "" "verknüpften Objekte führen, aber du hast nicht die Berechtigung die " "folgenden Typen von Objekten zu löschen:" -#: templates/admin/delete_selected_confirmation.html:9 +#: templates/admin/delete_selected_confirmation.html #, python-format msgid "" "Deleting the selected %(objects_name)s would require deleting the following " @@ -193,7 +193,7 @@ msgstr "" "Löschen der ausgewählten %(objects_name)s würde zur Löschung der folgenden " "geschützten verknüpften Objekte führen:" -#: templates/admin/delete_selected_confirmation.html:12 +#: templates/admin/delete_selected_confirmation.html #, python-format msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " @@ -202,99 +202,99 @@ msgstr "" "Bist du sicher, dass du die ausgewählten %(objects_name)s löschen möchtest? " "Alle folgenden Objekte und alle davon abhängigen Objekte werden gelöscht:" -#: templates/admin/delete_selected_confirmation.html:14 +#: templates/admin/delete_selected_confirmation.html msgid "Summary" msgstr "Zusammenfassung" -#: templates/admin/delete_selected_confirmation.html:18 +#: templates/admin/delete_selected_confirmation.html msgid "Objects" msgstr "Objekte" -#: templates/admin/edit_inline/stacked.html:20 -#: templates/admin/edit_inline/tabular.html:47 -#: templates/nesting/admin/inlines/stacked.html:42 +#: templates/admin/edit_inline/stacked.html +#: templates/admin/edit_inline/tabular.html +#: templates/nesting/admin/inlines/stacked.html msgid "Change" msgstr "Ändern" -#: templates/admin/edit_inline/stacked.html:20 -#: templates/admin/edit_inline/tabular.html:47 -#: templates/nesting/admin/inlines/stacked.html:42 +#: templates/admin/edit_inline/stacked.html +#: templates/admin/edit_inline/tabular.html +#: templates/nesting/admin/inlines/stacked.html msgid "View" msgstr "Anzeigen" -#: templates/admin/edit_inline/stacked.html:22 -#: templates/admin/edit_inline/tabular.html:49 -#: templates/nesting/admin/inlines/stacked.html:44 +#: templates/admin/edit_inline/stacked.html +#: templates/admin/edit_inline/tabular.html +#: templates/nesting/admin/inlines/stacked.html msgid "View on site" msgstr "Auf der Website anzeigen" -#: templates/admin/edit_inline/tabular.html:33 +#: templates/admin/edit_inline/tabular.html msgid "Delete?" msgstr "Löschen?" -#: templates/admin/finance/statementconfirmed/change_form_object_tools.html:8 +#: templates/admin/finance/statementconfirmed/change_form_object_tools.html msgid "Unconfirm" msgstr "Bestätigung zurücknehmen" -#: templates/admin/finance/statementsubmitted/change_form_object_tools.html:21 +#: templates/admin/finance/statementsubmitted/change_form_object_tools.html msgid "Reduce transactions" msgstr "Überweisungen minimieren" -#: templates/admin/finance/statementsubmitted/change_form_object_tools.html:36 +#: templates/admin/finance/statementsubmitted/change_form_object_tools.html msgid "Overview" msgstr "Übersicht" -#: templates/admin/finance/statementunsubmitted/change_form_object_tools.html:9 +#: templates/admin/finance/statementunsubmitted/change_form_object_tools.html msgid "Submit" msgstr "Einreichen" -#: templates/admin/members/freizeit/change_form_object_tools.html:9 +#: templates/admin/members/freizeit/change_form_object_tools.html msgid "Generate crisis intervention list" msgstr "Kriseninterventionsliste erstellen" -#: templates/admin/members/freizeit/change_form_object_tools.html:16 +#: templates/admin/members/freizeit/change_form_object_tools.html msgid "Generate SJR application" msgstr "SJR Antrag erstellen" -#: templates/admin/members/freizeit/change_form_object_tools.html:23 +#: templates/admin/members/freizeit/change_form_object_tools.html msgid "Generate seminar report" msgstr "Landesjugendplan Antrag erstellen" -#: templates/admin/members/freizeit/change_form_object_tools.html:30 +#: templates/admin/members/freizeit/change_form_object_tools.html msgid "Generate overview" msgstr "Hinweise für Jugendleiter*innen erstellen" -#: templates/admin/members/freizeit/change_form_object_tools.html:38 +#: templates/admin/members/freizeit/change_form_object_tools.html msgid "Finance overview" msgstr "Kostenübersicht" -#: templates/admin/members/member/change_form_object_tools.html:8 +#: templates/admin/members/member/change_form_object_tools.html msgid "Invite as user" msgstr "Als Kompassbenutzer*in einladen" -#: templates/admin/members/memberunconfirmedproxy/change_form_object_tools.html:8 +#: templates/admin/members/memberunconfirmedproxy/change_form_object_tools.html msgid "Demote to waiter" msgstr "Zurück auf die Warteliste setzen" -#: templates/admin/members/memberwaitinglist/change_form_object_tools.html:8 -#: templates/admin/members/memberwaitinglist/submit_line.html:9 +#: templates/admin/members/memberwaitinglist/change_form_object_tools.html +#: templates/admin/members/memberwaitinglist/submit_line.html msgid "Invite to group" msgstr "Zu Gruppe einladen" -#: templates/nesting/admin/inlines/stacked.html:87 +#: templates/nesting/admin/inlines/stacked.html #, python-format msgid "Add another %(verbose_name)s" msgstr "Weiteren %(verbose_name)s hinzufügen" -#: utils.py:15 +#: utils.py msgid "Please keep filesize under {} MiB. Current filesize: {:10.2f} MiB." msgstr "Maximale Dateigröße {} MiB. Aktuelle Dateigröße: {:10.2f} MiB." -#: utils.py:43 +#: utils.py msgid "Filetype not supported." msgstr "Dateityp nicht unterstützt." -#: utils.py:45 +#: utils.py msgid "Please keep filesize under {}. Current filesize: {}" msgstr "Maximale Dateigröße {}. Aktuelle Dateigröße: {}." diff --git a/jdav_web/mailer/locale/de/LC_MESSAGES/django.po b/jdav_web/mailer/locale/de/LC_MESSAGES/django.po index 7a7e0ec..a16e5dd 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: 2024-12-02 22:50+0100\n" +"POT-Creation-Date: 2025-01-19 14:26+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,11 +18,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: mailer/admin.py:69 +#: mailer/admin.py msgid "Send message" msgstr "Nachricht verschicken" -#: mailer/admin.py:96 +#: mailer/admin.py msgid "" "Your account is not connected to a member. Please contact your system " "administrator." @@ -30,7 +30,7 @@ msgstr "" "Dein Account ist nicht mit eine*r Teilnehmer*in verknüpft. Bitte kontaktiere " "deine*n Systemadministrator*in." -#: mailer/admin.py:100 +#: mailer/admin.py msgid "" "Your email address is not an internal email address. Please change your " "email address and try again." @@ -38,58 +38,58 @@ msgstr "" "Deine E-Mail Adresse ist keine DAV360 E-Mail Adresse. Bitte stelle sicher, " "dass deine E-Mail Adresse mit @alpenverein-heidelberg.de endet." -#: mailer/admin.py:104 +#: mailer/admin.py msgid "Failed to send message" msgstr "Fehler beim Senden der Email" -#: mailer/admin.py:106 +#: mailer/admin.py msgid "Failed to send some messages" msgstr "Fehler beim Senden der Emails" -#: mailer/admin.py:108 +#: mailer/admin.py msgid "Successfully sent message" msgstr "Email wurde erfolgreich verschickt" -#: mailer/apps.py:7 +#: mailer/apps.py msgid "mailer" msgstr "Verteiler" -#: mailer/management/commands/notify_active.py:36 +#: mailer/management/commands/notify_active.py #, python-format msgid "Congratulation %(name)s" msgstr "Herzlichen Glückwunsch %(name)s" -#: mailer/models.py:20 +#: mailer/models.py msgid "Only alphanumeric characters, ., - and _ are allowed" msgstr "Nur Buchstaben, Zahlen, ., . und _ sind erlaubt" -#: mailer/models.py:25 +#: mailer/models.py msgid "name" msgstr "Name" -#: mailer/models.py:27 +#: mailer/models.py msgid "Forward to participants" msgstr "Weiterleitung an Teilnehmer*innen" -#: mailer/models.py:30 +#: mailer/models.py msgid "Forward to group" msgstr "Weiterleitung an Gruppe" -#: mailer/models.py:32 +#: mailer/models.py msgid "Restrict to internal email addresses" msgstr "Weiterleitung nur von internen E-Mail Adressen erlaubt" -#: mailer/models.py:33 +#: mailer/models.py msgid "Only allow forwarding to this e-mail address from the internal domain." msgstr "" "Leite nur E-Mails weiter, die von ...@alpenverein-heidelberg.de verschickt " "wurden. " -#: mailer/models.py:36 +#: mailer/models.py msgid "Allowed sender" msgstr "Erlaubte Absender:innen" -#: mailer/models.py:37 +#: mailer/models.py msgid "" "Only forward e-mails of members of selected groups. Leave empty to allow all " "senders." @@ -97,222 +97,221 @@ msgstr "" "Leite nur E-Mails von Mitgliedern dieser Gruppen weiter. Lasse dieses Feld " "frei, um alle Absender*innen zu erlauben." -#: mailer/models.py:55 +#: mailer/models.py msgid "email address" msgstr "Email-Adresse" -#: mailer/models.py:56 +#: mailer/models.py msgid "email addresses" msgstr "Email-Adressen" -#: mailer/models.py:69 +#: mailer/models.py msgid "Either a group or at least one member is required as forward recipient." msgstr "" "Es muss entweder eine Gruppe oder mindestens ein*e Teilnehmer*in als " "Empfänger*in ausgewählt werden." -#: mailer/models.py:77 +#: mailer/models.py msgid "subject" msgstr "Betreff" -#: mailer/models.py:78 +#: mailer/models.py msgid "content" msgstr "Inhalt" -#: mailer/models.py:80 +#: mailer/models.py msgid "to group" msgstr "An Gruppe" -#: mailer/models.py:83 +#: mailer/models.py msgid "to freizeit" msgstr "An Ausfahrt" -#: mailer/models.py:88 +#: mailer/models.py msgid "to notes list" msgstr "An Notizliste" -#: mailer/models.py:93 +#: mailer/models.py msgid "to member" msgstr "An Teilnehmer*innen" -#: mailer/models.py:96 +#: mailer/models.py msgid "reply to participant" msgstr "Antwort an Teilnehmer*innen" -#: mailer/models.py:100 +#: mailer/models.py msgid "reply to custom email address" msgstr "Antwort an Email-Adresse" -#: mailer/models.py:103 +#: mailer/models.py msgid "sent" msgstr "Gesendet" -#: mailer/models.py:104 +#: mailer/models.py msgid "Created by" msgstr "Erstellt von" -#: mailer/models.py:122 +#: mailer/models.py msgid "Some other members" msgstr "Andere Teilnehmer*innen" -#: mailer/models.py:124 +#: mailer/models.py msgid "recipients" msgstr "Empfänger" -#: mailer/models.py:196 +#: mailer/models.py msgid "message" msgstr "Nachricht" -#: mailer/models.py:197 +#: mailer/models.py msgid "messages" msgstr "Nachrichten" -#: mailer/models.py:199 +#: mailer/models.py msgid "Can submit mails" msgstr "Kann Mails verschicken" -#: mailer/models.py:220 +#: mailer/models.py msgid "" "Either a group, a memberlist or at least one member is required as recipient" msgstr "" "Es muss entweder eine Gruppe, eine Teilnehmer*innenliste oder mindestens " "ein*e Teilnehmer*in als Empfänger*in ausgewählt werden." -#: mailer/models.py:227 +#: mailer/models.py msgid "file" msgstr "Datei" -#: mailer/models.py:232 +#: mailer/models.py msgid "Empty" msgstr "Leer" -#: mailer/models.py:235 +#: mailer/models.py msgid "attachment" msgstr "Anhang" -#: mailer/models.py:236 +#: mailer/models.py msgid "attachments" msgstr "Anhänge" -#: mailer/templates/mailer/change_form.html:11 +#: mailer/templates/mailer/change_form.html msgid "Save and send mail" msgstr "Speichern und Email senden" -#: mailer/templates/mailer/confirm_send.html:7 +#: mailer/templates/mailer/confirm_send.html msgid "Do you really want to send these mails?" msgstr "Möchtest du diese Emails wirklich verschicken?" -#: mailer/templates/mailer/confirm_send.html:13 +#: mailer/templates/mailer/confirm_send.html msgid "already sent" msgstr "schon verschickt" -#: mailer/templates/mailer/confirm_send.html:19 +#: mailer/templates/mailer/confirm_send.html msgid "" "Some messages have already been sent! Do you really want to resend them?" msgstr "" "Einige Emails wurden schon versendet! Möchtest du diese wirklich nochmal " "senden?" -#: mailer/templates/mailer/confirm_send.html:30 +#: mailer/templates/mailer/confirm_send.html msgid "Send" msgstr "Senden" -#: mailer/templates/mailer/confirm_send.html:35 +#: mailer/templates/mailer/confirm_send.html msgid "Cancel" msgstr "Abbruch" -#: mailer/templates/mailer/confirmation_sent.html:4 -#: mailer/templates/mailer/unsubscribe.html:5 -#: mailer/templates/mailer/unsubscribe.html:25 +#: mailer/templates/mailer/confirmation_sent.html +#: mailer/templates/mailer/unsubscribe.html msgid "Unsubscribe" msgstr "Vom Newsletter abmelden" -#: mailer/templates/mailer/confirmation_sent.html:7 +#: mailer/templates/mailer/confirmation_sent.html msgid "Sent confirmation mail to" msgstr "Bestätigungsmail gesendet an" -#: mailer/templates/mailer/confirmation_sent.html:7 +#: mailer/templates/mailer/confirmation_sent.html msgid "Follow the link in your mail to confirm your unsubscription." msgstr "Folge dem Link in der Email, um die Abmeldung zu bestätigen." -#: mailer/templates/mailer/index.html:2 +#: mailer/templates/mailer/index.html msgid "This is the mailer app!" msgstr "Das ist die Mailer App!" -#: mailer/templates/mailer/send.html:2 +#: mailer/templates/mailer/send.html msgid "Here you can send new emails!" msgstr "Hier kannst du neue Emails verschicken!" -#: mailer/templates/mailer/send.html:11 +#: mailer/templates/mailer/send.html msgid "Subject:" msgstr "Betreff" -#: mailer/templates/mailer/send.html:14 +#: mailer/templates/mailer/send.html msgid "Content:" msgstr "Inhalt:" -#: mailer/templates/mailer/send.html:17 +#: mailer/templates/mailer/send.html msgid "Receiving group:" msgstr "Erhaltende Gruppe" -#: mailer/templates/mailer/send.html:24 +#: mailer/templates/mailer/send.html msgid "Send mail" msgstr "Email senden" -#: mailer/templates/mailer/subscribe.html:5 +#: mailer/templates/mailer/subscribe.html msgid "Here you can register yourself to the newsletter" msgstr "Hier kannst du dich für den Newsletter anmelden." -#: mailer/templates/mailer/subscribe.html:16 +#: mailer/templates/mailer/subscribe.html msgid "Prename" msgstr "Vorname" -#: mailer/templates/mailer/subscribe.html:21 +#: mailer/templates/mailer/subscribe.html msgid "Lastname" msgstr "Nachname" -#: mailer/templates/mailer/subscribe.html:26 mailer/views.py:60 +#: mailer/templates/mailer/subscribe.html mailer/views.py msgid "Birthdate" msgstr "Geburtsdatum" -#: mailer/templates/mailer/subscribe.html:37 -#: mailer/templates/mailer/unsubscribe.html:20 +#: mailer/templates/mailer/subscribe.html +#: mailer/templates/mailer/unsubscribe.html msgid "Email address" msgstr "Email-Adresse" -#: mailer/templates/mailer/subscribe.html:42 +#: mailer/templates/mailer/subscribe.html msgid "Register" msgstr "Registrieren" -#: mailer/templates/mailer/subscribed.html:3 +#: mailer/templates/mailer/subscribed.html msgid "Subscribed successfully" msgstr "Erfolgreich angemeldet" -#: mailer/templates/mailer/unsubscribe.html:9 +#: mailer/templates/mailer/unsubscribe.html msgid "Here you can unsubscribe from the newsletter" msgstr "Hier kannst du dich vom Newsletter abmelden" -#: mailer/templates/mailer/unsubscribed.html:8 +#: mailer/templates/mailer/unsubscribed.html msgid "Successfully unsubscribed from the newsletter for " msgstr "Newsletter erfolgreich abbestellt für " -#: mailer/views.py:36 +#: mailer/views.py msgid "Can't verify this link. Try again!" msgstr "Ungültiger Link. Bitte nochmal versuchen!" -#: mailer/views.py:48 +#: mailer/views.py msgid "Please fill in every field" msgstr "Bitte jedes Feld ausfüllen!" -#: mailer/views.py:50 +#: mailer/views.py msgid "Unsubscription confirmation" msgstr "Abmeldebestätigung" -#: mailer/views.py:83 +#: mailer/views.py msgid "Please fill in every field!" msgstr "Bitte jedes Feld ausfüllen!" -#: mailer/views.py:90 +#: mailer/views.py msgid "Member already exists" msgstr "Mitglied schon vorhanden" diff --git a/jdav_web/material/locale/de/LC_MESSAGES/django.po b/jdav_web/material/locale/de/LC_MESSAGES/django.po index 12557af..c8467dd 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: 2024-12-01 16:23+0100\n" +"POT-Creation-Date: 2025-01-19 14:26+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,95 +18,95 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: material/admin.py:29 +#: material/admin.py msgid "Age" msgstr "Alter" -#: material/admin.py:34 +#: material/admin.py msgid "Not too old" msgstr "Nicht zu alt" -#: material/admin.py:35 +#: material/admin.py msgid "Too old" msgstr "Zu alt" -#: material/apps.py:7 +#: material/apps.py msgid "material" msgstr "Material" -#: material/models.py:16 +#: material/models.py msgid "Name" msgstr "Name" -#: material/models.py:22 material/models.py:39 +#: material/models.py msgid "Material category" msgstr "Materialtyp" -#: material/models.py:23 +#: material/models.py msgid "Material categories" msgstr "Materialtypen" -#: material/models.py:32 +#: material/models.py msgid "name" msgstr "Name" -#: material/models.py:33 +#: material/models.py msgid "description" msgstr "Beschreibung" -#: material/models.py:34 +#: material/models.py msgid "quantity" msgstr "Anzahl" -#: material/models.py:35 +#: material/models.py msgid "purchase date" msgstr "Kaufdatum" -#: material/models.py:36 +#: material/models.py msgid "lifetime (years)" msgstr "Lebenszeit (Jahre)" -#: material/models.py:37 +#: material/models.py msgid "photo" msgstr "Bild" -#: material/models.py:50 +#: material/models.py msgid "Quantity" msgstr "Anzahl" -#: material/models.py:57 +#: material/models.py msgid "Thumbnail" msgstr "Bild" -#: material/models.py:64 +#: material/models.py msgid "Owners" msgstr "Verantwortliche" -#: material/models.py:74 +#: material/models.py msgid "Not too old?" msgstr "Nicht zu alt?" -#: material/models.py:77 +#: material/models.py msgid "material part" msgstr "Materialteil" -#: material/models.py:78 +#: material/models.py msgid "material parts" msgstr "Materialteile" -#: material/models.py:84 +#: material/models.py msgid "owner" msgstr "Besitzer" -#: material/models.py:85 +#: material/models.py msgid "count" msgstr "Anzahl" -#: material/models.py:92 +#: material/models.py msgid "ownership" msgstr "Besitzer" -#: material/models.py:93 +#: material/models.py msgid "ownerships" msgstr "Verantwortliche" diff --git a/jdav_web/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po index 73e948e..16f2958 100644 --- a/jdav_web/members/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/members/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-29 13:12+0100\n" +"POT-Creation-Date: 2025-01-19 14:26+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,202 +18,200 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: members/admin.py:129 members/models.py:435 +#: members/admin.py members/models.py msgid "Registration complete" msgstr "Anmeldung vollständig" -#: members/admin.py:135 +#: members/admin.py msgid "True" msgstr "Ja" -#: members/admin.py:136 +#: members/admin.py msgid "False" msgstr "Nein" -#: members/admin.py:137 +#: members/admin.py msgid "All" msgstr "Alle" -#: members/admin.py:178 +#: members/admin.py msgid "The entered IBAN is not valid." msgstr "Die eingegebene IBAN ist ungültig." -#: members/admin.py:201 members/admin.py:432 +#: members/admin.py msgid "Contact information" msgstr "Kontaktinformationen" -#: members/admin.py:206 members/admin.py:437 +#: members/admin.py msgid "Skills" msgstr "Fähigkeiten" -#: members/admin.py:211 members/admin.py:442 +#: members/admin.py msgid "Others" msgstr "Sonstiges" -#: members/admin.py:217 members/admin.py:447 +#: members/admin.py msgid "Organizational" msgstr "Organisatorisches" -#: members/admin.py:300 +#: members/admin.py msgid "Compose new mail to selected members" msgstr "Neue Nachricht an ausgewählte Teilnehmer*innen verfassen" -#: members/admin.py:306 +#: members/admin.py msgid "Echo required" msgstr "Rückmeldung erforderlich" -#: members/admin.py:308 +#: members/admin.py msgid "Successfully requested echo from selected members." msgstr "" "Rückmeldungsaufforderung erfolgreich an ausgewählte Teilnehmer*innen " "verschickt." -#: members/admin.py:309 +#: members/admin.py msgid "Request echo from selected members" msgstr "Rückmeldungsaufforderung an ausgewählte Teilnehmer*innen verschicken" -#: members/admin.py:318 +#: members/admin.py #, python-format msgid "%(name)s does not have a DAV360 email address or is already registered." msgstr "%(name)s hat keine DAV360 E-Mail Adresse oder ist bereits registriert." -#: members/admin.py:320 +#: members/admin.py #, python-format msgid "Successfully invited %(name)s as user." msgstr "Erfolgreich %(name)s aufgefordert Zugangsdaten zu wählen." -#: members/admin.py:322 +#: members/admin.py msgid "Successfully invited selected members to join as users." msgstr "" "Erfolgreich ausgewählte Teilnehmer*innen aufgefordert Zugangsdaten zu wählen." -#: members/admin.py:324 +#: members/admin.py msgid "Some members have been invited, others could not be invited." msgstr "" "Manche Teilnehmer*innen wurden eingeladen, andere konnten nicht eingeladen " "werden." -#: members/admin.py:331 members/admin.py:348 +#: members/admin.py msgid "Permission denied." msgstr "Fehlende Berechtigungen." -#: members/admin.py:338 members/admin.py:372 -#: members/templates/admin/invite_as_user.html:21 +#: members/admin.py members/templates/admin/invite_as_user.html msgid "Invite as user" msgstr "Kompass Zugangsdaten wählen lassen" -#: members/admin.py:343 +#: members/admin.py msgid "Invite selected members to join Kompass as users." msgstr "Ausgewählte Teilnehmer*innen Kompass Zugangsdaten wählen lassen." -#: members/admin.py:354 +#: members/admin.py msgid "Member not found." msgstr "Teilnehmer*in nicht gefunden." -#: members/admin.py:358 +#: members/admin.py #, python-format msgid "%(name)s already has login data." msgstr "%(name)s hat schon Zugangsdaten." -#: members/admin.py:363 +#: members/admin.py #, python-format msgid "The configured email address for %(name)s is not an internal one." msgstr "Die für %(name)s eingestellte E-Mail Adresse ist keine DAV360 Adresse." -#: members/admin.py:377 +#: members/admin.py #, python-format msgid "%(name)s already has a pending invitation as user." msgstr "" "%(name)s hat bereits eine ausstehende Aufforderung Zugangsdaten zu wählen." -#: members/admin.py:395 +#: members/admin.py msgid "activity" msgstr "Aktivität" -#: members/admin.py:405 members/models.py:57 members/models.py:1589 +#: members/admin.py members/models.py msgid "Name" msgstr "Name" -#: members/admin.py:496 +#: members/admin.py msgid "Successfully requested mail confirmation from selected registrations." msgstr "Aufforderung zur Bestätigung der Email Adresse versendet." -#: members/admin.py:497 +#: members/admin.py msgid "Request mail confirmation from selected registrations" msgstr "Aufforderung zur Bestätigung der Email Adresse versenden" -#: members/admin.py:504 members/admin.py:569 +#: members/admin.py #, python-format msgid "Successfully confirmed %(name)s." msgstr "Registrierung von %(name)s erfolgreich bestätigt." -#: members/admin.py:508 members/admin.py:572 +#: members/admin.py #, python-format msgid "Can't confirm. %(name)s has unconfirmed email addresses." msgstr "Bestätigung nicht möglich. %(name)s hat unbestätigte Emailadressen." -#: members/admin.py:513 +#: members/admin.py msgid "Successfully confirmed multiple registrations." msgstr "Erfolgreich mehrere Registrierungen bestätigt." -#: members/admin.py:515 +#: members/admin.py msgid "" "Failed to confirm some registrations because of unconfirmed email addresses." msgstr "" "Einige Bestätigungen fehlgeschlagen, weil Emailadressen noch nicht bestätigt " "sind." -#: members/admin.py:516 +#: members/admin.py msgid "Confirm selected registrations" msgstr "Ausgewählte Registrierungen bestätigen" -#: members/admin.py:539 +#: members/admin.py msgid "Demote selected registrations to waiters." msgstr "Ausgewählte Registrierungen zurück auf die Warteliste setzen." -#: members/admin.py:555 +#: members/admin.py msgid "Demote member to waiter" msgstr "Ausgewählte Registrierung zurück auf die Warteliste setzen." -#: members/admin.py:564 +#: members/admin.py #, python-format msgid "Successfully demoted %(name)s to waiter." msgstr "%(name)s zurück auf die Warteliste gesetzt." -#: members/admin.py:579 members/models.py:442 members/models.py:845 -#: members/models.py:1334 +#: members/admin.py members/models.py msgid "Group" msgstr "Gruppe" -#: members/admin.py:584 +#: members/admin.py msgid "Invitation text" msgstr "Einladungstext" -#: members/admin.py:600 +#: members/admin.py msgid "Pending group invitation for group" msgstr "Ausstehende Gruppeneinladung für Gruppe" -#: members/admin.py:633 +#: members/admin.py #, python-format msgid "Successfully asked %(name)s to confirm their waiting status." msgstr "Erfolgreich %(name)s aufgefordert den Wartelistenplatz zu bestätigen." -#: members/admin.py:634 +#: members/admin.py msgid "Ask selected waiters to confirm their waiting status" msgstr "Wartende auffordern den Wartelistenplatz zu bestätigen" -#: members/admin.py:669 +#: members/admin.py msgid "Offer waiter a place in a group." msgstr "Personen auf der Warteliste einen Gruppenplatz anbieten." -#: members/admin.py:686 members/admin.py:714 +#: members/admin.py 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. " -#: members/admin.py:691 +#: members/admin.py msgid "" "The selected group does not have a contact email. Please first set a contact " "email and then try again." @@ -221,39 +219,39 @@ msgstr "" "Die ausgewählte Gruppe hat keine Kontakt E-Mail Adresse. Bitte stelle eine " "Kontakt E-Mail Adresse ein und versuche es erneut." -#: members/admin.py:694 members/admin.py:728 +#: members/admin.py msgid "Select group for invitation" msgstr "Wähle Gruppe für Einladung aus" -#: members/admin.py:719 +#: members/admin.py #, python-format msgid "Successfully invited %(name)s to %(group)s." msgstr "Erfolgreich %(name)s zu Gruppe %(group)s eingeladen." -#: members/admin.py:748 members/models.py:73 +#: members/admin.py members/models.py msgid "name" msgstr "Name" -#: members/admin.py:749 +#: members/admin.py msgid "" "The group name may only consist of letters, numerals, _, -, :, * and spaces." msgstr "" "Der Gruppenname darf nur aus Buchstaben, Zahlen, _, -, :, * oder Leerzeichen " "bestehen." -#: members/admin.py:778 +#: members/admin.py msgid "Difficulty" msgstr "Schwierigkeit" -#: members/admin.py:781 +#: members/admin.py msgid "Tour type" msgstr "Art der Tour" -#: members/admin.py:784 members/models.py:1065 +#: members/admin.py members/models.py msgid "Means of transportation" msgstr "Verkehrsmittel" -#: members/admin.py:811 +#: members/admin.py msgid "" "Please list here all expenses in relation with this excursion and upload " "relevant bills. These have to be permanently stored for the application of " @@ -266,7 +264,7 @@ msgstr "" "einzelnen Posten wird dabei auf der LJP-Kostenübersicht angezeigt (sinnvoll " "wären z.B. Anreise, Verpflegung, Material etc.)." -#: members/admin.py:829 +#: members/admin.py msgid "" "Here you can work on a seminar report for applying for financial " "contributions from Landesjugendplan (LJP). More information on creating a " @@ -279,7 +277,7 @@ msgstr "" "wahlweise nur TN-Liste und Kostenübersicht kannst du anschließend " "herunterladen." -#: members/admin.py:837 +#: members/admin.py msgid "" "Please list all participants (also youth leaders) of this excursion. Here " "you can still make changes just before departure and hence generate the " @@ -290,34 +288,34 @@ msgstr "" "jederzeit die aktuelle Teilnehmer*innenliste für die Krisenintervention " "generieren." -#: members/admin.py:883 +#: members/admin.py #, python-format msgid "You are not allowed to view all members on note list %(name)s." msgstr "" "Du hast nicht die nötigen Rechte um alle Teilnehmer*innen der Notizliste " "%(name)s anzusehen." -#: members/admin.py:893 +#: members/admin.py msgid "Generate PDF summary" msgstr "Übersicht erstellen" -#: members/admin.py:897 +#: members/admin.py msgid "Full report" msgstr "Vollständiger Seminarbericht" -#: members/admin.py:898 +#: members/admin.py msgid "Costs and participants only" msgstr "Nur Kosten und Teilnehmende" -#: members/admin.py:899 +#: members/admin.py msgid "Mode" msgstr "Modus" -#: members/admin.py:900 +#: members/admin.py msgid "Prepend V32" msgstr "V32 Formblatt einfügen" -#: members/admin.py:916 +#: members/admin.py msgid "" "General information on your excursion. These are partly relevant for the " "amount of financial compensation (means of transport, travel distance, etc.)." @@ -326,302 +324,299 @@ msgstr "" "teilweise relevant für die Zuschüsse aus dem Jugendetat (Verkehrsmittel, " "Fahrstrecke in km)." -#: members/admin.py:946 +#: members/admin.py #, python-format msgid "You are not allowed to view all members on excursion %(name)s." msgstr "" "Du hast nicht die nötigen Rechte um alle Teilnehmer*innen der Ausfahrt " "%(name)s anzusehen." -#: members/admin.py:954 +#: members/admin.py msgid "Generate crisis intervention list" msgstr "Kriseninterventionsliste erstellen" -#: members/admin.py:962 +#: members/admin.py msgid "Generate overview" msgstr "Hinweise für Jugendleiter erstellen" -#: members/admin.py:966 members/admin.py:998 -#: members/templates/admin/generate_seminar_report.html:21 +#: members/admin.py members/templates/admin/generate_seminar_report.html msgid "Generate seminar report" msgstr "Landesjugendplan Antrag erstellen" -#: members/admin.py:979 +#: members/admin.py msgid "Please select a mode." msgstr "Bitte wähle einen Modus aus." -#: members/admin.py:984 +#: members/admin.py msgid "" "Full mode is only available, if the seminar report section is filled out." msgstr "" "Der vollständiger Modus ist nur verfügbar, wenn der Seminarbericht " "ausgefüllt ist. " -#: members/admin.py:1010 +#: members/admin.py msgid "Generate SJR application" msgstr "SJR Antrag erstellen" -#: members/admin.py:1014 +#: members/admin.py msgid "No statement found. Please add a statement and then retry." msgstr "" "Keine Abrechnung angelegt. Bitte lege eine Abrechnung and und versuche es " "erneut." -#: members/admin.py:1018 +#: members/admin.py msgid "" "Successfully submited statement. The finance department will notify you as " "soon as possible." msgstr "" -"Abrechnung erfolgreich eingericht. Die Finanzabteilung wird sich bei dir so " +"Abrechnung erfolgreich eingereicht. Die Finanzabteilung wird sich bei dir so " "schnell wie möglich melden." -#: members/admin.py:1021 -#: members/templates/admin/freizeit_finance_overview.html:21 +#: members/admin.py members/templates/admin/freizeit_finance_overview.html msgid "Finance overview" msgstr "Kostenübersicht" -#: members/apps.py:7 +#: members/apps.py msgid "member administration" msgstr "Teilnehmer*innenverwaltung" -#: members/models.py:43 +#: members/models.py msgid "Monday" msgstr "Montag" -#: members/models.py:44 +#: members/models.py msgid "Tuesday" msgstr "Dienstag" -#: members/models.py:45 +#: members/models.py msgid "Wednesday" msgstr "Mittwoch" -#: members/models.py:46 +#: members/models.py msgid "Thursday" msgstr "Donnerstag" -#: members/models.py:47 +#: members/models.py msgid "Friday" msgstr "Freitag" -#: members/models.py:48 +#: members/models.py msgid "Saturday" msgstr "Samstag" -#: members/models.py:49 +#: members/models.py msgid "Sunday" msgstr "Sonntag" -#: members/models.py:58 members/models.py:1051 +#: members/models.py msgid "Description" msgstr "Beschreibung" -#: members/models.py:64 members/models.py:1043 -#: members/templates/members/change_member.html:18 +#: members/models.py members/templates/members/change_member.html msgid "Activity" msgstr "Aktivität" -#: members/models.py:65 +#: members/models.py msgid "Activities" msgstr "Aktivitäten" -#: members/models.py:74 +#: members/models.py msgid "description" msgstr "Beschreibung" -#: members/models.py:75 +#: members/models.py msgid "show on website" msgstr "Auf der Webseite anzeigen" -#: members/models.py:76 +#: members/models.py msgid "lowest year" msgstr "Ab Jahrgang" -#: members/models.py:77 +#: members/models.py msgid "highest year" msgstr "Bis Jahrgang" -#: members/models.py:78 +#: members/models.py msgid "youth leaders" msgstr "Jugendleiter" -#: members/models.py:80 +#: members/models.py msgid "week day" msgstr "Wochentag" -#: members/models.py:81 members/models.py:1416 +#: members/models.py msgid "Starting time" msgstr "Zeitpunkt" -#: members/models.py:82 +#: members/models.py msgid "Ending time" msgstr "Endzeitpunkt" -#: members/models.py:84 +#: members/models.py msgid "Contact email" msgstr "Kontakt Email" -#: members/models.py:94 members/models.py:295 +#: members/models.py msgid "group" msgstr "Gruppe" -#: members/models.py:95 +#: members/models.py msgid "groups" msgstr "Gruppen" -#: members/models.py:129 +#: members/models.py msgid "prename" msgstr "Vorname" -#: members/models.py:130 +#: members/models.py msgid "last name" msgstr "Nachname" -#: members/models.py:133 +#: members/models.py msgid "Email confirmed" msgstr "Emailadresse bestätigt" -#: members/models.py:151 members/models.py:222 members/models.py:269 +#: members/models.py msgid "phone number" msgstr "Telefonnummer (mobil)" -#: members/models.py:182 +#: members/models.py msgid "Email confirmation needed" msgstr "Email Bestätigung erforderlich" -#: members/models.py:232 +#: members/models.py msgid "birth date" msgstr "Geburtsdatum" -#: members/models.py:237 +#: members/models.py msgid "Gender" msgstr "Gender" -#: members/models.py:238 +#: members/models.py msgid "comments" msgstr "Kommentare" -#: members/models.py:266 +#: members/models.py msgid "Alternative email confirmed" msgstr "Alternative E-Mail Adresse bestätigt" -#: members/models.py:270 +#: members/models.py msgid "street and house number" msgstr "Straße und Hausnummer" -#: members/models.py:271 +#: members/models.py msgid "Postcode" msgstr "PLZ" -#: members/models.py:273 +#: members/models.py msgid "town" msgstr "Stadt" -#: members/models.py:274 +#: members/models.py msgid "Address extra" msgstr "Adress-Zusatz" -#: members/models.py:275 +#: members/models.py msgid "Country" msgstr "Land" -#: members/models.py:277 +#: members/models.py msgid "Good conduct certificate presented on" msgstr "Führungszeugnis vorgelegt am" -#: members/models.py:278 +#: members/models.py msgid "Joined on" msgstr "Eintritt" -#: members/models.py:279 +#: members/models.py msgid "Left on" msgstr "Austritt" -#: members/models.py:280 +#: members/models.py msgid "Has key" msgstr "Hat Jugendraumschlüssel" -#: members/models.py:281 +#: members/models.py msgid "Has a free ticket for the climbing gym" msgstr "Hat Freikarte für Kletterhalle" -#: members/models.py:282 +#: members/models.py msgid "DAV badge number" msgstr "DAV Mitgliedsnummer" -#: members/models.py:283 +#: members/models.py msgid "Knows how to swim" msgstr "Kann schwimmen" -#: members/models.py:284 +#: members/models.py msgid "Climbing badge" msgstr "Kletterschein" -#: members/models.py:285 +#: members/models.py msgid "Alpine experience" msgstr "Alpine Erfahrung" -#: members/models.py:286 +#: members/models.py msgid "Allergies" msgstr "Allergieen" -#: members/models.py:287 +#: members/models.py msgid "Medication" msgstr "Medikamente" -#: members/models.py:288 +#: members/models.py msgid "Tetanus vaccination" msgstr "Tetanusimpfung" -#: members/models.py:289 +#: members/models.py msgid "Photos may be taken" msgstr "Fotoerlaubnis" -#: members/models.py:290 +#: members/models.py msgid "Legal guardians" msgstr "Erziehungsberechtigte" -#: members/models.py:292 +#: members/models.py msgid "May cancel a group appointment independently" msgstr "Darf sich allein von der Gruppenstunde abmelden" -#: members/models.py:299 +#: members/models.py msgid "receives newsletter" msgstr "Erhält den Newsletter" -#: members/models.py:303 +#: members/models.py msgid "created" msgstr "erstellt" -#: members/models.py:304 +#: members/models.py msgid "Active" msgstr "Aktiv" -#: members/models.py:305 +#: members/models.py msgid "registration form" msgstr "Anmeldeformular" -#: members/models.py:314 +#: members/models.py msgid "image" msgstr "Bild" -#: members/models.py:323 +#: members/models.py msgid "Echoed" msgstr "Rückgemeldet" -#: members/models.py:324 +#: members/models.py msgid "Confirmed" msgstr "Bestätigt" -#: members/models.py:326 +#: members/models.py msgid "Login data" msgstr "Zugangsdaten" -#: members/models.py:328 +#: members/models.py msgid "waitinglist application date" msgstr "Wartelistenbewerbungsdatum" -#: members/models.py:330 +#: members/models.py msgid "" "If the person registered from the waitinglist, this is their application " "date." @@ -629,390 +624,386 @@ msgstr "" "Falls sich die Person über die Warteliste angemeldet hat ist dies ihr " "Bewerbungsdatum." -#: members/models.py:363 +#: members/models.py msgid "Good conduct certificate valid" msgstr "Führungszeugnis gültig" -#: members/models.py:445 +#: members/models.py msgid "member" msgstr "Teilnehmer*in" -#: members/models.py:446 +#: members/models.py msgid "members" msgstr "Teilnehmer*innen" -#: members/models.py:524 +#: members/models.py msgid "Upload registration form" msgstr "Anmeldeformular hochladen" -#: members/models.py:535 +#: members/models.py #, python-format msgid "New unconfirmed registration for group %(group)s" msgstr "Neue unbestätigte Registrierung für Gruppe %(group)s" -#: members/models.py:761 +#: members/models.py msgid "Set login data for Kompass" msgstr "Zugangsdaten für Kompass wählen" -#: members/models.py:796 members/models.py:999 members/models.py:1010 -#: members/models.py:1365 members/models.py:1372 +#: members/models.py msgid "Member" msgstr "Teilnehmer*in" -#: members/models.py:803 +#: members/models.py msgid "Emergency contact" msgstr "Notfallkontakt" -#: members/models.py:804 +#: members/models.py msgid "Emergency contacts" msgstr "Notfallkontakte" -#: members/models.py:824 +#: members/models.py msgid "Unconfirmed registration" msgstr "Unbestätigte Registrierung" -#: members/models.py:825 +#: members/models.py msgid "Unconfirmed registrations" msgstr "Unbestätigte Registrierungen" -#: members/models.py:844 members/models.py:889 +#: members/models.py msgid "Waiter" msgstr "Wartende Person" -#: members/models.py:846 +#: members/models.py msgid "Invitation date" msgstr "Einladungsdatum" -#: members/models.py:847 members/templates/members/reject_success.html:6 -#: members/templates/members/reject_success.html:11 +#: members/models.py members/templates/members/reject_success.html msgid "Invitation rejected" msgstr "Einladung abgelehnt" -#: members/models.py:851 +#: members/models.py msgid "Invitation to group" msgstr "Gruppeneinladung" -#: members/models.py:852 +#: members/models.py msgid "Invitations to groups" msgstr "Gruppeneinladungen" -#: members/models.py:859 +#: members/models.py msgid "Rejected" msgstr "Abgelehnt" -#: members/models.py:861 +#: members/models.py msgid "Expired" msgstr "Abgelaufen" -#: members/models.py:863 +#: members/models.py msgid "Undecided" msgstr "Ausstehend" -#: members/models.py:864 +#: members/models.py msgid "Status" msgstr "Status" -#: members/models.py:875 +#: members/models.py msgid "Do you want to tell us something else?" msgstr "Möchtest du uns noch etwas mitteilen?" -#: members/models.py:876 +#: members/models.py msgid "application date" msgstr "Bewerbungsdatum" -#: members/models.py:878 +#: members/models.py msgid "Last wait confirmation" msgstr "Letzte Wartebestätigung" -#: members/models.py:882 +#: members/models.py msgid "Last reminder" msgstr "Letzte Erinnerung" -#: members/models.py:883 +#: members/models.py msgid "Missed reminders" msgstr "Verpasste Erinnerungen" -#: members/models.py:890 +#: members/models.py msgid "Waiters" msgstr "Warteliste" -#: members/models.py:905 +#: members/models.py msgid "Latest group invitation" msgstr "Letzte Gruppeneinladung" -#: members/models.py:922 +#: members/models.py msgid "Waiting status confirmed" msgstr "Wartelistenplatz bestätigt" -#: members/models.py:929 +#: members/models.py msgid "Waiting confirmation needed" msgstr "Wartelistenplatzbestätigung erforderlich" -#: members/models.py:982 +#: members/models.py msgid "Invitation to trial group meeting" msgstr "Einladung zu Schnupperstunde" -#: members/models.py:990 +#: members/models.py msgid "Unregistered from waiting list" msgstr "Von der Warteliste abgemeldet" -#: members/models.py:1004 +#: members/models.py msgid "Comment" msgstr "Kommentar" -#: members/models.py:1011 members/models.py:1373 +#: members/models.py msgid "Members" msgstr "Teilnehmer*innen" -#: members/models.py:1045 +#: members/models.py msgid "Place" msgstr "Stützpunkt / Ort" -#: members/models.py:1046 +#: members/models.py msgid "Destination (optional)" msgstr "ggf. Ziel" -#: members/models.py:1048 +#: members/models.py msgid "e.g. a peak" msgstr "z.B. ein Gipfel" -#: members/models.py:1049 +#: members/models.py msgid "Begin" msgstr "Anfang" -#: members/models.py:1050 +#: members/models.py msgid "End (optional)" msgstr "Ende" -#: members/models.py:1053 +#: members/models.py msgid "Groups" msgstr "Gruppen" -#: members/models.py:1066 +#: members/models.py msgid "Kilometers traveled" msgstr "Fahrstrecke in Kilometer" -#: members/models.py:1069 +#: members/models.py msgid "Categories" msgstr "Kategorien" -#: members/models.py:1070 +#: members/models.py msgid "easy" msgstr "leicht" -#: members/models.py:1070 +#: members/models.py msgid "medium" msgstr "mittel" -#: members/models.py:1070 +#: members/models.py msgid "hard" msgstr "schwer" -#: members/models.py:1080 members/models.py:1396 -#: members/templates/admin/freizeit_finance_overview.html:26 +#: members/models.py members/templates/admin/freizeit_finance_overview.html msgid "Excursion" msgstr "Ausfahrt" -#: members/models.py:1081 +#: members/models.py msgid "Excursions" msgstr "Ausfahrten" -#: members/models.py:1311 members/models.py:1387 members/models.py:1603 +#: members/models.py msgid "Title" msgstr "Titel" -#: members/models.py:1312 members/models.py:1330 members/models.py:1604 +#: members/models.py msgid "Date" msgstr "Datum" -#: members/models.py:1331 +#: members/models.py msgid "Location" msgstr "Ort" -#: members/models.py:1332 +#: members/models.py msgid "Topic" msgstr "Thema" -#: members/models.py:1356 +#: members/models.py msgid "Jugendleiter" msgstr "Jugendleiter" -#: members/models.py:1359 +#: members/models.py msgid "Klettertreff" msgstr "Klettertreff" -#: members/models.py:1360 +#: members/models.py msgid "Klettertreffs" msgstr "Klettertreffs" -#: members/models.py:1378 +#: members/models.py msgid "Password" msgstr "Passwort" -#: members/models.py:1381 +#: members/models.py msgid "registration password" msgstr "Registrierungspassort" -#: members/models.py:1382 +#: members/models.py msgid "registration passwords" msgstr "Registrierungspasswörter" -#: members/models.py:1389 +#: members/models.py msgid "Alpinistic goals" msgstr "Alpintechnische Ziele" -#: members/models.py:1390 +#: members/models.py msgid "Pedagogic goals" msgstr "Pädagogische Ziele" -#: members/models.py:1391 +#: members/models.py msgid "Content and methods" msgstr "Inhalte und Methoden" -#: members/models.py:1392 +#: members/models.py msgid "Evaluation" msgstr "Wertung" -#: members/models.py:1393 +#: members/models.py msgid "Experiences and possible improvements" msgstr "Erfahrungen und Verbesserungsvorschläge" -#: members/models.py:1402 members/models.py:1423 +#: members/models.py msgid "LJP Proposal" msgstr "Seminarbericht" -#: members/models.py:1403 +#: members/models.py msgid "LJP Proposals" msgstr "Seminarberichte" -#: members/models.py:1417 +#: members/models.py msgid "Duration in hours" msgstr "Dauer in Stunden" -#: members/models.py:1420 +#: members/models.py msgid "Activity and method" msgstr "Art der Aktion inkl. Methode" -#: members/models.py:1428 +#: members/models.py msgid "Intervention" msgstr "Aktion" -#: members/models.py:1429 +#: members/models.py msgid "Interventions" msgstr "Aktionen" -#: members/models.py:1531 members/models.py:1561 +#: members/models.py msgid "May list members" msgstr "Darf folgende Teilnehmer*innen listen" -#: members/models.py:1533 members/models.py:1563 +#: members/models.py msgid "May view members" msgstr "Darf folgende Teilnehmer*innen anzeigen" -#: members/models.py:1535 members/models.py:1565 +#: members/models.py msgid "May change members" msgstr "Darf folgende Teilnehmer*innen ändern" -#: members/models.py:1537 members/models.py:1567 +#: members/models.py msgid "May delete members" msgstr "Darf folgende Teilnehmer*innen löschen" -#: members/models.py:1541 members/models.py:1571 +#: members/models.py msgid "May list members of groups" msgstr "Darf Teilnehmer*innen folgender Gruppen listen" -#: members/models.py:1543 members/models.py:1573 +#: members/models.py msgid "May view members of groups" msgstr "Darf Teilnehmer*innen folgender Gruppen anzeigen" -#: members/models.py:1545 members/models.py:1575 +#: members/models.py msgid "May change members of groups" msgstr "Darf Teilnehmer*innen folgender Gruppen ändern" -#: members/models.py:1547 members/models.py:1577 +#: members/models.py msgid "May delete members of groups" msgstr "Darf Teilnehmer*innen folgender Gruppen löschen" -#: members/models.py:1550 members/models.py:1551 members/models.py:1554 +#: members/models.py msgid "Permissions" msgstr "Berechtigungen" -#: members/models.py:1580 members/models.py:1581 members/models.py:1584 +#: members/models.py msgid "Group permissions" msgstr "Gruppenberechtigungen" -#: members/models.py:1590 +#: members/models.py msgid "Permission needed" msgstr "Freigabe erforderlich" -#: members/models.py:1593 +#: members/models.py msgid "Training category" msgstr "Fortbildungstyp" -#: members/models.py:1594 +#: members/models.py msgid "Training categories" msgstr "Fortbildungstypen" -#: members/models.py:1605 +#: members/models.py msgid "Category" msgstr "Kategorien" -#: members/models.py:1606 +#: members/models.py msgid "Comments" msgstr "Kommentar" -#: members/models.py:1607 +#: members/models.py msgid "Participated" msgstr "Teilgenommmen" -#: members/models.py:1608 +#: members/models.py msgid "Passed" msgstr "Bestanden" -#: members/models.py:1611 +#: members/models.py msgid "Training" msgstr "Fortbildung" -#: members/models.py:1612 +#: members/models.py msgid "Trainings" msgstr "Fortbildungen" -#: members/templates/admin/demote_to_waiter.html:17 -#: members/templates/admin/freizeit_finance_overview.html:17 -#: members/templates/admin/generate_seminar_report.html:17 -#: members/templates/admin/invite_as_user.html:17 -#: members/templates/admin/invite_for_group.html:17 -#: members/templates/admin/invite_for_group_text.html:17 -#: members/templates/admin/invite_selected_as_user.html:17 -#: members/templates/admin/invite_selected_for_group.html:17 +#: members/templates/admin/demote_to_waiter.html +#: members/templates/admin/freizeit_finance_overview.html +#: members/templates/admin/generate_seminar_report.html +#: members/templates/admin/invite_as_user.html +#: members/templates/admin/invite_for_group.html +#: members/templates/admin/invite_for_group_text.html +#: members/templates/admin/invite_selected_as_user.html +#: members/templates/admin/invite_selected_for_group.html msgid "Home" msgstr "Start" -#: members/templates/admin/demote_to_waiter.html:20 -#: members/templates/admin/demote_to_waiter.html:25 +#: members/templates/admin/demote_to_waiter.html msgid "Demote to waiter" msgstr "Zurück auf die Warteliste setzen" -#: members/templates/admin/demote_to_waiter.html:27 +#: members/templates/admin/demote_to_waiter.html msgid "" "Do you want to demote the following unconfirmed registrations to waiters?" msgstr "Möchtest du die folgenden Personen zurück auf die Warteliste setzen?" -#: members/templates/admin/demote_to_waiter.html:45 +#: members/templates/admin/demote_to_waiter.html msgid "Demote" msgstr "Zurück auf die Warteliste setzen" -#: members/templates/admin/demote_to_waiter.html:46 -#: members/templates/admin/freizeit_finance_overview.html:163 -#: members/templates/admin/generate_seminar_report.html:60 -#: members/templates/admin/invite_as_user.html:37 -#: members/templates/admin/invite_for_group.html:64 -#: members/templates/admin/invite_selected_as_user.html:49 -#: members/templates/admin/invite_selected_for_group.html:53 +#: members/templates/admin/demote_to_waiter.html +#: members/templates/admin/freizeit_finance_overview.html +#: members/templates/admin/generate_seminar_report.html +#: members/templates/admin/invite_as_user.html +#: members/templates/admin/invite_for_group.html +#: members/templates/admin/invite_selected_as_user.html +#: members/templates/admin/invite_selected_for_group.html msgid "Cancel" msgstr "Abbrechen" -#: members/templates/admin/freizeit_finance_overview.html:29 +#: members/templates/admin/freizeit_finance_overview.html msgid "" "\n" "Here you see an estimate on the expected costs and contributions by the " @@ -1023,48 +1014,42 @@ msgstr "" "Hier siehst du eine Schätzung der erwarteten Kosten und Zuschüsse. Dies ist " "kein garantierter Kostenplan.\n" -#: members/templates/admin/freizeit_finance_overview.html:34 -#: members/templates/admin/freizeit_finance_overview.html:109 +#: members/templates/admin/freizeit_finance_overview.html msgid "Expenses" msgstr "Ausgaben" -#: members/templates/admin/freizeit_finance_overview.html:35 +#: members/templates/admin/freizeit_finance_overview.html msgid "You listed the following expenses:" msgstr "Du hast die folgenden Ausgaben angegeben:" -#: members/templates/admin/freizeit_finance_overview.html:39 +#: members/templates/admin/freizeit_finance_overview.html msgid "Explanation" msgstr "Erklärung" -#: members/templates/admin/freizeit_finance_overview.html:40 +#: members/templates/admin/freizeit_finance_overview.html msgid "Amount" msgstr "Betrag" -#: members/templates/admin/freizeit_finance_overview.html:41 +#: members/templates/admin/freizeit_finance_overview.html msgid "Paid by" msgstr "Bezahlt von" -#: members/templates/admin/freizeit_finance_overview.html:42 +#: members/templates/admin/freizeit_finance_overview.html msgid "IBAN valid" msgstr "IBAN gültig" -#: members/templates/admin/freizeit_finance_overview.html:60 -msgid "Change here" -msgstr "Hier ändern" - -#: members/templates/admin/freizeit_finance_overview.html:67 +#: members/templates/admin/freizeit_finance_overview.html #, python-format msgid "The total expected expenses are %(total_bills_theoretic)s €." msgstr "" "Insgesamt belaufen sich die geschätzten Ausgaben auf " "%(total_bills_theoretic)s €." -#: members/templates/admin/freizeit_finance_overview.html:69 -#: members/templates/admin/freizeit_finance_overview.html:117 +#: members/templates/admin/freizeit_finance_overview.html msgid "Contributions by the association" msgstr "Sektionszuschüsse" -#: members/templates/admin/freizeit_finance_overview.html:72 +#: members/templates/admin/freizeit_finance_overview.html #, python-format msgid "" "According to the contribution guidelines,\n" @@ -1073,7 +1058,7 @@ msgstr "" "Gemäß den Zuschussrichtlinien erhalten %(staff_count)s Jugendleiter*innen " "Zuschüsse. Jeweils sind das" -#: members/templates/admin/freizeit_finance_overview.html:78 +#: members/templates/admin/freizeit_finance_overview.html #, python-format msgid "" "%(nights)s nights for %(price_per_night)s€ per night making a total of " @@ -1082,7 +1067,7 @@ msgstr "" "%(nights)s Nächte zum Preis von %(price_per_night)s€ pro Nacht. Das ergibt " "eine Gesamtsumme von %(nights_per_yl)s€." -#: members/templates/admin/freizeit_finance_overview.html:81 +#: members/templates/admin/freizeit_finance_overview.html #, python-format msgid "" "%(duration)s days for %(allowance_per_day)s€ per day making a total of " @@ -1091,7 +1076,7 @@ msgstr "" "%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine " "Gesamtsumme von %(allowance_per_yl)s€." -#: members/templates/admin/freizeit_finance_overview.html:84 +#: members/templates/admin/freizeit_finance_overview.html #, python-format msgid "" "%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / " @@ -1100,7 +1085,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€." -#: members/templates/admin/freizeit_finance_overview.html:89 +#: members/templates/admin/freizeit_finance_overview.html #, python-format msgid "" "In total these are contributions of %(total_per_yl)s€ times %(staff_count)s, " @@ -1109,11 +1094,11 @@ msgstr "" "Insgesamt sind das Kosten von %(total_per_yl)s€ mal %(staff_count)s, " "insgesamt also %(total_staff)s€." -#: members/templates/admin/freizeit_finance_overview.html:92 +#: members/templates/admin/freizeit_finance_overview.html msgid "LJP contributions" msgstr "LJP Zuschüsse" -#: members/templates/admin/freizeit_finance_overview.html:95 +#: members/templates/admin/freizeit_finance_overview.html #, python-format msgid "" "By submitting a seminar report, you may apply for LJP contributions. In this " @@ -1128,23 +1113,23 @@ msgstr "" "Gesamtausgaben erhalten. Das resultiert in einem Gesamtzuschuss von " "%(ljp_contributions)s€." -#: members/templates/admin/freizeit_finance_overview.html:100 +#: members/templates/admin/freizeit_finance_overview.html msgid "Summary" msgstr "Zusammenfassung" -#: members/templates/admin/freizeit_finance_overview.html:103 +#: members/templates/admin/freizeit_finance_overview.html msgid "This is the estimated cost and contribution summary:" msgstr "Das ist die geschätzte Kosten- und Zuschussübersicht." -#: members/templates/admin/freizeit_finance_overview.html:125 +#: members/templates/admin/freizeit_finance_overview.html msgid "Potential LJP contributions" msgstr "Mögliche LJP Zuschüsse" -#: members/templates/admin/freizeit_finance_overview.html:133 +#: members/templates/admin/freizeit_finance_overview.html msgid "Remaining costs" msgstr "Verbleibende Kosten" -#: members/templates/admin/freizeit_finance_overview.html:142 +#: members/templates/admin/freizeit_finance_overview.html msgid "" "Positive remaining costs indicate that the estimated costs exceed the " "estimated contributions, while negative\n" @@ -1155,7 +1140,7 @@ msgstr "" "geschätzten Zuschüsse übersteigen, während negative Kosten\n" " bedeuten, dass die geschätzten Zuschüsse die geschätzten Kosten übersteigen." -#: members/templates/admin/freizeit_finance_overview.html:146 +#: members/templates/admin/freizeit_finance_overview.html msgid "" "Note that this cost calculation expects you to apply for LJP contributions. " "On the\n" @@ -1165,32 +1150,33 @@ msgstr "" "beantragst. Auf der Hauptseite dieser Ausfahrt kannst du dir eine Vorlage " "und alle Formblätter für einen solchen Antrag erstellen lassen." -#: members/templates/admin/freizeit_finance_overview.html:151 +#: members/templates/admin/freizeit_finance_overview.html msgid "Submit statement" msgstr "Abrechnung einreichen" -#: members/templates/admin/freizeit_finance_overview.html:153 +#: members/templates/admin/freizeit_finance_overview.html msgid "" "Did you already complete this excursion? If yes, please check if all listed " "expenses are correct\n" -"and then submit the statement for processing by the finance department. If " -"you proceed,\n" +"and people who want their money back have valid bank account numbers. Then " +"submit the statement for processing by the finance department. If you " +"proceed,\n" "no further changes to the statement are possible." msgstr "" "Hat die Ausfahrt bereits stattgefunden? Wenn ja, prüfe bitte ob alle " -"aufgelisteten Kosten korrekt sind und reiche deine Abrechnung dann beim " -"Finanzreferat ein. Wenn du fortschreitest sind keine weiteren Änderungen an " -"der Abrechnung mehr möglich." +"aufgelisteten Kosten korrekt sind, alle notwendigen Belege hochgeladen sind und ob alle Personen, die Geld ausbezahlt bekommen sollen, eine gültige IBAN haben. " +"Reiche deine Abrechnung dann beim Finanzreferat ein. Wenn du fortschreitest, sind keine weiteren " +"Änderungen an der Abrechnung mehr möglich." -#: members/templates/admin/freizeit_finance_overview.html:162 +#: members/templates/admin/freizeit_finance_overview.html msgid "Submit" msgstr "Einreichen" -#: members/templates/admin/freizeit_finance_overview.html:167 +#: members/templates/admin/freizeit_finance_overview.html msgid "Statement submitted" msgstr "Abrechnung eingereicht" -#: members/templates/admin/freizeit_finance_overview.html:169 +#: members/templates/admin/freizeit_finance_overview.html msgid "" "The statement for this excursion was already submitted. The finance " "department is currently processing your\n" @@ -1200,12 +1186,12 @@ msgstr "" "Finanzreferat bearbeitet deine Abrechnung zur Zeit und kommt " "schnellstmöglich auf dich zurück." -#: members/templates/admin/freizeit_finance_overview.html:172 -#: members/templates/admin/invite_for_group_text.html:63 +#: members/templates/admin/freizeit_finance_overview.html +#: members/templates/admin/invite_for_group_text.html msgid "Back" msgstr "Zurück" -#: members/templates/admin/generate_seminar_report.html:27 +#: members/templates/admin/generate_seminar_report.html msgid "" "Here you can generate a seminar report suitable for the LJP. A report\n" "always contains a head page with the basic information on the seminar." @@ -1217,7 +1203,7 @@ msgstr "" "Teilnehemendenliste, eine Kostenübersicht und eine detaillierte didaktische " "Planung enthalten. " -#: members/templates/admin/generate_seminar_report.html:31 +#: members/templates/admin/generate_seminar_report.html msgid "" "Expenses with same short description are automatically summed up and shown " "as one expense in the\n" @@ -1226,7 +1212,7 @@ msgstr "" "In der Kostenübersicht werden Ausgaben mit der gleichen Kurzbeschreibung " "automatisch aufsummiert und zu einer Ausgabe zusammengefasst." -#: members/templates/admin/generate_seminar_report.html:36 +#: members/templates/admin/generate_seminar_report.html msgid "" "Full report: Include learning goals and a detailed, tabularized time " "schedule. This requires\n" @@ -1236,7 +1222,7 @@ msgstr "" "tabellierten Zeitplan dar. Dies benötigt, dass der Seminarbericht in der " "Ausfahrt ausgefüllt ist." -#: members/templates/admin/generate_seminar_report.html:40 +#: members/templates/admin/generate_seminar_report.html msgid "" "Costs and participants only: Only show a list of participants and costs. In " "this case you\n" @@ -1246,7 +1232,7 @@ msgstr "" "Kosten an. In diesem Fall musst du Lernziele und einen Zeitplan manuell " "hinzufügen." -#: members/templates/admin/generate_seminar_report.html:46 +#: members/templates/admin/generate_seminar_report.html msgid "You may also choose to include the V32 attachment." msgstr "" "Ein LJP Antrag benötigt immer ein Formblatt (in unserem Fall V32-1 " @@ -1254,11 +1240,11 @@ msgstr "" "vorausfüllen lassen und dem Antrag hinzufügen. Bitte fülle die verbleibenden " "Felder im Formblatt selbst aus und unterschreibe das PDF." -#: members/templates/admin/generate_seminar_report.html:59 +#: members/templates/admin/generate_seminar_report.html msgid "Generate" msgstr "Erstellen" -#: members/templates/admin/invite_as_user.html:27 +#: members/templates/admin/invite_as_user.html #, python-format msgid "" "Do you want to invite %(member)s to set their login data for Kompass? They " @@ -1271,42 +1257,42 @@ msgstr "" "%(member)s wird eine E-Mail mit einem Link erhalten, um, nach Eingabe eines " "der aktiven Registrierungspasswörter, Benutzername und Passwort zu setzen." -#: members/templates/admin/invite_as_user.html:36 -#: members/templates/admin/invite_for_group.html:63 -#: members/templates/admin/invite_selected_as_user.html:48 -#: members/templates/admin/invite_selected_for_group.html:52 +#: members/templates/admin/invite_as_user.html +#: members/templates/admin/invite_for_group.html +#: members/templates/admin/invite_selected_as_user.html +#: members/templates/admin/invite_selected_for_group.html msgid "Invite" msgstr "Einladen" -#: members/templates/admin/invite_for_group.html:23 -#: members/templates/admin/invite_for_group_text.html:23 +#: members/templates/admin/invite_for_group.html +#: members/templates/admin/invite_for_group_text.html msgid "Invite to group" msgstr "Zu Gruppe einladen" -#: members/templates/admin/invite_for_group.html:28 -#: members/templates/admin/invite_for_group_text.html:28 -#: members/templates/admin/invite_selected_for_group.html:25 +#: members/templates/admin/invite_for_group.html +#: members/templates/admin/invite_for_group_text.html +#: members/templates/admin/invite_selected_for_group.html msgid "Invite to a group" msgstr "Zu einer Gruppe einladen" -#: members/templates/admin/invite_for_group.html:31 +#: members/templates/admin/invite_for_group.html msgid "You are inviting:" msgstr "Du lädst die folgende Person ein:" -#: members/templates/admin/invite_for_group.html:33 +#: members/templates/admin/invite_for_group.html msgid "You are inviting the following waiters for registration:" msgstr "Du lädst die folgenden Wartenden zur Schnupperstunde ein:" -#: members/templates/admin/invite_for_group.html:48 +#: members/templates/admin/invite_for_group.html #, 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." -#: members/templates/admin/invite_for_group.html:50 +#: members/templates/admin/invite_for_group.html msgid "To which group do you want to invite these waiters?" msgstr "Zu welcher Gruppe möchtest du diese Wartenden einladen?" -#: members/templates/admin/invite_for_group_text.html:31 +#: members/templates/admin/invite_for_group_text.html #, python-format msgid "" "You are inviting the following waiter for registration in group %(group)s." @@ -1314,7 +1300,7 @@ msgstr "" "Du lädst den*die folgende Wartende*n zu einer Schnupperstunde in der Gruppe " "%(group)s ein:" -#: members/templates/admin/invite_for_group_text.html:33 +#: members/templates/admin/invite_for_group_text.html #, python-format msgid "" "You are inviting the following waiters for registration in group %(group)s." @@ -1322,7 +1308,7 @@ msgstr "" "Du lädst die folgenden Wartenden zu einer Schnupperstunde in der Gruppe " "%(group)s ein:" -#: members/templates/admin/invite_for_group_text.html:47 +#: members/templates/admin/invite_for_group_text.html #, python-brace-format msgid "" "The following text will be sent as an invitation email. The patterns\n" @@ -1335,19 +1321,19 @@ msgstr "" "durch personalisierte Daten ersetzt. Bitte passe den Text falls nötig an und " "schicke die Einladung anschließend ab." -#: members/templates/admin/invite_for_group_text.html:62 +#: members/templates/admin/invite_for_group_text.html msgid "Send" msgstr "Senden" -#: members/templates/admin/invite_selected_as_user.html:20 +#: members/templates/admin/invite_selected_as_user.html msgid "Invite multiple members as users" msgstr "Mehrere Teilnehmer*innen Zugangsdaten wählen lassen" -#: members/templates/admin/invite_selected_as_user.html:26 +#: members/templates/admin/invite_selected_as_user.html msgid "You selected the following members:" msgstr "Du hast die folgenden Teilnehmer*innen ausgewählt:" -#: members/templates/admin/invite_selected_as_user.html:38 +#: members/templates/admin/invite_selected_as_user.html msgid "" "Do you want to invite these members to set their login data for Kompass? " "They will\n" @@ -1360,77 +1346,75 @@ msgstr "" "eines der aktiven Registrierungspasswörter, Benutzername und Passwort zu " "setzen." -#: members/templates/admin/invite_selected_for_group.html:20 +#: members/templates/admin/invite_selected_for_group.html msgid "Invite multiple waiters" msgstr "Mehrere Wartende einladen" -#: members/templates/admin/invite_selected_for_group.html:27 +#: members/templates/admin/invite_selected_for_group.html msgid "You selected the following waiters:" msgstr "Du hast die folgenden Wartenden ausgewählt:" -#: members/templates/admin/invite_selected_for_group.html:40 +#: members/templates/admin/invite_selected_for_group.html 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." -#: members/templates/admin/klettertreff_overview.html:9 +#: members/templates/admin/klettertreff_overview.html msgid "date" msgstr "Datum" -#: members/templates/members/change_member.html:7 +#: members/templates/members/change_member.html msgid "Participations:" msgstr "Ausfahrtteilnahmen:" -#: members/templates/members/change_member.html:15 +#: members/templates/members/change_member.html msgid "Qualities:" msgstr "Fähigkeiten:" -#: members/templates/members/change_member.html:19 +#: members/templates/members/change_member.html msgid "Skill level" msgstr "Fähigkeitsniveau" -#: members/templates/members/change_member_unconfirmed.html:11 +#: members/templates/members/change_member_unconfirmed.html msgid "Save and confirm registration" msgstr "Speichern und Registrierung bestätigen" -#: members/templates/members/echo.html:6 members/templates/members/echo.html:13 -#: members/templates/members/echo_failed.html:10 -#: members/templates/members/echo_password.html:6 -#: members/templates/members/echo_password.html:11 -#: members/templates/members/echo_success.html:10 -#: members/templates/members/echo_wrong_password.html:6 -#: members/templates/members/echo_wrong_password.html:11 +#: members/templates/members/echo.html +#: members/templates/members/echo_failed.html +#: members/templates/members/echo_password.html +#: members/templates/members/echo_success.html +#: members/templates/members/echo_wrong_password.html msgid "Echo" msgstr "Rückmeldung" -#: members/templates/members/echo.html:15 +#: members/templates/members/echo.html 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." -#: members/templates/members/echo_failed.html:5 +#: members/templates/members/echo_failed.html msgid "Echo failed" msgstr "Rückmeldung fehlgeschlagen" -#: members/templates/members/echo_failed.html:12 -#: members/templates/members/invited_registration_failed.html:12 +#: members/templates/members/echo_failed.html +#: members/templates/members/invited_registration_failed.html msgid "Something went wrong. The key you supplied is" msgstr "Etwas ist schief gegangen. Der verwendete Code ist" -#: members/templates/members/echo_failed.html:14 -#: members/templates/members/invited_registration_failed.html:14 -#: members/templates/members/register_failed.html:14 +#: members/templates/members/echo_failed.html +#: members/templates/members/invited_registration_failed.html +#: members/templates/members/register_failed.html msgid "If you think this is a mistake, please" msgstr "Wenn du denkst, dass das ein Fehler ist, " -#: members/templates/members/echo_failed.html:15 -#: members/templates/members/invited_registration_failed.html:14 -#: members/templates/members/register_failed.html:15 +#: members/templates/members/echo_failed.html +#: members/templates/members/invited_registration_failed.html +#: members/templates/members/register_failed.html msgid "contact us." msgstr "kontaktiere uns." -#: members/templates/members/echo_password.html:13 +#: members/templates/members/echo_password.html msgid "" "Thanks for echoing back. Please enter the password, which you can find in " "the email we sent you.\n" @@ -1438,63 +1422,61 @@ msgstr "" "Bitte gib dein Passwort ein. Weitere Informationen zur Rückmeldung findest " "du in der E-Mail.\n" -#: members/templates/members/echo_password.html:24 -#: members/templates/members/register_password.html:22 -#: members/templates/members/register_waiting_list.html:39 +#: members/templates/members/echo_password.html +#: members/templates/members/register_password.html +#: members/templates/members/register_waiting_list.html msgid "submit" msgstr "Bestätigen" -#: members/templates/members/echo_success.html:5 +#: members/templates/members/echo_success.html msgid "Echo successful" msgstr "Rückmeldung erfolgreich" -#: members/templates/members/echo_success.html:12 +#: members/templates/members/echo_success.html msgid "Thank you" msgstr "Danke" -#: members/templates/members/echo_success.html:12 +#: members/templates/members/echo_success.html msgid "Your data was successfully updated." msgstr "Deine Daten wurden erfolgreich aktualisiert." -#: members/templates/members/echo_wrong_password.html:13 +#: members/templates/members/echo_wrong_password.html msgid "You entered a wrong password to often." msgstr "" "Du hast zu oft ein falsches Passwort eingegeben. Bitte frage deinen " "Jugendleiter nach einem korrekten Passwort." -#: members/templates/members/invited_registration_failed.html:5 -#: members/templates/members/register_failed.html:5 +#: members/templates/members/invited_registration_failed.html +#: members/templates/members/register_failed.html msgid "Registration failed" msgstr "Registrierung fehlgeschlagen" -#: members/templates/members/invited_registration_failed.html:10 -#: members/templates/members/register.html:6 -#: members/templates/members/register_failed.html:10 -#: members/templates/members/register_password.html:6 -#: members/templates/members/register_success.html:6 -#: members/templates/members/register_wrong_password.html:6 -#: members/templates/members/upload_registration_form.html:6 -#: members/templates/members/upload_registration_form_invalid.html:6 -#: members/templates/members/upload_registration_form_success.html:6 +#: members/templates/members/invited_registration_failed.html +#: members/templates/members/register.html +#: members/templates/members/register_failed.html +#: members/templates/members/register_password.html +#: members/templates/members/register_success.html +#: members/templates/members/register_wrong_password.html +#: members/templates/members/upload_registration_form.html +#: members/templates/members/upload_registration_form_invalid.html +#: members/templates/members/upload_registration_form_success.html msgid "Registration" msgstr "Registrierung" -#: members/templates/members/mail_confirmation_invalid.html:6 -#: members/templates/members/mail_confirmation_invalid.html:11 +#: members/templates/members/mail_confirmation_invalid.html msgid "Mail confirmation failed" msgstr "Emailbestätigung fehlgeschlagen" -#: members/templates/members/mail_confirmation_invalid.html:13 -#: members/templates/members/waiting_confirmation_invalid.html:19 +#: members/templates/members/mail_confirmation_invalid.html +#: members/templates/members/waiting_confirmation_invalid.html msgid "The supplied link is invalid." msgstr "Der verwendete Link ist ungültig." -#: members/templates/members/mail_confirmation_success.html:6 -#: members/templates/members/mail_confirmation_success.html:11 +#: members/templates/members/mail_confirmation_success.html msgid "Mail confirmed" msgstr "Emailadresse bestätigt" -#: members/templates/members/mail_confirmation_success.html:14 +#: members/templates/members/mail_confirmation_success.html #, python-format msgid "" "The email address %(email)s was successfully confirmed as parents email of " @@ -1503,7 +1485,7 @@ msgstr "" "Die Emailadresse %(email)s wurde erfolgreich als Emailadresse der Eltern von " "%(name)s bestätigt." -#: members/templates/members/mail_confirmation_success.html:17 +#: members/templates/members/mail_confirmation_success.html #, python-format msgid "" "The email address %(email)s was successfully confirmed as personal email of " @@ -1512,28 +1494,27 @@ msgstr "" "Die Emailadresse %(email)s wurde erfolgreich als persönliche Emailadresse " "von %(name)s bestätigt." -#: members/templates/members/member_form.html:13 +#: members/templates/members/member_form.html msgid "Emergency contacts:" msgstr "Notfallkontakte:" -#: members/templates/members/member_form.html:20 -#: members/templates/members/member_form.html:43 +#: members/templates/members/member_form.html msgid "Remove" msgstr "Entfernen" -#: members/templates/members/member_form.html:24 +#: members/templates/members/member_form.html msgid "Add more" msgstr "Weiteren hinzufügen" -#: members/templates/members/member_form.html:28 +#: members/templates/members/member_form.html #, python-format msgid "I am already or will become a member of the DAV %(sektion)s soon." msgstr "" "Ich bin bereits Mitglied der DAV %(sektion)s, oder beantrage die " "Mitgliedschaft zeitnah." -#: members/templates/members/member_form.html:30 -#: members/templates/members/register_waiting_list.html:36 +#: members/templates/members/member_form.html +#: members/templates/members/register_waiting_list.html #, python-format msgid "" "I agree that my data is stored and processed on the server of the JDAV " @@ -1542,33 +1523,33 @@ msgstr "" "Ich bin einverstanden, dass meine Daten auf dem Server der JDAV %(sektion)s " "gespeichert und verarbeitet werden." -#: members/templates/members/member_form.html:37 +#: members/templates/members/member_form.html msgid "Save" msgstr "Speichern" -#: members/templates/members/member_form.html:103 +#: members/templates/members/member_form.html msgid "This file is bigger than the maximal allowed file size of 5 MiB." msgstr "Diese Datei ist größer als die maximal erlaubte Dateigröße von 5 MiB." -#: 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 -#: members/templates/members/upload_registration_form.html:11 -#: members/templates/members/upload_registration_form_invalid.html:11 -#: members/templates/members/upload_registration_form_success.html:11 +#: members/templates/members/register.html +#: members/templates/members/register_password.html +#: members/templates/members/register_success.html +#: members/templates/members/register_wrong_password.html +#: members/templates/members/upload_registration_form.html +#: members/templates/members/upload_registration_form_invalid.html +#: members/templates/members/upload_registration_form_success.html msgid "Register" msgstr "Registrieren" -#: members/templates/members/register.html:15 +#: members/templates/members/register.html msgid "Here you can register for group" msgstr "Hier kannst du dich registrieren für die Gruppe" -#: members/templates/members/register_failed.html:12 +#: members/templates/members/register_failed.html msgid "Something went wrong while processing your registration." msgstr "Etwas ist schief gelaufen, bei der Verarbeitung deiner Registrierung." -#: members/templates/members/register_password.html:13 +#: members/templates/members/register_password.html #, python-format msgid "" "Thanks for your interest in participating in the JDAV %(sektion)s. Please " @@ -1577,7 +1558,7 @@ msgstr "" "Danke für dein Interesse bei der JDAV %(sektion)s teilzunehmen. Bitte gib " "das Passwort ein, das du von deinem Jugendleiter erhalten hast." -#: members/templates/members/register_success.html:13 +#: members/templates/members/register_success.html msgid "" "Your registration succeeded. We summarized your registration in this " "registration\n" @@ -1591,11 +1572,11 @@ msgstr "" "allgemeinen Teilnahmebedingungen. Falls du zustimmst,\n" "unterschreibe das Formular und lade hier einen Scan oder ein Bild hoch." -#: members/templates/members/register_success.html:18 +#: members/templates/members/register_success.html msgid "Please remember to confirm your email address." msgstr "Bitte denk daran, deine E-Mail Adresse(n) zu bestätigen." -#: members/templates/members/register_success.html:19 +#: members/templates/members/register_success.html msgid "" "The coordinating team will process your registration when your email address " "is confirmed." @@ -1603,55 +1584,52 @@ msgstr "" "Unser Jugendleiterteam wird deine Registrierung bearbeiten, wenn deine " "Emailadressen bestätigt sind." -#: members/templates/members/register_success.html:21 +#: members/templates/members/register_success.html msgid "" "The coordinating team will process your registration as soon as possible." msgstr "" "Unser Jugendleiterteam wird deine Registrierung so schnell wie möglich " "bearbeiten." -#: members/templates/members/register_waiting_list.html:6 +#: members/templates/members/register_waiting_list.html msgid "Registration for waiting list" msgstr "Registrierung für die Warteliste" -#: members/templates/members/register_waiting_list_success.html:6 -#: members/templates/members/register_waiting_list_success.html:11 +#: members/templates/members/register_waiting_list_success.html msgid "Registration for waiting list." msgstr "Registrierung für die Warteliste." -#: members/templates/members/register_waiting_list_success.html:13 +#: members/templates/members/register_waiting_list_success.html msgid "Your registration for the waiting list was successful." msgstr "Du wurdest auf die Warteliste gesetzt." -#: members/templates/members/register_waiting_list_success.html:14 +#: members/templates/members/register_waiting_list_success.html msgid "Please remember to confirm all email addresses that you entered." msgstr "Bitte denk daran, deine E-Mail Adresse(n) zu bestätigen." -#: members/templates/members/register_waiting_list_success.html:15 +#: members/templates/members/register_waiting_list_success.html 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." -#: members/templates/members/register_wrong_password.html:13 +#: members/templates/members/register_wrong_password.html 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." -#: members/templates/members/reject_invalid.html:6 -#: members/templates/members/reject_invalid.html:11 -#: members/templates/members/reject_invitation.html:6 -#: members/templates/members/reject_invitation.html:11 +#: members/templates/members/reject_invalid.html +#: members/templates/members/reject_invitation.html msgid "Reject invitation" msgstr "Einladung ablehnen" -#: members/templates/members/reject_invalid.html:13 +#: members/templates/members/reject_invalid.html msgid "This invitation is invalid or expired." msgstr "Diese Einladung ist ungültig oder abgelaufen." -#: members/templates/members/reject_invitation.html:13 +#: members/templates/members/reject_invitation.html #, python-format msgid "" "You were invited to a trial group meeting of the group %(groupname)s. On " @@ -1661,7 +1639,7 @@ msgstr "" "Du wurdest zu einer Schnupperstunde in der Gruppe %(groupname)s eingeladen. " "Auf dieser Seite kannst du die Einladung ablehnen." -#: members/templates/members/reject_invitation.html:17 +#: members/templates/members/reject_invitation.html msgid "" "You may either reject this specific invitation, because\n" "the time of the group does not fit your calendear, or unregister from the " @@ -1671,15 +1649,15 @@ msgstr "" "Termin keine Zeit hast, oder dich ganz von der Warteliste abmelden. Achtung: " "Das kann nicht rückgängig gemacht werden!" -#: members/templates/members/reject_invitation.html:26 +#: members/templates/members/reject_invitation.html msgid "Reject this invitation and stay on the waitinglist" msgstr "Diese Einladung ablehnen und auf der Warteliste bleiben" -#: members/templates/members/reject_invitation.html:27 +#: members/templates/members/reject_invitation.html msgid "Leave the waitinglist" msgstr "Warteliste verlassen" -#: members/templates/members/reject_success.html:15 +#: members/templates/members/reject_success.html msgid "" "You successfully unregistered from the waitinglist. If you want to rejoin " "the waitinglist\n" @@ -1689,7 +1667,7 @@ msgstr "" "einem späteren Zeitpunkt wieder auf die Warteliste setzen lassen möchtest " "kannst du das auf unserer Webseite machen.\n" -#: members/templates/members/reject_success.html:19 +#: members/templates/members/reject_success.html #, python-format msgid "" "You successfully rejected the invitation to a trial group meeting of the " @@ -1701,7 +1679,7 @@ msgstr "" "abgelehnt. Wenn ein Platz in einer anderen Gruppe frei wird, erhältst du " "eine neue Einladung.\n" -#: members/templates/members/upload_registration_form.html:14 +#: members/templates/members/upload_registration_form.html #, python-format msgid "" "We summarized your registration in our registration\n" @@ -1715,7 +1693,7 @@ msgstr "" "zustimmst, unterschreibe bitte das Formular und lade hier einen Scan oder " "ein Bild hoch." -#: members/templates/members/upload_registration_form.html:19 +#: members/templates/members/upload_registration_form.html msgid "" "If you are not an adult yet, please let someone responsible for you sign the " "agreement." @@ -1723,15 +1701,15 @@ msgstr "" "Bist du noch nicht volljährig? Dann lass bitte eine erziehungsberechtigte " "Person das Anmeldeformular unterschreiben." -#: members/templates/members/upload_registration_form.html:30 +#: members/templates/members/upload_registration_form.html msgid "Upload" msgstr "Hochladen" -#: members/templates/members/upload_registration_form_invalid.html:13 +#: members/templates/members/upload_registration_form_invalid.html msgid "The supplied key for uploading a registration form is invalid." msgstr "Der verwendete Link zum Hochladen eines Anmeldeformulars ist ungültig." -#: members/templates/members/upload_registration_form_success.html:13 +#: members/templates/members/upload_registration_form_success.html msgid "" "Thank you for uploading the registration form. Our team will process your " "registration shortly." @@ -1739,12 +1717,11 @@ msgstr "" "Danke für das Hochladen des Anmeldeformulars. Unser Jugendleiterteam wird " "deine Registrierung so schnell wie möglich bearbeiten." -#: members/templates/members/waiting_confirmation_invalid.html:6 -#: members/templates/members/waiting_confirmation_invalid.html:11 +#: members/templates/members/waiting_confirmation_invalid.html msgid "Waiting confirmation failed" msgstr "Wartelistenplatzbestätigung fehlgeschlagen" -#: members/templates/members/waiting_confirmation_invalid.html:15 +#: members/templates/members/waiting_confirmation_invalid.html 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" @@ -1752,16 +1729,15 @@ msgstr "" "Leider hast du deinen Wartelistenplatz nicht rechtzeitig bestätigt und hast " "somit deinen Platz verloren. Du kannst" -#: members/templates/members/waiting_confirmation_invalid.html:16 +#: members/templates/members/waiting_confirmation_invalid.html msgid "rejoin the waiting list" msgstr "der Warteliste erneut beitreten" -#: members/templates/members/waiting_confirmation_success.html:6 -#: members/templates/members/waiting_confirmation_success.html:11 +#: members/templates/members/waiting_confirmation_success.html msgid "Waiting confirmed" msgstr "Wartelistenplatz bestätigt" -#: members/templates/members/waiting_confirmation_success.html:14 +#: members/templates/members/waiting_confirmation_success.html #, python-format msgid "" "Thank you %(prename)s for your interest in staying on the waiting list.\n" @@ -1770,7 +1746,7 @@ msgstr "" "Danke %(prename)s für dein Interesse auf der Warteliste zu bleiben.\n" "Dein Platz ist bereits bestätigt." -#: members/templates/members/waiting_confirmation_success.html:18 +#: members/templates/members/waiting_confirmation_success.html #, python-format msgid "" "Thank you %(prename)s for your interest in staying on the waiting list.\n" @@ -1779,44 +1755,46 @@ msgstr "" "Danke %(prename)s für dein Interesse auf der Warteliste zu bleiben.\n" "Dein Platz wurde bestätigt." -#: members/views.py:37 members/views.py:76 +#: members/views.py msgid "Prename of the member." msgstr "Vorname des Teilnehmenden" -#: members/views.py:38 members/views.py:77 +#: members/views.py msgid "Lastname of the member." msgstr "Nachname des Teilnehmenden" -#: members/views.py:39 +#: members/views.py msgid "phone number of child or parent" msgstr "Telefonnummer des Teilnehmenden oder einer Kontaktperson" -#: members/views.py:40 +#: members/views.py msgid "email of child if available, otherwise parental email address" msgstr "" "Falls verfügbar, E-Mailadresse des Teilnehmenden, sonst einer Kontaktperson" -#: members/views.py:41 +#: members/views.py msgid "optional additional email address" msgstr "Optionale zusätzliche E-Mailadresse" -#: members/views.py:114 members/views.py:203 +#: members/views.py msgid "The entered password is wrong." msgstr "Das eingegebene Passwort ist falsch." -#: members/views.py:149 members/views.py:155 members/views.py:163 -#: members/views.py:423 +#: members/views.py msgid "invalid" msgstr "ungültig" -#: members/views.py:166 members/views.py:425 +#: members/views.py msgid "expired" msgstr "abgelaufen" -#: members/views.py:175 +#: members/views.py msgid "Invalid emergency contacts" msgstr "Ungültige Notfallkontakte" +#~ msgid "Change here" +#~ msgstr "Hier ändern" + #~ msgid "Your registration succeeded." #~ msgstr "Deine Registrierung war erfolgreich." diff --git a/jdav_web/startpage/locale/de/LC_MESSAGES/django.po b/jdav_web/startpage/locale/de/LC_MESSAGES/django.po index 4705c40..acfca1f 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: 2024-12-04 00:04+0100\n" +"POT-Creation-Date: 2025-01-19 14:26+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,94 +18,93 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: startpage/admin.py:21 startpage/admin.py:36 startpage/models.py:18 -#: startpage/models.py:40 +#: startpage/admin.py startpage/models.py msgid "URL" msgstr "URL" -#: startpage/admin.py:22 startpage/admin.py:37 +#: startpage/admin.py msgid "The url may only consist of letters, numerals, _, -, :, * and spaces." msgstr "" "Die URL darf nur aus Buchstaben, Zahlen, _, -, :, * oder Leerzeichen " "bestehen." -#: startpage/models.py:17 startpage/models.py:39 +#: startpage/models.py msgid "Title" msgstr "Titel" -#: startpage/models.py:19 startpage/models.py:42 +#: startpage/models.py msgid "website text" msgstr "Webseitentext" -#: startpage/models.py:20 +#: startpage/models.py msgid "Show in navigation" msgstr "In Navigation anzeigen" -#: startpage/models.py:23 startpage/models.py:63 +#: startpage/models.py msgid "Section" msgstr "Abschnitt" -#: startpage/models.py:24 +#: startpage/models.py msgid "Sections" msgstr "Abschnitte" -#: startpage/models.py:41 +#: startpage/models.py msgid "Date" msgstr "Datum" -#: startpage/models.py:44 +#: startpage/models.py msgid "Groups" msgstr "Gruppen" -#: startpage/models.py:45 +#: startpage/models.py msgid "detailed" msgstr "detailliert" -#: startpage/models.py:47 +#: startpage/models.py msgid "section" msgstr "Abschnitt" -#: startpage/models.py:54 +#: startpage/models.py msgid "Post" msgstr "Eintrag" -#: startpage/models.py:55 +#: startpage/models.py msgid "Posts" msgstr "Einträge" -#: startpage/models.py:79 +#: startpage/models.py msgid "file" msgstr "Datei" -#: startpage/models.py:85 +#: startpage/models.py msgid "Empty" msgstr "Leer" -#: startpage/models.py:88 +#: startpage/models.py msgid "image" msgstr "Bild" -#: startpage/models.py:89 +#: startpage/models.py msgid "images" msgstr "Bilder" -#: startpage/models.py:96 startpage/models.py:97 +#: startpage/models.py msgid "Member" msgstr "Mitglied" -#: startpage/models.py:98 +#: startpage/models.py msgid "Description" msgstr "Beschreibung" -#: startpage/models.py:99 +#: startpage/models.py msgid "Tag" msgstr "Tag" -#: startpage/models.py:102 +#: startpage/models.py msgid "Person" msgstr "Person" -#: startpage/models.py:103 +#: startpage/models.py msgid "Persons" msgstr "Personen" -- 2.38.4 From ce1a36a3898ccb8c5f5afa5f6b27eab09f892e8f Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sun, 19 Jan 2025 19:25:54 +0100 Subject: [PATCH 14/18] cleaned up translations --- jdav_web/members/locale/de/LC_MESSAGES/django.po | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/jdav_web/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po index 96ebca3..02327dd 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: 2025-01-19 14:26+0100\n" +"POT-Creation-Date: 2025-01-19 19:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1243,9 +1243,11 @@ msgid "" "no further changes to the statement are possible." msgstr "" "Hat die Ausfahrt bereits stattgefunden? Wenn ja, prüfe bitte ob alle " -"aufgelisteten Kosten korrekt sind, alle notwendigen Belege hochgeladen sind und ob alle Personen, die Geld ausbezahlt bekommen sollen, eine gültige IBAN haben. " -"Reiche deine Abrechnung dann beim Finanzreferat ein. Wenn du fortschreitest, sind keine weiteren " -"Änderungen an der Abrechnung mehr möglich." +"aufgelisteten Kosten korrekt sind, alle notwendigen Belege hochgeladen sind " +"und ob alle Personen, die Geld ausbezahlt bekommen sollen, eine gültige IBAN " +"haben. Reiche deine Abrechnung dann beim Finanzreferat ein. Wenn du " +"fortschreitest, sind keine weiteren Änderungen an der Abrechnung mehr " +"möglich." #: members/templates/admin/freizeit_finance_overview.html msgid "Submit" -- 2.38.4 From 4c6e271639d5ac4bc7b706c4bc191d3f3ee489f0 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sun, 19 Jan 2025 19:26:34 +0100 Subject: [PATCH 15/18] included IBAN check in allowance and subsidies --- .../admin/freizeit_finance_overview.html | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/jdav_web/members/templates/admin/freizeit_finance_overview.html b/jdav_web/members/templates/admin/freizeit_finance_overview.html index 2b11d26..efc7818 100644 --- a/jdav_web/members/templates/admin/freizeit_finance_overview.html +++ b/jdav_web/members/templates/admin/freizeit_finance_overview.html @@ -87,21 +87,29 @@ cost plan!

{% blocktrans %}The allowance of {{ allowance_per_yl }}€ per person is configured to be paid to:{% endblocktrans %} -

    + + + {% for member in memberlist.statement.allowance_to.all %} -
  • - {{ member.name }} -
  • + + + + {% endfor %} - +
    + {% trans "IBAN valid" %}
    {{ member.name }}{{ member.iban_valid|render_bool }}

    {% blocktrans %}The subsidies for night and transportation costs of {{ total_subsidies }}€ is configured to be paid to:{% endblocktrans %} -

      -
    • - {{ memberlist.statement.subsidy_to.name }} -
    • -
    + + + + + + + +
    + {% trans "IBAN valid" %}
    {{ memberlist.statement.subsidy_to.name }}{{ memberlist.statement.subsidy_to.iban_valid|render_bool }}

    {% if not memberlist.statement.allowance_to_valid %}

    -- 2.38.4 From c3ffedf5c27c38b39185a775e9a66f7ceadf1f49 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sun, 19 Jan 2025 20:04:08 +0100 Subject: [PATCH 16/18] changed calculation of cativity total costs, addresses #105 --- jdav_web/members/models.py | 2 +- jdav_web/members/templates/admin/freizeit_finance_overview.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index 36f8a39..b09f1db 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -1212,7 +1212,7 @@ class Freizeit(CommonModel): if not self.statement: return 0 total_costs = self.statement.total_bills_theoretic - total_contributions = self.statement.total_staff + self.potential_ljp_contributions + total_contributions = self.statement.total_subsidies + self.potential_ljp_contributions return total_costs - total_contributions @property diff --git a/jdav_web/members/templates/admin/freizeit_finance_overview.html b/jdav_web/members/templates/admin/freizeit_finance_overview.html index efc7818..ae14716 100644 --- a/jdav_web/members/templates/admin/freizeit_finance_overview.html +++ b/jdav_web/members/templates/admin/freizeit_finance_overview.html @@ -145,7 +145,7 @@ you may obtain up to 25€ times {{ duration }} days for {{ participant_count }} {% trans "Contributions by the association" %} - -{{ total_staff }}€ + -{{ total_subsidies }}€ -- 2.38.4 From 9ba4bf46141cd232550bc9bccafaca8a2b5325b1 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Mon, 20 Jan 2025 00:05:49 +0100 Subject: [PATCH 17/18] added boolean rendering --- .../finance/templates/admin/overview_submitted_statement.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jdav_web/finance/templates/admin/overview_submitted_statement.html b/jdav_web/finance/templates/admin/overview_submitted_statement.html index 4a33ae6..0546b81 100644 --- a/jdav_web/finance/templates/admin/overview_submitted_statement.html +++ b/jdav_web/finance/templates/admin/overview_submitted_statement.html @@ -1,5 +1,6 @@ {% extends "admin/base_site.html" %} {% load i18n admin_urls static %} +{% load overview_extras %} {% block extrahead %} {{ block.super }} @@ -40,7 +41,7 @@ {{ bill.amount }}€. - {{ bill.costs_covered }} + {{ bill.costs_covered|render_bool }} {% endfor %} -- 2.38.4 From d225668219e3c2442f15218ea231a0bf66bb5dab Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Mon, 20 Jan 2025 00:09:56 +0100 Subject: [PATCH 18/18] rerouting excursion-related expense submission to excursion finance overview page --- jdav_web/finance/admin.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/jdav_web/finance/admin.py b/jdav_web/finance/admin.py index e6fddc1..0f5237d 100644 --- a/jdav_web/finance/admin.py +++ b/jdav_web/finance/admin.py @@ -89,12 +89,25 @@ class StatementUnSubmittedAdmin(CommonAdminMixin, admin.ModelAdmin): messages.success(request, _("Successfully submited %(name)s. The finance department will notify the requestors as soon as possible.") % {'name': str(statement)}) return HttpResponseRedirect(reverse('admin:%s_%s_changelist' % (self.opts.app_label, self.opts.model_name))) - context = dict(self.admin_site.each_context(request), - title=_('Submit statement'), + + if statement.excursion: + memberlist = statement.excursion + context = dict(self.admin_site.each_context(request), + title=_('Finance overview'), opts=self.opts, - statement=statement) - - return render(request, 'admin/submit_statement.html', context=context) + memberlist=memberlist, + object=memberlist, + participant_count=memberlist.participant_count, + ljp_contributions=memberlist.potential_ljp_contributions, + total_relative_costs=memberlist.total_relative_costs, + **memberlist.statement.template_context()) + return render(request, 'admin/freizeit_finance_overview.html', context=context) + else: + context = dict(self.admin_site.each_context(request), + title=_('Submit statement'), + opts=self.opts, + statement=statement) + return render(request, 'admin/submit_statement.html', context=context) class TransactionOnSubmittedStatementInline(admin.TabularInline): -- 2.38.4