1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-07-03 21:32:33 +00:00
trezor-firmware/tools/ui_reports_generator/app.py

77 lines
2.4 KiB
Python

# Deployed by:
# uvicorn app:app --reload --host 0.0.0.0 --port 8002
from __future__ import annotations
import time
from datetime import datetime
from pathlib import Path
from fastapi import FastAPI, HTTPException, Request
from fastapi.templating import Jinja2Templates
from starlette.responses import RedirectResponse
from cli import do_update_pulls
from common_all import get_logger
from github import load_cache_file
from gitlab import get_latest_infos_for_branch
HERE = Path(__file__).parent
log_file = HERE / "app.log"
logger = get_logger(__name__, log_file)
app = FastAPI()
templates = Jinja2Templates(directory="templates", trim_blocks=True, lstrip_blocks=True)
LAST_UPDATE_TS = 0
UPDATE_ALLOWED_EVERY_S = 30
@app.get("/branch/{branch_name:path}")
async def get_branch_info(branch_name: str):
try:
logger.info(f"Branch: {branch_name}")
info = get_latest_infos_for_branch(branch_name, find_status=True)
return {"info": info}
except Exception as e:
logger.exception(f"Error: {e}")
raise HTTPException(status_code=500, detail="Internal server error")
@app.get("/dashboard")
async def get_dashboard(request: Request):
try:
logger.info("get_dashboard")
cached_info = load_cache_file()
last_update = cached_info["metadata"]["last_update"]
branches_dict = cached_info["branches"]
branches_list = sorted(
branches_dict.values(),
key=lambda branch_info: branch_info["pull_request_number"],
reverse=True,
)
branches_list = [branch for branch in branches_list if branch["job_infos"]]
for branch in branches_list:
branch[
"pr_link"
] = f"https://github.com/trezor/trezor-firmware/pull/{branch['pull_request_number']}"
return templates.TemplateResponse( # type: ignore
"dashboard.html",
{"request": request, "branches": branches_list, "last_update": last_update},
)
except Exception as e:
logger.exception(f"Error: {e}")
raise HTTPException(status_code=500, detail="Internal server error")
@app.get("/update")
async def update_dashboard():
logger.info("update_dashboard")
global LAST_UPDATE_TS
if time.time() - LAST_UPDATE_TS > UPDATE_ALLOWED_EVERY_S:
do_update_pulls()
LAST_UPDATE_TS = time.time()
else:
time.sleep(5)
return RedirectResponse(url="/dashboard")