Compare commits
2 Commits
c60caaa8aa
...
74801ad710
| Author | SHA1 | Date | |
|---|---|---|---|
| 74801ad710 | |||
| 28b0f09ec2 |
101
get_data.py
101
get_data.py
@@ -1,4 +1,8 @@
|
|||||||
|
<<<<<<< HEAD
|
||||||
|
from fastapi import FastAPI, HTTPException, Query
|
||||||
|
=======
|
||||||
from fastapi import FastAPI, HTTPException, Query, Request
|
from fastapi import FastAPI, HTTPException, Query, Request
|
||||||
|
>>>>>>> c60caaa8aaad763cf7605dcd2c4502b8dfc3be84
|
||||||
from fastapi.responses import Response, JSONResponse, HTMLResponse, StreamingResponse
|
from fastapi.responses import Response, JSONResponse, HTMLResponse, StreamingResponse
|
||||||
from fastapi.encoders import jsonable_encoder
|
from fastapi.encoders import jsonable_encoder
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
@@ -15,7 +19,10 @@ import nasio
|
|||||||
import logging
|
import logging
|
||||||
import logging.config
|
import logging.config
|
||||||
import platform
|
import platform
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
import json
|
import json
|
||||||
|
>>>>>>> c60caaa8aaad763cf7605dcd2c4502b8dfc3be84
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
|
|
||||||
|
|
||||||
@@ -29,7 +36,18 @@ _latest_lock = Lock()
|
|||||||
_stop_event = Event()
|
_stop_event = Event()
|
||||||
_worker_thread: Thread | None = None
|
_worker_thread: Thread | None = None
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
# Загружаем переменные из .env
|
||||||
|
if load_dotenv(dotenv_path="/mnt/khl/.env", verbose=True):
|
||||||
|
print("Добавить в лог что был найден файл окружения!!")
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
load_dotenv()
|
||||||
|
print("Добавить в лог что не был найден файл окружения!!")
|
||||||
|
|
||||||
|
=======
|
||||||
pprint(f"Локальный файл окружения ={load_dotenv(verbose=True)}")
|
pprint(f"Локальный файл окружения ={load_dotenv(verbose=True)}")
|
||||||
|
>>>>>>> c60caaa8aaad763cf7605dcd2c4502b8dfc3be84
|
||||||
api_user = os.getenv("API_USER")
|
api_user = os.getenv("API_USER")
|
||||||
api_pass = os.getenv("API_PASS")
|
api_pass = os.getenv("API_PASS")
|
||||||
league = os.getenv("LEAGUE")
|
league = os.getenv("LEAGUE")
|
||||||
@@ -40,7 +58,6 @@ USER = os.getenv("SYNO_USERNAME")
|
|||||||
PASSWORD = os.getenv("SYNO_PASSWORD")
|
PASSWORD = os.getenv("SYNO_PASSWORD")
|
||||||
PATH = f'{os.getenv("SYNO_PATH")}MATCH.xlsm'
|
PATH = f'{os.getenv("SYNO_PATH")}MATCH.xlsm'
|
||||||
|
|
||||||
|
|
||||||
def load_today_schedule():
|
def load_today_schedule():
|
||||||
"""Возвращает DataFrame матчей на сегодня с нужными колонками (или пустой DF)."""
|
"""Возвращает DataFrame матчей на сегодня с нужными колонками (или пустой DF)."""
|
||||||
url_tournaments = f"{api_base_url}tournaments.xml"
|
url_tournaments = f"{api_base_url}tournaments.xml"
|
||||||
@@ -732,6 +749,11 @@ def _norm_name(s: str | None) -> str:
|
|||||||
return ""
|
return ""
|
||||||
return str(s).strip().casefold()
|
return str(s).strip().casefold()
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
|
@app.get("/info")
|
||||||
|
def info():
|
||||||
|
=======
|
||||||
def _load_buf():
|
def _load_buf():
|
||||||
buf = nasio.load_bio(user=USER, password=PASSWORD,
|
buf = nasio.load_bio(user=USER, password=PASSWORD,
|
||||||
nas_ip=SERVER_NAME, nas_port="443", path=PATH)
|
nas_ip=SERVER_NAME, nas_port="443", path=PATH)
|
||||||
@@ -742,6 +764,7 @@ def _load_buf():
|
|||||||
|
|
||||||
@app.get("/info")
|
@app.get("/info")
|
||||||
async def info(format: str = "xlsx", sheet: str = "TEAMS"):
|
async def info(format: str = "xlsx", sheet: str = "TEAMS"):
|
||||||
|
>>>>>>> c60caaa8aaad763cf7605dcd2c4502b8dfc3be84
|
||||||
# 1) Проверяем, выбран ли матч
|
# 1) Проверяем, выбран ли матч
|
||||||
global current_season
|
global current_season
|
||||||
if not selected_game_id:
|
if not selected_game_id:
|
||||||
@@ -770,6 +793,81 @@ async def info(format: str = "xlsx", sheet: str = "TEAMS"):
|
|||||||
away_name = str(row.get("visitorName_en", "")).strip()
|
away_name = str(row.get("visitorName_en", "")).strip()
|
||||||
|
|
||||||
# 3) Подтягиваем справочник команд из Excel (лист TEAMS)
|
# 3) Подтягиваем справочник команд из Excel (лист TEAMS)
|
||||||
|
<<<<<<< HEAD
|
||||||
|
try:
|
||||||
|
binary_bytes: bytes = nasio.load_bio(
|
||||||
|
user=USER,
|
||||||
|
password=PASSWORD,
|
||||||
|
nas_ip=SERVER_NAME,
|
||||||
|
nas_port="443",
|
||||||
|
path=PATH,
|
||||||
|
# sheet="TEAMS"
|
||||||
|
)
|
||||||
|
buf = io.BytesIO(binary_bytes)
|
||||||
|
headers = {
|
||||||
|
"Content-Length": str(len(binary_bytes)),
|
||||||
|
"Cache-Control": "no-cache, no-store, must-revalidate",
|
||||||
|
"Pragma": "no-cache",
|
||||||
|
# можно подсунуть имя файла (если парсеру это важно)
|
||||||
|
"Content-Disposition": 'inline; filename="MATCH.xlsm"',
|
||||||
|
}
|
||||||
|
return StreamingResponse(
|
||||||
|
buf,
|
||||||
|
media_type="application/vnd.ms-excel.sheet.macroEnabled.12",
|
||||||
|
headers=headers,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Оставляем только полезные поля (подгони под свой файл)
|
||||||
|
keep = ["Team", "Logo", "Short", "HexPodl", "HexBase", "HexText"]
|
||||||
|
keep = [c for c in keep if c in teams_df.columns]
|
||||||
|
teams_df = teams_df.loc[:, keep].copy()
|
||||||
|
|
||||||
|
# 4) Нормализованные ключи для джоина по имени
|
||||||
|
teams_df["__key"] = teams_df["Team"].apply(_norm_name)
|
||||||
|
|
||||||
|
def _pick_team_info(name: str) -> dict:
|
||||||
|
key = _norm_name(name)
|
||||||
|
hit = teams_df.loc[teams_df["__key"] == key]
|
||||||
|
if hit.empty:
|
||||||
|
# не нашли точное совпадение — вернём только название
|
||||||
|
return {"Team": name}
|
||||||
|
rec = hit.iloc[0].to_dict()
|
||||||
|
rec.pop("__key", None)
|
||||||
|
# заменим NaN/inf на None, чтобы JSON не падал
|
||||||
|
for k, v in list(rec.items()):
|
||||||
|
if pd.isna(v) or v in (np.inf, -np.inf):
|
||||||
|
rec[k] = None
|
||||||
|
return rec
|
||||||
|
|
||||||
|
home_info = _pick_team_info(home_name)
|
||||||
|
away_info = _pick_team_info(away_name)
|
||||||
|
date_obj = datetime.strptime(row.get("datetime_str", ""), "%d.%m.%Y %H:%M")
|
||||||
|
try:
|
||||||
|
full_format = date_obj.strftime("%B %-d, %Y")
|
||||||
|
except ValueError:
|
||||||
|
full_format = date_obj.strftime("%B %#d, %Y")
|
||||||
|
|
||||||
|
payload = [
|
||||||
|
{
|
||||||
|
"selected_id": int(selected_game_id),
|
||||||
|
"tournament_id": (
|
||||||
|
int(current_tournament_id) if current_tournament_id else None
|
||||||
|
),
|
||||||
|
"datetime": str(full_format),
|
||||||
|
"arena": str(row.get("arena_en", "")),
|
||||||
|
"arena_city": str(row.get("arena_city_en", "")),
|
||||||
|
"home": home_info,
|
||||||
|
"home_city": str(row.get("homeCity_en", "")),
|
||||||
|
"away": away_info,
|
||||||
|
"away_city": str(row.get("visitorCity_en", "")),
|
||||||
|
"season": current_season,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
return JSONResponse(content=payload)
|
||||||
|
except Exception as ex:
|
||||||
|
pprint(ex)
|
||||||
|
=======
|
||||||
src = _load_buf()
|
src = _load_buf()
|
||||||
|
|
||||||
if format == "xlsx":
|
if format == "xlsx":
|
||||||
@@ -871,6 +969,7 @@ async def info(format: str = "xlsx", sheet: str = "TEAMS"):
|
|||||||
# return JSONResponse(content=payload)
|
# return JSONResponse(content=payload)
|
||||||
# except Exception as ex:
|
# except Exception as ex:
|
||||||
# pprint(ex)
|
# pprint(ex)
|
||||||
|
>>>>>>> c60caaa8aaad763cf7605dcd2c4502b8dfc3be84
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user