auth.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from rest_framework import serializers
  2. from django.contrib.auth import get_user_model
  3. from django.urls import reverse
  4. from misago.acl import serialize_acl
  5. from .user import UserSerializer
  6. UserModel = get_user_model()
  7. __all__ = ['AuthenticatedUserSerializer', 'AnonymousUserSerializer',]
  8. class AuthFlags(object):
  9. def get_is_authenticated(self, obj):
  10. return bool(obj.is_authenticated)
  11. def get_is_anonymous(self, obj):
  12. return bool(obj.is_anonymous)
  13. class AuthenticatedUserSerializer(UserSerializer, AuthFlags):
  14. email = serializers.SerializerMethodField()
  15. is_authenticated = serializers.SerializerMethodField()
  16. is_anonymous = serializers.SerializerMethodField()
  17. class Meta:
  18. model = UserModel
  19. fields = UserSerializer.Meta.fields + (
  20. 'is_authenticated',
  21. 'is_anonymous',
  22. )
  23. def get_acl(self, obj):
  24. return serialize_acl(obj)
  25. def get_email(self, obj):
  26. return obj.email
  27. def get_api_url(self, obj):
  28. return {
  29. 'avatar': reverse(
  30. 'misago:api:user-avatar', kwargs={'pk': obj.pk}),
  31. 'options': reverse(
  32. 'misago:api:user-forum-options', kwargs={'pk': obj.pk}),
  33. 'username': reverse(
  34. 'misago:api:user-username', kwargs={'pk': obj.pk}),
  35. 'change_email': reverse(
  36. 'misago:api:user-change-email', kwargs={'pk': obj.pk}),
  37. 'change_password': reverse(
  38. 'misago:api:user-change-password', kwargs={'pk': obj.pk}),
  39. }
  40. AuthenticatedUserSerializer = AuthenticatedUserSerializer.subset_exclude(
  41. 'is_avatar_locked', 'is_blocked', 'is_followed', 'is_signature_locked',
  42. 'meta', 'signature', 'status',
  43. )
  44. class AnonymousUserSerializer(serializers.Serializer, AuthFlags):
  45. id = serializers.ReadOnlyField()
  46. acl = serializers.SerializerMethodField()
  47. is_authenticated = serializers.SerializerMethodField()
  48. is_anonymous = serializers.SerializerMethodField()
  49. def get_acl(self, obj):
  50. if hasattr(obj, 'acl'):
  51. return serialize_acl(obj)
  52. else:
  53. return {}