Skip to content

Commit

Permalink
correctly removing composite when validated data is None
Browse files Browse the repository at this point in the history
  • Loading branch information
miki725 committed Jul 24, 2018
1 parent bcddeaa commit 35e35dc
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 1 deletion.
7 changes: 6 additions & 1 deletion rest_witchcraft/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,9 @@ def get_fields(self):
return _fields

def get_object(self, validated_data, instance=None):
if validated_data is None:
return

if instance:
return instance

Expand Down Expand Up @@ -500,7 +503,9 @@ def build_composite_field(self, field_name, composite):
"""
Builds a `CompositeSerializer` to handle composite attribute in model
"""
return CompositeSerializer(composite=composite)
field_kwargs = {"composite": composite}
field_kwargs = self.include_extra_kwargs(field_kwargs, self._extra_kwargs.get(field_name))
return CompositeSerializer(**field_kwargs)

def build_nested_field(self, field_name, relation_info, nested_depth):
"""
Expand Down
46 changes: 46 additions & 0 deletions tests/test_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -777,6 +777,52 @@ class Meta:
self.assertEqual(vehicle.options, data["options"])
self.assertEqual(vehicle.other.advertising_cost, 4321)

def test_post_update_remove_composite(self):
vehicle = Vehicle(
name="Test vehicle",
type=VehicleType.bus,
engine=Engine(4, 1234, None, None),
owner=session.query(Owner).get(1),
)

class VehicleSerializer(ModelSerializer):
class Meta:
model = Vehicle
session = session
fields = "__all__"
extra_kwargs = {
"other": {"required": False, "allow_create": True, "allow_nested_updates": True},
"engine": {"required": False, "allow_null": True},
}

data = {
"name": "Another test vechicle",
"one": "Two",
"type": "Car",
"engine": None,
"owner": {"id": 1},
"options": [],
"other": {"advertising_cost": 4321},
}

serializer = VehicleSerializer(instance=vehicle, data=data)

self.assertTrue(serializer.is_valid(), serializer.errors)

vehicle = serializer.save()

self.assertEqual(vehicle.name, data["name"])
self.assertEqual(vehicle.type, VehicleType(data["type"]))
self.assertEqual(vehicle.owner.id, data["owner"]["id"])
self.assertEqual(vehicle.owner.first_name, "Test")
self.assertEqual(vehicle.owner.last_name, "Owner")
self.assertEqual(vehicle.options, data["options"])
self.assertEqual(vehicle.other.advertising_cost, 4321)
self.assertIsNone(vehicle.engine.cylinders)
self.assertIsNone(vehicle.engine.displacement)
self.assertIsNone(vehicle.engine.fuel_type)
self.assertIsNone(vehicle.engine.type_)

def test_patch_update(self):

vehicle = Vehicle(
Expand Down

0 comments on commit 35e35dc

Please sign in to comment.