view.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from django.db.models import Q
  2. from django.utils.translation import ungettext, ugettext_lazy, ugettext as _
  3. from misago.acl import add_acl
  4. from misago.forums.lists import get_forum_path
  5. from misago.readtracker import threadstracker
  6. from misago.users.online.utils import get_user_state
  7. from misago.threads.events import add_events_to_posts
  8. from misago.threads.paginator import paginate
  9. from misago.threads.views.generic.base import ViewBase
  10. from misago.threads.views.generic.thread.postsactions import PostsActions
  11. from misago.threads.views.generic.thread.threadactions import ThreadActions
  12. __all__ = ['ThreadView']
  13. class ThreadView(ViewBase):
  14. """
  15. Basic view for threads
  16. """
  17. ThreadActions = ThreadActions
  18. PostsActions = PostsActions
  19. template = 'misago/thread/replies.html'
  20. def get_posts(self, user, forum, thread, kwargs):
  21. queryset = self.get_posts_queryset(user, forum, thread)
  22. page = paginate(queryset, kwargs.get('page', 0), 10, 5)
  23. posts = []
  24. for post in page.object_list:
  25. add_acl(user, post)
  26. if post.poster:
  27. poster_state = get_user_state(post.poster, user.acl)
  28. post.poster.online_state = poster_state
  29. posts.append(post)
  30. if page.next_page_first_item:
  31. add_events_to_posts(
  32. user, thread, posts, page.next_page_first_item.posted_on)
  33. else:
  34. add_events_to_posts(user, thread, posts)
  35. return page, posts
  36. def get_posts_queryset(self, user, forum, thread):
  37. queryset = thread.post_set.select_related(
  38. 'poster', 'poster__rank', 'poster__bancache', 'poster__online')
  39. if user.is_authenticated():
  40. if forum.acl['can_review_moderated_content']:
  41. visibility_condition = Q(is_moderated=False) | Q(poster=user)
  42. queryset = queryset.filter(visibility_condition)
  43. else:
  44. queryset = queryset.filter(is_moderated=False)
  45. return queryset.order_by('id')
  46. def dispatch(self, request, *args, **kwargs):
  47. relations = ['forum', 'starter', 'last_poster', 'first_post']
  48. thread = self.fetch_thread(request, select_related=relations, **kwargs)
  49. forum = thread.forum
  50. self.check_forum_permissions(request, forum)
  51. self.check_thread_permissions(request, thread)
  52. threadstracker.make_read_aware(request.user, thread)
  53. thread_actions = self.ThreadActions(user=request.user, thread=thread)
  54. posts_actions = self.PostsActions(user=request.user, thread=thread)
  55. if request.method == 'POST':
  56. if thread_actions.query_key in request.POST:
  57. response = thread_actions.handle_post(request, thread)
  58. if response:
  59. return response
  60. page, posts = self.get_posts(request.user, forum, thread, kwargs)
  61. threadstracker.make_posts_read_aware(request.user, thread, posts)
  62. threadstracker.read_thread(request.user, thread, posts[-1])
  63. return self.render(request, {
  64. 'link_name': thread.get_url_name(),
  65. 'links_params': {
  66. 'thread_id': thread.id, 'thread_slug': thread.slug
  67. },
  68. 'forum': forum,
  69. 'path': get_forum_path(forum),
  70. 'thread': thread,
  71. 'thread_actions': thread_actions.get_list(),
  72. 'posts': posts,
  73. 'posts_actions': posts_actions.get_list(),
  74. 'paginator': page.paginator,
  75. 'page': page,
  76. })