view.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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(
  28. request.user, self.link_name, cleaned_kwargs)
  29. cleaned_kwargs = filtering.clean_kwargs(cleaned_kwargs)
  30. if cleaned_kwargs != kwargs:
  31. return redirect(self.link_name, **cleaned_kwargs)
  32. threads = self.Threads(request.user)
  33. if self.Sorting:
  34. sorting.sort(threads)
  35. if self.Filtering:
  36. filtering.filter(threads)
  37. actions = None
  38. if self.Actions:
  39. actions = self.Actions(user=request.user)
  40. if request.method == 'POST':
  41. # see if we can delegate anything to actions manager
  42. response = actions.handle_post(request, threads.get_queryset())
  43. if response:
  44. return response
  45. # build template context
  46. context = {
  47. 'link_name': self.link_name,
  48. 'links_params': cleaned_kwargs,
  49. 'threads': threads.list(page_number),
  50. 'threads_count': threads.count(),
  51. 'page': threads.page,
  52. 'paginator': threads.paginator,
  53. }
  54. if self.Sorting:
  55. context.update({'sorting': sorting})
  56. if self.Filtering:
  57. context.update({'filtering': filtering})
  58. if self.Actions:
  59. context.update({
  60. 'threads_actions': actions,
  61. 'selected_threads': actions.get_selected_ids(),
  62. })
  63. return self.render(request, context)