From 13f5c44fdcfdccf1ca0a2e56b6caac8dfbe6ad3d Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Sat, 2 Jan 2021 22:29:26 +0100 Subject: [PATCH] =?UTF-8?q?V=C3=BDpis=20a=20export=20v=C5=A1ech=20=C3=BA?= =?UTF-8?q?=C4=8Dastn=C3=ADk=C5=AF=20dan=C3=A9ho=20kola?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #15. --- mo/web/org_contest.py | 83 ++++++++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py index 70ef8117..c82f585b 100644 --- a/mo/web/org_contest.py +++ b/mo/web/org_contest.py @@ -5,7 +5,7 @@ import locale import os import secrets from sqlalchemy.orm import joinedload -from typing import List, Tuple, Optional +from typing import List, Tuple, Optional, Sequence import werkzeug.exceptions import wtforms @@ -75,7 +75,19 @@ def org_round(id: int): @app.route('/org/contest/r/<int:id>/list') def org_round_list(id: int): - return render_template('not_implemented.html') + round, rr = get_round_rr(id, mo.rights.Right.manage_contest) + format = request.args.get('format', "") + + table = make_contestant_table(round, None) + + if format == "": + return render_template( + 'org_round_list.html', + round=round, + table=table, + ) + else: + return table.send_as(format) @app.route('/org/contest/r/<int:id>/import', methods=('GET', 'POST')) @@ -193,6 +205,23 @@ def org_contest_import_template(): return resp +@app.route('/org/contest/c/<int:id>/ucastnici') +def org_contest_list(id: int): + contest, rr = get_contest_rr(id, mo.rights.Right.manage_contest) + format = request.args.get('format', "") + + table = make_contestant_table(contest.round, contest) + + if format == "": + return render_template( + 'org_contest_list.html', + contest=contest, + table=table, + ) + else: + return table.send_as(format) + + contest_list_columns = ( Column(key='first_name', name='krestni', title='Křestní jméno'), Column(key='last_name', name='prijmeni', title='Příjmení'), @@ -206,24 +235,26 @@ contest_list_columns = ( ) -@app.route('/org/contest/c/<int:id>/ucastnici') -def org_contest_list(id: int): - contest, rr = get_contest_rr(id, mo.rights.Right.manage_contest) - format = request.args.get('format', "") +def make_contestant_table(round: db.Round, contest: Optional[db.Contest]) -> Table: + query = (db.get_session() + .query(db.Participation, db.Participant, db.Contest) + .select_from(db.Participation) + .join(db.Participant, db.Participant.user_id == db.Participation.user_id) + .filter(db.Participant.year == round.year)) + if contest: + query = query.join(db.Contest, db.Contest.contest_id == contest.contest_id) + else: + query = query.filter(db.Contest.round == round) + query = query.options(joinedload(db.Contest.place)) + query = query.filter(db.Participation.contest_id == db.Contest.contest_id) + query = query.options(joinedload(db.Participation.user), + joinedload(db.Participation.place), + joinedload(db.Participant.school_place)) - ctants = (db.get_session() - .query(db.Participation, db.Participant) - .select_from(db.Participation) - .join(db.Participant, db.Participant.user_id == db.Participation.user_id) - .options(joinedload(db.Participation.user), - joinedload(db.Participation.place), - joinedload(db.Participant.school_place)) - .filter(db.Participation.contest == contest) - .filter(db.Participant.year == contest.round.year) - .all()) + ctants = query.all() rows: List[dict] = [] - for pion, pant in ctants: + for pion, pant, ct in ctants: rows.append({ 'first_name': pion.user.first_name, 'last_name': pion.user.last_name, @@ -232,23 +263,19 @@ def org_contest_list(id: int): 'school_code': cell_place_link(pant.school_place, pant.school_place.get_code()), 'grade': pant.grade, 'born_year': pant.birth_year, + 'region_code': ct.place.get_code(), 'place_code': pion.place.get_code(), 'status': pion.state.name, }) rows.sort(key=lambda r: (locale.strxfrm(r['last_name']), locale.strxfrm(r['first_name']))) - table = Table( - columns=contest_list_columns, + cols: Sequence[Column] = contest_list_columns + if not contest: + cols = list(cols) + [Column(key='region_code', name='kod_oblasti', title='Oblast')] + + return Table( + columns=cols, rows=rows, filename='ucastnici', ) - - if format == "": - return render_template( - 'org_contest_list.html', - contest=contest, - table=table, - ) - else: - return table.send_as(format) -- GitLab