base.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from django.core.urlresolvers import reverse
  2. from django.http import Http404
  3. from django.shortcuts import redirect
  4. from misago.models import Forum, Thread, Post
  5. from misago.utils.pagination import make_pagination
  6. class ViewBase(object):
  7. def __new__(cls, request, **kwargs):
  8. obj = super(ViewBase, cls).__new__(cls)
  9. return obj(request, **kwargs)
  10. def set_forum_context(self):
  11. pass
  12. def set_thread_context(self):
  13. self.thread = Thread.objects.get(pk=self.kwargs.get('thread'))
  14. self.forum = self.thread.forum
  15. self.proxy = Forum.objects.parents_aware_forum(self.forum)
  16. self.request.acl.forums.allow_forum_view(self.forum)
  17. self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
  18. def set_post_contex(self):
  19. pass
  20. def check_forum_type(self):
  21. type_prefix = self.type_prefix
  22. if type_prefix == 'thread':
  23. type_prefix = 'root'
  24. else:
  25. type_prefix = '%ss' % type_prefix
  26. try:
  27. if self.parents[0].parent_id != Forum.objects.special_pk(type_prefix):
  28. raise Http404()
  29. except (AttributeError, IndexError):
  30. if self.forum.special != type_prefix:
  31. raise Http404()
  32. def _check_permissions(self):
  33. try:
  34. self.check_permissions()
  35. except AttributeError:
  36. pass
  37. def redirect_to_post(self, post):
  38. pagination = make_pagination(0, self.request.acl.threads.filter_posts(self.request, self.thread, self.thread.post_set).filter(id__lte=post.pk).count(), self.request.settings.posts_per_page)
  39. if pagination['total'] > 1:
  40. return redirect(reverse(self.type_prefix, kwargs={'thread': self.thread.pk, 'slug': self.thread.slug, 'page': pagination['total']}) + ('#post-%s' % post.pk))
  41. return redirect(reverse(self.type_prefix, kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % post.pk))