user.py 4.7 KB

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