user.py 3.8 KB

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