category.py 2.5 KB

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