post.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. from rest_framework import serializers
  2. from django.urls import reverse
  3. from misago.core.serializers import MutableFields
  4. from misago.threads.models import Post
  5. from misago.users.serializers import UserSerializer as BaseUserSerializer
  6. __all__ = ['PostSerializer']
  7. UserSerializer = BaseUserSerializer.subset_fields(
  8. 'id',
  9. 'username',
  10. 'real_name',
  11. 'rank',
  12. 'avatars',
  13. 'signature',
  14. 'title',
  15. 'status',
  16. 'posts',
  17. 'url',
  18. )
  19. class PostSerializer(serializers.ModelSerializer, MutableFields):
  20. poster = UserSerializer(many=False, read_only=True)
  21. poster_ip = serializers.SerializerMethodField()
  22. content = serializers.SerializerMethodField()
  23. attachments = serializers.SerializerMethodField()
  24. last_editor = serializers.PrimaryKeyRelatedField(read_only=True)
  25. hidden_by = serializers.PrimaryKeyRelatedField(read_only=True)
  26. acl = serializers.SerializerMethodField()
  27. is_read = serializers.SerializerMethodField()
  28. is_new = serializers.SerializerMethodField()
  29. is_liked = serializers.SerializerMethodField()
  30. last_likes = serializers.SerializerMethodField()
  31. likes = serializers.SerializerMethodField()
  32. api = serializers.SerializerMethodField()
  33. url = serializers.SerializerMethodField()
  34. class Meta:
  35. model = Post
  36. fields = [
  37. 'id',
  38. 'poster',
  39. 'poster_name',
  40. 'poster_ip',
  41. 'content',
  42. 'attachments',
  43. 'posted_on',
  44. 'updated_on',
  45. 'hidden_on',
  46. 'edits',
  47. 'last_editor',
  48. 'last_editor_name',
  49. 'last_editor_slug',
  50. 'hidden_by',
  51. 'hidden_by_name',
  52. 'hidden_by_slug',
  53. 'is_unapproved',
  54. 'is_hidden',
  55. 'is_protected',
  56. 'is_event',
  57. 'event_type',
  58. 'event_context',
  59. 'acl',
  60. 'is_liked',
  61. 'is_new',
  62. 'is_read',
  63. 'last_likes',
  64. 'likes',
  65. 'api',
  66. 'url',
  67. ]
  68. def get_poster_ip(self, obj):
  69. if self.context['user'].acl_cache['can_see_users_ips']:
  70. return obj.poster_ip
  71. else:
  72. return None
  73. def get_content(self, obj):
  74. if obj.is_valid and not obj.is_event and (not obj.is_hidden or obj.acl['can_see_hidden']):
  75. return obj.content
  76. else:
  77. return None
  78. def get_attachments(self, obj):
  79. return obj.attachments_cache
  80. def get_acl(self, obj):
  81. try:
  82. return obj.acl
  83. except AttributeError:
  84. return None
  85. def get_is_liked(self, obj):
  86. try:
  87. return obj.is_liked
  88. except AttributeError:
  89. return None
  90. def get_is_new(self, obj):
  91. try:
  92. return obj.is_new
  93. except AttributeError:
  94. return None
  95. def get_is_read(self, obj):
  96. try:
  97. return obj.is_read
  98. except AttributeError:
  99. return None
  100. def get_last_likes(self, obj):
  101. if obj.is_event:
  102. return None
  103. try:
  104. if obj.acl['can_see_likes']:
  105. return obj.last_likes
  106. except AttributeError:
  107. return None
  108. def get_likes(self, obj):
  109. if obj.is_event:
  110. return None
  111. try:
  112. if obj.acl['can_see_likes']:
  113. return obj.likes
  114. except AttributeError:
  115. return None
  116. def get_api(self, obj):
  117. api_links = {
  118. 'index': obj.get_api_url(),
  119. 'likes': obj.get_likes_api_url(),
  120. 'editor': obj.get_editor_api_url(),
  121. 'edits': obj.get_edits_api_url(),
  122. 'read': obj.get_read_api_url(),
  123. }
  124. if obj.is_event:
  125. del api_links['likes']
  126. return api_links
  127. def get_url(self, obj):
  128. return {
  129. 'index': obj.get_absolute_url(),
  130. 'last_editor': self.get_last_editor_url(obj),
  131. 'hidden_by': self.get_hidden_by_url(obj),
  132. }
  133. def get_last_editor_url(self, obj):
  134. if obj.last_editor_id:
  135. return reverse(
  136. 'misago:user', kwargs={
  137. 'pk': obj.last_editor_id,
  138. 'slug': obj.last_editor_slug,
  139. }
  140. )
  141. else:
  142. return None
  143. def get_hidden_by_url(self, obj):
  144. if obj.hidden_by_id:
  145. return reverse(
  146. 'misago:user', kwargs={
  147. 'pk': obj.hidden_by_id,
  148. 'slug': obj.hidden_by_slug,
  149. }
  150. )
  151. else:
  152. return None