thread.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. __all__ = [
  6. 'ThreadSerializer',
  7. 'ThreadsListSerializer',
  8. ]
  9. class ThreadSerializer(serializers.ModelSerializer):
  10. category = BasicCategorySerializer(many=False, read_only=True)
  11. acl = serializers.SerializerMethodField()
  12. is_new = serializers.SerializerMethodField()
  13. is_read = serializers.SerializerMethodField()
  14. subscription = serializers.SerializerMethodField()
  15. api = serializers.SerializerMethodField()
  16. url = serializers.SerializerMethodField()
  17. class Meta:
  18. model = Thread
  19. fields = (
  20. 'id',
  21. 'category',
  22. 'title',
  23. 'replies',
  24. 'has_unapproved_posts',
  25. 'is_unapproved',
  26. 'is_hidden',
  27. 'is_closed',
  28. 'weight',
  29. 'acl',
  30. 'is_new',
  31. 'is_read',
  32. 'subscription',
  33. 'api',
  34. 'url',
  35. )
  36. def get_acl(self, obj):
  37. try:
  38. return obj.acl
  39. except AttributeError:
  40. return {}
  41. def get_is_new(self, obj):
  42. try:
  43. return obj.is_new
  44. except AttributeError:
  45. return None
  46. def get_is_read(self, obj):
  47. try:
  48. return obj.is_read
  49. except AttributeError:
  50. return None
  51. def get_top_category(self, obj):
  52. try:
  53. return obj.top_category.pk
  54. except AttributeError:
  55. return None
  56. def get_subscription(self, obj):
  57. try:
  58. return obj.subscription.send_email
  59. except AttributeError:
  60. return None
  61. def get_api(self, obj):
  62. return {
  63. 'index': obj.get_api_url(),
  64. 'read': 'nada',
  65. }
  66. def get_url(self, obj):
  67. return {
  68. 'index': obj.get_absolute_url(),
  69. 'new_post': obj.get_new_post_url(),
  70. 'last_post': obj.get_last_post_url(),
  71. 'unapproved_post': obj.get_unapproved_post_url(),
  72. 'last_poster': self.get_last_poster_url(obj),
  73. }
  74. def get_last_poster_url(self, obj):
  75. if obj.last_poster_id:
  76. return reverse('misago:user', kwargs={
  77. 'slug': obj.last_poster_slug,
  78. 'pk': obj.last_poster_id,
  79. })
  80. else:
  81. return None
  82. class ThreadsListSerializer(ThreadSerializer):
  83. category = serializers.PrimaryKeyRelatedField(read_only=True)
  84. last_post = serializers.PrimaryKeyRelatedField(read_only=True)
  85. top_category = serializers.SerializerMethodField()
  86. class Meta:
  87. model = Thread
  88. fields = (
  89. 'id',
  90. 'category',
  91. 'title',
  92. 'replies',
  93. 'has_unapproved_posts',
  94. 'started_on',
  95. 'last_post_on',
  96. 'last_post',
  97. 'last_poster_name',
  98. 'weight',
  99. 'is_unapproved',
  100. 'is_hidden',
  101. 'is_closed',
  102. 'acl',
  103. 'is_new',
  104. 'is_read',
  105. 'subscription',
  106. 'top_category',
  107. 'api',
  108. 'url',
  109. )