post.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from rest_framework import serializers
  2. from django.urls import reverse
  3. from misago.api.serializers import MutableFields
  4. from misago.threads.models import Post
  5. from misago.users.serializers import UserSerializer as BaseUserSerializer
  6. UserSerializer = BaseUserSerializer.subset_fields(
  7. 'id',
  8. 'username',
  9. 'real_name',
  10. 'rank',
  11. 'avatars',
  12. 'signature',
  13. 'title',
  14. 'status',
  15. 'posts',
  16. )
  17. class PostSerializer(serializers.ModelSerializer, MutableFields):
  18. poster = UserSerializer(many=False, read_only=True)
  19. poster_ip = serializers.SerializerMethodField()
  20. content = serializers.SerializerMethodField()
  21. attachments = serializers.SerializerMethodField()
  22. last_editor = serializers.PrimaryKeyRelatedField(read_only=True)
  23. hidden_by = serializers.PrimaryKeyRelatedField(read_only=True)
  24. is_read = serializers.SerializerMethodField()
  25. is_new = serializers.SerializerMethodField()
  26. is_liked = serializers.SerializerMethodField()
  27. last_likes = serializers.SerializerMethodField()
  28. likes = serializers.SerializerMethodField()
  29. class Meta:
  30. model = Post
  31. fields = [
  32. 'id',
  33. 'poster',
  34. 'poster_name',
  35. 'poster_ip',
  36. 'content',
  37. 'attachments',
  38. 'posted_on',
  39. 'updated_on',
  40. 'hidden_on',
  41. 'edits',
  42. 'last_editor',
  43. 'last_editor_name',
  44. 'last_editor_slug',
  45. 'hidden_by',
  46. 'hidden_by_name',
  47. 'hidden_by_slug',
  48. 'is_unapproved',
  49. 'is_hidden',
  50. 'is_protected',
  51. 'is_event',
  52. 'event_type',
  53. 'event_context',
  54. 'is_liked',
  55. 'is_new',
  56. 'is_read',
  57. 'last_likes',
  58. 'likes',
  59. ]
  60. def get_poster_ip(self, obj):
  61. if self.context['user'].acl_cache['can_see_users_ips']:
  62. return obj.poster_ip
  63. else:
  64. return None
  65. def get_content(self, obj):
  66. if obj.is_valid and not obj.is_event and (not obj.is_hidden or obj.acl['can_see_hidden']):
  67. return obj.content
  68. else:
  69. return None
  70. def get_attachments(self, obj):
  71. return obj.attachments_cache
  72. def get_is_liked(self, obj):
  73. try:
  74. return obj.is_liked
  75. except AttributeError:
  76. return None
  77. def get_is_new(self, obj):
  78. try:
  79. return obj.is_new
  80. except AttributeError:
  81. return None
  82. def get_is_read(self, obj):
  83. try:
  84. return obj.is_read
  85. except AttributeError:
  86. return None
  87. def get_last_likes(self, obj):
  88. if obj.is_event:
  89. return None
  90. try:
  91. if obj.acl['can_see_likes']:
  92. return obj.last_likes
  93. except AttributeError:
  94. return None
  95. def get_likes(self, obj):
  96. if obj.is_event:
  97. return None
  98. try:
  99. if obj.acl['can_see_likes']:
  100. return obj.likes
  101. except AttributeError:
  102. return None