Skip to content

Commit 16410c7

Browse files
committed
Handle default values
Signed-off-by: Jakub Semik <[email protected]>
1 parent 2b547cf commit 16410c7

File tree

8 files changed

+78
-11
lines changed

8 files changed

+78
-11
lines changed

django_better_admin_arrayfield/forms/fields.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,33 @@ def __init__(self, base_field, **kwargs):
2222
def clean(self, value):
2323
cleaned_data = []
2424
errors = []
25-
value = list(filter(None, value))
25+
if value is not None:
26+
value = [x for x in value if x]
27+
28+
for index, item in enumerate(value):
29+
try:
30+
cleaned_data.append(self.base_field.clean(item))
31+
except forms.ValidationError as error:
32+
errors.append(
33+
prefix_validation_error(
34+
error, self.error_messages["item_invalid"], code="item_invalid", params={"nth": index}
35+
)
36+
)
37+
2638
if not value:
2739
cleaned_data = None
28-
for index, item in enumerate(value):
29-
try:
30-
cleaned_data.append(self.base_field.clean(item))
31-
except forms.ValidationError as error:
32-
errors.append(
33-
prefix_validation_error(
34-
error, self.error_messages["item_invalid"], code="item_invalid", params={"nth": index}
35-
)
36-
)
40+
41+
if cleaned_data is None and self.initial is not None:
42+
if callable(self.initial):
43+
cleaned_data = self.initial()
44+
else:
45+
cleaned_data = self.initial
46+
3747
if errors:
3848
raise forms.ValidationError(list(chain.from_iterable(errors)))
3949
if not cleaned_data and self.required:
4050
raise forms.ValidationError(self.error_messages["required"])
51+
4152
return cleaned_data
4253

4354
def has_changed(self, initial, data):
File renamed without changes.

requirements_dev.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
bumpversion==0.6.0
22
wheel==0.34.2
33
pre-commit==2.6.0
4-
black==19.10b0
4+
black==19.10b0psycopg2-binary==2.8.5

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ max-line-length = 119
2626

2727
[tool:pytest]
2828
DJANGO_SETTINGS_MODULE = tests.settings
29+
django_find_project = false

tests/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"django.contrib.contenttypes",
1515
"django.contrib.sites",
1616
"django_better_admin_arrayfield",
17+
"tests.testapp.apps.TestAppConfig",
1718
]
1819

1920
TEMPLATES = [{"BACKEND": "django.template.backends.django.DjangoTemplates", "APP_DIRS": True}]

tests/test_forms.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from typing import Type
2+
3+
import pytest
4+
from django.forms import ModelForm
5+
6+
from tests.testapp.models import DefaultValueNullableModel, NullableNoDefaultModel, DefaultValueRequiredModel
7+
8+
9+
def form_factory(model) -> Type[ModelForm]:
10+
meta = type("Meta", (), {"model": model, "fields": ["array"]})
11+
return type("SampleForm", (ModelForm,), {"Meta": meta})
12+
13+
14+
class TestDefaultValue:
15+
@pytest.mark.parametrize(
16+
"model_class,init_value,expected_value",
17+
(
18+
(DefaultValueNullableModel, None, []),
19+
(NullableNoDefaultModel, None, None),
20+
(DefaultValueRequiredModel, None, []),
21+
(DefaultValueNullableModel, [1], [1]),
22+
(NullableNoDefaultModel, [1], [1]),
23+
(DefaultValueRequiredModel, [1], [1]),
24+
),
25+
)
26+
def test_default_list(self, model_class, init_value, expected_value):
27+
data = {}
28+
if init_value is not None:
29+
data["array"] = init_value
30+
31+
form = form_factory(model_class)(data=data)
32+
assert form.is_valid()
33+
assert form.cleaned_data["array"] == expected_value

tests/testapp/apps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class TestAppConfig(AppConfig):
5+
name = "tests.testapp"
6+
verbose_name = "TestApp"

tests/testapp/models.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from django.db import models
2+
3+
from django_better_admin_arrayfield.models.fields import ArrayField
4+
5+
6+
class DefaultValueNullableModel(models.Model):
7+
array = ArrayField(models.IntegerField(), blank=True, null=True, default=list)
8+
9+
10+
class DefaultValueRequiredModel(models.Model):
11+
array = ArrayField(models.IntegerField(), blank=True, default=list)
12+
13+
14+
class NullableNoDefaultModel(models.Model):
15+
array = ArrayField(models.IntegerField(), blank=True, null=True)

0 commit comments

Comments
 (0)