serializers.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from django.core.urlresolvers import reverse
  2. from rest_framework import serializers
  3. from misago.core.utils import format_plaintext_for_html
  4. from misago.categories.models import Category
  5. __all__ = [
  6. 'BasicCategorySerializer',
  7. 'IndexCategorySerializer',
  8. 'CategorySerializer',
  9. ]
  10. class CategorySerializer(serializers.ModelSerializer):
  11. parent = serializers.SerializerMethodField()
  12. description = serializers.SerializerMethodField()
  13. is_read = serializers.SerializerMethodField()
  14. subcategories = serializers.SerializerMethodField()
  15. absolute_url = serializers.SerializerMethodField()
  16. last_poster_url = serializers.SerializerMethodField()
  17. last_thread_url = serializers.SerializerMethodField()
  18. acl = serializers.SerializerMethodField()
  19. class Meta:
  20. model = Category
  21. fields = (
  22. 'id',
  23. 'parent',
  24. 'name',
  25. 'description',
  26. 'is_closed',
  27. 'threads',
  28. 'posts',
  29. 'last_post_on',
  30. 'last_thread_title',
  31. 'last_poster_name',
  32. 'css_class',
  33. 'is_read',
  34. 'subcategories',
  35. 'absolute_url',
  36. 'last_thread_url',
  37. 'last_poster_url',
  38. 'acl',
  39. )
  40. def get_parent(self, obj):
  41. try:
  42. if obj.parent:
  43. return BasicCategorySerializer(obj.parent).data
  44. else:
  45. return None
  46. except AttributeError:
  47. return None
  48. def get_description(self, obj):
  49. if obj.description:
  50. return {
  51. 'plain': obj.description,
  52. 'html': format_plaintext_for_html(obj.description),
  53. }
  54. else:
  55. return None
  56. def get_is_read(self, obj):
  57. try:
  58. return obj.is_read
  59. except AttributeError:
  60. return None
  61. def get_subcategories(self, obj):
  62. try:
  63. return CategorySerializer(obj.subcategories, many=True).data
  64. except AttributeError:
  65. return []
  66. def get_absolute_url(self, obj):
  67. return obj.get_absolute_url()
  68. def get_last_thread_url(self, obj):
  69. return obj.get_last_thread_url()
  70. def get_last_poster_url(self, obj):
  71. if obj.last_poster_id:
  72. return reverse('misago:user', kwargs={
  73. 'user_slug': obj.last_poster_slug,
  74. 'user_id': obj.last_poster_id,
  75. })
  76. else:
  77. return None
  78. def get_acl(self, obj):
  79. try:
  80. return obj.acl
  81. except AttributeError:
  82. return {}
  83. class IndexCategorySerializer(CategorySerializer):
  84. class Meta:
  85. model = Category
  86. fields = (
  87. 'id',
  88. 'parent',
  89. 'name',
  90. 'description',
  91. 'css_class',
  92. 'absolute_url',
  93. )
  94. class BasicCategorySerializer(CategorySerializer):
  95. class Meta:
  96. model = Category
  97. fields = (
  98. 'id',
  99. 'name',
  100. 'css_class',
  101. 'absolute_url',
  102. )