nested_serializers.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import warnings
  2. from drf_spectacular.utils import extend_schema_field
  3. from rest_framework import serializers
  4. from core.models import ObjectType
  5. from netbox.api.fields import ContentTypeField
  6. from netbox.api.serializers import WritableNestedSerializer
  7. from serializers_.nested import NestedGroupSerializer, NestedUserSerializer
  8. from users.models import ObjectPermission, Token
  9. __all__ = [
  10. 'NestedGroupSerializer',
  11. 'NestedObjectPermissionSerializer',
  12. 'NestedTokenSerializer',
  13. 'NestedUserSerializer',
  14. ]
  15. # TODO: Remove in v4.2
  16. warnings.warn(
  17. f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.",
  18. DeprecationWarning
  19. )
  20. class NestedTokenSerializer(WritableNestedSerializer):
  21. class Meta:
  22. model = Token
  23. fields = ['id', 'url', 'display_url', 'display', 'key', 'write_enabled']
  24. class NestedObjectPermissionSerializer(WritableNestedSerializer):
  25. object_types = ContentTypeField(
  26. queryset=ObjectType.objects.all(),
  27. many=True
  28. )
  29. groups = serializers.SerializerMethodField(read_only=True)
  30. users = serializers.SerializerMethodField(read_only=True)
  31. class Meta:
  32. model = ObjectPermission
  33. fields = [
  34. 'id', 'url', 'display_url', 'display', 'name', 'enabled', 'object_types', 'groups', 'users', 'actions'
  35. ]
  36. @extend_schema_field(serializers.ListField)
  37. def get_groups(self, obj):
  38. return [g.name for g in obj.groups.all()]
  39. @extend_schema_field(serializers.ListField)
  40. def get_users(self, obj):
  41. return [u.username for u in obj.users.all()]