Нема описа

views_autocomplete.py 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from __future__ import annotations
  2. from django.http import JsonResponse
  3. from django.views.decorators.http import require_GET
  4. from .utils.geo import list_countries, list_states, list_cities
  5. import json
  6. def _q(request):
  7. return request.GET.get('q') or request.GET.get('term') or ''
  8. def _forward(request, key: str):
  9. # Try direct param (rare) or `forward[key]`
  10. val = request.GET.get(key)
  11. if val:
  12. return val
  13. fk = request.GET.get(f'forward[{key}]')
  14. if fk:
  15. return fk
  16. # DAL typically sends a JSON payload in `forward`
  17. fjson = request.GET.get('forward')
  18. if fjson:
  19. try:
  20. data = json.loads(fjson)
  21. # Format may be dict or list of dicts
  22. if isinstance(data, dict):
  23. return data.get(key)
  24. if isinstance(data, list):
  25. for item in data:
  26. if isinstance(item, dict) and item.get('name') == key:
  27. return item.get('value')
  28. except Exception:
  29. pass
  30. return None
  31. @require_GET
  32. def countries_autocomplete(request):
  33. q = _q(request)
  34. results = [{"id": code, "text": name} for code, name in list_countries(q)]
  35. return JsonResponse({"results": results, "pagination": {"more": False}})
  36. @require_GET
  37. def states_autocomplete(request):
  38. q = _q(request)
  39. country = _forward(request, 'country')
  40. items = list_states(country, q)
  41. results = [{"id": code, "text": name} for code, name in items[:50]]
  42. return JsonResponse({"results": results, "pagination": {"more": False}})
  43. @require_GET
  44. def cities_autocomplete(request):
  45. q = _q(request)
  46. country = _forward(request, 'country')
  47. state = _forward(request, 'state')
  48. items = list_cities(country, state, q)
  49. results = [{"id": code, "text": name} for code, name in items[:50]]
  50. return JsonResponse({"results": results, "pagination": {"more": False}})