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 @@