view.py 2.5 KB

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