Skip to content

Commit eca4655

Browse files
committed
Implement setter for properties
1 parent 829decd commit eca4655

File tree

1 file changed

+31
-15
lines changed

1 file changed

+31
-15
lines changed

django_features/serializers.py

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,38 +23,54 @@ class Meta:
2323

2424
@property
2525
def mapping(self) -> dict[str, dict[str, Any]]:
26-
mapping = getattr(self, "_mapping", None)
27-
if mapping is None:
28-
raise ValueError("Mapping must be set")
29-
return mapping
26+
if getattr(self, "_mapping") is None:
27+
raise ValueError(
28+
"Property 'mapping' on instance must be set and can't be 'None'"
29+
)
30+
return self._mapping
31+
32+
@mapping.setter
33+
def mapping(self, value: dict[str, dict[str, Any]]) -> None:
34+
self._mapping = value
3035

3136
@property
3237
def mapping_fields(self) -> list[str]:
3338
mapping_fields = getattr(
3439
self, "_mapping_fields", list(self.model_mapping.values())
3540
)
3641
if mapping_fields is None:
37-
raise ValueError("Mapping fields must be set")
42+
raise ValueError("Property 'mapping_fields' must be set and can't be 'None")
3843
return mapping_fields
3944

45+
@mapping_fields.setter
46+
def mapping_fields(self, value: list[str]) -> None:
47+
self._mapping_fields = value
48+
4049
@property
4150
def model_mapping(self) -> dict[str, Any]:
42-
mapping = getattr(self, "mapping", None)
43-
if mapping is None:
44-
raise ValueError("Mapping must be set")
45-
for key_path in mapping.keys():
51+
for key_path in self.mapping.keys():
4652
key = key_path.split(self.relation_separator)[-1]
4753
if key.lower() == self.model.__name__.lower():
48-
return mapping.get(key_path, {})
54+
return self.mapping.get(key_path, {})
4955
return {}
5056

57+
@model_mapping.setter
58+
def model_mapping(self, value: dict[str, Any]) -> None:
59+
self._model_mapping = value
60+
5161
@property
5262
def model(self) -> models.Model:
5363
model = getattr(self, "_model", self.Meta.model)
5464
if model is None:
55-
raise ValueError("Mapping must be set")
65+
raise ValueError(
66+
"Property 'model' must be set and can't be 'None. Default is 'Meta.model"
67+
)
5668
return model
5769

70+
@model.setter
71+
def model(self, value: models.Model) -> None:
72+
self._model = value
73+
5874

5975
class BaseMappingSerializer(CustomFieldBaseModelSerializer, PropertySerializer):
6076
serializer_related_field = UUIDRelatedField
@@ -188,8 +204,8 @@ def __init__(
188204
**kwargs: Any,
189205
) -> None:
190206
self.exclude = exclude
191-
self._mapping_fields = nested_fields
192-
self._mapping = parent_mapping
207+
self.mapping_fields = nested_fields
208+
self.mapping = parent_mapping
193209
self.Meta.model = field.related_model
194210
super().__init__(*args, **kwargs)
195211

@@ -256,8 +272,8 @@ def map_data(self, initial_data: Any) -> Any:
256272
class ListDataMappingSerializer(serializers.ListSerializer, DataMappingSerializer):
257273
def __init__(self, data: Any = empty, *args: Any, **kwargs: Any) -> None:
258274
self.instance = None
259-
self._mapping = kwargs.pop("mapping", {})
260-
self._model = kwargs.pop("model", None)
275+
self.mapping = kwargs.pop("mapping", {})
276+
self.model = kwargs.pop("model")
261277
self.unmapped_data = data if data is not empty else []
262278
mapped_data = self.map_list_data(self.unmapped_data)
263279
super().__init__(data=mapped_data, *args, **kwargs)

0 commit comments

Comments
 (0)