user.py 3.4 KB

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