view.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from django.conf import settings
  2. from django.core.exceptions import PermissionDenied
  3. from django.utils.translation import ugettext as _
  4. from misago.acl import add_acl
  5. from misago.core.shortcuts import validate_slug
  6. from misago.forums.lists import get_forum_path
  7. from misago.readtracker import threadstracker
  8. from misago.users.online.utils import get_user_state
  9. from misago.threads.events import add_events_to_posts
  10. from misago.threads.paginator import paginate
  11. from misago.threads.permissions import allow_reply_thread
  12. from misago.threads.reports import make_posts_reports_aware
  13. from misago.threads.views.generic.base import ViewBase
  14. from misago.threads.views.generic.thread.postsactions import PostsActions
  15. from misago.threads.views.generic.thread.threadactions import ThreadActions
  16. __all__ = ['ThreadView']
  17. class ThreadView(ViewBase):
  18. """
  19. Basic view for threads
  20. """
  21. ThreadActions = ThreadActions
  22. PostsActions = PostsActions
  23. template = 'misago/thread/replies.html'
  24. def get_posts(self, user, forum, thread, kwargs):
  25. queryset = self.get_posts_queryset(user, forum, thread)
  26. queryset = self.exclude_invisible_posts(queryset, user, forum, thread)
  27. page = paginate(queryset, kwargs.get('page', 0),
  28. settings.MISAGO_POSTS_PER_PAGE,
  29. settings.MISAGO_THREAD_TAIL)
  30. posts = []
  31. for post in page.object_list:
  32. post.forum = forum
  33. post.thread = thread
  34. add_acl(user, post)
  35. if post.poster:
  36. poster_state = get_user_state(post.poster, user.acl)
  37. post.poster.online_state = poster_state
  38. posts.append(post)
  39. if page.next_page_first_item:
  40. add_events_to_posts(
  41. user, thread, posts, page.next_page_first_item.posted_on)
  42. else:
  43. add_events_to_posts(user, thread, posts)
  44. return page, posts
  45. def get_posts_queryset(self, user, forum, thread):
  46. return thread.post_set.select_related(
  47. 'poster',
  48. 'poster__rank',
  49. 'poster__ban_cache',
  50. 'poster__online_tracker'
  51. ).order_by('id')
  52. def allow_reply_thread(self, user, thread):
  53. allow_reply_thread(user, thread)
  54. def dispatch(self, request, *args, **kwargs):
  55. relations = ['forum', 'starter', 'last_poster', 'first_post']
  56. thread = self.fetch_thread(request, select_related=relations, **kwargs)
  57. forum = thread.forum
  58. self.check_forum_permissions(request, forum)
  59. self.check_thread_permissions(request, thread)
  60. validate_slug(thread, kwargs['thread_slug'])
  61. threadstracker.make_read_aware(request.user, thread)
  62. thread_actions = self.ThreadActions(user=request.user, thread=thread)
  63. posts_actions = self.PostsActions(user=request.user, thread=thread)
  64. if request.method == 'POST':
  65. if thread_actions.query_key in request.POST:
  66. response = thread_actions.handle_post(request, thread)
  67. if response:
  68. return response
  69. if posts_actions.query_key in request.POST:
  70. queryset = self.get_posts_queryset(request.user, forum, thread)
  71. response = posts_actions.handle_post(request, queryset)
  72. if response:
  73. return response
  74. page, posts = self.get_posts(request.user, forum, thread, kwargs)
  75. make_posts_reports_aware(request.user, thread, posts)
  76. threadstracker.make_posts_read_aware(request.user, thread, posts)
  77. threadstracker.read_thread(request.user, thread, posts[-1])
  78. try:
  79. allow_reply_thread(request.user, thread)
  80. thread_reply_message = None
  81. except PermissionDenied as e:
  82. thread_reply_message = unicode(e)
  83. return self.render(request, {
  84. 'link_name': request.resolver_match.view_name,
  85. 'links_params': {
  86. 'thread_id': thread.id, 'thread_slug': thread.slug
  87. },
  88. 'forum': forum,
  89. 'path': get_forum_path(forum),
  90. 'thread': thread,
  91. 'thread_actions': thread_actions,
  92. 'thread_reply_message': thread_reply_message,
  93. 'posts': posts,
  94. 'posts_actions': posts_actions,
  95. 'selected_posts': posts_actions.get_selected_ids(),
  96. 'paginator': page.paginator,
  97. 'page': page,
  98. })