details.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  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.threads.views.base import BaseView
  6. class DetailsView(BaseView):
  7. def fetch_target(self, kwargs):
  8. self.thread = Thread.objects.get(pk=kwargs['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. self.parents = Forum.objects.forum_parents(self.forum.pk, True)
  14. self.post = Post.objects.select_related('user').get(pk=kwargs['post'], thread=self.thread.pk)
  15. self.post.thread = self.thread
  16. self.request.acl.threads.allow_post_view(self.request.user, self.thread, self.post)
  17. self.request.acl.users.allow_details_view()
  18. def __call__(self, request, **kwargs):
  19. self.request = request
  20. self.forum = None
  21. self.thread = None
  22. self.post = None
  23. try:
  24. self.fetch_target(kwargs)
  25. except (Forum.DoesNotExist, Thread.DoesNotExist, Post.DoesNotExist):
  26. return error404(self.request)
  27. except ACLError403 as e:
  28. return error403(request, e.message)
  29. except ACLError404 as e:
  30. return error404(request, e.message)
  31. return request.theme.render_to_response('threads/details.html',
  32. {
  33. 'forum': self.forum,
  34. 'parents': self.parents,
  35. 'thread': self.thread,
  36. 'post': self.post,
  37. },
  38. context_instance=RequestContext(request))