diff --git a/mo/web/org_certs.py b/mo/web/org_certs.py index 56fc5f94d1ef27d0856c2a77941c3ad3d38fe0c5..d145f32cf5fe56d7d0e0dca174138122c1abc2f8 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 664d2571be63f29956e365041f91d9333bb3b285..5c32b3d58dc9d461873f144d3f29e7da04aa86fb 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) %}