view.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. Threads = ForumThreads
  17. Sorting = Sorting
  18. Filtering = ForumFiltering
  19. Actions = ForumActions
  20. def dispatch(self, request, *args, **kwargs):
  21. forum = self.get_forum(request, **kwargs)
  22. validate_slug(forum, kwargs['forum_slug'])
  23. forum.labels = Label.objects.get_forum_labels(forum)
  24. if forum.lft + 1 < forum.rght:
  25. forum.subforums = get_forums_list(request.user, forum)
  26. else:
  27. forum.subforums = []
  28. page_number = kwargs.pop('page', None)
  29. cleaned_kwargs = self.clean_kwargs(request, kwargs)
  30. link_name = request.resolver_match.view_name
  31. sorting = self.Sorting(link_name, cleaned_kwargs)
  32. cleaned_kwargs = sorting.clean_kwargs(cleaned_kwargs)
  33. filtering = self.Filtering(forum, link_name, cleaned_kwargs)
  34. cleaned_kwargs = filtering.clean_kwargs(cleaned_kwargs)
  35. if cleaned_kwargs != kwargs:
  36. return redirect(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': 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. })