post.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. parsed = serializers.SerializerMethodField()
  11. attachments_cache = serializers.SerializerMethodField()
  12. last_editor = serializers.PrimaryKeyRelatedField(read_only=True)
  13. hidden_by = serializers.PrimaryKeyRelatedField(read_only=True)
  14. acl = serializers.SerializerMethodField()
  15. api = serializers.SerializerMethodField()
  16. url = serializers.SerializerMethodField()
  17. class Meta:
  18. model = Post
  19. fields = (
  20. 'id',
  21. 'poster',
  22. 'poster_name',
  23. 'poster_ip',
  24. 'parsed',
  25. 'has_attachments',
  26. 'attachments_cache',
  27. 'posted_on',
  28. 'updated_on',
  29. 'hidden_on',
  30. 'edits',
  31. 'last_editor',
  32. 'last_editor_name',
  33. 'last_editor_slug',
  34. 'hidden_by',
  35. 'hidden_by_name',
  36. 'hidden_by_slug',
  37. 'is_unapproved',
  38. 'is_hidden',
  39. 'is_protected',
  40. 'is_event',
  41. 'event_type',
  42. 'event_context',
  43. 'acl',
  44. 'api',
  45. 'url',
  46. )
  47. def get_parsed(self, obj):
  48. if obj.is_valid and not obj.is_event and (not obj.is_hidden or obj.acl['can_see_hidden']):
  49. return obj.parsed
  50. else:
  51. return None
  52. def get_attachments_cache(self, obj):
  53. # TODO: check if user can download attachments before we'll expose them here
  54. return None
  55. def get_acl(self, obj):
  56. try:
  57. return obj.acl
  58. except AttributeError:
  59. return None
  60. def get_api(self, obj):
  61. return {}
  62. def get_url(self, obj):
  63. return {
  64. 'index': obj.get_absolute_url(),
  65. 'last_editor': self.get_last_editor_url(obj),
  66. 'hidden_by': self.get_hidden_by_url(obj),
  67. }
  68. def get_last_editor_url(self, obj):
  69. if obj.last_editor_id:
  70. return reverse('misago:user', kwargs={
  71. 'pk': obj.last_editor_id,
  72. 'slug': obj.last_editor_slug
  73. })
  74. else:
  75. return None
  76. def get_hidden_by_url(self, obj):
  77. if obj.hidden_by_id:
  78. return reverse('misago:user', kwargs={
  79. 'pk': obj.hidden_by_id,
  80. 'slug': obj.hidden_by_slug
  81. })
  82. else:
  83. return None