user.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. from django.contrib.auth import get_user_model
  2. from rest_framework import serializers
  3. from misago.acl import serialize_acl
  4. from misago.users.online.utils import get_user_state
  5. from misago.users.serializers import RankSerializer
  6. __all__ = [
  7. 'AuthenticatedUserSerializer',
  8. 'AnonymousUserSerializer',
  9. 'BasicUserSerializer',
  10. 'UserSerializer',
  11. 'OnlineUserSerializer',
  12. 'ScoredUserSerializer',
  13. 'UserProfileSerializer',
  14. ]
  15. class AuthenticatedUserSerializer(serializers.ModelSerializer):
  16. absolute_url = serializers.SerializerMethodField()
  17. acl = serializers.SerializerMethodField()
  18. rank = RankSerializer(many=False, read_only=True)
  19. class Meta:
  20. model = get_user_model()
  21. fields = (
  22. 'id',
  23. 'username',
  24. 'slug',
  25. 'email',
  26. 'joined_on',
  27. 'is_hiding_presence',
  28. 'title',
  29. 'full_title',
  30. 'short_title',
  31. 'rank',
  32. 'avatar_hash',
  33. 'new_notifications',
  34. 'limits_private_thread_invites_to',
  35. 'unread_private_threads',
  36. 'subscribe_to_started_threads',
  37. 'subscribe_to_replied_threads',
  38. 'threads',
  39. 'posts',
  40. 'acl',
  41. 'absolute_url',
  42. )
  43. def get_acl(self, obj):
  44. return serialize_acl(obj)
  45. def get_absolute_url(self, obj):
  46. return obj.get_absolute_url()
  47. class AnonymousUserSerializer(serializers.Serializer):
  48. id = serializers.ReadOnlyField()
  49. acl = serializers.SerializerMethodField()
  50. def get_acl(self, obj):
  51. return serialize_acl(obj)
  52. class BaseSerializer(serializers.ModelSerializer):
  53. absolute_url = serializers.SerializerMethodField()
  54. def get_absolute_url(self, obj):
  55. return obj.get_absolute_url()
  56. class BasicUserSerializer(BaseSerializer):
  57. class Meta:
  58. model = get_user_model()
  59. fields = (
  60. 'id',
  61. 'username',
  62. 'slug',
  63. 'avatar_hash',
  64. 'absolute_url',
  65. )
  66. class UserSerializer(BaseSerializer):
  67. rank = RankSerializer(many=False, read_only=True)
  68. state = serializers.SerializerMethodField()
  69. signature = serializers.SerializerMethodField()
  70. class Meta:
  71. model = get_user_model()
  72. fields = (
  73. 'id',
  74. 'username',
  75. 'slug',
  76. 'avatar_hash',
  77. 'title',
  78. 'rank',
  79. 'signature',
  80. 'threads',
  81. 'posts',
  82. 'state',
  83. 'absolute_url',
  84. )
  85. def get_state(self, obj):
  86. if 'user' in self.context:
  87. return get_user_state(obj, self.context['user'].acl)
  88. else:
  89. return {}
  90. def get_signature(self, obj):
  91. if obj.has_valid_signature:
  92. return obj.signature.signature_parsed
  93. else:
  94. return None
  95. class OnlineUserSerializer(UserSerializer):
  96. last_click = serializers.SerializerMethodField()
  97. class Meta:
  98. model = get_user_model()
  99. fields = (
  100. 'id',
  101. 'username',
  102. 'slug',
  103. 'avatar_hash',
  104. 'title',
  105. 'rank',
  106. 'signature',
  107. 'threads',
  108. 'posts',
  109. 'last_click',
  110. )
  111. def get_last_click(self, obj):
  112. return obj.last_click
  113. class ScoredUserSerializer(UserSerializer):
  114. meta = serializers.SerializerMethodField()
  115. class Meta:
  116. model = get_user_model()
  117. fields = (
  118. 'id',
  119. 'username',
  120. 'slug',
  121. 'avatar_hash',
  122. 'title',
  123. 'rank',
  124. 'signature',
  125. 'threads',
  126. 'posts',
  127. 'meta',
  128. )
  129. def get_meta(self, obj):
  130. return {'score': obj.score}
  131. class UserProfileSerializer(UserSerializer):
  132. email = serializers.SerializerMethodField()
  133. is_followed = serializers.SerializerMethodField()
  134. is_blocked = serializers.SerializerMethodField()
  135. acl = serializers.SerializerMethodField()
  136. class Meta:
  137. model = get_user_model()
  138. fields = (
  139. 'id',
  140. 'username',
  141. 'slug',
  142. 'email',
  143. 'is_avatar_locked',
  144. 'avatar_hash',
  145. 'title',
  146. 'rank',
  147. 'signature',
  148. 'is_signature_locked',
  149. 'threads',
  150. 'posts',
  151. 'is_followed',
  152. 'is_blocked',
  153. 'state',
  154. 'acl',
  155. )
  156. def get_email(self, obj):
  157. if (obj == self.context['user'] or
  158. self.context['user'].acl['can_see_users_emails']):
  159. return obj.email
  160. else:
  161. return None
  162. def get_acl(self, obj):
  163. return obj.acl_
  164. def get_is_followed(self, obj):
  165. if obj.acl_['can_follow']:
  166. return self.context['user'].is_following(obj)
  167. else:
  168. return False
  169. def get_is_blocked(self, obj):
  170. if obj.acl_['can_block']:
  171. return self.context['user'].is_blocking(obj)
  172. else:
  173. return False