api.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from time import time
  2. from rest_framework.decorators import api_view
  3. from rest_framework.response import Response
  4. from django.core.exceptions import PermissionDenied
  5. from django.urls import reverse
  6. from django.utils import six
  7. from django.utils.translation import ugettext as _
  8. from misago.core.shortcuts import get_int_or_404
  9. from .searchproviders import searchproviders
  10. @api_view()
  11. def search(request, search_provider=None):
  12. allowed_providers = searchproviders.get_allowed_providers(request)
  13. if not request.user.acl_cache['can_search'] or not allowed_providers:
  14. raise PermissionDenied(_("You don't have permission to search site."))
  15. search_query = get_search_query(request)
  16. response = []
  17. for provider in allowed_providers:
  18. provider_data = {
  19. 'id': provider.url,
  20. 'name': six.text_type(provider.name),
  21. 'icon': provider.icon,
  22. 'url': reverse('misago:search', kwargs={'search_provider': provider.url}),
  23. 'api': reverse('misago:api:search', kwargs={'search_provider': provider.url}),
  24. 'results': None,
  25. 'time': None,
  26. }
  27. if not search_provider or search_provider == provider.url:
  28. start_time = time()
  29. if search_provider == provider.url:
  30. page = get_int_or_404(request.query_params.get('page', 1))
  31. else:
  32. page = 1
  33. provider_data['results'] = provider.search(search_query, page)
  34. provider_data['time'] = float('%.2f' % (time() - start_time))
  35. response.append(provider_data)
  36. return Response(response)
  37. def get_search_query(request):
  38. return request.query_params.get('q', '').strip()