diff --git a/netbox/extras/api/serializers_/customfields.py b/netbox/extras/api/serializers_/customfields.py index 175b88646..1cdbc46dd 100644 --- a/netbox/extras/api/serializers_/customfields.py +++ b/netbox/extras/api/serializers_/customfields.py @@ -19,7 +19,8 @@ __all__ = ( class CustomFieldChoiceSetSerializer(OwnerMixin, ChangeLogMessageSerializer, ValidatedModelSerializer): base_choices = ChoiceField( choices=CustomFieldChoiceSetBaseChoices, - required=False + required=False, + allow_null=True, ) extra_choices = serializers.ListField( child=serializers.ListField( diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index d278a5845..89af94be6 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -296,6 +296,36 @@ class CustomFieldChoiceSetTestCase(APIViewTestCases.APIViewTestCase): response = self.client.post(self._get_list_url(), data, format='json', **self.header) self.assertEqual(response.status_code, 400) + def test_null_base_choices(self): + """ + A null value for base_choices should be accepted, as returned by the API for a choice set which defines + only extra choices. + """ + self.add_permissions('extras.add_customfieldchoiceset', 'extras.change_customfieldchoiceset') + data = { + 'name': 'test', + 'base_choices': None, + 'extra_choices': [ + ['choice1', 'Choice 1'], + ], + } + + response = self.client.post(self._get_list_url(), data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + self.assertIsNone(response.data['base_choices']) + choice_set = CustomFieldChoiceSet.objects.get(pk=response.data['id']) + self.assertIsNone(choice_set.base_choices) + + # A choice set with base choices assigned can be reverted to null + choice_set.base_choices = CustomFieldChoiceSetBaseChoices.IATA + choice_set.save() + response = self.client.patch( + self._get_detail_url(choice_set), {'base_choices': None}, format='json', **self.header + ) + self.assertHttpStatus(response, status.HTTP_200_OK) + choice_set.refresh_from_db() + self.assertIsNone(choice_set.base_choices) + def test_invalid_choice_color(self): self.add_permissions('extras.add_customfieldchoiceset') data = {