user.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. from django.contrib.auth import get_user_model
  2. from django.urls import reverse
  3. from rest_framework import serializers
  4. from misago.core.serializers import MutableFields
  5. from . import RankSerializer
  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. else:
  63. return None
  64. def get_is_followed(self, obj):
  65. request = self.context["request"]
  66. if obj.acl["can_follow"]:
  67. return request.user.is_following(obj)
  68. else:
  69. return False
  70. def get_is_blocked(self, obj):
  71. request = self.context["request"]
  72. if obj.acl["can_block"]:
  73. return request.user.is_blocking(obj)
  74. else:
  75. return False
  76. def get_meta(self, obj):
  77. return {"score": obj.score}
  78. def get_real_name(self, obj):
  79. return obj.get_real_name()
  80. def get_signature(self, obj):
  81. if obj.has_valid_signature:
  82. return obj.signature_parsed
  83. else:
  84. return None
  85. def get_status(self, obj):
  86. try:
  87. return StatusSerializer(obj.status).data
  88. except AttributeError:
  89. return None
  90. def get_api(self, obj):
  91. return {
  92. "index": reverse("misago:api:user-detail", kwargs={"pk": obj.pk}),
  93. "follow": reverse("misago:api:user-follow", kwargs={"pk": obj.pk}),
  94. "ban": reverse("misago:api:user-ban", kwargs={"pk": obj.pk}),
  95. "details": reverse("misago:api:user-details", kwargs={"pk": obj.pk}),
  96. "edit_details": reverse(
  97. "misago:api:user-edit-details", kwargs={"pk": obj.pk}
  98. ),
  99. "moderate_avatar": reverse(
  100. "misago:api:user-moderate-avatar", kwargs={"pk": obj.pk}
  101. ),
  102. "moderate_username": reverse(
  103. "misago:api:user-moderate-username", kwargs={"pk": obj.pk}
  104. ),
  105. "delete": reverse("misago:api:user-delete", kwargs={"pk": obj.pk}),
  106. "followers": reverse("misago:api:user-followers", kwargs={"pk": obj.pk}),
  107. "follows": reverse("misago:api:user-follows", kwargs={"pk": obj.pk}),
  108. "threads": reverse("misago:api:user-threads", kwargs={"pk": obj.pk}),
  109. "posts": reverse("misago:api:user-posts", kwargs={"pk": obj.pk}),
  110. }
  111. def get_url(self, obj):
  112. return obj.get_absolute_url()
  113. UserCardSerializer = UserSerializer.subset_fields(
  114. "id",
  115. "username",
  116. "joined_on",
  117. "rank",
  118. "title",
  119. "avatars",
  120. "followers",
  121. "threads",
  122. "posts",
  123. "real_name",
  124. "status",
  125. "url",
  126. )