user.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. from django.contrib.auth import get_user_model
  2. from django.urls import reverse
  3. from rest_framework import serializers
  4. from . import RankSerializer
  5. from ...core.serializers import MutableFields
  6. User = get_user_model()
  7. __all__ = ["StatusSerializer", "UserSerializer", "UserCardSerializer"]
  8. class StatusSerializer(serializers.Serializer):
  9. is_offline = serializers.BooleanField()
  10. is_online = serializers.BooleanField()
  11. is_hidden = serializers.BooleanField()
  12. is_offline_hidden = serializers.BooleanField()
  13. is_online_hidden = serializers.BooleanField()
  14. last_click = serializers.DateTimeField()
  15. is_banned = serializers.BooleanField()
  16. banned_until = serializers.DateTimeField()
  17. class UserSerializer(serializers.ModelSerializer, MutableFields):
  18. email = serializers.SerializerMethodField()
  19. rank = RankSerializer(many=False, read_only=True)
  20. signature = serializers.SerializerMethodField()
  21. acl = serializers.SerializerMethodField()
  22. is_followed = serializers.SerializerMethodField()
  23. is_blocked = serializers.SerializerMethodField()
  24. meta = serializers.SerializerMethodField()
  25. real_name = serializers.SerializerMethodField()
  26. status = serializers.SerializerMethodField()
  27. api = serializers.SerializerMethodField()
  28. url = serializers.SerializerMethodField()
  29. class Meta:
  30. model = User
  31. fields = [
  32. "id",
  33. "username",
  34. "slug",
  35. "email",
  36. "joined_on",
  37. "rank",
  38. "title",
  39. "avatars",
  40. "is_avatar_locked",
  41. "signature",
  42. "is_signature_locked",
  43. "followers",
  44. "following",
  45. "threads",
  46. "posts",
  47. "acl",
  48. "is_followed",
  49. "is_blocked",
  50. "meta",
  51. "real_name",
  52. "status",
  53. "api",
  54. "url",
  55. ]
  56. def get_acl(self, obj):
  57. return obj.acl
  58. def get_email(self, obj):
  59. request = self.context["request"]
  60. if obj == request.user or request.user_acl["can_see_users_emails"]:
  61. return obj.email
  62. def get_is_followed(self, obj):
  63. request = self.context["request"]
  64. if obj.acl["can_follow"]:
  65. return request.user.is_following(obj)
  66. return False
  67. def get_is_blocked(self, obj):
  68. request = self.context["request"]
  69. if obj.acl["can_block"]:
  70. return request.user.is_blocking(obj)
  71. return False
  72. def get_meta(self, obj):
  73. return {"score": obj.score}
  74. def get_real_name(self, obj):
  75. return obj.get_real_name()
  76. def get_signature(self, obj):
  77. if obj.has_valid_signature:
  78. return obj.signature_parsed
  79. def get_status(self, obj):
  80. try:
  81. return StatusSerializer(obj.status).data
  82. except AttributeError:
  83. return None
  84. def get_api(self, obj):
  85. return {
  86. "index": reverse("misago:api:user-detail", kwargs={"pk": obj.pk}),
  87. "follow": reverse("misago:api:user-follow", kwargs={"pk": obj.pk}),
  88. "ban": reverse("misago:api:user-ban", kwargs={"pk": obj.pk}),
  89. "details": reverse("misago:api:user-details", kwargs={"pk": obj.pk}),
  90. "edit_details": reverse(
  91. "misago:api:user-edit-details", kwargs={"pk": obj.pk}
  92. ),
  93. "moderate_avatar": reverse(
  94. "misago:api:user-moderate-avatar", kwargs={"pk": obj.pk}
  95. ),
  96. "moderate_username": reverse(
  97. "misago:api:user-moderate-username", kwargs={"pk": obj.pk}
  98. ),
  99. "delete": reverse("misago:api:user-delete", kwargs={"pk": obj.pk}),
  100. "followers": reverse("misago:api:user-followers", kwargs={"pk": obj.pk}),
  101. "follows": reverse("misago:api:user-follows", kwargs={"pk": obj.pk}),
  102. "threads": reverse("misago:api:user-threads", kwargs={"pk": obj.pk}),
  103. "posts": reverse("misago:api:user-posts", kwargs={"pk": obj.pk}),
  104. }
  105. def get_url(self, obj):
  106. return obj.get_absolute_url()
  107. UserCardSerializer = UserSerializer.subset_fields(
  108. "id",
  109. "username",
  110. "joined_on",
  111. "rank",
  112. "title",
  113. "avatars",
  114. "followers",
  115. "threads",
  116. "posts",
  117. "real_name",
  118. "status",
  119. "url",
  120. )