api.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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['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. 'url': reverse('misago:search', kwargs={'search_provider': provider.url}),
  22. 'api': reverse('misago:api:search', kwargs={'search_provider': provider.url}),
  23. 'results': None,
  24. 'time': None,
  25. }
  26. if not search_provider or search_provider == provider.url:
  27. start_time = time()
  28. if search_provider == provider.url:
  29. page = get_int_or_404(request.query_params.get('page', 1))
  30. else:
  31. page = 1
  32. provider_data['results'] = provider.search(search_query, page)
  33. provider_data['time'] = float('%.2f' % (time() - start_time))
  34. response.append(provider_data)
  35. return Response(response)
  36. def get_search_query(request):
  37. return request.query_params.get('q', '').strip()