user.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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', 'username', 'slug', 'email', 'joined_on', 'rank', 'title', 'avatars',
  32. 'is_avatar_locked', 'signature', 'is_signature_locked', 'followers', 'following',
  33. 'threads', 'posts', 'acl', 'is_followed', 'is_blocked', 'meta', 'status',
  34. 'absolute_url', 'api_url',
  35. )
  36. def get_acl(self, obj):
  37. return obj.acl
  38. def get_email(self, obj):
  39. if (obj == self.context['user'] or self.context['user'].acl_cache['can_see_users_emails']):
  40. return obj.email
  41. else:
  42. return None
  43. def get_is_followed(self, obj):
  44. if obj.acl['can_follow']:
  45. return self.context['user'].is_following(obj)
  46. else:
  47. return False
  48. def get_is_blocked(self, obj):
  49. if obj.acl['can_block']:
  50. return self.context['user'].is_blocking(obj)
  51. else:
  52. return False
  53. def get_meta(self, obj):
  54. return {'score': obj.score}
  55. def get_signature(self, obj):
  56. if obj.has_valid_signature:
  57. return obj.signature_parsed
  58. else:
  59. return None
  60. def get_status(self, obj):
  61. try:
  62. return StatusSerializer(obj.status).data
  63. except AttributeError:
  64. return None
  65. def get_absolute_url(self, obj):
  66. return obj.get_absolute_url()
  67. def get_api_url(self, obj):
  68. return {
  69. 'root':
  70. reverse('misago:api:user-detail', kwargs={'pk': obj.pk}),
  71. 'follow':
  72. reverse('misago:api:user-follow', kwargs={'pk': obj.pk}),
  73. 'ban':
  74. reverse('misago:api:user-ban', kwargs={'pk': obj.pk}),
  75. 'moderate_avatar':
  76. reverse('misago:api:user-moderate-avatar', kwargs={'pk': obj.pk}),
  77. 'moderate_username':
  78. reverse('misago:api:user-moderate-username', kwargs={'pk': obj.pk}),
  79. 'delete':
  80. reverse('misago:api:user-delete', kwargs={'pk': obj.pk}),
  81. 'followers':
  82. reverse('misago:api:user-followers', kwargs={'pk': obj.pk}),
  83. 'follows':
  84. reverse('misago:api:user-follows', kwargs={'pk': obj.pk}),
  85. 'threads':
  86. reverse('misago:api:user-threads', kwargs={'pk': obj.pk}),
  87. 'posts':
  88. reverse('misago:api:user-posts', kwargs={'pk': obj.pk}),
  89. }
  90. UserCardSerializer = UserSerializer.subset_fields(
  91. 'id', 'username', 'joined_on', 'rank', 'title', 'avatars', 'followers', 'threads', 'posts',
  92. 'status', 'absolute_url'
  93. )