list.py 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from itertools import chain
  2. from django.utils.translation import ugettext as _
  3. from misago.apps.threadtype.list import ThreadsListBaseView, ThreadsListModeration
  4. from misago.models import Forum, Thread
  5. from misago.readstrackers import ThreadsTracker
  6. from misago.utils.pagination import make_pagination
  7. from misago.apps.threads.mixins import TypeMixin
  8. class ThreadsListView(ThreadsListBaseView, ThreadsListModeration, TypeMixin):
  9. def fetch_forum(self):
  10. self.forum = Forum.objects.get(pk=self.kwargs.get('forum'), type='forum')
  11. def threads_queryset(self):
  12. announcements = Forum.objects.special_model('announcements')
  13. annos_global = announcements.thread_set.filter(deleted=False).filter(moderated=False).order_by('-pk')
  14. annos_forum = self.request.acl.threads.filter_threads(self.request, self.forum, self.forum.thread_set).filter(weight=2).order_by('-pk')
  15. rest = self.request.acl.threads.filter_threads(self.request, self.forum, self.forum.thread_set).filter(weight__lt=2).order_by('-last')
  16. # Dont display threads by ignored users (unless they are important)
  17. if self.request.user.is_authenticated():
  18. ignored_users = self.request.user.ignored_users()
  19. if ignored_users:
  20. 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])])
  21. # Add in first and last poster
  22. if self.request.settings.avatars_on_threads_list:
  23. annos_global = annos_global.prefetch_related('start_poster', 'last_poster')
  24. annos_forum = annos_forum.prefetch_related('start_poster', 'last_poster')
  25. rest = rest.prefetch_related('start_poster', 'last_poster')
  26. return annos_global, annos_forum, rest
  27. def fetch_threads(self):
  28. qs_global, qs_forum, qs_rest = self.threads_queryset()
  29. self.count = qs_rest.count()
  30. self.pagination = make_pagination(self.kwargs.get('page', 0), self.count, self.request.settings.threads_per_page)
  31. tracker_annos = ThreadsTracker(self.request, Forum.objects.special_model('announcements'))
  32. tracker_forum = ThreadsTracker(self.request, self.forum)
  33. for thread in list(chain(qs_global, qs_forum, qs_rest[self.pagination['start']:self.pagination['stop']])):
  34. if thread.forum_id == self.forum.pk:
  35. thread.is_read = tracker_forum.is_read(thread)
  36. else:
  37. thread.weight = 2
  38. thread.is_read = tracker_annos.is_read(thread)
  39. self.threads.append(thread)
  40. def threads_actions(self):
  41. acl = self.request.acl.threads.get_role(self.forum)
  42. actions = []
  43. try:
  44. if acl['can_approve']:
  45. actions.append(('accept', _('Accept threads')))
  46. if acl['can_pin_threads'] == 2:
  47. actions.append(('annouce', _('Change to announcements')))
  48. if acl['can_pin_threads'] > 0:
  49. actions.append(('sticky', _('Change to sticky threads')))
  50. if acl['can_pin_threads'] > 0:
  51. actions.append(('normal', _('Change to standard thread')))
  52. if acl['can_move_threads_posts']:
  53. actions.append(('move', _('Move threads')))
  54. actions.append(('merge', _('Merge threads')))
  55. if acl['can_close_threads']:
  56. actions.append(('open', _('Open threads')))
  57. actions.append(('close', _('Close threads')))
  58. if acl['can_delete_threads']:
  59. actions.append(('undelete', _('Undelete threads')))
  60. actions.append(('soft', _('Soft delete threads')))
  61. if acl['can_delete_threads'] == 2:
  62. actions.append(('hard', _('Hard delete threads')))
  63. except KeyError:
  64. pass
  65. return actions