threads.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from misago.core.shortcuts import paginate
  2. from misago.readtracker import categoriestracker, threadstracker
  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, category):
  8. self.user = user
  9. self.category = category
  10. categoriestracker.make_read_aware(user, category)
  11. self.pinned_count = 0
  12. self.filter_by = None
  13. self.sort_by = '-last_post_on'
  14. def list(self, page=0):
  15. queryset = self.get_queryset()
  16. queryset = queryset.order_by(self.sort_by)
  17. pinned_qs = queryset.filter(is_pinned=True)
  18. threads_qs = queryset.filter(is_pinned=False)
  19. self._page = paginate(threads_qs, page, 20, 10)
  20. self._paginator = self._page.paginator
  21. threads = []
  22. if self.fetch_pinned_threads:
  23. for thread in pinned_qs:
  24. threads.append(thread)
  25. self.pinned_count += 1
  26. for thread in self._page.object_list:
  27. threads.append(thread)
  28. for thread in threads:
  29. thread.category = self.category
  30. self.label_threads(threads, self.category.labels)
  31. self.make_threads_read_aware(threads)
  32. return threads
  33. def get_queryset(self):
  34. queryset = exclude_invisible_threads(
  35. self.category.thread_set, self.user, self.category)
  36. return self.filter_threads(queryset)
  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.category.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.category.labels:
  54. if label.slug == self.filter_by:
  55. return queryset.filter(label_id=label.pk)
  56. else:
  57. return queryset
  58. def make_threads_read_aware(self, threads):
  59. threadstracker.make_threads_read_aware(self.user, threads, self.category)