post.py 5.2 KB

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