user.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. from rest_framework import serializers
  2. from django.contrib.auth import get_user_model
  3. from django.urls import reverse
  4. from misago.core.serializers import MutableFields
  5. from . import RankSerializer
  6. UserModel = 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 = UserModel
  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(
  93. 'misago:api:user-detail',
  94. kwargs={
  95. 'pk': obj.pk
  96. }
  97. ),
  98. 'follow': reverse(
  99. 'misago:api:user-follow',
  100. kwargs={
  101. 'pk': obj.pk
  102. }
  103. ),
  104. 'ban': reverse(
  105. 'misago:api:user-ban',
  106. kwargs={
  107. 'pk': obj.pk
  108. }
  109. ),
  110. 'details': reverse(
  111. 'misago:api:user-details',
  112. kwargs={
  113. 'pk': obj.pk,
  114. }
  115. ),
  116. 'edit_details': reverse(
  117. 'misago:api:user-edit-details',
  118. kwargs={
  119. 'pk': obj.pk,
  120. }
  121. ),
  122. 'moderate_avatar': reverse(
  123. 'misago:api:user-moderate-avatar',
  124. kwargs={
  125. 'pk': obj.pk
  126. }
  127. ),
  128. 'moderate_username': reverse(
  129. 'misago:api:user-moderate-username',
  130. kwargs={
  131. 'pk': obj.pk
  132. }
  133. ),
  134. 'delete': reverse(
  135. 'misago:api:user-delete',
  136. kwargs={
  137. 'pk': obj.pk
  138. }
  139. ),
  140. 'followers': reverse(
  141. 'misago:api:user-followers',
  142. kwargs={
  143. 'pk': obj.pk
  144. }
  145. ),
  146. 'follows': reverse(
  147. 'misago:api:user-follows',
  148. kwargs={
  149. 'pk': obj.pk
  150. }
  151. ),
  152. 'threads': reverse(
  153. 'misago:api:user-threads',
  154. kwargs={
  155. 'pk': obj.pk
  156. }
  157. ),
  158. 'posts': reverse(
  159. 'misago:api:user-posts',
  160. kwargs={
  161. 'pk': obj.pk
  162. }
  163. ),
  164. }
  165. def get_url(self, obj):
  166. return obj.get_absolute_url()
  167. UserCardSerializer = UserSerializer.subset_fields(
  168. 'id',
  169. 'username',
  170. 'joined_on',
  171. 'rank',
  172. 'title',
  173. 'avatars',
  174. 'followers',
  175. 'threads',
  176. 'posts',
  177. 'real_name',
  178. 'status',
  179. 'url',
  180. )