threads.py 3.0 KB

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