views.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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 import timezone
  6. from django.utils.translation import ugettext as _
  7. from misago.authn.decorators import block_guest
  8. from misago.csrf.decorators import check_csrf
  9. from misago.forums.models import Forum
  10. from misago.messages import Message
  11. from misago.readstracker.models import Record
  12. from misago.readstracker.trackers import ForumsTracker
  13. from misago.ranks.models import Rank
  14. from misago.sessions.models import Session
  15. from misago.threads.models import Thread
  16. def home(request):
  17. # Alert ourselves
  18. request.user.alert("%(username)s, you have checked board index page.").url('username', request.user.username, reverse('user', kwargs={'user': request.user.pk, 'username': request.user.username_slug})).save_all()
  19. # Threads ranking
  20. popular_threads = cache.get('thread_ranking_%s' % request.user.make_acl_key(), 'nada')
  21. if popular_threads == 'nada' and request.settings['thread_ranking_size'] > 0:
  22. popular_threads = []
  23. 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']]:
  24. thread.forum_name = thread.forum.name
  25. thread.forum_slug = thread.forum.slug
  26. popular_threads.append(thread)
  27. cache.set('thread_ranking_%s' % request.user.make_acl_key(), popular_threads, request.settings['thread_ranking_refresh'])
  28. # Ranks online
  29. ranks_list = cache.get('users_online', 'nada')
  30. if ranks_list == 'nada':
  31. ranks_dict = {}
  32. ranks_list = []
  33. users_list = []
  34. for rank in Rank.objects.filter(on_index=True).order_by('order'):
  35. rank_entry = {'name': rank.name, 'style': rank.style, 'title': rank.title, 'online': []}
  36. ranks_list.append(rank_entry)
  37. ranks_dict[rank.pk] = rank_entry
  38. if ranks_dict:
  39. for session in Session.objects.select_related('user').filter(rank__in=ranks_dict.keys()).filter(user__isnull=False):
  40. if not session.user_id in users_list:
  41. ranks_dict[session.user.rank_id]['online'].append(session.user)
  42. users_list.append(session.user_id)
  43. del ranks_dict
  44. del users_list
  45. cache.set('ranks_list', ranks_list, 15)
  46. # Render page with forums list
  47. reads_tracker = ForumsTracker(request.user)
  48. return request.theme.render_to_response('index.html',
  49. {
  50. 'forums_list': Forum.objects.treelist(request.acl.forums, tracker=reads_tracker),
  51. 'ranks_online': ranks_list,
  52. 'popular_threads': popular_threads,
  53. },
  54. context_instance=RequestContext(request));
  55. def category(request, forum, slug):
  56. if not request.acl.forums.can_see(forum):
  57. return error404(request)
  58. try:
  59. forum = Forum.objects.get(pk=forum, type='category')
  60. if not request.acl.forums.can_browse(forum):
  61. return error403(request, _("You don't have permission to browse this category."))
  62. except Forum.DoesNotExist:
  63. return error404(request)
  64. forum.subforums = Forum.objects.treelist(request.acl.forums, forum, tracker=ForumsTracker(request.user))
  65. return request.theme.render_to_response('category.html',
  66. {
  67. 'category': forum,
  68. 'parents': Forum.objects.forum_parents(forum.pk),
  69. },
  70. context_instance=RequestContext(request));
  71. def redirection(request, forum, slug):
  72. if not request.acl.forums.can_see(forum):
  73. return error404(request)
  74. try:
  75. forum = Forum.objects.get(pk=forum, type='redirect')
  76. if not request.acl.forums.can_browse(forum):
  77. return error403(request, _("You don't have permission to follow this redirect."))
  78. forum.redirects += 1
  79. forum.redirects_delta += 1
  80. forum.save(force_update=True)
  81. return redirect(forum.redirect)
  82. except Forum.DoesNotExist:
  83. return error404(request)
  84. @block_guest
  85. @check_csrf
  86. def read_all(request):
  87. Record.objects.filter(user=request.user).delete()
  88. now = timezone.now()
  89. bulk = []
  90. for forum in request.acl.forums.known_forums():
  91. new_record = Record(user=request.user, forum_id=forum, updated=now, cleared=now)
  92. new_record.set_threads({})
  93. bulk.append(new_record)
  94. if bulk:
  95. Record.objects.bulk_create(bulk)
  96. request.messages.set_flash(Message(_("All forums have been marked as read.")), 'success')
  97. return redirect(reverse('index'))
  98. def redirect_message(request, message, type='info', owner=None):
  99. request.messages.set_flash(message, type, owner)
  100. return redirect(reverse('index'))
  101. def error403(request, message=None):
  102. return error_view(request, 403, message)
  103. def error404(request, message=None):
  104. return error_view(request, 404, message)
  105. def error_view(request, error, message):
  106. response = request.theme.render_to_response(('error%s.html' % error),
  107. {
  108. 'message': message,
  109. 'hide_signin': True,
  110. 'exception_response': True,
  111. },
  112. context_instance=RequestContext(request));
  113. response.status_code = error
  114. return response