nested_serializers.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. class Meta:
  20. model = User
  21. fields = ['id', 'url', 'display', 'username']
  22. def get_display(self, obj):
  23. if full_name := obj.get_full_name():
  24. return f"{obj.username} ({full_name})"
  25. return obj.username
  26. class NestedTokenSerializer(WritableNestedSerializer):
  27. url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail')
  28. class Meta:
  29. model = Token
  30. fields = ['id', 'url', 'display', 'key', 'write_enabled']
  31. class NestedObjectPermissionSerializer(WritableNestedSerializer):
  32. url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail')
  33. object_types = ContentTypeField(
  34. queryset=ContentType.objects.all(),
  35. many=True
  36. )
  37. groups = serializers.SerializerMethodField(read_only=True)
  38. users = serializers.SerializerMethodField(read_only=True)
  39. class Meta:
  40. model = ObjectPermission
  41. fields = ['id', 'url', 'display', 'name', 'enabled', 'object_types', 'groups', 'users', 'actions']
  42. def get_groups(self, obj):
  43. return [g.name for g in obj.groups.all()]
  44. def get_users(self, obj):
  45. return [u.username for u in obj.users.all()]