post.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. from django.core.urlresolvers import reverse
  2. from rest_framework import serializers
  3. from misago.users.serializers import UserSerializer
  4. from ..models import Post
  5. __all__ = [
  6. 'PostSerializer',
  7. ]
  8. class PostSerializer(serializers.ModelSerializer):
  9. poster = UserSerializer(many=False, read_only=True)
  10. poster_ip = serializers.SerializerMethodField()
  11. content = serializers.SerializerMethodField()
  12. attachments = serializers.SerializerMethodField()
  13. last_editor = serializers.PrimaryKeyRelatedField(read_only=True)
  14. hidden_by = serializers.PrimaryKeyRelatedField(read_only=True)
  15. acl = serializers.SerializerMethodField()
  16. is_read = serializers.SerializerMethodField()
  17. is_new = serializers.SerializerMethodField()
  18. is_liked = serializers.SerializerMethodField()
  19. api = serializers.SerializerMethodField()
  20. url = serializers.SerializerMethodField()
  21. class Meta:
  22. model = Post
  23. fields = (
  24. 'id',
  25. 'poster',
  26. 'poster_name',
  27. 'poster_ip',
  28. 'content',
  29. 'attachments',
  30. 'posted_on',
  31. 'updated_on',
  32. 'hidden_on',
  33. 'edits',
  34. 'last_editor',
  35. 'last_editor_name',
  36. 'last_editor_slug',
  37. 'hidden_by',
  38. 'hidden_by_name',
  39. 'hidden_by_slug',
  40. 'is_unapproved',
  41. 'is_hidden',
  42. 'is_protected',
  43. 'is_event',
  44. 'event_type',
  45. 'event_context',
  46. 'likes',
  47. 'last_likes',
  48. 'acl',
  49. 'is_liked',
  50. 'is_new',
  51. 'is_read',
  52. 'api',
  53. 'url',
  54. )
  55. def get_poster_ip(self, obj):
  56. if self.context['user'].acl['can_see_users_ips']:
  57. return obj.poster_ip
  58. else:
  59. return None
  60. def get_content(self, obj):
  61. if obj.is_valid and not obj.is_event and (not obj.is_hidden or obj.acl['can_see_hidden']):
  62. return obj.content
  63. else:
  64. return None
  65. def get_attachments(self, obj):
  66. return obj.attachments_cache
  67. def get_acl(self, obj):
  68. try:
  69. return obj.acl
  70. except AttributeError:
  71. return None
  72. def get_is_liked(self, obj):
  73. try:
  74. return obj.is_liked
  75. except AttributeError:
  76. return None
  77. def get_is_new(self, obj):
  78. try:
  79. return obj.is_new
  80. except AttributeError:
  81. return None
  82. def get_is_read(self, obj):
  83. try:
  84. return obj.is_read
  85. except AttributeError:
  86. return None
  87. def get_api(self, obj):
  88. return {
  89. 'index': obj.get_api_url(),
  90. 'likes': obj.get_likes_api_url(),
  91. 'editor': obj.get_editor_api_url(),
  92. 'edits': obj.get_edits_api_url(),
  93. 'read': obj.get_read_api_url(),
  94. }
  95. def get_url(self, obj):
  96. return {
  97. 'index': obj.get_absolute_url(),
  98. 'last_editor': self.get_last_editor_url(obj),
  99. 'hidden_by': self.get_hidden_by_url(obj),
  100. }
  101. def get_last_editor_url(self, obj):
  102. if obj.last_editor_id:
  103. return reverse('misago:user', kwargs={
  104. 'pk': obj.last_editor_id,
  105. 'slug': obj.last_editor_slug
  106. })
  107. else:
  108. return None
  109. def get_hidden_by_url(self, obj):
  110. if obj.hidden_by_id:
  111. return reverse('misago:user', kwargs={
  112. 'pk': obj.hidden_by_id,
  113. 'slug': obj.hidden_by_slug
  114. })
  115. else:
  116. return None