views.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from itertools import chain
  2. from misago.apps.forumbase.list import ThreadsListBaseView
  3. from misago.models import Forum, Thread
  4. from misago.readstrackers import ThreadsTracker
  5. from misago.utils.pagination import make_pagination
  6. from misago.apps.threads.mixins import TypeMixin
  7. class ThreadsListView(ThreadsListBaseView, TypeMixin):
  8. def fetch_forum(self):
  9. self.forum = Forum.objects.get(pk=self.kwargs.get('forum'), type='forum')
  10. def threads_queryset(self):
  11. announcements = Forum.objects.special_model('announcements')
  12. annos_global = announcements.thread_set.filter(deleted=False).filter(moderated=False)
  13. annos_forum = self.request.acl.threads.filter_threads(self.request, self.forum, self.forum.thread_set).filter(weight=2)
  14. rest = self.request.acl.threads.filter_threads(self.request, self.forum, self.forum.thread_set).filter(weight__lt=2)
  15. # Dont display threads by ignored users (unless they are important)
  16. if self.request.user.is_authenticated():
  17. ignored_users = self.request.user.ignored_users()
  18. if ignored_users:
  19. rest = rest.extra(where=["`threads_thread`.`start_poster_id` IS NULL OR `threads_thread`.`start_poster_id` NOT IN (%s)" % ','.join([str(i) for i in ignored_users])])
  20. # Add in first and last poster
  21. if self.request.settings.avatars_on_threads_list:
  22. annos_global = annos_global.prefetch_related('start_poster', 'last_poster')
  23. annos_forum = annos_forum.prefetch_related('start_poster', 'last_poster')
  24. rest = rest.prefetch_related('start_poster', 'last_poster')
  25. return annos_global, annos_forum, rest
  26. def fetch_threads(self):
  27. qs_global, qs_forum, qs_rest = self.threads_queryset()
  28. self.count = qs_rest.count()
  29. self.pagination = make_pagination(self.kwargs.get('page', 0), self.count, self.request.settings.threads_per_page)
  30. tracker_annos = ThreadsTracker(self.request, Forum.objects.special_model('announcements'))
  31. tracker_forum = ThreadsTracker(self.request, self.forum)
  32. for thread in list(chain(qs_global, qs_forum, qs_rest[self.pagination['start']:self.pagination['stop']])):
  33. if thread.forum_id == self.forum.pk:
  34. thread.is_read = tracker_forum.is_read(thread)
  35. else:
  36. thread.weight = 2
  37. thread.is_read = tracker_annos.is_read(thread)
  38. self.threads.append(thread)