list.py 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from itertools import chain
  2. from django.core.urlresolvers import reverse
  3. from django.http import Http404
  4. from django.shortcuts import redirect
  5. from django.utils.translation import ugettext as _
  6. from misago.apps.threadtype.list import ThreadsListBaseView, ThreadsListModeration
  7. from misago.messages import Message
  8. from misago.models import Forum, Thread
  9. from misago.readstrackers import ThreadsTracker
  10. from misago.utils.pagination import make_pagination
  11. from misago.apps.reports.mixins import TypeMixin
  12. class ThreadsListView(ThreadsListBaseView, ThreadsListModeration, TypeMixin):
  13. def fetch_forum(self):
  14. self.forum = Forum.objects.get(special='reports')
  15. def threads_queryset(self):
  16. announcements = self.forum.thread_set.filter(weight=2).order_by('-pk')
  17. threads = self.forum.thread_set.filter(weight__lt=2).order_by('-weight', '-last')
  18. # Add in first and last poster
  19. if self.request.settings.avatars_on_threads_list:
  20. announcements = announcements.prefetch_related('start_poster', 'last_poster')
  21. threads = threads.prefetch_related('start_poster', 'last_poster')
  22. return announcements, threads
  23. def fetch_threads(self):
  24. qs_announcements, qs_threads = self.threads_queryset()
  25. self.count = qs_threads.count()
  26. try:
  27. self.pagination = make_pagination(self.kwargs.get('page', 0), self.count, self.request.settings.threads_per_page)
  28. except Http404:
  29. return self.threads_list_redirect()
  30. tracker_forum = ThreadsTracker(self.request, self.forum)
  31. unresolved_count = 0
  32. for thread in list(chain(qs_announcements, qs_threads[self.pagination['start']:self.pagination['stop']])):
  33. if thread.weight == 2:
  34. unresolved_count += 1
  35. thread.is_read = tracker_forum.is_read(thread)
  36. self.threads.append(thread)
  37. if int(self.request.monitor['reported_posts']) != unresolved_count:
  38. self.request.monitor['reported_posts'] = unresolved_count
  39. def threads_actions(self):
  40. acl = self.request.acl.threads.get_role(self.forum)
  41. actions = []
  42. try:
  43. actions.append(('sticky', _('Change to resolved')))
  44. actions.append(('normal', _('Change to bogus')))
  45. if acl['can_delete_threads']:
  46. actions.append(('undelete', _('Restore threads')))
  47. actions.append(('soft', _('Hide threads')))
  48. if acl['can_delete_threads'] == 2:
  49. actions.append(('hard', _('Delete threads')))
  50. except KeyError:
  51. pass
  52. return actions
  53. def action_sticky(self, ids):
  54. if self._action_sticky(ids):
  55. self.request.messages.set_flash(Message(_('Selected reports were set as resolved.')), 'success', 'threads')
  56. else:
  57. self.request.messages.set_flash(Message(_('No reports were set as resolved.')), 'info', 'threads')
  58. def action_normal(self, ids):
  59. if self._action_normal(ids):
  60. self.request.messages.set_flash(Message(_('Selected reports were set as bogus.')), 'success', 'threads')
  61. else:
  62. self.request.messages.set_flash(Message(_('No reports were set as bogus.')), 'info', 'threads')
  63. def action_undelete(self, ids):
  64. if self._action_undelete(ids):
  65. self.request.messages.set_flash(Message(_('Selected reports have been restored.')), 'success', 'threads')
  66. else:
  67. self.request.messages.set_flash(Message(_('No reports were restored.')), 'info', 'threads')
  68. def action_soft(self, ids):
  69. if self._action_soft(ids):
  70. self.request.messages.set_flash(Message(_('Selected reports have been hidden.')), 'success', 'threads')
  71. else:
  72. self.request.messages.set_flash(Message(_('No reports were hidden.')), 'info', 'threads')
  73. def action_hard(self, ids):
  74. if self._action_hard(ids):
  75. self.request.messages.set_flash(Message(_('Selected reports have been deleted.')), 'success', 'threads')
  76. else:
  77. self.request.messages.set_flash(Message(_('No reports were deleted.')), 'info', 'threads')