nested_serializers.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from django.contrib.auth.models import Group, User
  2. from django.contrib.contenttypes.models import ContentType
  3. from rest_framework import serializers
  4. from netbox.api import ContentTypeField, WritableNestedSerializer
  5. from users.models import ObjectPermission, Token
  6. __all__ = [
  7. 'NestedGroupSerializer',
  8. 'NestedObjectPermissionSerializer',
  9. 'NestedTokenSerializer',
  10. 'NestedUserSerializer',
  11. ]
  12. class NestedGroupSerializer(WritableNestedSerializer):
  13. url = serializers.HyperlinkedIdentityField(view_name='users-api:group-detail')
  14. class Meta:
  15. model = Group
  16. fields = ['id', 'url', 'display', 'name']
  17. class NestedUserSerializer(WritableNestedSerializer):
  18. url = serializers.HyperlinkedIdentityField(view_name='users-api:user-detail')
  19. display = serializers.SerializerMethodField(read_only=True)
  20. class Meta:
  21. model = User
  22. fields = ['id', 'url', 'display', 'username']
  23. def get_display(self, obj):
  24. if full_name := obj.get_full_name():
  25. return f"{obj.username} ({full_name})"
  26. return obj.username
  27. class NestedTokenSerializer(WritableNestedSerializer):
  28. url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail')
  29. class Meta:
  30. model = Token
  31. fields = ['id', 'url', 'display', 'key', 'write_enabled']
  32. class NestedObjectPermissionSerializer(WritableNestedSerializer):
  33. url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail')
  34. object_types = ContentTypeField(
  35. queryset=ContentType.objects.all(),
  36. many=True
  37. )
  38. groups = serializers.SerializerMethodField(read_only=True)
  39. users = serializers.SerializerMethodField(read_only=True)
  40. class Meta:
  41. model = ObjectPermission
  42. fields = ['id', 'url', 'display', 'name', 'enabled', 'object_types', 'groups', 'users', 'actions']
  43. def get_groups(self, obj):
  44. return [g.name for g in obj.groups.all()]
  45. def get_users(self, obj):
  46. return [u.username for u in obj.users.all()]