post.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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. content = serializers.SerializerMethodField()
  22. attachments = serializers.SerializerMethodField()
  23. last_editor = serializers.PrimaryKeyRelatedField(read_only=True)
  24. hidden_by = serializers.PrimaryKeyRelatedField(read_only=True)
  25. acl = serializers.SerializerMethodField()
  26. is_read = serializers.SerializerMethodField()
  27. is_new = serializers.SerializerMethodField()
  28. is_liked = serializers.SerializerMethodField()
  29. last_likes = serializers.SerializerMethodField()
  30. likes = serializers.SerializerMethodField()
  31. api = serializers.SerializerMethodField()
  32. url = serializers.SerializerMethodField()
  33. class Meta:
  34. model = Post
  35. fields = [
  36. "id",
  37. "poster",
  38. "poster_name",
  39. "content",
  40. "attachments",
  41. "posted_on",
  42. "updated_on",
  43. "hidden_on",
  44. "edits",
  45. "last_editor",
  46. "last_editor_name",
  47. "last_editor_slug",
  48. "hidden_by",
  49. "hidden_by_name",
  50. "hidden_by_slug",
  51. "is_unapproved",
  52. "is_hidden",
  53. "is_protected",
  54. "is_event",
  55. "event_type",
  56. "event_context",
  57. "acl",
  58. "is_liked",
  59. "is_new",
  60. "is_read",
  61. "last_likes",
  62. "likes",
  63. "api",
  64. "url",
  65. ]
  66. def get_content(self, obj):
  67. if (
  68. obj.is_valid
  69. and not obj.is_event
  70. and (not obj.is_hidden or obj.acl["can_see_hidden"])
  71. ):
  72. return obj.content
  73. else:
  74. return None
  75. def get_attachments(self, obj):
  76. return obj.attachments_cache
  77. def get_acl(self, obj):
  78. try:
  79. return obj.acl
  80. except AttributeError:
  81. return None
  82. def get_is_liked(self, obj):
  83. try:
  84. return obj.is_liked
  85. except AttributeError:
  86. return None
  87. def get_is_new(self, obj):
  88. try:
  89. return obj.is_new
  90. except AttributeError:
  91. return None
  92. def get_is_read(self, obj):
  93. try:
  94. return obj.is_read
  95. except AttributeError:
  96. return None
  97. def get_last_likes(self, obj):
  98. if obj.is_event:
  99. return None
  100. try:
  101. if obj.acl["can_see_likes"]:
  102. return obj.last_likes
  103. except AttributeError:
  104. return None
  105. def get_likes(self, obj):
  106. if obj.is_event:
  107. return None
  108. try:
  109. if obj.acl["can_see_likes"]:
  110. return obj.likes
  111. except AttributeError:
  112. return None
  113. def get_api(self, obj):
  114. api_links = {
  115. "index": obj.get_api_url(),
  116. "likes": obj.get_likes_api_url(),
  117. "editor": obj.get_editor_api_url(),
  118. "edits": obj.get_edits_api_url(),
  119. "read": obj.get_read_api_url(),
  120. }
  121. if obj.is_event:
  122. del api_links["likes"]
  123. return api_links
  124. def get_url(self, obj):
  125. return {
  126. "index": obj.get_absolute_url(),
  127. "last_editor": self.get_last_editor_url(obj),
  128. "hidden_by": self.get_hidden_by_url(obj),
  129. }
  130. def get_last_editor_url(self, obj):
  131. if obj.last_editor_id:
  132. return reverse(
  133. "misago:user",
  134. kwargs={"pk": obj.last_editor_id, "slug": obj.last_editor_slug},
  135. )
  136. else:
  137. return None
  138. def get_hidden_by_url(self, obj):
  139. if obj.hidden_by_id:
  140. return reverse(
  141. "misago:user",
  142. kwargs={"pk": obj.hidden_by_id, "slug": obj.hidden_by_slug},
  143. )
  144. else:
  145. return None