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