user.py 6.9 KB

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