123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- from django.http import Http404
- from misago.acl import add_acl
- from misago.categories.models import Category
- from misago.categories.permissions import allow_browse_category, allow_see_category
- from misago.categories.serializers import BasicCategorySerializer
- from misago.core.shortcuts import validate_slug
- class ViewModel(object):
- def __init__(self, request, **kwargs):
- self.categories = self.get_categories(request)
- map(lambda c: add_acl(request.user, c), self.categories)
- self.category = self.get_category(request, self.categories, **kwargs)
- self.subcategories = filter(self.category.has_child, self.categories)
- self.children = filter(lambda s: s.parent_id == self.category.pk, self.subcategories)
- def get_categories(self, request):
- raise NotImplementedError('Category view model has to implement get_categories(request)')
- def get_category(self, request, categories, **kwargs):
- return categories[0]
- def get_frontend_context(self):
- return {
- 'CATEGORIES': BasicCategorySerializer(self.categories, many=True).data
- }
- def get_template_context(self):
- return {
- 'category': self.category,
- 'subcategories': self.children
- }
- class ThreadsRootCategory(ViewModel):
- def get_categories(self, request):
- return [Category.objects.root_category()] + list(
- Category.objects.all_categories().filter(
- id__in=request.user.acl['browseable_categories']
- ).select_related('parent'))
- class ThreadsCategory(ThreadsRootCategory):
- @property
- def level(self):
- return self.category.level
- def get_category(self, request, categories, **kwargs):
- for category in categories:
- if category.pk == int(kwargs['pk']):
- if not category.special_role:
- # don't check permissions for non-special category
- allow_see_category(request.user, category)
- allow_browse_category(request.user, category)
- if 'slug' in kwargs:
- validate_slug(category, kwargs['slug'])
- return category
- raise Http404()
- class PrivateThreadsCategory(ViewModel):
- pass
|