Skip to content

Commit 4722e65

Browse files
authored
Merge pull request #887 from cordada/deploy/v0.56.0
Deploy release v0.56.0
2 parents 0e0c24a + 02ec70b commit 4722e65

File tree

10 files changed

+93
-26
lines changed

10 files changed

+93
-26
lines changed

.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 0.55.0
2+
current_version = 0.56.0
33
commit = True
44
tag = False
55
message = chore: Bump version from {current_version} to {new_version}

HISTORY.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# History
22

3+
## 0.56.0 (2025-09-10)
4+
5+
- (PR #883, 2025-09-10) extras: Add more tests for Django form field for `Rut`
6+
- (PR #884, 2025-09-10) extras: Improve Django filters `FILTER_FOR_DBFIELD_DEFAULTS`
7+
- (PR #882, 2025-09-10) extras: Django model field `RutField` does not validate DV of `Rut`
8+
- (PR #885, 2025-09-10) deps: Update `cryptography` from 45.0.4 to 45.0.7
9+
310
## 0.55.0 (2025-09-10)
411

512
- (PR #878, 2025-09-10) extras: Improve Django filter for `Rut`

requirements-dev.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ colorama==0.4.6
4242
# via tox
4343
coverage==7.10.6
4444
# via -r requirements-dev.in
45-
cryptography==45.0.4
45+
cryptography==45.0.7
4646
# via
4747
# -c requirements.txt
4848
# secretstorage

requirements.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# git+https://github.com/example/example.git@example-vcs-ref#egg=example-pkg[foo,bar]==1.42.3
77

88
backports-zoneinfo==0.2.1 ; python_version < "3.9" # Used by `djangorestframework`.
9-
cryptography==45.0.4
9+
cryptography==45.0.7
1010
defusedxml==0.7.1
1111
django-filter>=24.2
1212
Django>=4.2

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ certifi==2024.7.4
1616
# via signxml
1717
cffi==1.16.0
1818
# via cryptography
19-
cryptography==45.0.4
19+
cryptography==45.0.7
2020
# via
2121
# -r requirements.in
2222
# pyopenssl

src/cl_sii/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
55
"""
66

7-
__version__ = '0.55.0'
7+
__version__ = '0.56.0'

src/cl_sii/extras/dj_filters.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
import cl_sii.extras.dj_model_fields
2424

2525

26-
FILTER_FOR_DBFIELD_DEFAULTS: Mapping[Type[django.db.models.Field], Mapping[str, object]]
27-
FILTER_FOR_DBFIELD_DEFAULTS = deepcopy(django_filters.filterset.FILTER_FOR_DBFIELD_DEFAULTS)
26+
FILTER_FOR_DBFIELD_DEFAULTS: Mapping[Type[django.db.models.Field], Mapping[str, object]] = {}
2827

2928

3029
class RutFilter(django_filters.filters.CharFilter):
@@ -90,4 +89,7 @@ class SiiFilterSet(django_filters.filterset.FilterSet):
9089
"""
9190

9291
FILTER_DEFAULTS: ClassVar[Mapping[Type[django.db.models.Field], Mapping[str, object]]]
93-
FILTER_DEFAULTS = FILTER_FOR_DBFIELD_DEFAULTS
92+
FILTER_DEFAULTS = {
93+
**deepcopy(django_filters.FilterSet.FILTER_DEFAULTS),
94+
**FILTER_FOR_DBFIELD_DEFAULTS,
95+
}

src/cl_sii/extras/dj_model_fields.py

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -153,29 +153,37 @@ def to_python(self, value: Optional[object]) -> Optional[Rut]:
153153
if the data can't be converted
154154
155155
"""
156-
if value is None or isinstance(value, Rut):
156+
if value is None:
157157
converted_value = value
158-
else:
159-
try:
160-
converted_value = Rut(value, validate_dv=self.validate_dv) # type: ignore
161-
except (AttributeError, TypeError, ValueError) as exc:
162-
if (
163-
isinstance(exc, ValueError)
164-
and exc.args
165-
and exc.args[0] == Rut.INVALID_DV_ERROR_MESSAGE
166-
):
167-
raise django.core.exceptions.ValidationError(
168-
self.error_messages['invalid_dv'],
169-
code='invalid_dv',
170-
params={'value': value},
171-
)
172-
158+
return converted_value
159+
elif isinstance(value, Rut):
160+
if not self.validate_dv:
161+
converted_value = value
162+
return converted_value
163+
elif self.validate_dv and value.validate_dv(raise_exception=False):
164+
converted_value = value
165+
return converted_value
166+
167+
try:
168+
converted_value = Rut(value, validate_dv=self.validate_dv) # type: ignore
169+
except (AttributeError, TypeError, ValueError) as exc:
170+
if (
171+
isinstance(exc, ValueError)
172+
and exc.args
173+
and exc.args[0] == Rut.INVALID_DV_ERROR_MESSAGE
174+
):
173175
raise django.core.exceptions.ValidationError(
174-
self.error_messages['invalid'],
175-
code='invalid',
176+
self.error_messages['invalid_dv'],
177+
code='invalid_dv',
176178
params={'value': value},
177179
)
178180

181+
raise django.core.exceptions.ValidationError(
182+
self.error_messages['invalid'],
183+
code='invalid',
184+
params={'value': value},
185+
)
186+
179187
return converted_value
180188

181189
def value_to_string(self, obj: django.db.models.Model) -> str:

src/tests/test_extras_dj_form_fields.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def setUpClass(cls) -> None:
1919
cls.valid_rut_canonical_instance_with_invalid_dv = Rut(
2020
cls.valid_rut_canonical_with_invalid_dv
2121
)
22+
assert not cls.valid_rut_canonical_instance_with_invalid_dv.validate_dv()
2223
cls.valid_rut_verbose_leading_zero_lowercase = '060.803.000-k'
2324

2425
def test_clean_value_of_invalid_canonical_str(self) -> None:
@@ -57,6 +58,18 @@ def test_clean_value_of_rut_str_with_invalid_dv_if_not_validated(self) -> None:
5758
self.assertIsInstance(cleaned_value, Rut)
5859
self.assertEqual(cleaned_value.canonical, self.valid_rut_canonical_with_invalid_dv)
5960

61+
def test_clean_value_of_rut_instance_with_invalid_dv_if_validated(self) -> None:
62+
rut_field = RutField(validate_dv=True)
63+
with self.assertRaises(django.core.exceptions.ValidationError) as cm:
64+
rut_field.clean(self.valid_rut_canonical_instance_with_invalid_dv)
65+
self.assertEqual(cm.exception.code, 'invalid_dv')
66+
67+
def test_clean_value_of_rut_instance_with_invalid_dv_if_not_validated(self) -> None:
68+
rut_field = RutField(validate_dv=False)
69+
cleaned_value = rut_field.clean(self.valid_rut_canonical_instance_with_invalid_dv)
70+
self.assertIsInstance(cleaned_value, Rut)
71+
self.assertEqual(cleaned_value, self.valid_rut_canonical_instance_with_invalid_dv)
72+
6073
def test_clean_of_empty_value_if_not_required(self) -> None:
6174
rut_field = RutField(required=False)
6275
for value in RutField.empty_values:

src/tests/test_extras_dj_model_fields.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class RutFieldTest(unittest.TestCase):
1111
valid_rut_canonical: str
1212
valid_rut_instance: Rut
1313
valid_rut_canonical_with_invalid_dv: str
14+
valid_rut_canonical_instance_with_invalid_dv: Rut
1415
valid_rut_verbose_leading_zero_lowercase: str
1516
mock_model_instance: django.db.models.Model
1617

@@ -19,6 +20,10 @@ def setUpClass(cls) -> None:
1920
cls.valid_rut_canonical = '60803000-K'
2021
cls.valid_rut_instance = Rut(cls.valid_rut_canonical)
2122
cls.valid_rut_canonical_with_invalid_dv = '60803000-0'
23+
cls.valid_rut_canonical_instance_with_invalid_dv = Rut(
24+
cls.valid_rut_canonical_with_invalid_dv
25+
)
26+
assert not cls.valid_rut_canonical_instance_with_invalid_dv.validate_dv()
2227
cls.valid_rut_verbose_leading_zero_lowercase = '060.803.000-k'
2328
cls.mock_model_instance = unittest.mock.create_autospec(
2429
django.db.models.Model, instance=True
@@ -43,6 +48,14 @@ def test_get_prep_value_of_None(self) -> None:
4348
prepared_value = RutField().get_prep_value(None)
4449
self.assertIsNone(prepared_value)
4550

51+
def test_clean_value_with_invalid_type(self) -> None:
52+
for value_with_invalid_type in [12345678, 12.34, [], {}, object()]:
53+
with self.subTest(value=value_with_invalid_type):
54+
rut_field = RutField()
55+
with self.assertRaises(django.core.exceptions.ValidationError) as cm:
56+
rut_field.clean(value_with_invalid_type, self.mock_model_instance)
57+
self.assertEqual(cm.exception.code, 'invalid')
58+
4659
def test_clean_value_of_rut_str_with_invalid_dv_if_validated(self) -> None:
4760
rut_field = RutField(validate_dv=True)
4861
with self.assertRaises(django.core.exceptions.ValidationError) as cm:
@@ -57,6 +70,30 @@ def test_clean_value_of_rut_str_with_invalid_dv_if_not_validated(self) -> None:
5770
self.assertIsInstance(cleaned_value, Rut)
5871
self.assertEqual(cleaned_value.canonical, self.valid_rut_canonical_with_invalid_dv)
5972

73+
def test_clean_value_of_rut_instance_with_valid_dv(self) -> None:
74+
for validate_dv in [True, False]:
75+
with self.subTest(validate_dv=validate_dv):
76+
rut_field = RutField(validate_dv=validate_dv)
77+
cleaned_value = rut_field.clean(self.valid_rut_instance, self.mock_model_instance)
78+
self.assertIsInstance(cleaned_value, Rut)
79+
self.assertEqual(cleaned_value, self.valid_rut_instance)
80+
81+
def test_clean_value_of_rut_instance_with_invalid_dv_if_validated(self) -> None:
82+
rut_field = RutField(validate_dv=True)
83+
with self.assertRaises(django.core.exceptions.ValidationError) as cm:
84+
rut_field.clean(
85+
self.valid_rut_canonical_instance_with_invalid_dv, self.mock_model_instance
86+
)
87+
self.assertEqual(cm.exception.code, 'invalid_dv')
88+
89+
def test_clean_value_of_rut_instance_with_invalid_dv_if_not_validated(self) -> None:
90+
rut_field = RutField(validate_dv=False)
91+
cleaned_value = rut_field.clean(
92+
self.valid_rut_canonical_instance_with_invalid_dv, self.mock_model_instance
93+
)
94+
self.assertIsInstance(cleaned_value, Rut)
95+
self.assertEqual(cleaned_value, self.valid_rut_canonical_instance_with_invalid_dv)
96+
6097
def test_deconstruct_without_options(self) -> None:
6198
name, path, args, kwargs = RutField().deconstruct()
6299
self.assertEqual(path, 'cl_sii.extras.dj_model_fields.RutField')

0 commit comments

Comments
 (0)