From e9979aa71519d2291ba5eeb8a80326d9959cd86b Mon Sep 17 00:00:00 2001 From: saxix Date: Tue, 2 Jul 2024 16:06:07 +0200 Subject: [PATCH] fixes default attrs --- src/hope_flex_fields/models.py | 20 +++++++++++++------- tests/admin/test_admin_field.py | 21 ++++++++++++++++++++- tests/extra/demoapp/demo/urls.py | 2 +- tests/extra/testutils/factories.py | 1 + 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/hope_flex_fields/models.py b/src/hope_flex_fields/models.py index 6439aa3..e391b6c 100644 --- a/src/hope_flex_fields/models.py +++ b/src/hope_flex_fields/models.py @@ -26,6 +26,10 @@ } +def get_default_attrs(): + return DEFAULT_ATTRS + + class TestForm(forms.Form): fieldset = None @@ -39,7 +43,7 @@ class FieldDefinition(models.Model): name = models.CharField(max_length=255, unique=True) description = models.TextField(max_length=500, blank=True, null=True, default="") field_type = StrategyClassField(registry=field_registry) - attrs = models.JSONField(default=DEFAULT_ATTRS, blank=True) + attrs = models.JSONField(default=get_default_attrs, blank=True) regex = RegexField(blank=True, null=True, validators=[RegexValidator()]) validation = models.TextField(blank=True, null=True) objects = FieldDefinitionManager() @@ -59,17 +63,19 @@ def clean(self): raise ValidationError(e) def set_default_arguments(self): - if not isinstance(self.attrs, dict): - self.attrs = {} - stored = self.attrs + if self.attrs in [None, "null", ""]: + self.attrs = DEFAULT_ATTRS + elif isinstance(self.attrs, str): + self.attrs = DEFAULT_ATTRS + sig: inspect.Signature = inspect.signature(self.field_type) - defaults = { + merged = { k.name: k.default for __, k in sig.parameters.items() if k.default not in [inspect.Signature.empty] } - defaults.update(**stored) - self.attrs = defaults + merged.update(**self.attrs) + self.attrs = merged @property def required(self): diff --git a/tests/admin/test_admin_field.py b/tests/admin/test_admin_field.py index 7e125a1..a6f3b98 100644 --- a/tests/admin/test_admin_field.py +++ b/tests/admin/test_admin_field.py @@ -2,6 +2,9 @@ from django.urls import reverse import pytest +from strategy_field.utils import fqn + +from hope_flex_fields.models import FieldDefinition pytestmark = [pytest.mark.admin, pytest.mark.smoke, pytest.mark.django_db] @@ -19,7 +22,7 @@ def record(db): return fd1 -def test_fieldset_test(app, record): +def test_field_test(app, record): url = reverse("admin:hope_flex_fields_fielddefinition_test", args=[record.pk]) res = app.get(url) res.forms["test"]["IntField"] = "" @@ -31,3 +34,19 @@ def test_fieldset_test(app, record): res = res.forms["test"].submit() messages = [s.message for s in res.context["messages"]] assert messages == ["Valid"] + + +def test_fields_create(app, record): + url = reverse("admin:hope_flex_fields_fielddefinition_add") + res = app.get(url) + res.form["name"] = "Int" + res.form["field_type"] = fqn(forms.ChoiceField) + res = res.form.submit() + assert res.status_code == 302 + obj: FieldDefinition = FieldDefinition.objects.get(name="int") + assert obj.attrs == { + "choices": [], + "required": False, + "label": None, + "help_text": "", + } diff --git a/tests/extra/demoapp/demo/urls.py b/tests/extra/demoapp/demo/urls.py index 277dcbc..39adc2d 100644 --- a/tests/extra/demoapp/demo/urls.py +++ b/tests/extra/demoapp/demo/urls.py @@ -27,6 +27,6 @@ urlpatterns = [ - path("admin/", admin.site.urls), path("api/", include(router.urls)), + path("", admin.site.urls), ] diff --git a/tests/extra/testutils/factories.py b/tests/extra/testutils/factories.py index e6674b3..a5a4c5e 100644 --- a/tests/extra/testutils/factories.py +++ b/tests/extra/testutils/factories.py @@ -61,6 +61,7 @@ class SuperUserFactory(UserFactory): class FieldDefinitionFactory(AutoRegisterModelFactory): name = factory.Sequence(lambda d: "FieldDefinition-%s" % d) field_type = factory.fuzzy.FuzzyChoice([forms.CharField, forms.IntegerField]) + attrs = {} class Meta: model = FieldDefinition