From 0397725bdac27d9cb1d1920d2169faf1f9305aec Mon Sep 17 00:00:00 2001 From: julius Date: Sat, 22 Mar 2025 16:24:40 +0100 Subject: [PATCH] feat: who's missing? --- cutt/analysis.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/cutt/analysis.py b/cutt/analysis.py index bb5c277..351c606 100644 --- a/cutt/analysis.py +++ b/cutt/analysis.py @@ -260,12 +260,73 @@ def mvp( ] +async def turnout( + request: Annotated[ + TeamScopedRequest, Security(verify_team_scope, scopes=["analysis"]) + ], +): + player_map = {} + with Session(engine) as session: + statement = select(Team).where(Team.id == request.team_id) + players = [t.players for t in session.exec(statement)][0] + if not players: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) + for p in players: + player_map[p.id] = p.display_name + + subquery = ( + select(C.user, func.max(C.time).label("latest")) + .where(C.team == request.team_id) + .group_by(C.user) + .subquery() + ) + statement2 = select(C.user).join( + subquery, (C.user == subquery.c.user) & (C.time == subquery.c.latest) + ) + chemistry_turnout = session.exec(statement2).all() + chemistry_missing = set(player_map) - set(chemistry_turnout) + chemistry_missing = [player_map[i] for i in chemistry_missing] + + subquery = ( + select(R.user, func.max(R.time).label("latest")) + .where(R.team == request.team_id) + .group_by(R.user) + .subquery() + ) + statement2 = select(R.user).join( + subquery, (R.user == subquery.c.user) & (R.time == subquery.c.latest) + ) + mvp_turnout = session.exec(statement2).all() + mvp_missing = set(player_map) - set(mvp_turnout) + mvp_missing = [player_map[i] for i in mvp_missing] + return JSONResponse( + { + "players": len(player_map), + "chemistry": { + "turnout": len(chemistry_turnout), + "missing": sorted(list(chemistry_missing)), + }, + "MVP": { + "turnout": len(mvp_turnout), + "missing": sorted(list(mvp_missing)), + }, + } + ) + + # analysis_router.add_api_route("/json", endpoint=sociogram_json, methods=["GET"]) analysis_router.add_api_route( "/graph_json/{team_id}", endpoint=graph_json, methods=["GET"] ) # analysis_router.add_api_route("/image", endpoint=render_sociogram, methods=["POST"]) -analysis_router.add_api_route("/mvp/{team_id}", endpoint=mvp, methods=["GET"]) +analysis_router.add_api_route( + "/mvp/{team_id}", + endpoint=mvp, + methods=["GET"], + name="MVPs", + description="Request Most Valuable Players stats", +) +analysis_router.add_api_route("/turnout/{team_id}", endpoint=turnout, methods=["GET"]) if __name__ == "__main__": with Session(engine) as session: