user.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. from rest_framework import serializers
  2. from django.contrib.auth import get_user_model
  3. from django.urls import reverse
  4. from misago.api.serializers import MutableFields
  5. from . import RankSerializer
  6. UserModel = get_user_model()
  7. class StatusSerializer(serializers.Serializer):
  8. is_offline = serializers.BooleanField()
  9. is_online = serializers.BooleanField()
  10. is_hidden = serializers.BooleanField()
  11. is_offline_hidden = serializers.BooleanField()
  12. is_online_hidden = serializers.BooleanField()
  13. last_click = serializers.DateTimeField()
  14. is_banned = serializers.BooleanField()
  15. banned_until = serializers.DateTimeField()
  16. class UserSerializer(serializers.ModelSerializer, MutableFields):
  17. email = serializers.SerializerMethodField()
  18. rank = RankSerializer(many=False, read_only=True)
  19. signature = serializers.SerializerMethodField()
  20. acl = serializers.SerializerMethodField()
  21. is_followed = serializers.SerializerMethodField()
  22. is_blocked = serializers.SerializerMethodField()
  23. meta = serializers.SerializerMethodField()
  24. status = serializers.SerializerMethodField()
  25. api = serializers.SerializerMethodField()
  26. url = serializers.SerializerMethodField()
  27. class Meta:
  28. model = UserModel
  29. fields = [
  30. 'id',
  31. 'username',
  32. 'slug',
  33. 'email',
  34. 'joined_on',
  35. 'rank',
  36. 'title',
  37. 'avatars',
  38. 'is_avatar_locked',
  39. 'signature',
  40. 'is_signature_locked',
  41. 'followers',
  42. 'following',
  43. 'threads',
  44. 'posts',
  45. 'acl',
  46. 'is_followed',
  47. 'is_blocked',
  48. 'meta',
  49. 'status',
  50. 'api',
  51. 'url',
  52. ]
  53. def get_acl(self, obj):
  54. return obj.acl
  55. def get_email(self, obj):
  56. if (obj == self.context['user'] or self.context['user'].acl_cache['can_see_users_emails']):
  57. return obj.email
  58. else:
  59. return None
  60. def get_is_followed(self, obj):
  61. if obj.acl['can_follow']:
  62. return self.context['user'].is_following(obj)
  63. else:
  64. return False
  65. def get_is_blocked(self, obj):
  66. if obj.acl['can_block']:
  67. return self.context['user'].is_blocking(obj)
  68. else:
  69. return False
  70. def get_meta(self, obj):
  71. return {'score': obj.score}
  72. def get_signature(self, obj):
  73. if obj.has_valid_signature:
  74. return obj.signature_parsed
  75. else:
  76. return None
  77. def get_status(self, obj):
  78. try:
  79. return StatusSerializer(obj.status).data
  80. except AttributeError:
  81. return None
  82. def get_api(self, obj):
  83. return {
  84. 'index': reverse(
  85. 'misago:api:user-detail',
  86. kwargs={
  87. 'pk': obj.pk
  88. }
  89. ),
  90. 'follow': reverse(
  91. 'misago:api:user-follow',
  92. kwargs={
  93. 'pk': obj.pk
  94. }
  95. ),
  96. 'ban': reverse(
  97. 'misago:api:user-ban',
  98. kwargs={
  99. 'pk': obj.pk
  100. }
  101. ),
  102. 'details': reverse(
  103. 'misago:api:user-details',
  104. kwargs={
  105. 'pk': obj.pk,
  106. }
  107. ),
  108. 'edit_details': reverse(
  109. 'misago:api:user-edit-details',
  110. kwargs={
  111. 'pk': obj.pk,
  112. }
  113. ),
  114. 'moderate_avatar': reverse(
  115. 'misago:api:user-moderate-avatar',
  116. kwargs={
  117. 'pk': obj.pk
  118. }
  119. ),
  120. 'moderate_username': reverse(
  121. 'misago:api:user-moderate-username',
  122. kwargs={
  123. 'pk': obj.pk
  124. }
  125. ),
  126. 'delete': reverse(
  127. 'misago:api:user-delete',
  128. kwargs={
  129. 'pk': obj.pk
  130. }
  131. ),
  132. 'followers': reverse(
  133. 'misago:api:user-followers',
  134. kwargs={
  135. 'pk': obj.pk
  136. }
  137. ),
  138. 'follows': reverse(
  139. 'misago:api:user-follows',
  140. kwargs={
  141. 'pk': obj.pk
  142. }
  143. ),
  144. 'threads': reverse(
  145. 'misago:api:user-threads',
  146. kwargs={
  147. 'pk': obj.pk
  148. }
  149. ),
  150. 'posts': reverse(
  151. 'misago:api:user-posts',
  152. kwargs={
  153. 'pk': obj.pk
  154. }
  155. ),
  156. }
  157. def get_url(self, obj):
  158. return obj.get_absolute_url()
  159. UserCardSerializer = UserSerializer.subset_fields(
  160. 'id',
  161. 'username',
  162. 'joined_on',
  163. 'rank',
  164. 'title',
  165. 'avatars',
  166. 'followers',
  167. 'threads',
  168. 'posts',
  169. 'status',
  170. 'url',
  171. )