karmas.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. from django.template import RequestContext
  2. from misago.acl.utils import ACLError403, ACLError404
  3. from misago.forums.models import Forum
  4. from misago.threads.models import Thread, Post
  5. from misago.threads.views.base import BaseView
  6. from misago.views import error403, error404
  7. class KarmaVotesView(BaseView):
  8. def fetch_target(self, kwargs):
  9. self.thread = Thread.objects.get(pk=kwargs['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. self.parents = Forum.objects.forum_parents(self.forum.pk, True)
  15. self.post = Post.objects.select_related('user').get(pk=kwargs['post'], thread=self.thread.pk)
  16. self.post.thread = self.thread
  17. self.request.acl.threads.allow_post_view(self.request.user, self.thread, self.post)
  18. self.request.acl.threads.allow_post_votes_view(self.forum)
  19. def __call__(self, request, **kwargs):
  20. self.request = request
  21. self.forum = None
  22. self.thread = None
  23. self.post = None
  24. try:
  25. self.fetch_target(kwargs)
  26. except (Forum.DoesNotExist, Thread.DoesNotExist, Post.DoesNotExist):
  27. return error404(self.request)
  28. except ACLError403 as e:
  29. return error403(request, e.message)
  30. except ACLError404 as e:
  31. return error404(request, e.message)
  32. return request.theme.render_to_response('threads/karmas.html',
  33. {
  34. 'forum': self.forum,
  35. 'parents': self.parents,
  36. 'thread': self.thread,
  37. 'post': self.post,
  38. 'upvotes': self.post.karma_set.filter(score=1),
  39. 'downvotes': self.post.karma_set.filter(score=-1),
  40. },
  41. context_instance=RequestContext(request))