views.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. from django.core.urlresolvers import reverse
  2. from django.http import Http404
  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 haystack.query import RelatedSearchQuerySet
  8. from misago.decorators import block_crawlers
  9. from misago.forms import FormFields
  10. from misago.models import Forum, Thread, Post, User
  11. from misago.search import SearchException
  12. from misago.utils.pagination import make_pagination
  13. from misago.apps.errors import error403, error404
  14. from misago.apps.profiles.views import list as users_list
  15. from misago.apps.search.forms import QuickSearchForm
  16. @block_crawlers
  17. def search(request):
  18. queryset = Post.objects.filter(forum__in=Forum.objects.readable_forums(request.acl))
  19. return do_search(request, queryset)
  20. def do_search(request, queryset, search_route=None):
  21. if not request.acl.search.can_search():
  22. return error403(request, _("You don't have permission to search community."))
  23. search_route = search_route or 'search'
  24. if request.method != "POST":
  25. form = QuickSearchForm(request=request)
  26. return request.theme.render_to_response('search/home.html',
  27. {
  28. 'form': FormFields(form),
  29. 'search_route': search_route,
  30. 'search_result': request.session.get('%s_result' % search_route),
  31. 'disable_search': True,
  32. },
  33. context_instance=RequestContext(request))
  34. try:
  35. form = QuickSearchForm(request.POST, request=request)
  36. if form.is_valid():
  37. if form.mode == 'forum':
  38. jump_to = Forum.objects.forum_by_name(form.target, request.acl)
  39. if jump_to:
  40. if jump_to.level == 1:
  41. return redirect(reverse('index') + ('#%s' % jump_to.slug))
  42. return redirect(jump_to.url)
  43. else:
  44. raise SearchException(_('Forum "%(forum)s" could not be found.') % {'forum': form.target})
  45. if form.mode == 'user':
  46. request.POST = request.POST.copy()
  47. request.POST['username'] = form.target
  48. return users_list(request)
  49. sqs = RelatedSearchQuerySet().auto_query(form.cleaned_data['search_query']).order_by('-id').load_all()
  50. sqs = sqs.load_all_queryset(Post, queryset.filter(deleted=False).filter(moderated=False).select_related('thread', 'forum'))[:120]
  51. if request.user.is_authenticated():
  52. request.user.last_search = timezone.now()
  53. request.user.save(force_update=True)
  54. if request.user.is_anonymous():
  55. request.session['last_search'] = timezone.now()
  56. if not sqs:
  57. raise SearchException(_("Search returned no results. Change search query and try again."))
  58. request.session['%s_result' % search_route] = {
  59. 'search_query': form.cleaned_data['search_query'],
  60. 'search_results': [p.object.pk for p in sqs],
  61. }
  62. return redirect(reverse('%s_results' % search_route))
  63. else:
  64. raise SearchException(form.errors['search_query'][0])
  65. except SearchException as e:
  66. return request.theme.render_to_response('search/error.html',
  67. {
  68. 'form': FormFields(form),
  69. 'search_route': search_route,
  70. 'message': unicode(e),
  71. 'disable_search': True,
  72. },
  73. context_instance=RequestContext(request))
  74. @block_crawlers
  75. def show_results(request, page=0):
  76. return results(request, page)
  77. def results(request, page=0, search_route=None):
  78. if not request.acl.search.can_search():
  79. return error403(request, _("You don't have permission to search community."))
  80. search_route = search_route or 'search'
  81. result = request.session.get('%s_result' % search_route)
  82. if not result:
  83. form = QuickSearchForm(request=request)
  84. return request.theme.render_to_response('search/error.html',
  85. {
  86. 'form': FormFields(form),
  87. 'search_route': search_route,
  88. 'message': _("No search results were found."),
  89. 'disable_search': True,
  90. },
  91. context_instance=RequestContext(request))
  92. queryset = Post.objects.filter(id__in=result['search_results'])
  93. items_total = queryset.count();
  94. try:
  95. pagination = make_pagination(page, items_total, 12)
  96. except Http404:
  97. return redirect(reverse('%s_results' % search_route))
  98. form = QuickSearchForm(request=request, initial={'search_query': result['search_query']})
  99. return request.theme.render_to_response('search/results.html',
  100. {
  101. 'form': FormFields(form),
  102. 'search_route': search_route,
  103. 'search_query': result['search_query'],
  104. 'results': queryset.select_related('thread', 'forum', 'user')[pagination['start']:pagination['stop']],
  105. 'disable_search': True,
  106. 'items_total': items_total,
  107. 'pagination': pagination,
  108. },
  109. context_instance=RequestContext(request))