customfields.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 ChangeLogMessageSerializer, ValidatedModelSerializer
  10. from users.api.serializers_.mixins import OwnerMixin
  11. __all__ = (
  12. 'CustomFieldChoiceSetSerializer',
  13. 'CustomFieldSerializer',
  14. )
  15. class CustomFieldChoiceSetSerializer(OwnerMixin, ChangeLogMessageSerializer, ValidatedModelSerializer):
  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. choice_colors = serializers.DictField(
  27. child=serializers.ChoiceField(choices=CustomFieldChoiceColorChoices),
  28. required=False,
  29. )
  30. choices_count = serializers.IntegerField(read_only=True)
  31. class Meta:
  32. model = CustomFieldChoiceSet
  33. fields = [
  34. 'id', 'url', 'display_url', 'display', 'name', 'description', 'base_choices', 'extra_choices',
  35. 'choice_colors', 'order_alphabetically', 'choices_count', 'owner', 'created', 'last_updated',
  36. ]
  37. brief_fields = ('id', 'url', 'display', 'name', 'description', 'choices_count')
  38. class CustomFieldSerializer(OwnerMixin, ChangeLogMessageSerializer, ValidatedModelSerializer):
  39. object_types = ContentTypeField(
  40. queryset=ObjectType.objects.with_feature('custom_fields'),
  41. many=True
  42. )
  43. type = ChoiceField(choices=CustomFieldTypeChoices)
  44. related_object_type = ContentTypeField(
  45. queryset=ObjectType.objects.all(),
  46. required=False,
  47. allow_null=True
  48. )
  49. filter_logic = ChoiceField(choices=CustomFieldFilterLogicChoices, required=False)
  50. data_type = serializers.SerializerMethodField()
  51. choice_set = CustomFieldChoiceSetSerializer(
  52. nested=True,
  53. required=False,
  54. allow_null=True
  55. )
  56. ui_visible = ChoiceField(choices=CustomFieldUIVisibleChoices, required=False)
  57. ui_editable = ChoiceField(choices=CustomFieldUIEditableChoices, required=False)
  58. class Meta:
  59. model = CustomField
  60. fields = [
  61. 'id', 'url', 'display_url', 'display', 'object_types', 'type', 'related_object_type', 'data_type',
  62. 'name', 'label', 'group_name', 'description', 'required', 'unique', 'search_weight', 'filter_logic',
  63. 'ui_visible', 'ui_editable', 'is_cloneable', 'default', 'related_object_filter', 'weight',
  64. 'validation_minimum', 'validation_maximum', 'validation_regex', 'validation_schema', 'choice_set',
  65. 'owner', 'comments', 'created', 'last_updated',
  66. ]
  67. brief_fields = ('id', 'url', 'display', 'name', 'description')
  68. def validate_type(self, value):
  69. if self.instance and self.instance.type != value:
  70. raise serializers.ValidationError(_('Changing the type of custom fields is not supported.'))
  71. return value
  72. @extend_schema_field(OpenApiTypes.STR)
  73. def get_data_type(self, obj):
  74. types = CustomFieldTypeChoices
  75. if obj.type == types.TYPE_INTEGER:
  76. return 'integer'
  77. if obj.type == types.TYPE_DECIMAL:
  78. return 'decimal'
  79. if obj.type == types.TYPE_BOOLEAN:
  80. return 'boolean'
  81. if obj.type in (types.TYPE_JSON, types.TYPE_OBJECT):
  82. return 'object'
  83. if obj.type in (types.TYPE_MULTISELECT, types.TYPE_MULTIOBJECT):
  84. return 'array'
  85. return 'string'