From cca91fd4496fbd081d890e8db7a0e6c4690a125c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Setni=C4=8Dka?= <setnicka@seznam.cz>
Date: Sun, 21 Nov 2021 15:55:09 +0100
Subject: [PATCH] =?UTF-8?q?V=C3=BDsledkovky=20i=20pro=20hierarchick=C3=A9?=
 =?UTF-8?q?=20proch=C3=A1zen=C3=AD=20sout=C4=9B=C5=BE=C3=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Issue #238
---
 mo/score.py                     | 8 +++++++-
 mo/web/org_score.py             | 8 +++++---
 mo/web/templates/org_round.html | 2 +-
 mo/web/templates/org_score.html | 1 +
 4 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/mo/score.py b/mo/score.py
index f497e95e..04440a2b 100644
--- a/mo/score.py
+++ b/mo/score.py
@@ -87,6 +87,7 @@ class ScoreTask:
 class Score:
     round: db.Round
     contest: Optional[db.Contest]
+    hier_place: Optional[db.Place]
     part_states: List[db.PartState]
     want_successful: bool
     want_winners: bool
@@ -104,12 +105,13 @@ class Score:
     _messages: List[Tuple[str, str]]
 
     def __init__(
-        self, round: db.Round, contest: Optional[db.Contest] = None,
+        self, round: db.Round, contest: Optional[db.Contest] = None, hier_place: Optional[db.Place] = None,
         # Ze kterých stavů chceme výsledkovku počítat
         part_states: List[db.PartState] = [db.PartState.registered, db.PartState.active],
     ):
         self.round = round
         self.contest = contest
+        self.hier_place = hier_place
         self.part_states = part_states
         self.want_successful = round.score_successful_limit is not None
         self.want_winners = round.score_winner_limit is not None
@@ -121,6 +123,10 @@ class Score:
             contest_subq = [contest.master_contest_id]
         else:
             contest_subq = sess.query(db.Contest.master_contest_id).filter_by(round=round)
+            if hier_place:
+                contest_subq = db.filter_place_nth_parent(
+                    contest_subq, db.Contest.place_id, round.level - hier_place.level, hier_place.place_id
+                )
 
         # Načtení účastníků
         data: List[Tuple[db.User, db.Participation, db.Participant]] = (
diff --git a/mo/web/org_score.py b/mo/web/org_score.py
index 7fc047f2..1e5c0681 100644
--- a/mo/web/org_score.py
+++ b/mo/web/org_score.py
@@ -86,10 +86,12 @@ class ScoreEditForm(FlaskForm):
 
 @app.route('/org/contest/r/<int:round_id>/score')
 @app.route('/org/contest/r/<int:round_id>/score/edit', methods=('GET', 'POST'), endpoint="org_score_edit")
+@app.route('/org/contest/r/<int:round_id>/h/<int:hier_id>/score')
+@app.route('/org/contest/r/<int:round_id>/h/<int:hier_id>/score/edit', methods=('GET', 'POST'), endpoint="org_score_edit")
 @app.route('/org/contest/c/<int:ct_id>/score')
 @app.route('/org/contest/c/<int:ct_id>/score/edit', methods=('GET', 'POST'), endpoint="org_score_edit")
-def org_score(round_id: Optional[int] = None, ct_id: Optional[int] = None):
-    ctx = get_context(round_id=round_id, ct_id=ct_id)
+def org_score(round_id: Optional[int] = None, hier_id: Optional[int] = None, ct_id: Optional[int] = None):
+    ctx = get_context(round_id=round_id, hier_id=hier_id, ct_id=ct_id)
     contest = ctx.contest
     round = ctx.round
     format = request.args.get('format', "")
@@ -104,7 +106,7 @@ def org_score(round_id: Optional[int] = None, ct_id: Optional[int] = None):
     if is_edit and not ctx.rights.have_right(Right.manage_contest):
         raise werkzeug.exceptions.Forbidden()
 
-    score = Score(round.master, contest)
+    score = Score(round.master, contest, ctx.hier_place)
     tasks = score.get_tasks()
     results = score.get_sorted_results()
     messages = score.get_messages()
diff --git a/mo/web/templates/org_round.html b/mo/web/templates/org_round.html
index 0a8ab128..25e71383 100644
--- a/mo/web/templates/org_round.html
+++ b/mo/web/templates/org_round.html
@@ -88,7 +88,7 @@
 	{% if can_view_contestants %}
 	<a class="btn btn-primary" href='{{ ctx.url_for('org_generic_list') }}'>Seznam účastníků</a>
 	{% endif %}
-	{% if can_view_contestants and round.state in [RoundState.grading, RoundState.closed, RoundState.delegate] and not in_hier %}
+	{% if can_view_contestants and round.state in [RoundState.grading, RoundState.closed, RoundState.delegate] %}
 	<a class="btn btn-primary" href='{{ ctx.url_for('org_score') }}'>Výsledky</a>
 	{% endif %}
 	{% if can_manage_contest %}
diff --git a/mo/web/templates/org_score.html b/mo/web/templates/org_score.html
index 9b1c170c..5aa15a38 100644
--- a/mo/web/templates/org_score.html
+++ b/mo/web/templates/org_score.html
@@ -3,6 +3,7 @@
 
 {% block title %}
 {{ round.round_code() }}: Výsledky pro {{ round.name|lower }} kategorie {{ round.category }}{% if contest %} {{ contest.place.name_locative() }}{% endif %}
+{% if ctx.hier_place %} ({{ ctx.hier_place.name_locative() }}){% endif %}
 {% endblock %}
 {% block breadcrumbs %}
 {{ ctx.breadcrumbs(action="Výsledky oblasti" if contest else "Výsledky kola") }}
-- 
GitLab