misc: allow using schwifty for IBAN validation (#41903)
gitea/wcs/pipeline/head There was a failure building this commit Details

This commit is contained in:
Frédéric Péters 2023-12-23 11:33:58 +01:00
parent ce813b1556
commit 40b20bcd4b
3 changed files with 63 additions and 46 deletions

View File

@ -2,12 +2,14 @@ import copy
import datetime
import decimal
import os
from unittest import mock
import mechanize
import pytest
from pyquery import PyQuery
from quixote import cleanup, get_response
from quixote.http_request import parse_query
from schwifty import IBAN
from wcs.fields.base import CssClassesWidget
from wcs.qommon import sessions
@ -1303,57 +1305,60 @@ def test_wcsextrastringwidget_belgian_nrn_validation():
assert widget.has_error()
def test_wcsextrastringwidget_iban_validation():
@pytest.mark.parametrize('iban_class', [None, IBAN])
def test_wcsextrastringwidget_iban_validation(iban_class):
class FakeField:
pass
fakefield = FakeField()
fakefield.validation = {'type': 'iban'}
with mock.patch('wcs.qommon.misc.IBAN', iban_class):
fakefield = FakeField()
fakefield.validation = {'type': 'iban'}
# regular cases
for iban in [
'BE71 0961 2345 6769', # Belgium
'be71 0961 2345 6769', # Lowercase
' BE71 0961 2345 6769 ', # Extra padding
'FR76 3000 6000 0112 3456 7890 189', # France
'FR27 2004 1000 0101 2345 6Z02 068', # France (having letter)
'DE91 1000 0000 0123 4567 89', # Germany
'GR96 0810 0010 0000 0123 4567 890', # Greece
'RO09 BCYP 0000 0012 3456 7890', # Romania
'SA44 2000 0001 2345 6789 1234', # Saudi Arabia
'ES79 2100 0813 6101 2345 6789', # Spain
'CH56 0483 5012 3456 7800 9', # Switzerland
'GB98 MIDL 0700 9312 3456 78', # United Kingdom
]:
widget = WcsExtraStringWidget('test', value='foo', required=False)
widget.field = fakefield
mock_form_submission(req, widget, {'test': iban.replace(' ', '')})
assert not widget.has_error()
widget._parse(req)
assert widget.value == iban.upper().replace(' ', '').strip()
# regular cases
for iban in [
'BE71 0961 2345 6769', # Belgium
'be71 0961 2345 6769', # Lowercase
' BE71 0961 2345 6769 ', # Extra padding
'FR76 3000 6000 0112 3456 7890 189', # France
'FR27 2004 1000 0101 2345 6Z02 068', # France (having letter)
'DE91 1000 0000 0123 4567 89', # Germany
'GR96 0810 0010 0000 0123 4567 890', # Greece
'RO09 BCYP 0000 0012 3456 7890', # Romania
'SA44 2000 0001 2345 6789 1234', # Saudi Arabia
'ES79 2100 0813 6101 2345 6789', # Spain
'CH56 0483 5012 3456 7800 9', # Switzerland
'GB98 MIDL 0700 9312 3456 78', # United Kingdom
]:
widget = WcsExtraStringWidget('test', value='foo', required=False)
widget.field = fakefield
mock_form_submission(req, widget, {'test': iban.replace(' ', '')})
assert not widget.has_error()
widget._parse(req)
assert widget.value == iban.upper().replace(' ', '').strip()
# failing cases
for iban in [
'42',
'FR76 2004 1000 0101 2345 6Z02 068',
'FR76 2004 1000 0101 2345 6%02 068',
'FR76 hello 234 6789 1234 6789 123',
'FRxx 2004 1000 0101 2345 6Z02 068',
'FR76 3000 6000 011² 3456 7890 189', # ²
'XX12',
'XX12 0000 00',
'FR76',
'FR76 0000 0000 0000 0000 0000 000',
'FR76 1234 4567',
]:
widget = WcsExtraStringWidget('test', value='foo', required=False)
widget.field = fakefield
mock_form_submission(req, widget, {'test': iban.replace(' ', '')})
assert widget.has_error()
assert (
widget.error
== 'You should enter a valid IBAN code, it should have between 14 and 34 characters, for example FR7600001000010000000000101.'
)
# failing cases
for iban in [
'42',
'FR76 2004 1000 0101 2345 6Z02 068',
'FR76 2004 1000 0101 2345 6%02 068',
'FR76 hello 234 6789 1234 6789 123',
'FRxx 2004 1000 0101 2345 6Z02 068',
'FR76 3000 6000 011² 3456 7890 189', # ²
'XX12',
'XX12 0000 00',
'FR76',
'FR76 0000 0000 0000 0000 0000 000',
'FR76 1234 4567',
]:
widget = WcsExtraStringWidget('test', value='foo', required=False)
widget.field = fakefield
mock_form_submission(req, widget, {'test': iban.replace(' ', '')})
assert widget.has_error()
assert (
widget.error
== 'You should enter a valid IBAN code, it should have between 14 and 34 characters, '
'for example FR7600001000010000000000101.'
)
def test_wcsextrastringwidget_time():

View File

@ -32,6 +32,7 @@ deps =
pylint
pre-commit
pyzbar
schwifty
bleach<5
# others...
django32: django>=3.2,<3.3
@ -72,6 +73,7 @@ deps =
Quixote>=3.0,<3.2
pre-commit
pyzbar
schwifty
allowlist_externals =
./getlasso3.sh
commands =

View File

@ -61,6 +61,10 @@ try:
except subprocess.CalledProcessError:
HAS_PDFTOPPM = False
try:
from schwifty import IBAN
except ImportError:
IBAN = None
EXIF_ORIENTATION = 0x0112
@ -1117,6 +1121,12 @@ def validate_iban(string_value):
'''https://fr.wikipedia.org/wiki/International_Bank_Account_Number'''
if not string_value:
return False
if IBAN:
try:
IBAN(string_value, validate_bban=True)
except ValueError:
return False
return True
string_value = string_value.upper().strip().replace(' ', '')
country_code = string_value[:2]
iban_key = string_value[2:4]