thread.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. from rest_framework import serializers
  2. from django.urls import reverse
  3. from misago.api.serializers import MutableFields
  4. from misago.categories.serializers import BasicCategorySerializer
  5. from misago.threads.models import Thread
  6. from .poll import PollSerializer
  7. from .threadparticipant import ThreadParticipantSerializer
  8. class ThreadSerializer(serializers.ModelSerializer, MutableFields):
  9. category = BasicCategorySerializer(many=False, read_only=True)
  10. has_unapproved_posts = serializers.SerializerMethodField()
  11. is_new = serializers.SerializerMethodField()
  12. is_read = serializers.SerializerMethodField()
  13. path = BasicCategorySerializer(many=True, read_only=True)
  14. poll = PollSerializer(many=False, read_only=True)
  15. best_answer = serializers.PrimaryKeyRelatedField(read_only=True)
  16. best_answer_marked_by = serializers.PrimaryKeyRelatedField(read_only=True)
  17. subscription = serializers.SerializerMethodField()
  18. class Meta:
  19. model = Thread
  20. fields = [
  21. 'id',
  22. 'category',
  23. 'title',
  24. 'replies',
  25. 'has_unapproved_posts',
  26. 'started_on',
  27. 'starter_name',
  28. 'last_post_on',
  29. 'last_post_is_event',
  30. 'last_post',
  31. 'last_poster_name',
  32. 'is_unapproved',
  33. 'is_hidden',
  34. 'is_closed',
  35. 'weight',
  36. 'best_answer',
  37. 'best_answer_is_protected',
  38. 'best_answer_marked_on',
  39. 'best_answer_marked_by',
  40. 'best_answer_marked_by_name',
  41. 'best_answer_marked_by_slug',
  42. 'is_new',
  43. 'is_read',
  44. 'path',
  45. 'poll',
  46. 'subscription',
  47. ]
  48. def get_has_unapproved_posts(self, obj):
  49. try:
  50. acl = obj.acl
  51. except AttributeError:
  52. return False
  53. return acl.get('can_approve') and obj.has_unapproved_posts
  54. def get_is_new(self, obj):
  55. try:
  56. return obj.is_new
  57. except AttributeError:
  58. return None
  59. def get_is_read(self, obj):
  60. try:
  61. return obj.is_read
  62. except AttributeError:
  63. return None
  64. def get_participants(self, obj):
  65. return ThreadParticipantSerializer(obj.participants_list, many=True).data
  66. def get_subscription(self, obj):
  67. try:
  68. return obj.subscription.send_email
  69. except AttributeError:
  70. return None
  71. class PrivateThreadSerializer(ThreadSerializer):
  72. participants = serializers.SerializerMethodField()
  73. class Meta:
  74. model = Thread
  75. fields = ThreadSerializer.Meta.fields + ['participants']
  76. class ThreadsListSerializer(ThreadSerializer):
  77. category = serializers.PrimaryKeyRelatedField(read_only=True)
  78. last_post = serializers.PrimaryKeyRelatedField(read_only=True)
  79. starter = serializers.SerializerMethodField()
  80. last_poster = serializers.SerializerMethodField()
  81. class Meta:
  82. model = Thread
  83. fields = ThreadSerializer.Meta.fields + [
  84. 'has_poll',
  85. 'starter',
  86. 'last_poster',
  87. ]
  88. def get_starter(self, obj):
  89. if obj.starter:
  90. avatars = obj.starter.avatars
  91. real_name = obj.starter.get_real_name()
  92. else:
  93. avatars = None
  94. real_name = None
  95. return {
  96. 'id': obj.starter_id,
  97. 'username': obj.starter_name,
  98. 'slug': obj.starter_slug,
  99. 'real_name': real_name,
  100. 'avatars': avatars,
  101. }
  102. def get_last_poster(self, obj):
  103. if obj.last_poster:
  104. avatars = obj.last_poster.avatars
  105. real_name = obj.last_poster.get_real_name()
  106. else:
  107. avatars = None
  108. real_name = None
  109. return {
  110. 'id': obj.last_poster_id,
  111. 'username': obj.last_poster_name,
  112. 'slug': obj.last_poster_slug,
  113. 'real_name': real_name,
  114. 'avatars': avatars,
  115. }
  116. ThreadsListSerializer = ThreadsListSerializer.exclude_fields('path', 'poll')