1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

#10052: Serialize date fields

This commit is contained in:
jeremystretch
2022-11-15 15:44:36 -05:00
parent 87fd09ca8b
commit 23077821f6
2 changed files with 34 additions and 24 deletions

View File

@ -302,6 +302,8 @@ class CustomField(CloningMixin, ExportTemplatesMixin, WebhooksMixin, ChangeLogge
""" """
if value is None: if value is None:
return value return value
if self.type == CustomFieldTypeChoices.TYPE_DATE and type(value) is date:
return value.isoformat()
if self.type == CustomFieldTypeChoices.TYPE_OBJECT: if self.type == CustomFieldTypeChoices.TYPE_OBJECT:
return value.pk return value.pk
if self.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT: if self.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT:
@ -314,6 +316,11 @@ class CustomField(CloningMixin, ExportTemplatesMixin, WebhooksMixin, ChangeLogge
""" """
if value is None: if value is None:
return value return value
if self.type == CustomFieldTypeChoices.TYPE_DATE:
try:
return date.fromisoformat(value)
except ValueError:
return value
if self.type == CustomFieldTypeChoices.TYPE_OBJECT: if self.type == CustomFieldTypeChoices.TYPE_OBJECT:
model = self.object_type.model_class() model = self.object_type.model_class()
return model.objects.filter(pk=value).first() return model.objects.filter(pk=value).first()

View File

@ -523,7 +523,7 @@ class CustomFieldAPITest(APITestCase):
Validate that custom fields are present and correctly set for an object with values defined. Validate that custom fields are present and correctly set for an object with values defined.
""" """
site2 = Site.objects.get(name='Site 2') site2 = Site.objects.get(name='Site 2')
site2_cfvs = site2.custom_field_data site2_cfvs = site2.cf
url = reverse('dcim-api:site-detail', kwargs={'pk': site2.pk}) url = reverse('dcim-api:site-detail', kwargs={'pk': site2.pk})
self.add_permissions('dcim.view_site') self.add_permissions('dcim.view_site')
@ -539,10 +539,10 @@ class CustomFieldAPITest(APITestCase):
self.assertEqual(response.data['custom_fields']['json_field'], site2_cfvs['json_field']) self.assertEqual(response.data['custom_fields']['json_field'], site2_cfvs['json_field'])
self.assertEqual(response.data['custom_fields']['select_field'], site2_cfvs['select_field']) self.assertEqual(response.data['custom_fields']['select_field'], site2_cfvs['select_field'])
self.assertEqual(response.data['custom_fields']['multiselect_field'], site2_cfvs['multiselect_field']) self.assertEqual(response.data['custom_fields']['multiselect_field'], site2_cfvs['multiselect_field'])
self.assertEqual(response.data['custom_fields']['object_field']['id'], site2_cfvs['object_field']) self.assertEqual(response.data['custom_fields']['object_field']['id'], site2_cfvs['object_field'].pk)
self.assertEqual( self.assertEqual(
[obj['id'] for obj in response.data['custom_fields']['multiobject_field']], [obj['id'] for obj in response.data['custom_fields']['multiobject_field']],
site2_cfvs['multiobject_field'] [obj.pk for obj in site2_cfvs['multiobject_field']]
) )
def test_create_single_object_with_defaults(self): def test_create_single_object_with_defaults(self):
@ -569,7 +569,7 @@ class CustomFieldAPITest(APITestCase):
self.assertEqual(response_cf['integer_field'], cf_defaults['integer_field']) self.assertEqual(response_cf['integer_field'], cf_defaults['integer_field'])
self.assertEqual(response_cf['decimal_field'], cf_defaults['decimal_field']) self.assertEqual(response_cf['decimal_field'], cf_defaults['decimal_field'])
self.assertEqual(response_cf['boolean_field'], cf_defaults['boolean_field']) self.assertEqual(response_cf['boolean_field'], cf_defaults['boolean_field'])
self.assertEqual(response_cf['date_field'], cf_defaults['date_field']) self.assertEqual(response_cf['date_field'].isoformat(), cf_defaults['date_field'])
self.assertEqual(response_cf['url_field'], cf_defaults['url_field']) self.assertEqual(response_cf['url_field'], cf_defaults['url_field'])
self.assertEqual(response_cf['json_field'], cf_defaults['json_field']) self.assertEqual(response_cf['json_field'], cf_defaults['json_field'])
self.assertEqual(response_cf['select_field'], cf_defaults['select_field']) self.assertEqual(response_cf['select_field'], cf_defaults['select_field'])
@ -631,7 +631,7 @@ class CustomFieldAPITest(APITestCase):
self.assertEqual(response_cf['integer_field'], data_cf['integer_field']) self.assertEqual(response_cf['integer_field'], data_cf['integer_field'])
self.assertEqual(response_cf['decimal_field'], data_cf['decimal_field']) self.assertEqual(response_cf['decimal_field'], data_cf['decimal_field'])
self.assertEqual(response_cf['boolean_field'], data_cf['boolean_field']) self.assertEqual(response_cf['boolean_field'], data_cf['boolean_field'])
self.assertEqual(response_cf['date_field'], data_cf['date_field']) self.assertEqual(response_cf['date_field'].isoformat(), data_cf['date_field'])
self.assertEqual(response_cf['url_field'], data_cf['url_field']) self.assertEqual(response_cf['url_field'], data_cf['url_field'])
self.assertEqual(response_cf['json_field'], data_cf['json_field']) self.assertEqual(response_cf['json_field'], data_cf['json_field'])
self.assertEqual(response_cf['select_field'], data_cf['select_field']) self.assertEqual(response_cf['select_field'], data_cf['select_field'])
@ -695,7 +695,7 @@ class CustomFieldAPITest(APITestCase):
self.assertEqual(response_cf['integer_field'], cf_defaults['integer_field']) self.assertEqual(response_cf['integer_field'], cf_defaults['integer_field'])
self.assertEqual(response_cf['decimal_field'], cf_defaults['decimal_field']) self.assertEqual(response_cf['decimal_field'], cf_defaults['decimal_field'])
self.assertEqual(response_cf['boolean_field'], cf_defaults['boolean_field']) self.assertEqual(response_cf['boolean_field'], cf_defaults['boolean_field'])
self.assertEqual(response_cf['date_field'], cf_defaults['date_field']) self.assertEqual(response_cf['date_field'].isoformat(), cf_defaults['date_field'])
self.assertEqual(response_cf['url_field'], cf_defaults['url_field']) self.assertEqual(response_cf['url_field'], cf_defaults['url_field'])
self.assertEqual(response_cf['json_field'], cf_defaults['json_field']) self.assertEqual(response_cf['json_field'], cf_defaults['json_field'])
self.assertEqual(response_cf['select_field'], cf_defaults['select_field']) self.assertEqual(response_cf['select_field'], cf_defaults['select_field'])
@ -772,7 +772,7 @@ class CustomFieldAPITest(APITestCase):
self.assertEqual(response_cf['integer_field'], custom_field_data['integer_field']) self.assertEqual(response_cf['integer_field'], custom_field_data['integer_field'])
self.assertEqual(response_cf['decimal_field'], custom_field_data['decimal_field']) self.assertEqual(response_cf['decimal_field'], custom_field_data['decimal_field'])
self.assertEqual(response_cf['boolean_field'], custom_field_data['boolean_field']) self.assertEqual(response_cf['boolean_field'], custom_field_data['boolean_field'])
self.assertEqual(response_cf['date_field'], custom_field_data['date_field']) self.assertEqual(response_cf['date_field'].isoformat(), custom_field_data['date_field'])
self.assertEqual(response_cf['url_field'], custom_field_data['url_field']) self.assertEqual(response_cf['url_field'], custom_field_data['url_field'])
self.assertEqual(response_cf['json_field'], custom_field_data['json_field']) self.assertEqual(response_cf['json_field'], custom_field_data['json_field'])
self.assertEqual(response_cf['select_field'], custom_field_data['select_field']) self.assertEqual(response_cf['select_field'], custom_field_data['select_field'])
@ -804,7 +804,7 @@ class CustomFieldAPITest(APITestCase):
modified. modified.
""" """
site2 = Site.objects.get(name='Site 2') site2 = Site.objects.get(name='Site 2')
original_cfvs = {**site2.custom_field_data} original_cfvs = {**site2.cf}
data = { data = {
'custom_fields': { 'custom_fields': {
'text_field': 'ABCD', 'text_field': 'ABCD',
@ -829,26 +829,29 @@ class CustomFieldAPITest(APITestCase):
self.assertEqual(response_cf['json_field'], original_cfvs['json_field']) self.assertEqual(response_cf['json_field'], original_cfvs['json_field'])
self.assertEqual(response_cf['select_field'], original_cfvs['select_field']) self.assertEqual(response_cf['select_field'], original_cfvs['select_field'])
self.assertEqual(response_cf['multiselect_field'], original_cfvs['multiselect_field']) self.assertEqual(response_cf['multiselect_field'], original_cfvs['multiselect_field'])
self.assertEqual(response_cf['object_field']['id'], original_cfvs['object_field']) self.assertEqual(response_cf['object_field']['id'], original_cfvs['object_field'].pk)
self.assertEqual( self.assertListEqual(
[obj['id'] for obj in response_cf['multiobject_field']], [obj['id'] for obj in response_cf['multiobject_field']],
original_cfvs['multiobject_field'] [obj.pk for obj in original_cfvs['multiobject_field']]
) )
# Validate database data # Validate database data
site2.refresh_from_db() site2 = Site.objects.get(pk=site2.pk)
self.assertEqual(site2.custom_field_data['text_field'], data['custom_fields']['text_field']) self.assertEqual(site2.cf['text_field'], data['custom_fields']['text_field'])
self.assertEqual(site2.custom_field_data['longtext_field'], original_cfvs['longtext_field']) self.assertEqual(site2.cf['longtext_field'], original_cfvs['longtext_field'])
self.assertEqual(site2.custom_field_data['integer_field'], data['custom_fields']['integer_field']) self.assertEqual(site2.cf['integer_field'], data['custom_fields']['integer_field'])
self.assertEqual(site2.custom_field_data['decimal_field'], original_cfvs['decimal_field']) self.assertEqual(site2.cf['decimal_field'], original_cfvs['decimal_field'])
self.assertEqual(site2.custom_field_data['boolean_field'], original_cfvs['boolean_field']) self.assertEqual(site2.cf['boolean_field'], original_cfvs['boolean_field'])
self.assertEqual(site2.custom_field_data['date_field'], original_cfvs['date_field']) self.assertEqual(site2.cf['date_field'], original_cfvs['date_field'])
self.assertEqual(site2.custom_field_data['url_field'], original_cfvs['url_field']) self.assertEqual(site2.cf['url_field'], original_cfvs['url_field'])
self.assertEqual(site2.custom_field_data['json_field'], original_cfvs['json_field']) self.assertEqual(site2.cf['json_field'], original_cfvs['json_field'])
self.assertEqual(site2.custom_field_data['select_field'], original_cfvs['select_field']) self.assertEqual(site2.cf['select_field'], original_cfvs['select_field'])
self.assertEqual(site2.custom_field_data['multiselect_field'], original_cfvs['multiselect_field']) self.assertEqual(site2.cf['multiselect_field'], original_cfvs['multiselect_field'])
self.assertEqual(site2.custom_field_data['object_field'], original_cfvs['object_field']) self.assertEqual(site2.cf['object_field'], original_cfvs['object_field'])
self.assertEqual(site2.custom_field_data['multiobject_field'], original_cfvs['multiobject_field']) self.assertListEqual(
list(site2.cf['multiobject_field']),
list(original_cfvs['multiobject_field'])
)
def test_minimum_maximum_values_validation(self): def test_minimum_maximum_values_validation(self):
site2 = Site.objects.get(name='Site 2') site2 = Site.objects.get(name='Site 2')