view.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from django.shortcuts import redirect
  2. from misago.core.shortcuts import validate_slug
  3. from misago.forums.lists import get_forums_list, get_forum_path
  4. from misago.readtracker import forumstracker
  5. from misago.threads.models import Label
  6. from misago.threads.views.generic.forum.actions import ForumActions
  7. from misago.threads.views.generic.forum.filtering import ForumFiltering
  8. from misago.threads.views.generic.forum.threads import ForumThreads
  9. from misago.threads.views.generic.threads import Sorting, ThreadsView
  10. __all__ = ['ForumView']
  11. class ForumView(ThreadsView):
  12. """
  13. Basic view for forum threads lists
  14. """
  15. template = 'misago/threads/forum.html'
  16. link_name = 'misago:forum'
  17. Threads = ForumThreads
  18. Sorting = Sorting
  19. Filtering = ForumFiltering
  20. Actions = ForumActions
  21. def dispatch(self, request, *args, **kwargs):
  22. forum = self.get_forum(request, **kwargs)
  23. validate_slug(forum, kwargs['forum_slug'])
  24. forum.labels = Label.objects.get_forum_labels(forum)
  25. if forum.lft + 1 < forum.rght:
  26. forum.subforums = get_forums_list(request.user, forum)
  27. else:
  28. forum.subforums = []
  29. page_number = kwargs.pop('page', None)
  30. cleaned_kwargs = self.clean_kwargs(request, kwargs)
  31. sorting = self.Sorting(self.link_name, cleaned_kwargs)
  32. cleaned_kwargs = sorting.clean_kwargs(cleaned_kwargs)
  33. filtering = self.Filtering(forum, self.link_name, cleaned_kwargs)
  34. cleaned_kwargs = filtering.clean_kwargs(cleaned_kwargs)
  35. if cleaned_kwargs != kwargs:
  36. return redirect(self.link_name, **cleaned_kwargs)
  37. threads = self.Threads(request.user, forum)
  38. sorting.sort(threads)
  39. filtering.filter(threads)
  40. actions = self.Actions(user=request.user, forum=forum)
  41. if request.method == 'POST':
  42. response = actions.handle_post(request, threads.get_queryset())
  43. if response:
  44. return response
  45. return self.render(request, {
  46. 'link_name': self.link_name,
  47. 'links_params': cleaned_kwargs,
  48. 'forum': forum,
  49. 'path': get_forum_path(forum),
  50. 'threads': threads.list(page_number),
  51. 'threads_count': threads.count(),
  52. 'page': threads.page,
  53. 'paginator': threads.paginator,
  54. 'threads_actions': actions,
  55. 'selected_threads': actions.get_selected_ids(),
  56. 'sorting': sorting,
  57. 'filtering': filtering,
  58. })