post.py 4.5 KB

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