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.translation import ugettext as _
  7. from misago.core.shortcuts import get_int_or_404
  8. from .searchproviders import searchproviders
  9. @api_view()
  10. def search(request, search_provider=None):
  11. allowed_providers = searchproviders.get_allowed_providers(request)
  12. if not request.user.acl_cache['can_search'] or not allowed_providers:
  13. raise PermissionDenied(_("You don't have permission to search site."))
  14. search_query = get_search_query(request)
  15. response = []
  16. for provider in allowed_providers:
  17. provider_data = {
  18. 'id': provider.url,
  19. 'name': str(provider.name),
  20. 'icon': provider.icon,
  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()