threads.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import redirect
  3. from django.utils.translation import ugettext_lazy, ugettext as _
  4. from misago.core.shortcuts import paginate
  5. from misago.readtracker import threadstracker
  6. from misago.threads.models import Label
  7. from misago.threads.views.generic.base import ViewBase
  8. __all__ = ['Sorting', 'Threads', 'ThreadsView']
  9. class Threads(object):
  10. def __init__(self, user):
  11. self.user = user
  12. def sort(self, sort_by):
  13. self.queryset = self.queryset.order_by(sort_by)
  14. def label_threads(self, threads, labels=None):
  15. if labels:
  16. labels_dict = dict([(label.pk, label) for label in labels])
  17. else:
  18. labels_dict = Label.objects.get_cached_labels_dict()
  19. for thread in threads:
  20. thread.label = labels_dict.get(thread.label_id)
  21. def make_threads_read_aware(self, threads):
  22. threadstracker.make_read_aware(self.user, threads)
  23. class Sorting(object):
  24. sortings = (
  25. {
  26. 'method': 'recently-replied',
  27. 'name': ugettext_lazy("Recently replied"),
  28. 'order_by': '-last_post_on',
  29. },
  30. {
  31. 'method': 'last-replied',
  32. 'name': ugettext_lazy("Last replied"),
  33. 'order_by': 'last_post_on',
  34. },
  35. {
  36. 'method': 'most-replied',
  37. 'name': ugettext_lazy("Most replied"),
  38. 'order_by': '-replies',
  39. },
  40. {
  41. 'method': 'least-replied',
  42. 'name': ugettext_lazy("Least replied"),
  43. 'order_by': 'replies',
  44. },
  45. {
  46. 'method': 'newest',
  47. 'name': ugettext_lazy("Newest"),
  48. 'order_by': '-id',
  49. },
  50. {
  51. 'method': 'oldest',
  52. 'name': ugettext_lazy("Oldest"),
  53. 'order_by': 'id',
  54. },
  55. )
  56. def __init__(self, link_name, link_params):
  57. self.link_name = link_name
  58. self.link_params = link_params.copy()
  59. self.default_method = self.sortings[0]['method']
  60. def clean_kwargs(self, kwargs):
  61. sorting = kwargs.get('sort')
  62. if sorting:
  63. if sorting == self.default_method:
  64. kwargs.pop('sort')
  65. return kwargs
  66. available_sortings = [method['method'] for method in self.sortings]
  67. if sorting not in available_sortings:
  68. kwargs.pop('sort')
  69. return kwargs
  70. else:
  71. sorting = self.default_method
  72. self.set_sorting(sorting)
  73. return kwargs
  74. def set_sorting(self, method):
  75. for sorting in self.sortings:
  76. if sorting['method'] == method:
  77. self.sorting = sorting
  78. break
  79. @property
  80. def name(self):
  81. return self.sorting['name']
  82. def choices(self):
  83. choices = []
  84. for sorting in self.sortings:
  85. if sorting['method'] != self.sorting['method']:
  86. if sorting['method'] == self.default_method:
  87. self.link_params.pop('sort', None)
  88. else:
  89. self.link_params['sort'] = sorting['method']
  90. url = reverse(self.link_name, kwargs=self.link_params)
  91. choices.append({
  92. 'name': sorting['name'],
  93. 'url': url,
  94. })
  95. return choices
  96. def sort(self, threads):
  97. threads.sort(self.sorting['order_by'])
  98. class ThreadsView(ViewBase):
  99. def get_threads(self, request, kwargs):
  100. queryset = self.get_threads_queryset(request, forum)
  101. queryset = threads_qs.order_by('-last_post_id')
  102. page = paginate(threads_qs, kwargs.get('page', 0), 30, 10)
  103. threads = [thread for thread in page.object_list]
  104. return page, threads
  105. def get_threads_queryset(self, request):
  106. return forum.thread_set.all().order_by('-last_post_id')
  107. def clean_kwargs(self, request, kwargs):
  108. cleaned_kwargs = kwargs.copy()
  109. if request.user.is_anonymous():
  110. """we don't allow sort/filter for guests"""
  111. cleaned_kwargs.pop('sort', None)
  112. cleaned_kwargs.pop('show', None)
  113. return cleaned_kwargs