category.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from django.http import Http404
  2. from misago.acl import add_acl
  3. from misago.categories.models import Category
  4. from misago.categories.permissions import allow_browse_category, allow_see_category
  5. from misago.categories.serializers import BasicCategorySerializer
  6. from misago.core.viewmodel import ViewModel as BaseViewModel
  7. from misago.core.shortcuts import validate_slug
  8. __all__ = ['ThreadsRootCategory', 'ThreadsCategory', 'PrivateThreadsCategory']
  9. class ViewModel(BaseViewModel):
  10. def __init__(self, request, **kwargs):
  11. self._categories = self.get_categories(request)
  12. add_acl(request.user, self._categories)
  13. self._model = self.get_category(request, self._categories, **kwargs)
  14. self._subcategories = list(filter(self._model.has_child, self._categories))
  15. self._children = list(filter(lambda s: s.parent_id == self._model.pk, self._subcategories))
  16. @property
  17. def categories(self):
  18. return self._categories
  19. @property
  20. def subcategories(self):
  21. return self._subcategories
  22. @property
  23. def children(self):
  24. return self._children
  25. def get_categories(self, request):
  26. raise NotImplementedError('Category view model has to implement get_categories(request)')
  27. def get_category(self, request, categories, **kwargs):
  28. return categories[0]
  29. def get_frontend_context(self):
  30. return {
  31. 'CATEGORIES': BasicCategorySerializer(self._categories, many=True).data
  32. }
  33. def get_template_context(self):
  34. return {
  35. 'category': self._model,
  36. 'subcategories': self._children
  37. }
  38. class ThreadsRootCategory(ViewModel):
  39. def get_categories(self, request):
  40. return [Category.objects.root_category()] + list(
  41. Category.objects.all_categories().filter(
  42. id__in=request.user.acl['browseable_categories']
  43. ).select_related('parent'))
  44. class ThreadsCategory(ThreadsRootCategory):
  45. @property
  46. def level(self):
  47. return self._model.level
  48. def get_category(self, request, categories, **kwargs):
  49. for category in categories:
  50. if category.pk == int(kwargs['pk']):
  51. if not category.special_role:
  52. # don't check permissions for non-special category
  53. allow_see_category(request.user, category)
  54. allow_browse_category(request.user, category)
  55. if 'slug' in kwargs:
  56. validate_slug(category, kwargs['slug'])
  57. return category
  58. raise Http404()
  59. class PrivateThreadsCategory(ViewModel):
  60. def get_categories(self, request):
  61. return [Category.objects.private_threads()]