12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- from itertools import chain
- from misago.apps.forumbase.list import ThreadsListBaseView
- from misago.models import Forum, Thread
- from misago.readstrackers import ThreadsTracker
- from misago.utils.pagination import make_pagination
- from misago.apps.threads.mixins import TypeMixin
- class ThreadsListView(ThreadsListBaseView, TypeMixin):
- def fetch_forum(self):
- self.forum = Forum.objects.get(pk=self.kwargs.get('forum'), type='forum')
- def threads_queryset(self):
- announcements = Forum.objects.special_model('announcements')
- annos_global = announcements.thread_set.filter(deleted=False).filter(moderated=False)
- annos_forum = self.request.acl.threads.filter_threads(self.request, self.forum, self.forum.thread_set).filter(weight=2)
- rest = self.request.acl.threads.filter_threads(self.request, self.forum, self.forum.thread_set).filter(weight__lt=2)
- # Dont display threads by ignored users (unless they are important)
- if self.request.user.is_authenticated():
- ignored_users = self.request.user.ignored_users()
- if ignored_users:
- 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])])
- # Add in first and last poster
- if self.request.settings.avatars_on_threads_list:
- annos_global = annos_global.prefetch_related('start_poster', 'last_poster')
- annos_forum = annos_forum.prefetch_related('start_poster', 'last_poster')
- rest = rest.prefetch_related('start_poster', 'last_poster')
- return annos_global, annos_forum, rest
- def fetch_threads(self):
- qs_global, qs_forum, qs_rest = self.threads_queryset()
- self.count = qs_rest.count()
- self.pagination = make_pagination(self.kwargs.get('page', 0), self.count, self.request.settings.threads_per_page)
- tracker_annos = ThreadsTracker(self.request, Forum.objects.special_model('announcements'))
- tracker_forum = ThreadsTracker(self.request, self.forum)
- for thread in list(chain(qs_global, qs_forum, qs_rest[self.pagination['start']:self.pagination['stop']])):
- if thread.forum_id == self.forum.pk:
- thread.is_read = tracker_forum.is_read(thread)
- else:
- thread.weight = 2
- thread.is_read = tracker_annos.is_read(thread)
- self.threads.append(thread)
|