views.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from misago.apps.forumbase.list import ThreadsListBaseView
  2. from misago.models import Forum, Thread
  3. from misago.utils.pagination import make_pagination
  4. from misago.apps.threads.mixins import TypeMixin
  5. class ThreadsListView(ThreadsListBaseView, TypeMixin):
  6. def fetch_forum(self):
  7. self.forum = Forum.objects.get(pk=self.kwargs.get('forum'), type='forum')
  8. def threads_queryset(self):
  9. announcements = Forum.objects.special_model('announcements')
  10. annos_global = self.request.acl.threads.filter_threads(self.request, announcements, announcements.thread_set).order_by('-weight')
  11. annos_forum = self.request.acl.threads.filter_threads(self.request, self.forum, self.forum.thread_set).filter(weight=2)
  12. rest = self.request.acl.threads.filter_threads(self.request, self.forum, self.forum.thread_set).filter(weight=2)
  13. # Dont display threads by ignored users (unless they are important)
  14. if self.request.user.is_authenticated():
  15. ignored_users = self.request.user.ignored_users()
  16. if ignored_users:
  17. 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])])
  18. # Return two
  19. if self.request.settings.avatars_on_threads_list:
  20. return ((annos_global | annos_forum | rest).prefetch_related('start_poster', 'last_poster'),
  21. rest.prefetch_related('start_poster', 'last_poster'))
  22. return (annos_global | annos_forum | rest), rest
  23. def fetch_threads(self):
  24. self.threads = []
  25. ignored_users = []
  26. queryset, threads = self.threads_queryset()
  27. for thread in queryset:
  28. self.threads.append(thread)
  29. self.count =threads.count()
  30. self.pagination = make_pagination(self.kwargs.get('page', 0), self.count, self.request.settings.threads_per_page)
  31. """
  32. queryset_anno = Thread.objects.filter(Q(forum=Forum.objects.token_to_pk('announcements')) | (Q(forum=self.forum) & Q(weight=2)))
  33. queryset_threads = self.request.acl.threads.filter_threads(self.request, self.forum, Thread.objects.filter(forum=self.forum).filter(weight__lt=2)).order_by('-weight', '-last')
  34. if self.request.user.is_authenticated():
  35. ignored_users = self.request.user.ignored_users()
  36. if ignored_users:
  37. queryset_threads = queryset_threads.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])])
  38. if self.request.settings.avatars_on_threads_list:
  39. queryset_anno = queryset_anno.prefetch_related('start_poster', 'last_post')
  40. queryset_threads = queryset_threads.prefetch_related('start_poster', 'last_poster')
  41. for thread in queryset_anno:
  42. self.threads.append(thread)
  43. for thread in queryset_threads:
  44. self.threads.append(thread)
  45. if self.request.settings.threads_per_page < self.count:
  46. self.threads = self.threads[self.pagination['start']:self.pagination['stop']]
  47. for thread in self.threads:
  48. if thread.forum_id == self.forum.pk:
  49. thread.is_read = self.tracker.is_read(thread)
  50. thread.last_poster_ignored = thread.last_poster_id in ignored_users
  51. """