From f80fb6ca76beffffcec654699797616bdde3359e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Setni=C4=8Dka?= <setnicka@seznam.cz>
Date: Tue, 14 Dec 2021 17:40:03 +0100
Subject: [PATCH] =?UTF-8?q?Opraven=C3=BD=20typing=20pro=20v=C3=BDsledkov?=
 =?UTF-8?q?=C3=A9=20listiny?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mo/score.py         |  1 +
 mo/web/org_score.py | 34 +++++++++++++++-------------------
 mo/web/user.py      | 12 +++++++-----
 3 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/mo/score.py b/mo/score.py
index 04440a2b..c4914913 100644
--- a/mo/score.py
+++ b/mo/score.py
@@ -118,6 +118,7 @@ class Score:
 
         # Příprava subquery na účastníky (contest_subq obsahuje master_contest_id)
         sess = db.get_session()
+        contest_subq: Union[List[int], Query]
         if contest:
             assert contest.master_contest_id is not None
             contest_subq = [contest.master_contest_id]
diff --git a/mo/web/org_score.py b/mo/web/org_score.py
index 83fdb8a5..309ce8a5 100644
--- a/mo/web/org_score.py
+++ b/mo/web/org_score.py
@@ -2,11 +2,11 @@ import decimal
 from flask import g, render_template, request
 from flask.helpers import flash, url_for
 from typing import Iterable, List, Optional, Tuple, Union
-from flask_wtf.form import FlaskForm
+from flask_wtf.form import FlaskForm  # type: ignore
 import json
 import werkzeug.exceptions
 from werkzeug.utils import redirect
-import wtforms
+import wtforms  # type: ignore
 
 import mo
 import mo.db as db
@@ -34,17 +34,12 @@ class SolPointsCell(Cell):
     def __str__(self) -> str:
         if not self.sol:
             return '–'
-        elif self.sol.points is None:
-            return '?'
-        return format_decimal(self.sol.points)
+        return format_decimal(self.sol.points) or '?'
 
     def to_html(self) -> str:
         if not self.sol:
             return '<td>–'
-        elif self.sol.points is None:
-            points = '<span class="unknown">?</span>'
-        else:
-            points = format_decimal(self.sol.points)
+        points = format_decimal(self.sol.points) or '<span class="unknown">?</span>'
 
         if not self.link_to_paper:
             return f'<td>{points}'
@@ -103,7 +98,7 @@ def org_score(round_id: Optional[int] = None, hier_id: Optional[int] = None, ct_
             count = 0
             for result in results:
                 try:
-                    score_suborder = int(request.form.get(f"suborder_{result.user.user_id}"))
+                    score_suborder = request.form.get(f"suborder_{result.user.user_id}", type=int)
                 except ValueError:
                     score_suborder = None
 
@@ -208,7 +203,7 @@ def org_score(round_id: Optional[int] = None, hier_id: Optional[int] = None, ct_
             'total_points': format_decimal(result.get_total_points()),
             'birth_year':   pant.birth_year,
             'order_key':    result._order_key,
-            'suborder':     CellInput(f"suborder_{user.user_id}", pion.score_suborder, "number", attrs={"size": 6}),
+            'suborder':     CellInput(f"suborder_{user.user_id}", str(pion.score_suborder), "number", attrs={"size": "6"}),
         })
 
         sols = result.get_sols_map()
@@ -300,23 +295,24 @@ def org_score_snapshots(ct_id: int):
 
             snapshot_rows = []
             for result in results:
-                snapshot_row = {
+                tasks_points: List[Optional[str]] = []
+                sols = result.get_sols_map()
+                for task in tasks:
+                    sol = sols.get(task.task_id)
+                    tasks_points.append(format_decimal(sol.points) if sol else None)
+
+                snapshot_rows.append({
                     'order': result.order.__dict__,
                     'winner': result.winner,
                     'successful': result.successful,
                     'name': result.user.full_name(),
                     'school': result.pant.school_place.name or "?",
                     'grade': result.pant.grade,
-                    'tasks': [],
+                    'tasks': tasks_points,
                     'total_points': format_decimal(result.get_total_points()),
                     'birth_year': result.pant.birth_year,
                     'order_key': json.dumps(result._order_key, cls=OrderKeyEncoder)
-                }
-                sols = result.get_sols_map()
-                for task in tasks:
-                    sol = sols.get(task.task_id)
-                    snapshot_row['tasks'].append(format_decimal(sol.points) if sol else None)
-                snapshot_rows.append(snapshot_row)
+                })
 
             score_table = db.ScoreTable(
                 contest_id=ct_id,
diff --git a/mo/web/user.py b/mo/web/user.py
index 62a88d5c..ec9c11e7 100644
--- a/mo/web/user.py
+++ b/mo/web/user.py
@@ -6,7 +6,7 @@ import hashlib
 import hmac
 from sqlalchemy import and_
 from sqlalchemy.orm import joinedload
-from typing import List, Tuple, Optional
+from typing import List, Tuple, Optional, Dict, Any
 import werkzeug.exceptions
 import wtforms
 from wtforms.validators import Required
@@ -508,13 +508,15 @@ def scoretable_construct(scoretable: db.ScoreTable, is_export: bool = False) ->
     if is_export:
         columns.insert(1, Column(key='status', name='stav'))
 
-    for (code, name) in scoretable.tasks:
+    tasks: List[Tuple[str, str]] = scoretable.tasks  # type: ignore
+    for (code, name) in tasks:
         columns.append(Column(key=f'task_{code}', name=code, title=code))
     columns.append(Column(key='total_points', name='celkove_body', title='Celkové body'))
 
     table_rows = []
-    for row in scoretable.rows:
-        order_cell = OrderCell(place=row['order']['place'], span=row['order']['span'], continuation=row['order']['continuation'])
+    rows: List[Dict[str, Any]] = scoretable.rows  # type: ignore
+    for row in rows:
+        order_cell = OrderCell(place=int(row['order']['place']), span=int(row['order']['span']), continuation=bool(row['order']['continuation']))
         row['order'] = order_cell
 
         html_attr = {}
@@ -525,7 +527,7 @@ def scoretable_construct(scoretable: db.ScoreTable, is_export: bool = False) ->
             row['status'] = 'úspěšný'
             html_attr = {"class": "successful", "title": "Úspěšný řešitel"}
 
-        for ((code, _), points) in zip(scoretable.tasks, row['tasks']):
+        for ((code, _), points) in zip(tasks, row['tasks']):
             row[f'task_{code}'] = points or '–'
 
         table_rows.append(Row(keys=row, html_attr=html_attr))
-- 
GitLab