list.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from itertools import chain
  2. from django.http import Http404
  3. from django.utils.translation import ugettext as _
  4. from misago.apps.threadtype.list import ThreadsListBaseView, ThreadsListModeration
  5. from misago.conf import settings
  6. from misago import messages
  7. from misago.models import Forum, Thread, User
  8. from misago.readstrackers import ThreadsTracker
  9. from misago.utils.pagination import make_pagination
  10. from misago.apps.privatethreads.mixins import TypeMixin
  11. class ThreadsListView(ThreadsListBaseView, ThreadsListModeration, TypeMixin):
  12. def fetch_forum(self):
  13. self.forum = Forum.objects.get(special='private_threads')
  14. def threads_queryset(self):
  15. qs_threads = self.forum.thread_set.filter(participants__id=self.request.user.pk).order_by('-last')
  16. if self.request.acl.private_threads.is_mod():
  17. qs_reported = self.forum.thread_set.filter(replies_reported__gt=0)
  18. qs_threads = qs_threads | qs_reported
  19. qs_threads = qs_threads.distinct()
  20. return qs_threads
  21. def fetch_threads(self):
  22. qs_threads = self.threads_queryset()
  23. # Add in first and last poster
  24. if settings.avatars_on_threads_list:
  25. qs_threads = qs_threads.prefetch_related('start_poster', 'last_poster')
  26. self.count = qs_threads.count()
  27. try:
  28. self.pagination = make_pagination(self.kwargs.get('page', 0), self.count, settings.threads_per_page)
  29. except Http404:
  30. return self.threads_list_redirect()
  31. tracker_forum = ThreadsTracker(self.request, self.forum)
  32. for thread in qs_threads[self.pagination['start']:self.pagination['stop']]:
  33. thread.is_read = tracker_forum.is_read(thread)
  34. self.threads.append(thread)
  35. def threads_actions(self):
  36. return (('leave', _("Leave threads")),)
  37. def action_leave(self, ids):
  38. left = 0
  39. for thread in self.threads:
  40. if thread.pk in ids:
  41. try:
  42. user = thread.participants.get(id=self.request.user.pk)
  43. thread.participants.remove(user)
  44. thread.threadread_set.filter(id=user.pk).delete()
  45. thread.watchedthread_set.filter(id=user.pk).delete()
  46. user.sync_pds = True
  47. user.save(force_update=True)
  48. left +=1
  49. # If there are no more participants in thread, remove it
  50. if thread.participants.count() == 0:
  51. thread.delete()
  52. # Nope, see if we removed ourselves
  53. else:
  54. thread.set_checkpoint(self.request, 'left')
  55. except User.DoesNotExist:
  56. pass
  57. if left:
  58. messages.success(self.request, _('You have left selected private threads.'), 'threads')
  59. else:
  60. messages.info(self.request, _('You have left no private threads.'), 'threads')