post.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. from rest_framework import serializers
  2. from django.urls import reverse
  3. from misago.categories.serializers import CategorySerializer
  4. from misago.core.serializers import Subsettable
  5. from misago.threads.models import Post
  6. from misago.users.serializers import UserSerializer as BaseUserSerializer
  7. __all__ = ['PostSerializer']
  8. UserSerializer = BaseUserSerializer.subset(
  9. 'id', 'username', 'rank', 'avatars', 'signature', 'short_title', 'status', 'absolute_url')
  10. class PostSerializer(serializers.ModelSerializer, Subsettable):
  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['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('misago:user', kwargs={
  127. '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('misago:user', kwargs={
  135. 'pk': obj.hidden_by_id,
  136. 'slug': obj.hidden_by_slug
  137. })
  138. else:
  139. return None