From 0e57dd4766c522efeff204f2b7feefb297674600 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Pracha=C5=99?= <jan.prachar@gmail.com>
Date: Mon, 9 May 2022 20:25:15 +0200
Subject: [PATCH] =?UTF-8?q?mo/score:=20=C5=98azen=C3=AD=20podle=20roku=20n?=
 =?UTF-8?q?arozen=C3=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mo/score.py                     | 24 ++++++++++++++++++++++++
 mo/web/templates/org_score.html |  4 ++--
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/mo/score.py b/mo/score.py
index 513e8037..4972d6e4 100644
--- a/mo/score.py
+++ b/mo/score.py
@@ -1,4 +1,5 @@
 import decimal
+from flask import url_for
 from fractions import Fraction
 from sqlalchemy import and_
 from sqlalchemy.orm import joinedload
@@ -490,6 +491,7 @@ class Score:
                 result._order_key.append(-modif_points)
 
         # Na konec třídícího klíče přidáme ročník (menší ročník první)
+        # a dotřiďovací klíč
         for result in self._results.values():
             grade = normalize_grade(result.pant.grade)
             if grade == -1:
@@ -500,5 +502,27 @@ class Score:
             result._order_key.append(grade)
             result._order_key.append(result.pion.score_suborder or 0)
 
+        # Pokud stále existují sdílená místa, pokusíme se použít rok narození
+        same_order = set()
+        last = None
+        for result in sorted(self._results.values(), key=lambda result: result._order_key):
+            if last and result._order_key == last._order_key:
+                same_order.add(last)
+                same_order.add(result)
+            last = result
+        if len(same_order) > 0:
+            if all(result.pant.birth_year for result in same_order):
+                links = [f"{result.user.first_name} {result.user.last_name} ({result.pant.birth_year})" for result in same_order]
+                self._add_message("info", f"K řazení některých soutěžících byl použit rok narození: {', '.join(links)}.")
+
+                for result in self._results.values():
+                    result._order_key.append(-result.pant.birth_year if result.pant.birth_year else 0)
+            else:
+                links = [f"<a href='{url_for('org_user_participant_edit', user_id=result.user.user_id, year=result.pant.year)}'>{result.user.first_name} {result.user.last_name}</a>" for result in same_order if not result.pant.birth_year]
+                self._add_message(
+                    "error",
+                    "Doplňte prosím těmto soutežícím rok narození, aby mohl být použit pro řazení na sdílených místech: "+(", ".join(links))+"."
+                )
+
         if self._exists_same_order_key():
             self.shared_places = "O pořadí na sdílených místech rozhoduje datum narození, případně je třeba ho určit losem."
diff --git a/mo/web/templates/org_score.html b/mo/web/templates/org_score.html
index 5175736b..aac498b9 100644
--- a/mo/web/templates/org_score.html
+++ b/mo/web/templates/org_score.html
@@ -66,8 +66,8 @@ Výsledky {{ round.name|round_genitive|lower }}{% if public %} {{ round.year }}.
 {% endif %}
 </p>
 {% for (type, msg) in messages %}
-    {% if type == "error" %}<p class="text-danger"><b>{{ msg }}</b></p>
-    {% elif type == "warning" %}<p class="text-warning">{{ msg }}</p>
+    {% if type == "error" %}<p class="text-danger"><b>{{ msg | safe }}</b></p>
+    {% elif type == "warning" %}<p class="text-warning">{{ msg | safe }}</p>
     {% else %}<p>{{ msg | safe }}{% endif %}</p>
 {% endfor %}
 {% endif %}
-- 
GitLab