thread.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from django.db.models import Q
  2. from django.shortcuts import redirect
  3. from misago.acl import add_acl
  4. from misago.core.shortcuts import paginate
  5. from misago.forums.lists import get_forum_path
  6. from misago.readtracker import threadstracker
  7. from misago.users.online.utils import get_user_state
  8. from misago.threads.views.generic.base import ViewBase
  9. __all__ = ['ThreadView']
  10. class ThreadView(ViewBase):
  11. """
  12. Basic view for threads
  13. """
  14. template = 'misago/thread/replies.html'
  15. def get_posts(self, user, forum, thread, kwargs):
  16. queryset = self.get_posts_queryset(user, forum, thread)
  17. page = paginate(queryset, kwargs.get('page', 0), 10, 5)
  18. posts = []
  19. for post in page.object_list:
  20. add_acl(user, post)
  21. if post.poster:
  22. poster_state = get_user_state(post.poster, user.acl)
  23. post.poster.online_state = poster_state
  24. posts.append(post)
  25. return page, posts
  26. def get_posts_queryset(self, user, forum, thread):
  27. queryset = thread.post_set.select_related(
  28. 'poster', 'poster__rank', 'poster__bancache', 'poster__online')
  29. if user.is_authenticated():
  30. if forum.acl['can_review_moderated_content']:
  31. visibility_condition = Q(is_moderated=False) | Q(poster=user)
  32. queryset = queryset.filter(visibility_condition)
  33. else:
  34. queryset = queryset.filter(is_moderated=False)
  35. return queryset
  36. def dispatch(self, request, *args, **kwargs):
  37. relations = ['forum', 'starter', 'last_poster', 'first_post']
  38. thread = self.fetch_thread(request, select_related=relations, **kwargs)
  39. forum = thread.forum
  40. self.check_forum_permissions(request, forum)
  41. self.check_thread_permissions(request, thread)
  42. threadstracker.make_read_aware(request.user, thread)
  43. page, posts = self.get_posts(request.user, forum, thread, kwargs)
  44. threadstracker.make_posts_read_aware(thread, posts)
  45. threadstracker.read_thread(request.user, thread, posts[-1])
  46. return self.render(request, {
  47. 'forum': forum,
  48. 'path': get_forum_path(forum),
  49. 'thread': thread,
  50. 'posts': posts,
  51. 'page': page,
  52. 'paginator': page.paginator,
  53. })