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