Skip to content

Commit 63d8e93

Browse files
committed
wip
1 parent 020c0e8 commit 63d8e93

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

app/serializers/person.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
from typing import Any
2+
3+
from constance import config
4+
15
from app.models import Person
26
from django_features.custom_fields.serializers import CustomFieldBaseModelSerializer
7+
from django_features.serializers import MappingSerializer
38

49

510
class PersonSerializer(CustomFieldBaseModelSerializer):
@@ -10,3 +15,12 @@ class Meta:
1015
"firstname",
1116
"lastname",
1217
]
18+
19+
20+
class PersonMappingSerializer(MappingSerializer):
21+
class Meta:
22+
model = Person
23+
24+
@property
25+
def mapping(self) -> dict[str, dict[str, Any]]:
26+
return config.MODEL_MAPPING_FIELD

django_features/serializers.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from typing import Any
2+
3+
from rest_framework.fields import empty
4+
5+
from django_features.custom_fields.serializers import CustomFieldBaseModelSerializer
6+
7+
8+
class MappingSerializer(CustomFieldBaseModelSerializer):
9+
class Meta:
10+
abstract = True
11+
fields = "__all__"
12+
model = None
13+
14+
def __init__(self, instance: Any = None, data: Any = empty, **kwargs: Any) -> None:
15+
super().__init__(instance, data, **kwargs)
16+
self._init_fields()
17+
18+
@property
19+
def mapping(self) -> dict[str, dict[str, Any]]:
20+
raise NotImplementedError("Mapping must be set")
21+
22+
@property
23+
def model_mapping(self) -> dict[str, Any]:
24+
if not self.Meta.model:
25+
raise ValueError("Meta.model must be set")
26+
return self.mapping.get(self.Meta.model.__name__.lower(), {})
27+
28+
def _init_fields(self) -> None:
29+
for source, dest in self.model_mapping.items():
30+
field = self.fields.get(dest)
31+
if not field:
32+
raise ValueError(f"Field {dest} not found in serializer")
33+
field.source = source

django_features/validations.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,11 @@ def validate_required_fields(
8383
) -> None:
8484
info = get_field_info(model)
8585
for name, field in info.fields.items():
86-
if field.null is False and name not in field_mapping.values():
86+
if (
87+
field.null is False
88+
and field.auto_now_add is False
89+
and name not in field_mapping.values()
90+
):
8791
raise ValidationError(
8892
f"Required field '{name}' not found in field mapping."
8993
)

0 commit comments

Comments
 (0)