base.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from django.core.urlresolvers import reverse
  2. from django.http import Http404
  3. from django.shortcuts import redirect
  4. from misago.conf import settings
  5. from misago.models import Forum, Thread, Post
  6. from misago.utils.pagination import page_number
  7. class ViewBase(object):
  8. def __new__(cls, request, **kwargs):
  9. obj = super(ViewBase, cls).__new__(cls)
  10. return obj(request, **kwargs)
  11. @property
  12. def search_in(self):
  13. return '%ss' % self.type_prefix
  14. def _type_available(self):
  15. try:
  16. if not self.type_available():
  17. raise Http404()
  18. except AttributeError:
  19. pass
  20. def set_forum_context(self):
  21. pass
  22. def set_thread_context(self):
  23. self.thread = Thread.objects.get(pk=self.kwargs.get('thread'))
  24. self.forum = self.thread.forum
  25. self.proxy = Forum.objects.parents_aware_forum(self.forum)
  26. self.request.acl.forums.allow_forum_view(self.forum)
  27. self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
  28. def set_post_contex(self):
  29. pass
  30. def check_forum_type(self):
  31. type_prefix = self.type_prefix
  32. if type_prefix == 'thread':
  33. type_prefix = 'root'
  34. else:
  35. type_prefix = '%ss' % type_prefix
  36. try:
  37. if self.parents[0].parent_id != Forum.objects.special_pk(type_prefix):
  38. raise Http404()
  39. except (AttributeError, IndexError):
  40. if self.forum.special != type_prefix:
  41. raise Http404()
  42. def _check_permissions(self):
  43. try:
  44. self.check_permissions()
  45. except AttributeError:
  46. pass
  47. def redirect_to_post(self, post, type_prefix=None):
  48. type_prefix = type_prefix or self.type_prefix
  49. queryset = self.request.acl.threads.filter_posts(self.request, self.thread, self.thread.post_set)
  50. page = page_number(queryset.filter(id__lte=post.pk).count(), queryset.count(), settings.posts_per_page)
  51. if page > 1:
  52. return redirect(reverse(type_prefix, kwargs={'thread': self.thread.pk, 'slug': self.thread.slug, 'page': page}) + ('#post-%s' % post.pk))
  53. return redirect(reverse(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 _template_vars(self, context):
  57. context.update({
  58. 'type_prefix': self.type_prefix,
  59. 'search_in': self.search_in,
  60. })
  61. return self.template_vars(context)
  62. def retreat_redirect(self):
  63. if self.request.POST.get('retreat'):
  64. return redirect(self.request.POST.get('retreat'))
  65. return redirect(reverse(self.type_prefix, kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}))