views.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from django.core.urlresolvers import reverse
  2. from django.db.models import Q, F
  3. from django.http import Http404
  4. from django.shortcuts import redirect
  5. from django.template import RequestContext
  6. from django.utils.translation import ugettext as _
  7. from misago.apps.errors import error403
  8. from misago.conf import settings
  9. from misago.decorators import block_guest
  10. from misago.models import Forum, WatchedThread, ThreadPrefix
  11. from misago.shortcuts import render_to_response
  12. from misago.utils.pagination import make_pagination
  13. @block_guest
  14. def watched_threads(request, page=0, new=False):
  15. # Find mode and fetch threads
  16. readable_forums = Forum.objects.readable_forums(request.acl, True)
  17. starter_readable_forums = Forum.objects.starter_readable_forums(request.acl)
  18. if not readable_forums and not readable_forums:
  19. return error403(request, _("%(username), you cannot read any forums.") % {'username': request.user.username})
  20. private_threads_pk = Forum.objects.special_pk('private_threads')
  21. if not settings.enable_private_threads and private_threads_pk in readable_forums:
  22. readable_forums.remove(private_threads_pk)
  23. queryset = WatchedThread.objects.filter(user=request.user).filter(thread__moderated=False).filter(thread__deleted=False).select_related('thread')
  24. if starter_readable_forums and readable_forums:
  25. queryset = queryset.filter(Q(forum_id__in=readable_forums) | Q(forum_id__in=starter_readable_forums, starter_id=request.user.pk))
  26. elif starter_readable_forums:
  27. queryset = queryset.filter(starter_id__in=request.user.pk).filter(forum_id__in=starter_readable_forums)
  28. else:
  29. queryset = queryset.filter(forum_id__in=readable_forums)
  30. if settings.avatars_on_threads_list:
  31. queryset = queryset.prefetch_related('thread__last_poster')
  32. if new:
  33. queryset = queryset.filter(last_read__lt=F('thread__last'))
  34. count = queryset.count()
  35. try:
  36. pagination = make_pagination(page, count, settings.threads_per_page)
  37. except Http404:
  38. if new:
  39. return redirect(reverse('watched_threads_new'))
  40. return redirect(reverse('watched_threads'))
  41. queryset = queryset.order_by('-thread__last')
  42. if settings.threads_per_page < count:
  43. queryset = queryset[pagination['start']:pagination['stop']]
  44. queryset.prefetch_related('thread__forum', 'thread__start_poster', 'thread__last_poster')
  45. threads = []
  46. for thread in queryset:
  47. thread.thread.send_email = thread.email
  48. thread.thread.is_read = thread.thread.last <= thread.last_read
  49. threads.append(thread.thread)
  50. # Display page
  51. return render_to_response('watched.html',
  52. {
  53. 'items_total': count,
  54. 'pagination': pagination,
  55. 'new': new,
  56. 'threads': threads,
  57. 'prefixes': ThreadPrefix.objects.all_prefixes(),
  58. 'message': request.messages.get_message('threads'),
  59. },
  60. context_instance=RequestContext(request))