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