user.py 2.8 KB

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