user.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. from rest_framework import serializers
  2. from django.contrib.auth import get_user_model
  3. from django.urls import reverse
  4. from misago.core.serializers import MutableFields
  5. from . import RankSerializer
  6. UserModel = get_user_model()
  7. __all__ = ['StatusSerializer', 'UserSerializer', 'UserCardSerializer']
  8. class StatusSerializer(serializers.Serializer):
  9. is_offline = serializers.BooleanField()
  10. is_online = serializers.BooleanField()
  11. is_hidden = serializers.BooleanField()
  12. is_offline_hidden = serializers.BooleanField()
  13. is_online_hidden = serializers.BooleanField()
  14. last_click = serializers.DateTimeField()
  15. is_banned = serializers.BooleanField()
  16. banned_until = serializers.DateTimeField()
  17. class UserSerializer(serializers.ModelSerializer, MutableFields):
  18. email = serializers.SerializerMethodField()
  19. rank = RankSerializer(many=False, read_only=True)
  20. signature = serializers.SerializerMethodField()
  21. acl = serializers.SerializerMethodField()
  22. is_followed = serializers.SerializerMethodField()
  23. is_blocked = serializers.SerializerMethodField()
  24. meta = serializers.SerializerMethodField()
  25. status = serializers.SerializerMethodField()
  26. absolute_url = serializers.SerializerMethodField()
  27. api_url = serializers.SerializerMethodField()
  28. class Meta:
  29. model = UserModel
  30. fields = [
  31. 'id',
  32. 'username',
  33. 'slug',
  34. 'email',
  35. 'joined_on',
  36. 'rank',
  37. 'title',
  38. 'avatars',
  39. 'is_avatar_locked',
  40. 'signature',
  41. 'is_signature_locked',
  42. 'followers',
  43. 'following',
  44. 'threads',
  45. 'posts',
  46. 'acl',
  47. 'is_followed',
  48. 'is_blocked',
  49. 'meta',
  50. 'status',
  51. 'absolute_url',
  52. 'api_url',
  53. ]
  54. def get_acl(self, obj):
  55. return obj.acl
  56. def get_email(self, obj):
  57. if (obj == self.context['user'] or self.context['user'].acl_cache['can_see_users_emails']):
  58. return obj.email
  59. else:
  60. return None
  61. def get_is_followed(self, obj):
  62. if obj.acl['can_follow']:
  63. return self.context['user'].is_following(obj)
  64. else:
  65. return False
  66. def get_is_blocked(self, obj):
  67. if obj.acl['can_block']:
  68. return self.context['user'].is_blocking(obj)
  69. else:
  70. return False
  71. def get_meta(self, obj):
  72. return {'score': obj.score}
  73. def get_signature(self, obj):
  74. if obj.has_valid_signature:
  75. return obj.signature_parsed
  76. else:
  77. return None
  78. def get_status(self, obj):
  79. try:
  80. return StatusSerializer(obj.status).data
  81. except AttributeError:
  82. return None
  83. def get_absolute_url(self, obj):
  84. return obj.get_absolute_url()
  85. def get_api_url(self, obj):
  86. return {
  87. 'root':
  88. reverse('misago:api:user-detail', kwargs={
  89. 'pk': obj.pk,
  90. }),
  91. 'follow':
  92. reverse('misago:api:user-follow', kwargs={
  93. 'pk': obj.pk,
  94. }),
  95. 'ban':
  96. reverse('misago:api:user-ban', kwargs={
  97. 'pk': obj.pk,
  98. }),
  99. 'moderate_avatar':
  100. reverse('misago:api:user-moderate-avatar', kwargs={
  101. 'pk': obj.pk,
  102. }),
  103. 'moderate_username':
  104. reverse('misago:api:user-moderate-username', kwargs={
  105. 'pk': obj.pk,
  106. }),
  107. 'delete':
  108. reverse('misago:api:user-delete', kwargs={
  109. 'pk': obj.pk,
  110. }),
  111. 'followers':
  112. reverse('misago:api:user-followers', kwargs={
  113. 'pk': obj.pk,
  114. }),
  115. 'follows':
  116. reverse('misago:api:user-follows', kwargs={
  117. 'pk': obj.pk,
  118. }),
  119. 'threads':
  120. reverse('misago:api:user-threads', kwargs={
  121. 'pk': obj.pk,
  122. }),
  123. 'posts':
  124. reverse('misago:api:user-posts', kwargs={
  125. 'pk': obj.pk,
  126. }),
  127. }
  128. UserCardSerializer = UserSerializer.subset_fields(
  129. 'id',
  130. 'username',
  131. 'joined_on',
  132. 'rank',
  133. 'title',
  134. 'avatars',
  135. 'followers',
  136. 'threads',
  137. 'posts',
  138. 'status',
  139. 'absolute_url',
  140. )