thread.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. acl = serializers.SerializerMethodField()
  14. class Meta:
  15. model = Thread
  16. fields = (
  17. 'id',
  18. 'title',
  19. 'category',
  20. 'top_category',
  21. 'is_read',
  22. 'acl',
  23. )
  24. def get_is_read(self, obj):
  25. try:
  26. return obj.is_read
  27. except AttributeError:
  28. return None
  29. def get_acl(self, obj):
  30. try:
  31. return obj.acl
  32. except AttributeError:
  33. return {}
  34. class ThreadListSerializer(ThreadSerializer):
  35. category = serializers.PrimaryKeyRelatedField(read_only=True)
  36. last_post = serializers.PrimaryKeyRelatedField(read_only=True)
  37. last_poster_url = serializers.SerializerMethodField()
  38. top_category = serializers.SerializerMethodField()
  39. class Meta:
  40. model = Thread
  41. fields = (
  42. 'id',
  43. 'title',
  44. 'category',
  45. 'top_category',
  46. 'started_on',
  47. 'last_post',
  48. 'last_poster_name',
  49. 'last_poster_url',
  50. 'last_post_on',
  51. 'is_read',
  52. 'acl',
  53. )
  54. def get_last_poster_url(self, obj):
  55. if obj.last_poster_id:
  56. return reverse('misago:user', kwargs={
  57. 'user_slug': obj.last_poster_slug,
  58. 'user_id': obj.last_poster_id,
  59. })
  60. else:
  61. return None
  62. def get_top_category(self, obj):
  63. try:
  64. return obj.top_category.pk
  65. except AttributeError:
  66. return None
  67. def get_acl(self, obj):
  68. try:
  69. return obj.acl
  70. except AttributeError:
  71. return {}