user.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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 BasicUserSerializer(serializers.ModelSerializer):
  53. absolute_url = serializers.SerializerMethodField()
  54. class Meta:
  55. model = get_user_model()
  56. fields = (
  57. 'id',
  58. 'username',
  59. 'slug',
  60. 'avatar_hash',
  61. 'absolute_url',
  62. )
  63. def get_absolute_url(self, obj):
  64. return obj.get_absolute_url()
  65. class UserSerializer(serializers.ModelSerializer):
  66. rank = RankSerializer(many=False, read_only=True)
  67. state = serializers.SerializerMethodField()
  68. signature = serializers.SerializerMethodField()
  69. class Meta:
  70. model = get_user_model()
  71. fields = (
  72. 'id',
  73. 'username',
  74. 'slug',
  75. 'avatar_hash',
  76. 'title',
  77. 'rank',
  78. 'signature',
  79. 'threads',
  80. 'posts',
  81. 'state',
  82. 'absolute_url',
  83. )
  84. def get_state(self, obj):
  85. if 'user' in self.context:
  86. return get_user_state(obj, self.context['user'].acl)
  87. else:
  88. return {}
  89. def get_signature(self, obj):
  90. if obj.has_valid_signature:
  91. return obj.signature.signature_parsed
  92. else:
  93. return None
  94. class OnlineUserSerializer(UserSerializer):
  95. last_click = serializers.SerializerMethodField()
  96. class Meta:
  97. model = get_user_model()
  98. fields = (
  99. 'id',
  100. 'username',
  101. 'slug',
  102. 'avatar_hash',
  103. 'title',
  104. 'rank',
  105. 'signature',
  106. 'threads',
  107. 'posts',
  108. 'last_click',
  109. )
  110. def get_last_click(self, obj):
  111. return obj.last_click
  112. class ScoredUserSerializer(UserSerializer):
  113. meta = serializers.SerializerMethodField()
  114. class Meta:
  115. model = get_user_model()
  116. fields = (
  117. 'id',
  118. 'username',
  119. 'slug',
  120. 'avatar_hash',
  121. 'title',
  122. 'rank',
  123. 'signature',
  124. 'threads',
  125. 'posts',
  126. 'meta',
  127. )
  128. def get_meta(self, obj):
  129. return {'score': obj.score}
  130. class UserProfileSerializer(UserSerializer):
  131. email = serializers.SerializerMethodField()
  132. is_followed = serializers.SerializerMethodField()
  133. is_blocked = serializers.SerializerMethodField()
  134. acl = serializers.SerializerMethodField()
  135. class Meta:
  136. model = get_user_model()
  137. fields = (
  138. 'id',
  139. 'username',
  140. 'slug',
  141. 'email',
  142. 'is_avatar_locked',
  143. 'avatar_hash',
  144. 'title',
  145. 'rank',
  146. 'signature',
  147. 'is_signature_locked',
  148. 'threads',
  149. 'posts',
  150. 'is_followed',
  151. 'is_blocked',
  152. 'state',
  153. 'acl',
  154. )
  155. def get_email(self, obj):
  156. if (obj == self.context['user'] or
  157. self.context['user'].acl['can_see_users_emails']):
  158. return obj.email
  159. else:
  160. return None
  161. def get_acl(self, obj):
  162. return obj.acl_
  163. def get_is_followed(self, obj):
  164. if obj.acl_['can_follow']:
  165. return self.context['user'].is_following(obj)
  166. else:
  167. return False
  168. def get_is_blocked(self, obj):
  169. if obj.acl_['can_block']:
  170. return self.context['user'].is_blocking(obj)
  171. else:
  172. return False