api.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from time import time
  2. from django.core.exceptions import PermissionDenied
  3. from django.urls import reverse
  4. from django.utils.translation import gettext as _
  5. from rest_framework.decorators import api_view
  6. from rest_framework.response import Response
  7. from ..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["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(
  23. "misago:api:search", kwargs={"search_provider": provider.url}
  24. ),
  25. "results": None,
  26. "time": None,
  27. }
  28. if not search_provider or search_provider == provider.url:
  29. start_time = time()
  30. if search_provider == provider.url:
  31. page = get_int_or_404(request.query_params.get("page", 1))
  32. else:
  33. page = 1
  34. provider_data["results"] = provider.search(search_query, page)
  35. provider_data["time"] = float("%.2f" % (time() - start_time))
  36. response.append(provider_data)
  37. return Response(response)
  38. def get_search_query(request):
  39. return request.query_params.get("q", "").strip()