customfields.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from django.utils.translation import gettext as _
  2. from drf_spectacular.types import OpenApiTypes
  3. from drf_spectacular.utils import extend_schema_field
  4. from rest_framework import serializers
  5. from core.models import ObjectType
  6. from extras.choices import *
  7. from extras.models import CustomField, CustomFieldChoiceSet
  8. from netbox.api.fields import ChoiceField, ContentTypeField
  9. from netbox.api.serializers import ValidatedModelSerializer
  10. __all__ = (
  11. 'CustomFieldChoiceSetSerializer',
  12. 'CustomFieldSerializer',
  13. )
  14. class CustomFieldChoiceSetSerializer(ValidatedModelSerializer):
  15. url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfieldchoiceset-detail')
  16. base_choices = ChoiceField(
  17. choices=CustomFieldChoiceSetBaseChoices,
  18. required=False
  19. )
  20. extra_choices = serializers.ListField(
  21. child=serializers.ListField(
  22. min_length=2,
  23. max_length=2
  24. )
  25. )
  26. class Meta:
  27. model = CustomFieldChoiceSet
  28. fields = [
  29. 'id', 'url', 'display', 'name', 'description', 'base_choices', 'extra_choices', 'order_alphabetically',
  30. 'choices_count', 'created', 'last_updated',
  31. ]
  32. brief_fields = ('id', 'url', 'display', 'name', 'description', 'choices_count')
  33. class CustomFieldSerializer(ValidatedModelSerializer):
  34. url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfield-detail')
  35. object_types = ContentTypeField(
  36. queryset=ObjectType.objects.with_feature('custom_fields'),
  37. many=True
  38. )
  39. type = ChoiceField(choices=CustomFieldTypeChoices)
  40. related_object_type = ContentTypeField(
  41. queryset=ObjectType.objects.all(),
  42. required=False,
  43. allow_null=True
  44. )
  45. filter_logic = ChoiceField(choices=CustomFieldFilterLogicChoices, required=False)
  46. data_type = serializers.SerializerMethodField()
  47. choice_set = CustomFieldChoiceSetSerializer(
  48. nested=True,
  49. required=False,
  50. allow_null=True
  51. )
  52. ui_visible = ChoiceField(choices=CustomFieldUIVisibleChoices, required=False)
  53. ui_editable = ChoiceField(choices=CustomFieldUIEditableChoices, required=False)
  54. class Meta:
  55. model = CustomField
  56. fields = [
  57. 'id', 'url', 'display', 'object_types', 'type', 'related_object_type', 'data_type', 'name', 'label',
  58. 'group_name', 'description', 'required', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable',
  59. 'is_cloneable', 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex',
  60. 'choice_set', 'comments', 'created', 'last_updated',
  61. ]
  62. brief_fields = ('id', 'url', 'display', 'name', 'description')
  63. def validate_type(self, value):
  64. if self.instance and self.instance.type != value:
  65. raise serializers.ValidationError(_('Changing the type of custom fields is not supported.'))
  66. return value
  67. @extend_schema_field(OpenApiTypes.STR)
  68. def get_data_type(self, obj):
  69. types = CustomFieldTypeChoices
  70. if obj.type == types.TYPE_INTEGER:
  71. return 'integer'
  72. if obj.type == types.TYPE_DECIMAL:
  73. return 'decimal'
  74. if obj.type == types.TYPE_BOOLEAN:
  75. return 'boolean'
  76. if obj.type in (types.TYPE_JSON, types.TYPE_OBJECT):
  77. return 'object'
  78. if obj.type in (types.TYPE_MULTISELECT, types.TYPE_MULTIOBJECT):
  79. return 'array'
  80. return 'string'