Update serializer to access custom_field_data directly

This commit is contained in:
Jeremy Stretch 2020-08-25 10:42:22 -04:00
parent c85a45e520
commit d9e5adc032
2 changed files with 8 additions and 44 deletions

View File

@ -2,7 +2,6 @@ from datetime import datetime
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist
from django.db import transaction
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_framework.fields import CreateOnlyDefault
@ -134,6 +133,7 @@ class CustomFieldModelSerializer(ValidatedModelSerializer):
Extends ModelSerializer to render any CustomFields and their values associated with an object.
"""
custom_fields = CustomFieldsSerializer(
source='custom_field_data',
required=False,
default=CreateOnlyDefault(CustomFieldDefaultValues())
)
@ -163,40 +163,6 @@ class CustomFieldModelSerializer(ValidatedModelSerializer):
else:
instance.custom_fields[field.name] = value
def _save_custom_fields(self, instance, custom_fields):
for field_name, value in custom_fields.items():
instance.custom_field_data[field_name] = value
def create(self, validated_data):
with transaction.atomic():
instance = super().create(validated_data)
# Save custom fields
custom_fields = validated_data.get('custom_fields')
if custom_fields is not None:
self._save_custom_fields(instance, custom_fields)
instance.custom_fields = custom_fields
return instance
def update(self, instance, validated_data):
with transaction.atomic():
custom_fields = validated_data.get('custom_fields')
instance._cf = custom_fields
instance = super().update(instance, validated_data)
# Save custom fields
if custom_fields is not None:
self._save_custom_fields(instance, custom_fields)
instance.custom_fields = custom_fields
return instance
class CustomFieldChoiceSerializer(serializers.ModelSerializer):
"""

View File

@ -1,5 +1,3 @@
from datetime import date
from django.contrib.contenttypes.models import ContentType
from django.urls import reverse
from rest_framework import status
@ -30,7 +28,7 @@ class CustomFieldTest(TestCase):
{'field_type': CustomFieldTypeChoices.TYPE_INTEGER, 'field_value': 42, 'empty_value': None},
{'field_type': CustomFieldTypeChoices.TYPE_BOOLEAN, 'field_value': True, 'empty_value': None},
{'field_type': CustomFieldTypeChoices.TYPE_BOOLEAN, 'field_value': False, 'empty_value': None},
{'field_type': CustomFieldTypeChoices.TYPE_DATE, 'field_value': date(2016, 6, 23), 'empty_value': None},
{'field_type': CustomFieldTypeChoices.TYPE_DATE, 'field_value': '2016-06-23', 'empty_value': None},
{'field_type': CustomFieldTypeChoices.TYPE_URL, 'field_value': 'http://example.com/', 'empty_value': ''},
)
@ -239,7 +237,7 @@ class CustomFieldAPITest(APITestCase):
self.assertEqual(site.custom_field_data['boolean_field'], self.cf_boolean.default)
self.assertEqual(str(site.custom_field_data['date_field']), self.cf_date.default)
self.assertEqual(site.custom_field_data['url_field'], self.cf_url.default)
self.assertEqual(site.custom_field_data['choice_field'].pk, self.cf_select_choice1.pk)
self.assertEqual(site.custom_field_data['choice_field'], self.cf_select_choice1.pk)
def test_create_single_object_with_values(self):
"""
@ -280,7 +278,7 @@ class CustomFieldAPITest(APITestCase):
self.assertEqual(site.custom_field_data['boolean_field'], data_cf['boolean_field'])
self.assertEqual(str(site.custom_field_data['date_field']), data_cf['date_field'])
self.assertEqual(site.custom_field_data['url_field'], data_cf['url_field'])
self.assertEqual(site.custom_field_data['choice_field'].pk, data_cf['choice_field'])
self.assertEqual(site.custom_field_data['choice_field'], data_cf['choice_field'])
def test_create_multiple_objects_with_defaults(self):
"""
@ -326,7 +324,7 @@ class CustomFieldAPITest(APITestCase):
self.assertEqual(site.custom_field_data['boolean_field'], self.cf_boolean.default)
self.assertEqual(str(site.custom_field_data['date_field']), self.cf_date.default)
self.assertEqual(site.custom_field_data['url_field'], self.cf_url.default)
self.assertEqual(site.custom_field_data['choice_field'].pk, self.cf_select_choice1.pk)
self.assertEqual(site.custom_field_data['choice_field'], self.cf_select_choice1.pk)
def test_create_multiple_objects_with_values(self):
"""
@ -382,7 +380,7 @@ class CustomFieldAPITest(APITestCase):
self.assertEqual(site.custom_field_data['boolean_field'], custom_field_data['boolean_field'])
self.assertEqual(str(site.custom_field_data['date_field']), custom_field_data['date_field'])
self.assertEqual(site.custom_field_data['url_field'], custom_field_data['url_field'])
self.assertEqual(site.custom_field_data['choice_field'].pk, custom_field_data['choice_field'])
self.assertEqual(site.custom_field_data['choice_field'], custom_field_data['choice_field'])
def test_update_single_object_with_values(self):
"""
@ -502,7 +500,7 @@ class CustomFieldImportTest(TestCase):
self.assertEqual(site1.custom_field_data['text'], 'ABC')
self.assertEqual(site1.custom_field_data['integer'], 123)
self.assertEqual(site1.custom_field_data['boolean'], True)
self.assertEqual(site1.custom_field_data['date'], date(2020, 1, 1))
self.assertEqual(site1.custom_field_data['date'], '2020-01-01')
self.assertEqual(site1.custom_field_data['url'], 'http://example.com/1')
self.assertEqual(site1.custom_field_data['select'].value, 'Choice A')
@ -512,7 +510,7 @@ class CustomFieldImportTest(TestCase):
self.assertEqual(site2.custom_field_data['text'], 'DEF')
self.assertEqual(site2.custom_field_data['integer'], 456)
self.assertEqual(site2.custom_field_data['boolean'], False)
self.assertEqual(site2.custom_field_data['date'], date(2020, 1, 2))
self.assertEqual(site2.custom_field_data['date'], '2020-01-02')
self.assertEqual(site2.custom_field_data['url'], 'http://example.com/2')
self.assertEqual(site2.custom_field_data['select'].value, 'Choice B')