From c870d0b737dcb31d6ab38d5b212ce44bd45335ba Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Sun, 9 Feb 2025 21:33:09 +0100 Subject: [PATCH] =?UTF-8?q?Diplomy/UI:=20Pokud=20nen=C3=AD=20ofici=C3=A1ln?= =?UTF-8?q?=C3=AD=20v=C3=BDsledkovka,=20pou=C5=BEijme=20nejnov=C4=9Bj?= =?UTF-8?q?=C5=A1=C3=AD=20ulo=C5=BEenou?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tohle umožňuje udržet až do předání diplomů výsledky v tajnosti. --- mo/web/org_certs.py | 19 +++++++++++++++++-- mo/web/templates/org_certificates.html | 18 +++++++++++++----- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/mo/web/org_certs.py b/mo/web/org_certs.py index 56fc5f94..d145f32c 100644 --- a/mo/web/org_certs.py +++ b/mo/web/org_certs.py @@ -102,6 +102,19 @@ class CertApproveForm(FlaskForm): unapprove = wtforms.SubmitField("Zrušit schválení") +def get_cert_scoretable_id(contest: db.Contest) -> Optional[int]: + if contest.scoretable_id is not None: + return contest.scoretable_id + + # Pokud neexistuje oficiální výsledková listina, použijeme nejnovější uloženou + sess = db.get_session() + stab = sess.query(db.ScoreTable).filter_by(contest=contest).order_by(db.ScoreTable.created_at.desc()).limit(1).one_or_none() + if stab is not None: + return stab.scoretable_id + else: + return None + + @app.route('/org/contest/c/<int:ct_id>/certificates', methods=('GET', 'POST')) def org_certificates(ct_id: int): ctx = get_context(ct_id=ct_id, right_needed=Right.view_contestants) @@ -113,6 +126,7 @@ def org_certificates(ct_id: int): contest = ctx.master_contest ct_id = contest.contest_id can_change = ctx.rights.have_right(Right.manage_contest) and ctx.master_round.round_type != db.RoundType.other + preferred_scoretable_id = get_cert_scoretable_id(contest) sess = db.get_session() cset = (sess.query(db.CertSet) @@ -236,7 +250,7 @@ def org_certificates(ct_id: int): if cset.job is not None and cset.job.is_active(): flash('Počkejte, až doběhne předchozí dávka na tvorbu diplomů.', 'danger') else: - cset.job_id = schedule_create_certs(contest, g.user) + cset.job_id = schedule_create_certs(contest, preferred_scoretable_id, g.user) sess.commit() return redirect(url_for('org_job_wait', id=cset.job_id, back=ctx.url_for('org_certificates'))) else: @@ -269,8 +283,9 @@ def org_certificates(ct_id: int): users_pions=users_pions, cert_file_columns=cert_file_columns, certs_by_uid_type=certs_by_uid_type, + preferred_scoretable_id=preferred_scoretable_id, settings_changed=(cset.changed_at is not None and (cset.certs_issued_at is None or cset.certs_issued_at < cset.changed_at)), - scoretable_changed=(cset.scoretable != contest.scoretable), + scoretable_changed=(cset.scoretable_id != preferred_scoretable_id), form_has_errors=form and form.is_submitted(), ) diff --git a/mo/web/templates/org_certificates.html b/mo/web/templates/org_certificates.html index 664d2571..5c32b3d5 100644 --- a/mo/web/templates/org_certificates.html +++ b/mo/web/templates/org_certificates.html @@ -143,11 +143,19 @@ Pokud je schválíte, po uzavření kola budou dostupné soutěžícím a jejich <h3>Nastavení</h3> -{% if contest.scoretable is none %} -<div class="alert alert-warning" role="alert"> - Zatím je možné vydávat jen účastnické listy, - protože soutěž dosud nemá oficiální výsledkovou listinu. -</div> +{% if preferred_scoretable_id is not none %} + {% if contest.scoretable_id != preferred_scoretable_id %} + <div class="alert alert-warning" role="alert"> + Soutěž dosud nemá oficiální výsledkovou listinu, + takže diplomy budou vytvářeny podle + <a href='{{ url_for("org_score_snapshot", ct_id=contest.contest_id, scoretable_id=preferred_scoretable_id) }}'>nejnovější uložené výsledkové listiny</a>. + </div> + {% endif %} +{% else %} + <div class="alert alert-warning" role="alert"> + Zatím je možné vydávat jen účastnické listy, + protože soutěž dosud nemá uloženou výsledkovou listinu. + </div> {% endif %} {% macro field(f) %} -- GitLab