threads.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from misago.core.shortcuts import paginate
  2. from misago.threads.permissions import exclude_invisible_threads
  3. from misago.threads.views.generic.threads import Threads
  4. __all__ = ['ForumThreads']
  5. class ForumThreads(Threads):
  6. def __init__(self, user, forum):
  7. self.user = user
  8. self.forum = forum
  9. self.filter_by = None
  10. self.sort_by = '-last_post_on'
  11. def filter(self, filter_by):
  12. self.filter_by = filter_by
  13. def sort(self, sort_by):
  14. self.sort_by = sort_by
  15. def list(self, page=0):
  16. queryset = self.get_queryset()
  17. queryset = queryset.order_by(self.sort_by)
  18. pinned_qs = queryset.filter(is_pinned=True)
  19. threads_qs = queryset.filter(is_pinned=False)
  20. self._page = paginate(threads_qs, page, 20, 10)
  21. self._paginator = self._page.paginator
  22. threads = []
  23. for thread in pinned_qs:
  24. threads.append(thread)
  25. for thread in self._page.object_list:
  26. threads.append(thread)
  27. for thread in threads:
  28. thread.forum = self.forum
  29. self.label_threads(threads, self.forum.labels)
  30. self.make_threads_read_aware(threads)
  31. return threads
  32. def filter_threads(self, queryset):
  33. if self.filter_by == 'my-threads':
  34. return queryset.filter(starter_id=self.user.id)
  35. else:
  36. if self.forum.acl['can_see_own_threads']:
  37. if self.user.is_authenticated():
  38. queryset = queryset.filter(starter_id=self.user.id)
  39. else:
  40. queryset = queryset.filter(starter_id=0)
  41. if self.filter_by == 'reported':
  42. return queryset.filter(has_reported_posts=True)
  43. elif self.filter_by == 'moderated-threads':
  44. return queryset.filter(is_moderated=True)
  45. elif self.filter_by == 'moderated-posts':
  46. return queryset.filter(has_moderated_posts=True)
  47. else:
  48. for label in self.forum.labels:
  49. if label.slug == self.filter_by:
  50. return queryset.filter(label_id=label.pk)
  51. else:
  52. return queryset
  53. def get_queryset(self):
  54. queryset = exclude_invisible_threads(
  55. self.user, self.forum, self.forum.thread_set)
  56. return self.filter_threads(queryset)
  57. error_message = ("threads list has to be loaded via call to list() before "
  58. "pagination data will be available")
  59. @property
  60. def paginator(self):
  61. try:
  62. return self._paginator
  63. except AttributeError:
  64. raise AttributeError(self.error_message)
  65. @property
  66. def page(self):
  67. try:
  68. return self._page
  69. except AttributeError:
  70. raise AttributeError(self.error_message)