category.py 2.2 KB

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