auth.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from django.contrib.auth import get_user_model
  2. from django.urls import reverse
  3. from rest_framework import serializers
  4. from misago.acl.useracl import serialize_user_acl
  5. from .user import UserSerializer
  6. User = 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 = User
  19. fields = UserSerializer.Meta.fields + [
  20. "has_usable_password",
  21. "is_hiding_presence",
  22. "limits_private_thread_invites_to",
  23. "unread_private_threads",
  24. "subscribe_to_started_threads",
  25. "subscribe_to_replied_threads",
  26. "is_authenticated",
  27. "is_anonymous",
  28. ]
  29. def get_acl(self, obj):
  30. acl = self.context.get("acl")
  31. if acl:
  32. return serialize_user_acl(acl)
  33. return {}
  34. def get_email(self, obj):
  35. return obj.email
  36. def get_api(self, obj):
  37. return {
  38. "avatar": reverse("misago:api:user-avatar", kwargs={"pk": obj.pk}),
  39. "data_downloads": reverse(
  40. "misago:api:user-data-downloads", kwargs={"pk": obj.pk}
  41. ),
  42. "details": reverse("misago:api:user-details", kwargs={"pk": obj.pk}),
  43. "change_email": reverse(
  44. "misago:api:user-change-email", kwargs={"pk": obj.pk}
  45. ),
  46. "change_password": reverse(
  47. "misago:api:user-change-password", kwargs={"pk": obj.pk}
  48. ),
  49. "edit_details": reverse(
  50. "misago:api:user-edit-details", kwargs={"pk": obj.pk}
  51. ),
  52. "options": reverse("misago:api:user-forum-options", kwargs={"pk": obj.pk}),
  53. "request_data_download": reverse(
  54. "misago:api:user-request-data-download", kwargs={"pk": obj.pk}
  55. ),
  56. "username": reverse("misago:api:user-username", kwargs={"pk": obj.pk}),
  57. "delete": reverse(
  58. "misago:api:user-delete-own-account", kwargs={"pk": obj.pk}
  59. ),
  60. }
  61. AuthenticatedUserSerializer = AuthenticatedUserSerializer.exclude_fields(
  62. "is_avatar_locked",
  63. "is_blocked",
  64. "is_followed",
  65. "is_signature_locked",
  66. "meta",
  67. "signature",
  68. "status",
  69. )
  70. class AnonymousUserSerializer(serializers.Serializer, AuthFlags):
  71. id = serializers.ReadOnlyField()
  72. acl = serializers.SerializerMethodField()
  73. is_authenticated = serializers.SerializerMethodField()
  74. is_anonymous = serializers.SerializerMethodField()
  75. def get_acl(self, obj):
  76. acl = self.context.get("acl")
  77. if acl:
  78. return serialize_user_acl(acl)
  79. return {}