thread.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. from django.core.urlresolvers import reverse
  2. from rest_framework import serializers
  3. from misago.categories.serializers import BasicCategorySerializer
  4. from ..models import Thread
  5. from .poll import PollSerializer
  6. __all__ = [
  7. 'ThreadSerializer',
  8. 'ThreadsListSerializer',
  9. ]
  10. class ThreadSerializer(serializers.ModelSerializer):
  11. category = BasicCategorySerializer(many=False, read_only=True)
  12. acl = serializers.SerializerMethodField()
  13. is_new = serializers.SerializerMethodField()
  14. is_read = serializers.SerializerMethodField()
  15. path = BasicCategorySerializer(many=True, read_only=True)
  16. poll = PollSerializer(many=False, read_only=True)
  17. subscription = serializers.SerializerMethodField()
  18. api = serializers.SerializerMethodField()
  19. url = serializers.SerializerMethodField()
  20. class Meta:
  21. model = Thread
  22. fields = (
  23. 'id',
  24. 'category',
  25. 'title',
  26. 'replies',
  27. 'has_unapproved_posts',
  28. 'started_on',
  29. 'last_post_on',
  30. 'last_post',
  31. 'last_poster_name',
  32. 'is_unapproved',
  33. 'is_hidden',
  34. 'is_closed',
  35. 'weight',
  36. 'acl',
  37. 'is_new',
  38. 'is_read',
  39. 'path',
  40. 'poll',
  41. 'subscription',
  42. 'api',
  43. 'url',
  44. )
  45. def get_acl(self, obj):
  46. try:
  47. return obj.acl
  48. except AttributeError:
  49. return {}
  50. def get_is_new(self, obj):
  51. try:
  52. return obj.is_new
  53. except AttributeError:
  54. return None
  55. def get_is_read(self, obj):
  56. try:
  57. return obj.is_read
  58. except AttributeError:
  59. return None
  60. def get_top_category(self, obj):
  61. try:
  62. return obj.top_category.pk
  63. except AttributeError:
  64. return None
  65. def get_subscription(self, obj):
  66. try:
  67. return obj.subscription.send_email
  68. except AttributeError:
  69. return None
  70. def get_api(self, obj):
  71. return {
  72. 'index': obj.get_api_url(),
  73. 'editor': obj.get_editor_api_url(),
  74. 'merge': obj.get_merge_api_url(),
  75. 'posts': {
  76. 'index': obj.get_posts_api_url(),
  77. 'merge': obj.get_post_merge_api_url(),
  78. 'move': obj.get_post_move_api_url(),
  79. 'split': obj.get_post_split_api_url()
  80. }
  81. }
  82. def get_url(self, obj):
  83. return {
  84. 'index': obj.get_absolute_url(),
  85. 'new_post': obj.get_new_post_url(),
  86. 'last_post': obj.get_last_post_url(),
  87. 'unapproved_post': obj.get_unapproved_post_url(),
  88. 'last_poster': self.get_last_poster_url(obj),
  89. }
  90. def get_last_poster_url(self, obj):
  91. if obj.last_poster_id:
  92. return reverse('misago:user', kwargs={
  93. 'slug': obj.last_poster_slug,
  94. 'pk': obj.last_poster_id,
  95. })
  96. else:
  97. return None
  98. class ThreadsListSerializer(ThreadSerializer):
  99. category = serializers.PrimaryKeyRelatedField(read_only=True)
  100. last_post = serializers.PrimaryKeyRelatedField(read_only=True)
  101. top_category = serializers.SerializerMethodField()
  102. class Meta:
  103. model = Thread
  104. fields = (
  105. 'id',
  106. 'category',
  107. 'title',
  108. 'replies',
  109. 'has_unapproved_posts',
  110. 'started_on',
  111. 'last_post_on',
  112. 'last_post',
  113. 'last_poster_name',
  114. 'weight',
  115. 'is_unapproved',
  116. 'is_hidden',
  117. 'is_closed',
  118. 'acl',
  119. 'is_new',
  120. 'is_read',
  121. 'subscription',
  122. 'top_category',
  123. 'api',
  124. 'url',
  125. )