details.py 3.2 KB

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