Skip to content

Commit

Permalink
AutoGeneratedField to actual field in get_uniqueness_extra_kwargs
Browse files Browse the repository at this point in the history
  • Loading branch information
Brontes committed Dec 18, 2024
1 parent f7a9c03 commit 60f969b
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 6 deletions.
4 changes: 2 additions & 2 deletions dynamicforms/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@
Statement,
TimeFieldMixin,
)
from .struct import Struct

assert DFField # So that the linter does not complain


class AutoGeneratedField(FieldRenderMixin, Struct):
class AutoGeneratedField(dict):
pass


class BooleanField(FieldRenderMixin, ActionMixin, FieldHelpTextMixin, ConditionalVisibilityMixin, fields.BooleanField):
def __init__(
self,
Expand Down
26 changes: 22 additions & 4 deletions dynamicforms/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,19 +294,38 @@ def get_extra_kwargs(self):
value = getattr(self, fld_name, None)
if isinstance(value, fields.AutoGeneratedField):
res.setdefault(fld_name, {})
res[fld_name].update(value.__to_dict__())
res[fld_name].update(value)
return res

def get_uniqueness_extra_kwargs(self, field_names: List[str], declared_fields: Dict, extra_kwargs: Dict):
"""
Finds all ChoiceFields and RelatedFields and creates additional "-display" fields to show
resolved display value in table
"""
from rest_framework.utils import model_meta

model = getattr(self.Meta, "model")
depth = getattr(self.Meta, "depth", 0)
info = None

def _get_info():
nonlocal info
if info is None:
info = model_meta.get_field_info(model)
return info

for field_name in field_names[:]:
# serializer field: either what is declared as a Field instance in Serializer or AutogeneratedField
s_field = declared_fields.get(field_name, getattr(self, field_name, None))
# existing extra as provided by get_extra_kwargs
extra = extra_kwargs.get(field_name, dict())

# serializer field: either what is declared as a Field instance in Serializer or AutogeneratedField
s_field = declared_fields.get(field_name, getattr(self, field_name, None))
if isinstance(s_field, fields.AutoGeneratedField):
field_class, field_kwargs = self.build_field(field_name, _get_info(), model, depth)
field_kwargs.update(extra)

s_field = field_class(**field_kwargs)

# model field, if it exists
try:
d_field = self.Meta.model._meta.get_field(field_name)
Expand Down Expand Up @@ -528,4 +547,3 @@ def determine_layout_at_runtime(self, request):
except ImportError:
pass
return self.Meta.layout

0 comments on commit 60f969b

Please sign in to comment.