210 lines
6.2 KiB
Python
210 lines
6.2 KiB
Python
"""
|
|
api_client.py — HTTP-клиент для stats-приложения.
|
|
Запросы идут к основному API без авторизации.
|
|
"""
|
|
import os
|
|
from typing import Optional
|
|
import httpx
|
|
|
|
API_URL = os.getenv("API_URL", "http://api:8000")
|
|
_TIMEOUT = 15
|
|
|
|
|
|
async def get_summary() -> dict:
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/stats/summary")
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return {"total_responses": 0, "total_polls": 0, "active_polls": 0, "orgs_active": 0}
|
|
|
|
|
|
async def get_years() -> list[int]:
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/stats/years")
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
|
|
async def get_chart_data(
|
|
group_by: str,
|
|
poll_id: Optional[str] = None,
|
|
org_id: Optional[str] = None,
|
|
group_id: Optional[str] = None,
|
|
year: Optional[int] = None,
|
|
) -> list[dict]:
|
|
params: dict = {"group_by": group_by}
|
|
if poll_id:
|
|
params["poll_id"] = poll_id
|
|
if org_id:
|
|
params["org_id"] = org_id
|
|
if group_id:
|
|
params["group_id"] = group_id
|
|
if year:
|
|
params["year"] = year
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/stats/responses", params=params)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
|
|
async def get_polls() -> list[dict]:
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/polls/")
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
|
|
async def get_organizations() -> list[dict]:
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/organizations/")
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
|
|
async def get_groups() -> list[dict]:
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/groups/")
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
|
|
async def get_dimensions(poll_id: Optional[str] = None) -> list[str]:
|
|
params = {}
|
|
if poll_id:
|
|
params["poll_id"] = poll_id
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/stats/results/dimensions", params=params)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
|
|
async def get_avg_by_dimension(
|
|
poll_id: Optional[str] = None,
|
|
org_id: Optional[str] = None,
|
|
group_id: Optional[str] = None,
|
|
year: Optional[int] = None,
|
|
) -> list[dict]:
|
|
params = {}
|
|
if poll_id: params["poll_id"] = poll_id
|
|
if org_id: params["org_id"] = org_id
|
|
if group_id: params["group_id"] = group_id
|
|
if year: params["year"] = year
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/stats/results/avg-by-dimension", params=params)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
|
|
async def get_leading_type(
|
|
poll_id: Optional[str] = None,
|
|
org_id: Optional[str] = None,
|
|
group_id: Optional[str] = None,
|
|
year: Optional[int] = None,
|
|
) -> list[dict]:
|
|
params = {}
|
|
if poll_id: params["poll_id"] = poll_id
|
|
if org_id: params["org_id"] = org_id
|
|
if group_id: params["group_id"] = group_id
|
|
if year: params["year"] = year
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/stats/results/leading-type", params=params)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
|
|
async def get_compare_groups(
|
|
dimension_name: str,
|
|
by: str = "organization",
|
|
poll_id: Optional[str] = None,
|
|
year: Optional[int] = None,
|
|
) -> list[dict]:
|
|
params = {"dimension_name": dimension_name, "by": by}
|
|
if poll_id: params["poll_id"] = poll_id
|
|
if year: params["year"] = year
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/stats/results/compare-groups", params=params)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
|
|
async def get_top_users(
|
|
dimension_name: str,
|
|
poll_id: Optional[str] = None,
|
|
org_id: Optional[str] = None,
|
|
group_id: Optional[str] = None,
|
|
year: Optional[int] = None,
|
|
limit: int = 10,
|
|
) -> list[dict]:
|
|
params = {"dimension_name": dimension_name, "limit": limit}
|
|
if poll_id: params["poll_id"] = poll_id
|
|
if org_id: params["org_id"] = org_id
|
|
if group_id: params["group_id"] = group_id
|
|
if year: params["year"] = year
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/stats/results/top-users", params=params)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
|
|
async def get_dimension_trend(
|
|
dimension_name: str,
|
|
poll_id: Optional[str] = None,
|
|
org_id: Optional[str] = None,
|
|
group_id: Optional[str] = None,
|
|
) -> list[dict]:
|
|
params = {"dimension_name": dimension_name}
|
|
if poll_id: params["poll_id"] = poll_id
|
|
if org_id: params["org_id"] = org_id
|
|
if group_id: params["group_id"] = group_id
|
|
try:
|
|
async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client:
|
|
resp = await client.get("/stats/results/dimension-trend", params=params)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except Exception:
|
|
pass
|
|
return []
|