threads.py 4.4 KB

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