From c582cae3e3d43af5bb15ed1bdba712c0b89a3c80 Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Sat, 29 Apr 2023 20:50:03 +0200 Subject: [PATCH] =?UTF-8?q?Export=20pro=20anketu=20mezi=20okresn=C3=ADmi?= =?UTF-8?q?=20garanty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/export-okresni-anketa | 88 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 bin/export-okresni-anketa diff --git a/bin/export-okresni-anketa b/bin/export-okresni-anketa new file mode 100755 index 00000000..8bb092d7 --- /dev/null +++ b/bin/export-okresni-anketa @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +# Předvyplněné statistiky pro anketu mezi okresními garanty + +from dataclasses import dataclass +from sqlalchemy import and_ +from sqlalchemy.orm import joinedload, aliased +import sys +from typing import Dict + +import mo.config as config +import mo.csv +import mo.db as db + + +@dataclass +class Row(mo.csv.Row): + jmeno: str + okres: str + kraj: str + dom_ucastnici: int = 0 + okr_ucastnici: int = 0 + dom_skoly: int = 0 + skolni_garanti: int = 0 + dom_ucastnici_s_body: int = 0 + + +stats: Dict[int, Row] = {} +sess = db.get_session() + +for okres in sess.query(db.Place).filter_by(level=2).options(joinedload(db.Place.parent_place)).all(): + stats[okres.place_id] = Row("", okres.name, okres.parent_place.name) + + +def kolo(seq: int, region_id: int): + print(seq, region_id, file=sys.stderr) + row = stats[region_id] + + ctq = (sess.query(db.Contest) + .join(db.Contest.round) + .filter(db.Round.year == config.CURRENT_YEAR) + .filter(db.Round.category.in_(['Z6', 'Z7', 'Z8'])) + .filter(db.Round.seq == seq) + .join(db.RegionDescendant, and_(db.RegionDescendant.descendant == db.Contest.place_id, + db.RegionDescendant.region == region_id)) + .filter(sess.query(db.Participation) + .filter(db.Participation.contest_id == db.Contest.contest_id) + .filter(db.Participation.state.in_((db.PartState.registered, db.PartState.active))) + .exists()) + .subquery()) + cts = aliased(db.Contest, ctq) + + pant_q = (sess.query(db.Participation.user_id) + .join(cts, cts.contest_id == db.Participation.contest_id) + .filter(db.Participation.state.in_((db.PartState.registered, db.PartState.active)))) + + if seq == 1: + row.dom_ucastnici = pant_q.distinct().count() + + row.dom_ucastnici_s_body = (pant_q + .filter(sess.query(db.Solution) + .filter(db.Solution.user_id == db.Participation.user_id) + .filter(db.Solution.points != None) + .exists()) + .distinct() + .count()) + + row.dom_skoly = sess.query(cts.place_id).distinct().count() + + skg = (sess.query(cts.place_id) + .filter(sess.query(db.UserRole) + .filter(db.UserRole.role == db.RoleType.garant_skola) + .join(db.Place, db.Place.place_id == db.UserRole.place_id) + .join(db.RegionDescendant, and_(db.RegionDescendant.region == db.Place.place_id, + db.RegionDescendant.descendant == cts.place_id)) + .exists()) + .distinct() + .count()) + row.skolni_garanti = skg + + else: + row.okr_ucastnici = pant_q.distinct().count() + + +for seq in [1, 2]: + for reg in stats.keys(): + kolo(seq, reg) + +mo.csv.write(sys.stdout, mo.csv.FileFormat.en_csv, Row, sorted(stats.values(), key=lambda r: (r.kraj, r.okres))) -- GitLab