base.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 _type_available(self):
  11. try:
  12. if not self.type_available():
  13. raise Http404()
  14. except AttributeError:
  15. pass
  16. def set_forum_context(self):
  17. pass
  18. def set_thread_context(self):
  19. self.thread = Thread.objects.get(pk=self.kwargs.get('thread'))
  20. self.forum = self.thread.forum
  21. self.proxy = Forum.objects.parents_aware_forum(self.forum)
  22. self.request.acl.forums.allow_forum_view(self.forum)
  23. self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
  24. def set_post_contex(self):
  25. pass
  26. def check_forum_type(self):
  27. type_prefix = self.type_prefix
  28. if type_prefix == 'thread':
  29. type_prefix = 'root'
  30. else:
  31. type_prefix = '%ss' % type_prefix
  32. try:
  33. if self.parents[0].parent_id != Forum.objects.special_pk(type_prefix):
  34. raise Http404()
  35. except (AttributeError, IndexError):
  36. if self.forum.special != type_prefix:
  37. raise Http404()
  38. def _check_permissions(self):
  39. try:
  40. self.check_permissions()
  41. except AttributeError:
  42. pass
  43. def redirect_to_post(self, post):
  44. queryset = self.request.acl.threads.filter_posts(self.request, self.thread, self.thread.post_set)
  45. total = queryset.count()
  46. page = int(queryset.filter(id__lte=post.pk).count() / self.request.settings.posts_per_page)
  47. try:
  48. pagination = make_pagination(page, total, self.request.settings.posts_per_page)
  49. if pagination['total'] > 1:
  50. return redirect(reverse(self.type_prefix, kwargs={'thread': self.thread.pk, 'slug': self.thread.slug, 'page': pagination['total']}) + ('#post-%s' % post.pk))
  51. except Http404:
  52. pass
  53. return redirect(reverse(self.type_prefix, kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % post.pk))
  54. def template_vars(self, context):
  55. return context
  56. def retreat_redirect(self):
  57. if self.request.POST.get('retreat'):
  58. return redirect(self.request.POST.get('retreat'))
  59. return redirect(reverse(self.type_prefix, kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}))