details.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from django.template import RequestContext
  2. from misago.acl.exceptions import ACLError403, ACLError404
  3. from misago.apps.errors import error403, error404
  4. from misago.models import Forum, Thread, Post
  5. from misago.apps.threadtype.base import ViewBase
  6. class ExtraBaseView(ViewBase):
  7. def fetch_target(self):
  8. self.thread = Thread.objects.get(pk=self.kwargs.get('thread'))
  9. self.forum = self.thread.forum
  10. self.proxy = Forum.objects.parents_aware_forum(self.forum)
  11. self.request.acl.forums.allow_forum_view(self.forum)
  12. self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
  13. if self.forum.level:
  14. self.parents = Forum.objects.forum_parents(self.forum.pk, True)
  15. self.check_forum_type()
  16. self.post = Post.objects.select_related('user').get(pk=self.kwargs.get('post'), thread=self.thread.pk)
  17. self.post.thread = self.thread
  18. self.request.acl.threads.allow_post_view(self.request.user, self.thread, self.post)
  19. def __call__(self, request, **kwargs):
  20. self.request = request
  21. self.kwargs = kwargs
  22. self.forum = None
  23. self.thread = None
  24. self.post = None
  25. self.parents = []
  26. try:
  27. self.fetch_target()
  28. self.check_acl()
  29. self._check_permissions()
  30. except (Forum.DoesNotExist, Thread.DoesNotExist, Post.DoesNotExist):
  31. return error404(self.request)
  32. except ACLError403 as e:
  33. return error403(request, e.message)
  34. except ACLError404 as e:
  35. return error404(request, e.message)
  36. return self.response()
  37. class DetailsBaseView(ExtraBaseView):
  38. def check_acl(self):
  39. self.request.acl.users.allow_details_view()
  40. def response(self):
  41. return self.request.theme.render_to_response('%ss/details.html' % self.type_prefix,
  42. self.template_vars({
  43. 'type_prefix': self.type_prefix,
  44. 'forum': self.forum,
  45. 'parents': self.parents,
  46. 'thread': self.thread,
  47. 'post': self.post,
  48. }),
  49. context_instance=RequestContext(self.request))
  50. class KarmaVotesBaseView(ExtraBaseView):
  51. def check_acl(self):
  52. self.request.acl.threads.allow_post_votes_view(self.forum)
  53. def response(self):
  54. return self.request.theme.render_to_response('%ss/karmas.html' % self.type_prefix,
  55. self.template_vars({
  56. 'type_prefix': self.type_prefix,
  57. 'forum': self.forum,
  58. 'parents': self.parents,
  59. 'thread': self.thread,
  60. 'post': self.post,
  61. 'upvotes': self.post.karma_set.filter(score=1),
  62. 'downvotes': self.post.karma_set.filter(score=-1),
  63. }),
  64. context_instance=RequestContext(self.request))