user.py 5.8 KB

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