mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 22:32:17 -06:00
Add `get_internal_type()` to custom field classes for Django compatibility, annotate path parameters and operation IDs for background endpoints, and provide serializer context on the RQ base viewset to clear schema warnings. Fixes #20365
92 lines
3.5 KiB
Python
92 lines
3.5 KiB
Python
from django.utils.translation import gettext as _
|
|
from drf_spectacular.types import OpenApiTypes
|
|
from drf_spectacular.utils import extend_schema_field
|
|
from rest_framework import serializers
|
|
|
|
from core.models import ObjectType
|
|
from extras.choices import *
|
|
from extras.models import CustomField, CustomFieldChoiceSet
|
|
from netbox.api.fields import ChoiceField, ContentTypeField
|
|
from netbox.api.serializers import ChangeLogMessageSerializer, ValidatedModelSerializer
|
|
|
|
__all__ = (
|
|
'CustomFieldChoiceSetSerializer',
|
|
'CustomFieldSerializer',
|
|
)
|
|
|
|
|
|
class CustomFieldChoiceSetSerializer(ChangeLogMessageSerializer, ValidatedModelSerializer):
|
|
base_choices = ChoiceField(
|
|
choices=CustomFieldChoiceSetBaseChoices,
|
|
required=False
|
|
)
|
|
extra_choices = serializers.ListField(
|
|
child=serializers.ListField(
|
|
min_length=2,
|
|
max_length=2
|
|
)
|
|
)
|
|
choices_count = serializers.IntegerField(read_only=True)
|
|
|
|
class Meta:
|
|
model = CustomFieldChoiceSet
|
|
fields = [
|
|
'id', 'url', 'display_url', 'display', 'name', 'description', 'base_choices', 'extra_choices',
|
|
'order_alphabetically', 'choices_count', 'created', 'last_updated',
|
|
]
|
|
brief_fields = ('id', 'url', 'display', 'name', 'description', 'choices_count')
|
|
|
|
|
|
class CustomFieldSerializer(ChangeLogMessageSerializer, ValidatedModelSerializer):
|
|
object_types = ContentTypeField(
|
|
queryset=ObjectType.objects.with_feature('custom_fields'),
|
|
many=True
|
|
)
|
|
type = ChoiceField(choices=CustomFieldTypeChoices)
|
|
related_object_type = ContentTypeField(
|
|
queryset=ObjectType.objects.all(),
|
|
required=False,
|
|
allow_null=True
|
|
)
|
|
filter_logic = ChoiceField(choices=CustomFieldFilterLogicChoices, required=False)
|
|
data_type = serializers.SerializerMethodField()
|
|
choice_set = CustomFieldChoiceSetSerializer(
|
|
nested=True,
|
|
required=False,
|
|
allow_null=True
|
|
)
|
|
ui_visible = ChoiceField(choices=CustomFieldUIVisibleChoices, required=False)
|
|
ui_editable = ChoiceField(choices=CustomFieldUIEditableChoices, required=False)
|
|
|
|
class Meta:
|
|
model = CustomField
|
|
fields = [
|
|
'id', 'url', 'display_url', 'display', 'object_types', 'type', 'related_object_type', 'data_type',
|
|
'name', 'label', 'group_name', 'description', 'required', 'unique', 'search_weight', 'filter_logic',
|
|
'ui_visible', 'ui_editable', 'is_cloneable', 'default', 'related_object_filter', 'weight',
|
|
'validation_minimum', 'validation_maximum', 'validation_regex', 'choice_set', 'comments', 'created',
|
|
'last_updated',
|
|
]
|
|
brief_fields = ('id', 'url', 'display', 'name', 'description')
|
|
|
|
def validate_type(self, value):
|
|
if self.instance and self.instance.type != value:
|
|
raise serializers.ValidationError(_('Changing the type of custom fields is not supported.'))
|
|
|
|
return value
|
|
|
|
@extend_schema_field(OpenApiTypes.STR)
|
|
def get_data_type(self, obj):
|
|
types = CustomFieldTypeChoices
|
|
if obj.type == types.TYPE_INTEGER:
|
|
return 'integer'
|
|
if obj.type == types.TYPE_DECIMAL:
|
|
return 'decimal'
|
|
if obj.type == types.TYPE_BOOLEAN:
|
|
return 'boolean'
|
|
if obj.type in (types.TYPE_JSON, types.TYPE_OBJECT):
|
|
return 'object'
|
|
if obj.type in (types.TYPE_MULTISELECT, types.TYPE_MULTIOBJECT):
|
|
return 'array'
|
|
return 'string'
|