auth.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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.useracl import serialize_user_acl
  5. from .user import UserSerializer
  6. UserModel = get_user_model()
  7. __all__ = [
  8. 'AuthenticatedUserSerializer',
  9. 'AnonymousUserSerializer',
  10. ]
  11. class AuthFlags(object):
  12. def get_is_authenticated(self, obj):
  13. return bool(obj.is_authenticated)
  14. def get_is_anonymous(self, obj):
  15. return bool(obj.is_anonymous)
  16. class AuthenticatedUserSerializer(UserSerializer, AuthFlags):
  17. email = serializers.SerializerMethodField()
  18. is_authenticated = serializers.SerializerMethodField()
  19. is_anonymous = serializers.SerializerMethodField()
  20. class Meta:
  21. model = UserModel
  22. fields = UserSerializer.Meta.fields + [
  23. 'has_usable_password',
  24. 'is_hiding_presence',
  25. 'limits_private_thread_invites_to',
  26. 'unread_private_threads',
  27. 'subscribe_to_started_threads',
  28. 'subscribe_to_replied_threads',
  29. 'is_authenticated',
  30. 'is_anonymous',
  31. ]
  32. def get_acl(self, obj):
  33. acl = self.context.get("acl")
  34. if acl:
  35. return serialize_user_acl(acl)
  36. return {}
  37. def get_email(self, obj):
  38. return obj.email
  39. def get_api(self, obj):
  40. return {
  41. 'avatar': reverse('misago:api:user-avatar', kwargs={'pk': obj.pk}),
  42. 'data_downloads': reverse('misago:api:user-data-downloads', kwargs={'pk': obj.pk}),
  43. 'details': reverse('misago:api:user-details', kwargs={'pk': obj.pk}),
  44. 'change_email': reverse('misago:api:user-change-email', kwargs={'pk': obj.pk}),
  45. 'change_password': reverse('misago:api:user-change-password', kwargs={'pk': obj.pk}),
  46. 'edit_details': reverse('misago:api:user-edit-details', kwargs={'pk': obj.pk}),
  47. 'options': reverse('misago:api:user-forum-options', kwargs={'pk': obj.pk}),
  48. 'request_data_download': reverse('misago:api:user-request-data-download', kwargs={'pk': obj.pk}),
  49. 'username': reverse('misago:api:user-username', kwargs={'pk': obj.pk}),
  50. 'delete': reverse('misago:api:user-delete-own-account', kwargs={'pk': obj.pk}),
  51. }
  52. AuthenticatedUserSerializer = AuthenticatedUserSerializer.exclude_fields(
  53. 'is_avatar_locked',
  54. 'is_blocked',
  55. 'is_followed',
  56. 'is_signature_locked',
  57. 'meta',
  58. 'signature',
  59. 'status',
  60. )
  61. class AnonymousUserSerializer(serializers.Serializer, AuthFlags):
  62. id = serializers.ReadOnlyField()
  63. acl = serializers.SerializerMethodField()
  64. is_authenticated = serializers.SerializerMethodField()
  65. is_anonymous = serializers.SerializerMethodField()
  66. def get_acl(self, obj):
  67. acl = self.context.get("acl")
  68. if acl:
  69. return serialize_user_acl(acl)
  70. return {}