view.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from misago.core.shortcuts import paginate
  2. from misago.threads.views.generic.base import ViewBase
  3. from misago.threads.views.generic.threads.sorting import Sorting
  4. __all__ = ['ThreadsView']
  5. class ThreadsView(ViewBase):
  6. """
  7. Basic view for generic threads lists
  8. """
  9. Threads = None
  10. Sorting = Sorting
  11. Filtering = None
  12. Actions = None
  13. def clean_kwargs(self, request, kwargs):
  14. cleaned_kwargs = kwargs.copy()
  15. if request.user.is_anonymous():
  16. """we don't allow sort/filter for guests"""
  17. cleaned_kwargs.pop('sort', None)
  18. cleaned_kwargs.pop('show', None)
  19. return cleaned_kwargs
  20. def dispatch(self, request, *args, **kwargs):
  21. page_number = kwargs.pop('page', None)
  22. cleaned_kwargs = self.clean_kwargs(request, kwargs)
  23. if self.Sorting:
  24. sorting = self.Sorting(self.link_name, cleaned_kwargs)
  25. cleaned_kwargs = sorting.clean_kwargs(cleaned_kwargs)
  26. if self.Filtering:
  27. filtering = self.Filtering(self.link_name, cleaned_kwargs)
  28. cleaned_kwargs = filtering.clean_kwargs(cleaned_kwargs)
  29. if cleaned_kwargs != kwargs:
  30. return redirect(self.link_name, **cleaned_kwargs)
  31. threads = self.Threads(request.user)
  32. if self.Sorting:
  33. sorting.sort(threads)
  34. if self.Filtering:
  35. filtering.filter(threads)
  36. actions = None
  37. if self.Actions:
  38. actions = self.Actions(user=request.user)
  39. if request.method == 'POST':
  40. # see if we can delegate anything to actions manager
  41. response = actions.handle_post(request, threads.get_queryset())
  42. if response:
  43. return response
  44. # build template context
  45. context = {
  46. 'link_name': self.link_name,
  47. 'links_params': cleaned_kwargs,
  48. 'threads': threads.list(page_number),
  49. 'threads_count': threads.count(),
  50. 'page': threads.page,
  51. 'paginator': threads.paginator,
  52. }
  53. if self.Sorting:
  54. context.update({'sorting': sorting})
  55. if self.Filtering:
  56. context.update({'filtering': filtering})
  57. if self.Actions:
  58. context.update({
  59. 'threads_actions': actions,
  60. 'selected_threads': actions.get_selected_ids(),
  61. })
  62. return self.render(request, context)