thread.py 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import redirect
  3. from django.template import RequestContext
  4. from django.utils.translation import ugettext as _
  5. from misago.acl.utils import ACLError403, ACLError404
  6. from misago.forms import FormFields
  7. from misago.forums.models import Forum
  8. from misago.readstracker.trackers import ThreadsTracker
  9. from misago.threads.forms import QuickReplyForm
  10. from misago.threads.models import Thread, Post
  11. from misago.threads.views.base import BaseView
  12. from misago.views import error403, error404
  13. from misago.utils import make_pagination
  14. class ThreadView(BaseView):
  15. def fetch_thread(self, thread):
  16. self.thread = Thread.objects.get(pk=thread)
  17. self.forum = self.thread.forum
  18. self.request.acl.forums.allow_forum_view(self.forum)
  19. self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
  20. self.parents = Forum.objects.forum_parents(self.forum.pk)
  21. self.tracker = ThreadsTracker(self.request.user, self.forum)
  22. def fetch_posts(self, page):
  23. self.count = self.request.acl.threads.filter_posts(self.request, self.thread, Post.objects.filter(thread=self.thread)).count()
  24. self.posts = self.request.acl.threads.filter_posts(self.request, self.thread, Post.objects.filter(thread=self.thread)).prefetch_related('checkpoint_set', 'user', 'user__rank')
  25. if self.thread.merges > 0:
  26. self.posts = self.posts.order_by('merge', 'pk')
  27. else:
  28. self.posts = self.posts.order_by('pk')
  29. self.pagination = make_pagination(page, self.count, self.request.settings.posts_per_page)
  30. if self.request.settings.posts_per_page < self.count:
  31. self.posts = self.posts[self.pagination['start']:self.pagination['stop']]
  32. self.read_date = self.tracker.get_read_date(self.thread)
  33. for post in self.posts:
  34. post.message = self.request.messages.get_message('threads_%s' % post.pk)
  35. post.is_read = post.date <= self.read_date
  36. last_post = self.posts[len(self.posts) - 1]
  37. if not self.tracker.is_read(self.thread):
  38. self.tracker.set_read(self.thread, last_post)
  39. self.tracker.sync()
  40. def __call__(self, request, slug=None, thread=None, page=0):
  41. self.request = request
  42. self.pagination = None
  43. self.parents = None
  44. try:
  45. self.fetch_thread(thread)
  46. self.fetch_posts(page)
  47. except Thread.DoesNotExist:
  48. return error404(self.request)
  49. except ACLError403 as e:
  50. return error403(request, e.message)
  51. except ACLError404 as e:
  52. return error404(request, e.message)
  53. return request.theme.render_to_response('threads/thread.html',
  54. {
  55. 'message': request.messages.get_message('threads'),
  56. 'forum': self.forum,
  57. 'parents': self.parents,
  58. 'thread': self.thread,
  59. 'is_read': self.tracker.is_read(self.thread),
  60. 'count': self.count,
  61. 'posts': self.posts,
  62. 'pagination': self.pagination,
  63. 'quick_reply': FormFields(QuickReplyForm(request=request)).fields
  64. },
  65. context_instance=RequestContext(request));