fixed injection watcher
This commit is contained in:
@@ -4,45 +4,69 @@ import httpx
|
||||
|
||||
from app.config import get_settings
|
||||
|
||||
# wger language ids (https://wger.de/api/v2/language/)
|
||||
_LANG_RU = 5
|
||||
_LANG_EN = 2
|
||||
|
||||
|
||||
class WgerClient:
|
||||
def __init__(self) -> None:
|
||||
settings = get_settings()
|
||||
self.base_url = settings.wger_base_url.rstrip("/")
|
||||
|
||||
@staticmethod
|
||||
def _pick_name(item: dict[str, Any]) -> str:
|
||||
translations = item.get("translations") or []
|
||||
for lang_id in (_LANG_RU, _LANG_EN):
|
||||
for tr in translations:
|
||||
if tr.get("language") == lang_id and tr.get("name"):
|
||||
return str(tr["name"])
|
||||
for tr in translations:
|
||||
if tr.get("name"):
|
||||
return str(tr["name"])
|
||||
return f"#{item.get('id')}"
|
||||
|
||||
def _fetch_exerciseinfo(
|
||||
self,
|
||||
client: httpx.Client,
|
||||
*,
|
||||
query: str,
|
||||
languagecode: str,
|
||||
limit: int,
|
||||
) -> list[dict[str, Any]]:
|
||||
response = client.get(
|
||||
f"{self.base_url}/exerciseinfo/",
|
||||
params={
|
||||
"name__search": query,
|
||||
"languagecode": languagecode,
|
||||
"limit": limit,
|
||||
},
|
||||
)
|
||||
response.raise_for_status()
|
||||
return response.json().get("results") or []
|
||||
|
||||
def search_exercises(self, query: str, limit: int = 8) -> list[dict[str, Any]]:
|
||||
query = query.strip()
|
||||
if not query:
|
||||
return []
|
||||
|
||||
with httpx.Client(timeout=20.0) as client:
|
||||
response = client.get(
|
||||
f"{self.base_url}/exercise/search/",
|
||||
params={"term": query, "language": "ru"},
|
||||
results = self._fetch_exerciseinfo(
|
||||
client, query=query, languagecode="ru", limit=limit
|
||||
)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
sug = data.get("suggestions", data) if isinstance(data, dict) else []
|
||||
if isinstance(sug, dict):
|
||||
results = sug.get("results", [])
|
||||
elif isinstance(sug, list):
|
||||
results = sug
|
||||
else:
|
||||
results = []
|
||||
if not results:
|
||||
results = self._fetch_exerciseinfo(
|
||||
client, query=query, languagecode="en", limit=limit
|
||||
)
|
||||
|
||||
out: list[dict[str, Any]] = []
|
||||
for item in results[:limit]:
|
||||
if isinstance(item, dict):
|
||||
name = item.get("value") or item.get("name") or str(item)
|
||||
out.append({"name": name, "data": item})
|
||||
elif isinstance(item, str):
|
||||
out.append({"name": item})
|
||||
if out:
|
||||
return out
|
||||
|
||||
response2 = client.get(
|
||||
f"{self.base_url}/exerciseinfo/",
|
||||
params={"language": 2, "limit": limit},
|
||||
out: list[dict[str, Any]] = []
|
||||
for item in results[:limit]:
|
||||
category = item.get("category") or {}
|
||||
out.append(
|
||||
{
|
||||
"id": item.get("id"),
|
||||
"name": self._pick_name(item),
|
||||
"category": category.get("name") if isinstance(category, dict) else category,
|
||||
}
|
||||
)
|
||||
response2.raise_for_status()
|
||||
for item in (response2.json().get("results") or [])[:limit]:
|
||||
name = item.get("name") or f"#{item.get('id')}"
|
||||
if query.lower() in name.lower():
|
||||
out.append({"id": item.get("id"), "name": name, "category": item.get("category")})
|
||||
return out[:limit]
|
||||
return out
|
||||
|
||||
Reference in New Issue
Block a user