threads.py 4.2 KB

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