search.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from django.utils.translation import ugettext_lazy as _
  2. from misago.conf import settings
  3. from misago.core.shortcuts import paginate, pagination_dict
  4. from misago.search import SearchProvider
  5. from .models import Post, Thread
  6. from .permissions import exclude_invisible_threads
  7. from .serializers import PostFeedSerializer
  8. from .viewmodels import ThreadsRootCategory
  9. from .utils import add_categories_to_items
  10. class SearchThreads(SearchProvider):
  11. name = _("Threads")
  12. url = 'threads'
  13. def search(self, query, page=1):
  14. root_category = ThreadsRootCategory(self.request)
  15. threads_categories = [root_category.unwrap()] + root_category.subcategories
  16. if len(query) > 2:
  17. visible_threads = exclude_invisible_threads(
  18. self.request.user, threads_categories, Thread.objects)
  19. results = search_threads(self.request, query, visible_threads)
  20. else:
  21. results = []
  22. list_page = paginate(
  23. results, page, settings.MISAGO_POSTS_PER_PAGE, settings.MISAGO_POSTS_TAIL,
  24. allow_explicit_first_page=True)
  25. paginator = pagination_dict(list_page, include_page_range=False)
  26. posts = list(list_page.object_list)
  27. threads = []
  28. for post in posts:
  29. threads.append(post.thread)
  30. add_categories_to_items(
  31. root_category.unwrap(), threads_categories, posts + threads)
  32. results = {
  33. 'results': PostFeedSerializer(
  34. posts, many=True, context={'user': self.request.user}).data
  35. }
  36. results.update(paginator)
  37. return results
  38. def search_threads(request, query, visible_threads):
  39. return Post.objects.select_related('thread', 'poster').filter(
  40. is_event=False,
  41. is_hidden=False,
  42. is_unapproved=False,
  43. thread_id__in=visible_threads.values('id'),
  44. original__icontains=query
  45. ).order_by('-pk')