thread.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. from django.core.urlresolvers import reverse
  2. from rest_framework import serializers
  3. from misago.categories.serializers import BasicCategorySerializer
  4. from misago.threads.models import Thread
  5. __all__ = [
  6. 'ThreadSerializer',
  7. 'ThreadListSerializer',
  8. ]
  9. class ThreadSerializer(serializers.ModelSerializer):
  10. category = BasicCategorySerializer()
  11. is_read = serializers.SerializerMethodField()
  12. top_category = BasicCategorySerializer()
  13. last_poster_url = serializers.SerializerMethodField()
  14. absolute_url = serializers.SerializerMethodField()
  15. last_post_url = serializers.SerializerMethodField()
  16. new_post_url = serializers.SerializerMethodField()
  17. acl = serializers.SerializerMethodField()
  18. class Meta:
  19. model = Thread
  20. fields = (
  21. 'id',
  22. 'title',
  23. 'category',
  24. 'top_category',
  25. 'replies',
  26. 'is_closed',
  27. 'is_read',
  28. 'absolute_url',
  29. 'last_post_url',
  30. 'new_post_url',
  31. 'acl',
  32. )
  33. def get_is_read(self, obj):
  34. try:
  35. return obj.is_read
  36. except AttributeError:
  37. return None
  38. def get_last_poster_url(self, obj):
  39. if obj.last_poster_id:
  40. return reverse('misago:user', kwargs={
  41. 'user_slug': obj.last_poster_slug,
  42. 'user_id': obj.last_poster_id,
  43. })
  44. else:
  45. return None
  46. def get_absolute_url(self, obj):
  47. return obj.get_absolute_url()
  48. def get_last_post_url(self, obj):
  49. return obj.get_last_post_url()
  50. def get_new_post_url(self, obj):
  51. return obj.get_new_post_url()
  52. def get_acl(self, obj):
  53. try:
  54. return obj.acl
  55. except AttributeError:
  56. return {}
  57. class ThreadListSerializer(ThreadSerializer):
  58. category = serializers.PrimaryKeyRelatedField(read_only=True)
  59. last_post = serializers.PrimaryKeyRelatedField(read_only=True)
  60. top_category = serializers.SerializerMethodField()
  61. class Meta:
  62. model = Thread
  63. fields = (
  64. 'id',
  65. 'title',
  66. 'category',
  67. 'top_category',
  68. 'replies',
  69. 'started_on',
  70. 'last_post',
  71. 'last_poster_name',
  72. 'last_poster_url',
  73. 'last_post_on',
  74. 'is_closed',
  75. 'is_read',
  76. 'absolute_url',
  77. 'last_post_url',
  78. 'new_post_url',
  79. 'acl',
  80. )
  81. def get_top_category(self, obj):
  82. try:
  83. return obj.top_category.pk
  84. except AttributeError:
  85. return None
  86. def get_acl(self, obj):
  87. try:
  88. return obj.acl
  89. except AttributeError:
  90. return {}