feat: gender-separated MVPChart in mixed teams
This commit is contained in:
@@ -349,24 +349,26 @@ def last_submissions(
|
||||
|
||||
|
||||
def mvp(
|
||||
request: Annotated[TeamScopedRequest, Security(verify_team_scope)],
|
||||
request: Annotated[TeamScopedRequest, Security(verify_team_scope)], mixed=False
|
||||
):
|
||||
ranks = dict()
|
||||
if request.team_id == 42:
|
||||
ranks = {}
|
||||
random.seed(42)
|
||||
players = [request.user] + demo_players
|
||||
for p in players:
|
||||
random.shuffle(players)
|
||||
for i, p in enumerate(players):
|
||||
ranks[p.display_name] = ranks.get(p.display_name, []) + [i + 1]
|
||||
ranks[p.id] = ranks.get(p.id, []) + [i + 1]
|
||||
return [
|
||||
{
|
||||
"name": p,
|
||||
"rank": f"{np.mean(v):.02f}",
|
||||
"std": f"{np.std(v):.02f}",
|
||||
"n": len(v),
|
||||
}
|
||||
for p, v in ranks.items()
|
||||
[
|
||||
{
|
||||
"p_id": p_id,
|
||||
"rank": f"{np.mean(v):.02f}",
|
||||
"std": f"{np.std(v):.02f}",
|
||||
"n": len(v),
|
||||
}
|
||||
for i, (p_id, v) in enumerate(ranks.items())
|
||||
]
|
||||
]
|
||||
|
||||
with Session(engine) as session:
|
||||
@@ -378,7 +380,7 @@ def mvp(
|
||||
).all()
|
||||
if not players:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
|
||||
player_map = {p.id: p.display_name for p in players}
|
||||
player_map = {p.id: p for p in players}
|
||||
subquery = (
|
||||
select(R.user, func.max(R.time).label("latest"))
|
||||
.where(R.team == request.team_id)
|
||||
@@ -388,25 +390,45 @@ def mvp(
|
||||
statement2 = select(R).join(
|
||||
subquery, (R.user == subquery.c.user) & (R.time == subquery.c.latest)
|
||||
)
|
||||
for r in session.exec(statement2):
|
||||
for i, p_id in enumerate(r.mvps):
|
||||
if p_id not in player_map:
|
||||
continue
|
||||
p = player_map[p_id]
|
||||
ranks[p] = ranks.get(p, []) + [i + 1]
|
||||
if mixed:
|
||||
all_ranks = []
|
||||
for gender in ["fmp", "mmp"]:
|
||||
ranks = {}
|
||||
for r in session.exec(statement2):
|
||||
mvps = [
|
||||
p_id
|
||||
for p_id in r.mvps
|
||||
if p_id in player_map and player_map[p_id].gender == gender
|
||||
]
|
||||
for i, p_id in enumerate(mvps):
|
||||
p = player_map[p_id]
|
||||
ranks[p_id] = ranks.get(p_id, []) + [i + 1]
|
||||
all_ranks.append(ranks)
|
||||
else:
|
||||
ranks = {}
|
||||
for r in session.exec(statement2):
|
||||
for i, p_id in enumerate(r.mvps):
|
||||
if p_id not in player_map:
|
||||
continue
|
||||
p = player_map[p_id]
|
||||
ranks[p_id] = ranks.get(p_id, []) + [i + 1]
|
||||
all_ranks = [ranks]
|
||||
|
||||
if not ranks:
|
||||
if not all_ranks:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND, detail="no entries found"
|
||||
)
|
||||
return [
|
||||
{
|
||||
"name": p,
|
||||
"rank": f"{np.mean(v):.02f}",
|
||||
"std": f"{np.std(v):.02f}",
|
||||
"n": len(v),
|
||||
}
|
||||
for p, v in ranks.items()
|
||||
[
|
||||
{
|
||||
"p_id": p_id,
|
||||
"rank": f"{np.mean(v):.02f}",
|
||||
"std": f"{np.std(v):.02f}",
|
||||
"n": len(v),
|
||||
}
|
||||
for p_id, v in ranks.items()
|
||||
]
|
||||
for ranks in all_ranks
|
||||
]
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ names = [
|
||||
demo_players = [
|
||||
Player.model_validate(
|
||||
{
|
||||
"id": i,
|
||||
"id": i + 4200,
|
||||
"display_name": name,
|
||||
"username": name.lower().replace(" ", "").replace(".", ""),
|
||||
"gender": gender,
|
||||
|
||||
Reference in New Issue
Block a user