post.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. from django.urls import reverse
  2. from rest_framework import serializers
  3. from ...core.serializers import MutableFields
  4. from ...users.serializers import UserSerializer as BaseUserSerializer
  5. from ..models import Post
  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. def get_attachments(self, obj):
  74. return obj.attachments_cache
  75. def get_acl(self, obj):
  76. try:
  77. return obj.acl
  78. except AttributeError:
  79. return None
  80. def get_is_liked(self, obj):
  81. try:
  82. return obj.is_liked
  83. except AttributeError:
  84. return None
  85. def get_is_new(self, obj):
  86. try:
  87. return obj.is_new
  88. except AttributeError:
  89. return None
  90. def get_is_read(self, obj):
  91. try:
  92. return obj.is_read
  93. except AttributeError:
  94. return None
  95. def get_last_likes(self, obj):
  96. if obj.is_event:
  97. return None
  98. try:
  99. if obj.acl["can_see_likes"]:
  100. return obj.last_likes
  101. except AttributeError:
  102. return None
  103. def get_likes(self, obj):
  104. if obj.is_event:
  105. return None
  106. try:
  107. if obj.acl["can_see_likes"]:
  108. return obj.likes
  109. except AttributeError:
  110. return None
  111. def get_api(self, obj):
  112. api_links = {
  113. "index": obj.get_api_url(),
  114. "likes": obj.get_likes_api_url(),
  115. "editor": obj.get_editor_api_url(),
  116. "edits": obj.get_edits_api_url(),
  117. "read": obj.get_read_api_url(),
  118. }
  119. if obj.is_event:
  120. del api_links["likes"]
  121. return api_links
  122. def get_url(self, obj):
  123. return {
  124. "index": obj.get_absolute_url(),
  125. "last_editor": self.get_last_editor_url(obj),
  126. "hidden_by": self.get_hidden_by_url(obj),
  127. }
  128. def get_last_editor_url(self, obj):
  129. if obj.last_editor_id:
  130. return reverse(
  131. "misago:user",
  132. kwargs={"pk": obj.last_editor_id, "slug": obj.last_editor_slug},
  133. )
  134. def get_hidden_by_url(self, obj):
  135. if obj.hidden_by_id:
  136. return reverse(
  137. "misago:user",
  138. kwargs={"pk": obj.hidden_by_id, "slug": obj.hidden_by_slug},
  139. )