thread.py 4.2 KB

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