serializers.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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__ = ['BasicCategorySerializer', 'CategorySerializer']
  6. class CategorySerializer(serializers.ModelSerializer):
  7. parent = serializers.SerializerMethodField()
  8. description = serializers.SerializerMethodField()
  9. is_read = serializers.SerializerMethodField()
  10. subcategories = serializers.SerializerMethodField()
  11. absolute_url = serializers.SerializerMethodField()
  12. last_poster_url = serializers.SerializerMethodField()
  13. last_thread_url = serializers.SerializerMethodField()
  14. acl = serializers.SerializerMethodField()
  15. class Meta:
  16. model = Category
  17. fields = (
  18. 'id',
  19. 'parent',
  20. 'name',
  21. 'description',
  22. 'is_closed',
  23. 'threads',
  24. 'posts',
  25. 'last_post_on',
  26. 'last_thread_title',
  27. 'last_poster_name',
  28. 'css_class',
  29. 'is_read',
  30. 'subcategories',
  31. 'absolute_url',
  32. 'last_thread_url',
  33. 'last_poster_url',
  34. 'acl',
  35. )
  36. def get_parent(self, obj):
  37. try:
  38. if obj.parent:
  39. return BasicCategorySerializer(obj.parent).data
  40. else:
  41. return None
  42. except AttributeError:
  43. return None
  44. def get_description(self, obj):
  45. if obj.description:
  46. return {
  47. 'plain': obj.description,
  48. 'html': format_plaintext_for_html(obj.description),
  49. }
  50. else:
  51. return None
  52. def get_is_read(self, obj):
  53. try:
  54. return obj.is_read
  55. except AttributeError:
  56. return None
  57. def get_subcategories(self, obj):
  58. try:
  59. return CategorySerializer(obj.subcategories, many=True).data
  60. except AttributeError:
  61. return []
  62. def get_absolute_url(self, obj):
  63. return obj.get_absolute_url()
  64. def get_last_thread_url(self, obj):
  65. return obj.get_last_thread_url()
  66. def get_last_poster_url(self, obj):
  67. if obj.last_poster_id:
  68. return reverse('misago:user', kwargs={
  69. 'user_slug': obj.last_poster_slug,
  70. 'user_id': obj.last_poster_id,
  71. })
  72. else:
  73. return None
  74. def get_acl(self, obj):
  75. try:
  76. return obj.acl
  77. except AttributeError:
  78. return {}
  79. class BasicCategorySerializer(CategorySerializer):
  80. class Meta:
  81. model = Category
  82. fields = (
  83. 'id',
  84. 'name',
  85. 'css_class',
  86. 'absolute_url',
  87. )