views.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from django.core.cache import cache
  2. from django.core.urlresolvers import reverse
  3. from django.shortcuts import redirect
  4. from django.template import RequestContext
  5. from django.utils.translation import ugettext as _
  6. from misago.forums.models import Forum
  7. from misago.readstracker.trackers import ForumsTracker
  8. from misago.sessions.models import Session
  9. from misago.threads.models import Thread
  10. def home(request):
  11. # Threads ranking
  12. popular_threads = cache.get('thread_ranking_%s' % request.user.make_acl_key(), 'nada')
  13. if popular_threads == 'nada' and request.settings['thread_ranking_size'] > 0:
  14. popular_threads = []
  15. for thread in Thread.objects.filter(moderated=False).filter(deleted=False).filter(forum__in=request.acl.threads.get_readable_forums(request.acl)).prefetch_related('forum').order_by('-score')[:request.settings['thread_ranking_size']]:
  16. popular_threads.append(thread)
  17. cache.set('thread_ranking_%s' % request.user.make_acl_key(), popular_threads, request.settings['thread_ranking_refresh'])
  18. # Team online
  19. team_online = []
  20. team_pks = []
  21. for session in Session.objects.filter(team=1).filter(admin=0).filter(user__isnull=False).order_by('-start').select_related('user', 'user__rank'):
  22. if session.user.pk not in team_pks:
  23. team_pks.append(session.user.pk)
  24. team_online.append(session.user)
  25. # Render page with forums list
  26. reads_tracker = ForumsTracker(request.user)
  27. return request.theme.render_to_response('index.html',
  28. {
  29. 'forums_list': Forum.objects.treelist(request.acl.forums, tracker=reads_tracker),
  30. 'team_online': team_online,
  31. 'popular_threads': popular_threads,
  32. },
  33. context_instance=RequestContext(request));
  34. def category(request, forum, slug):
  35. if not request.acl.forums.can_see(forum):
  36. return error404(request)
  37. try:
  38. forum = Forum.objects.get(pk=forum, type='category')
  39. if not request.acl.forums.can_browse(forum):
  40. return error403(request, _("You don't have permission to browse this category."))
  41. except Forum.DoesNotExist:
  42. return error404(request)
  43. forum.subforums = Forum.objects.treelist(request.acl.forums, forum, tracker=ForumsTracker(request.user))
  44. return request.theme.render_to_response('category.html',
  45. {
  46. 'category': forum,
  47. 'parents': Forum.objects.forum_parents(forum.pk),
  48. },
  49. context_instance=RequestContext(request));
  50. def redirection(request, forum, slug):
  51. if not request.acl.forums.can_see(forum):
  52. return error404(request)
  53. try:
  54. forum = Forum.objects.get(pk=forum, type='redirect')
  55. if not request.acl.forums.can_browse(forum):
  56. return error403(request, _("You don't have permission to follow this redirect."))
  57. forum.redirects += 1
  58. forum.redirects_delta += 1
  59. forum.save(force_update=True)
  60. return redirect(forum.redirect)
  61. except Forum.DoesNotExist:
  62. return error404(request)
  63. def redirect_message(request, message, type='info', owner=None):
  64. request.messages.set_flash(message, type, owner)
  65. return redirect(reverse('index'))
  66. def error403(request, message=None):
  67. return error_view(request, 403, message)
  68. def error404(request, message=None):
  69. return error_view(request, 404, message)
  70. def error_view(request, error, message):
  71. response = request.theme.render_to_response(('error%s.html' % error),
  72. {
  73. 'message': message,
  74. 'hide_signin': True,
  75. 'exception_response': True,
  76. },
  77. context_instance=RequestContext(request));
  78. response.status_code = error
  79. return response