user.py 5.7 KB

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