views.py 3.2 KB

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