views.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from django import forms
  2. from django.core.urlresolvers import reverse
  3. from django.db.models import 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.conf import settings
  9. from misago.decorators import block_guest
  10. from misago.forms import Form, FormLayout, FormFields
  11. from misago.messages import Message
  12. from misago.models import Forum, WatchedThread
  13. from misago.shortcuts import render_to_response
  14. from misago.utils.pagination import make_pagination
  15. @block_guest
  16. def watched_threads(request, page=0, new=False):
  17. # Find mode and fetch threads
  18. readable_forums = Forum.objects.readable_forums(request.acl, True)
  19. if not settings.enable_private_threads:
  20. readable_forums.remove(Forum.objects.special_pk('private_threads'))
  21. queryset = WatchedThread.objects.filter(user=request.user).filter(forum_id__in=readable_forums).select_related('thread').filter(thread__moderated=False).filter(thread__deleted=False)
  22. if settings.avatars_on_threads_list:
  23. queryset = queryset.prefetch_related('thread__last_poster')
  24. if new:
  25. queryset = queryset.filter(last_read__lt=F('thread__last'))
  26. count = queryset.count()
  27. try:
  28. pagination = make_pagination(page, count, settings.threads_per_page)
  29. except Http404:
  30. if new:
  31. return redirect(reverse('watched_threads_new'))
  32. return redirect(reverse('watched_threads'))
  33. queryset = queryset.order_by('-thread__last')
  34. if settings.threads_per_page < count:
  35. queryset = queryset[pagination['start']:pagination['stop']]
  36. queryset.prefetch_related('thread__forum', 'thread__start_poster', 'thread__last_poster')
  37. threads = []
  38. for thread in queryset:
  39. thread.thread.send_email = thread.email
  40. thread.thread.is_read = thread.thread.last <= thread.last_read
  41. threads.append(thread.thread)
  42. # Display page
  43. return render_to_response('watched.html',
  44. {
  45. 'items_total': count,
  46. 'pagination': pagination,
  47. 'new': new,
  48. 'threads': threads,
  49. 'message': request.messages.get_message('threads'),
  50. },
  51. context_instance=RequestContext(request))