user.py 5.3 KB

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