From cbed27b692b620551647d8faadd5639ee6d0eb93 Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Wed, 18 Jun 2025 10:51:35 +0200 Subject: [PATCH] export-pion: Body --- bin/export-pion | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/bin/export-pion b/bin/export-pion index 71d3affd..20c09ac4 100755 --- a/bin/export-pion +++ b/bin/export-pion @@ -1,16 +1,31 @@ #!/usr/bin/env python3 -# Účast ve všech soutěžích ročníku (anonymně) +# Účast a body ve všech soutěžích ročníku (anonymně) +from collections import defaultdict from dataclasses import dataclass +from decimal import Decimal from sqlalchemy import and_ from sqlalchemy.orm import joinedload import sys +from typing import DefaultDict, Tuple import mo.csv import mo.db as db +from mo.util import assert_not_none +from mo.util_format import format_decimal sess = db.get_session() +points_by_uid_roundid: DefaultDict[Tuple[int, int], Decimal] = defaultdict(Decimal) + +sols = (sess.query(db.Solution) + .options(joinedload(db.Solution.task)) + .all()) + +for sol in sols: + if sol.points is not None: + points_by_uid_roundid[sol.user_id, sol.task.round_id] += sol.points + res = (sess.query(db.Participant, db.Participation, db.Contest, db.Round) .select_from(db.Participant) .join(db.Participation, db.Participation.user_id == db.Participant.user_id) @@ -24,7 +39,7 @@ res = (sess.query(db.Participant, db.Participation, db.Contest, db.Round) @dataclass -class Row: +class Row(mo.csv.Row): rocnik: str = "" kategorie: str = "" kolo_seq: str = "" @@ -41,11 +56,16 @@ class Row: kraj_skoly: str = "" nuts_skoly: str = "" odhad_pohlavi: str = "" + body: str = "" output = [] for pant, pion, ct, rnd in res: female_guess = pant.user.last_name.endswith('á') + if (pion.user_id, rnd.round_id) in points_by_uid_roundid: + points = assert_not_none(format_decimal(points_by_uid_roundid[pion.user_id, rnd.round_id])) + else: + points = "" output.append(Row( rocnik=str(rnd.year), kategorie=rnd.category, @@ -63,6 +83,7 @@ for pant, pion, ct, rnd in res: kraj_skoly=pant.school_place.parent_place.parent_place.parent_place.name, nuts_skoly=pant.school_place.parent_place.parent_place.nuts, odhad_pohlavi="Ž" if female_guess else "M", + body=points, )) output.sort(key=lambda o: (o.rocnik, o.kategorie, o.kolo_seq, o.id_mista, o.id_ucastnika)) -- GitLab