user.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. from django.contrib.auth import get_user_model
  2. from rest_framework import serializers
  3. from misago.acl import serialize_acl
  4. from misago.users.online.utils import get_user_state
  5. from misago.users.serializers import RankSerializer
  6. __all__ = [
  7. 'AuthenticatedUserSerializer',
  8. 'AnonymousUserSerializer',
  9. 'BasicUserSerializer',
  10. 'UserSerializer',
  11. 'UserProfileSerializer',
  12. ]
  13. class AuthenticatedUserSerializer(serializers.ModelSerializer):
  14. acl = serializers.SerializerMethodField()
  15. rank = RankSerializer(many=False, read_only=True)
  16. class Meta:
  17. model = get_user_model()
  18. fields = (
  19. 'id',
  20. 'username',
  21. 'slug',
  22. 'email',
  23. 'joined_on',
  24. 'is_hiding_presence',
  25. 'title',
  26. 'full_title',
  27. 'short_title',
  28. 'rank',
  29. 'avatar_hash',
  30. 'new_notifications',
  31. 'limits_private_thread_invites_to',
  32. 'unread_private_threads',
  33. 'subscribe_to_started_threads',
  34. 'subscribe_to_replied_threads',
  35. 'threads',
  36. 'posts',
  37. 'acl'
  38. )
  39. def get_acl(self, obj):
  40. return serialize_acl(obj)
  41. class AnonymousUserSerializer(serializers.Serializer):
  42. id = serializers.ReadOnlyField()
  43. acl = serializers.SerializerMethodField()
  44. def get_acl(self, obj):
  45. return serialize_acl(obj)
  46. class BasicUserSerializer(serializers.ModelSerializer):
  47. class Meta:
  48. model = get_user_model()
  49. fields = (
  50. 'id',
  51. 'username',
  52. 'slug',
  53. 'avatar_hash'
  54. )
  55. class UserSerializer(serializers.ModelSerializer):
  56. rank = RankSerializer(many=False, read_only=True)
  57. state = serializers.SerializerMethodField()
  58. signature = serializers.SerializerMethodField()
  59. class Meta:
  60. model = get_user_model()
  61. fields = (
  62. 'id',
  63. 'username',
  64. 'slug',
  65. 'is_avatar_locked',
  66. 'avatar_hash',
  67. 'title',
  68. 'rank',
  69. 'state',
  70. 'is_signature_locked',
  71. 'signature',
  72. )
  73. def get_state(self, obj):
  74. return get_user_state(obj, self.context['user'].acl)
  75. def get_signature(self, obj):
  76. if obj.has_valid_signature:
  77. return obj.signature.signature_parsed
  78. else:
  79. return None
  80. class UserProfileSerializer(UserSerializer):
  81. email = serializers.SerializerMethodField()
  82. is_followed = serializers.SerializerMethodField()
  83. is_blocked = serializers.SerializerMethodField()
  84. acl = serializers.SerializerMethodField()
  85. class Meta:
  86. model = get_user_model()
  87. fields = (
  88. 'id',
  89. 'username',
  90. 'slug',
  91. 'email',
  92. 'is_avatar_locked',
  93. 'avatar_hash',
  94. 'title',
  95. 'rank',
  96. 'is_signature_locked',
  97. 'signature',
  98. 'is_followed',
  99. 'is_blocked',
  100. 'state',
  101. 'acl',
  102. )
  103. def get_email(self, obj):
  104. if (obj == self.context['user'] or
  105. self.context['user'].acl['can_see_users_emails']):
  106. return obj.email
  107. else:
  108. return None
  109. def get_acl(self, obj):
  110. return obj.acl_
  111. def get_is_followed(self, obj):
  112. if obj.acl_['can_follow']:
  113. return self.context['user'].is_following(obj)
  114. else:
  115. return False
  116. def get_is_blocked(self, obj):
  117. if obj.acl_['can_block']:
  118. return self.context['user'].is_blocking(obj)
  119. else:
  120. return False