Просмотр исходного кода

Update serializer to access custom_field_data directly

Jeremy Stretch 5 лет назад
Родитель
Сommit
d9e5adc032
2 измененных файлов с 8 добавлено и 44 удалено
  1. 1 35
      netbox/extras/api/customfields.py
  2. 7 9
      netbox/extras/tests/test_customfields.py

+ 1 - 35
netbox/extras/api/customfields.py

@@ -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):
     """

+ 7 - 9
netbox/extras/tests/test_customfields.py

@@ -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')