serializers.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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, SerializedPKRelatedField, ValidatedModelSerializer
  5. from users.models import ObjectPermission, Token
  6. from .nested_serializers import *
  7. __all__ = (
  8. 'GroupSerializer',
  9. 'ObjectPermissionSerializer',
  10. 'TokenSerializer',
  11. 'UserSerializer',
  12. )
  13. class UserSerializer(ValidatedModelSerializer):
  14. url = serializers.HyperlinkedIdentityField(view_name='users-api:user-detail')
  15. groups = SerializedPKRelatedField(
  16. queryset=Group.objects.all(),
  17. serializer=NestedGroupSerializer,
  18. required=False,
  19. many=True
  20. )
  21. class Meta:
  22. model = User
  23. fields = (
  24. 'id', 'url', 'display', 'username', 'password', 'first_name', 'last_name', 'email', 'is_staff', 'is_active',
  25. 'date_joined', 'groups',
  26. )
  27. extra_kwargs = {
  28. 'password': {'write_only': True}
  29. }
  30. def create(self, validated_data):
  31. """
  32. Extract the password from validated data and set it separately to ensure proper hash generation.
  33. """
  34. password = validated_data.pop('password')
  35. user = super().create(validated_data)
  36. user.set_password(password)
  37. user.save()
  38. return user
  39. class GroupSerializer(ValidatedModelSerializer):
  40. url = serializers.HyperlinkedIdentityField(view_name='users-api:group-detail')
  41. user_count = serializers.IntegerField(read_only=True)
  42. class Meta:
  43. model = Group
  44. fields = ('id', 'url', 'display', 'name', 'user_count')
  45. class TokenSerializer(ValidatedModelSerializer):
  46. url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail')
  47. key = serializers.CharField(min_length=40, max_length=40, allow_blank=True, required=False)
  48. user = NestedUserSerializer()
  49. class Meta:
  50. model = Token
  51. fields = ('id', 'url', 'display', 'user', 'created', 'expires', 'key', 'write_enabled', 'description', 'allowed_ips')
  52. def to_internal_value(self, data):
  53. if 'key' not in data:
  54. data['key'] = Token.generate_key()
  55. return super().to_internal_value(data)
  56. class TokenProvisionSerializer(serializers.Serializer):
  57. username = serializers.CharField()
  58. password = serializers.CharField()
  59. class ObjectPermissionSerializer(ValidatedModelSerializer):
  60. url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail')
  61. object_types = ContentTypeField(
  62. queryset=ContentType.objects.all(),
  63. many=True
  64. )
  65. groups = SerializedPKRelatedField(
  66. queryset=Group.objects.all(),
  67. serializer=NestedGroupSerializer,
  68. required=False,
  69. many=True
  70. )
  71. users = SerializedPKRelatedField(
  72. queryset=User.objects.all(),
  73. serializer=NestedUserSerializer,
  74. required=False,
  75. many=True
  76. )
  77. class Meta:
  78. model = ObjectPermission
  79. fields = (
  80. 'id', 'url', 'display', 'name', 'description', 'enabled', 'object_types', 'groups', 'users', 'actions',
  81. 'constraints',
  82. )