From 8faa7f83e78716c5db6492370c27a93d8a01507e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Pracha=C5=99?= <jan.prachar@gmail.com>
Date: Wed, 21 Apr 2021 01:50:14 +0200
Subject: [PATCH] import: add run_on_row()

---
 mo/imports.py         | 12 +++++++++++-
 mo/web/org_contest.py | 21 +++++++--------------
 2 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/mo/imports.py b/mo/imports.py
index f0eedb2c..efbbed42 100644
--- a/mo/imports.py
+++ b/mo/imports.py
@@ -440,6 +440,16 @@ class Import:
         self.notify_users()
         return True
 
+    def run_on_row(self, row: mo.csv.Row) -> bool:
+        self.import_row(row)
+        if len(self.errors) > 0:
+            db.get_session().rollback()
+            return False
+
+        db.get_session().commit()
+        self.notify_users()
+        return True
+
 
 @dataclass
 class ContestImportRow(mo.csv.Row):
@@ -746,7 +756,7 @@ class PointsImport(Import):
 
 def create_import(user: db.User,
                   type: ImportType,
-                  fmt: FileFormat,
+                  fmt: Optional[FileFormat] = None,
                   round: Optional[db.Round] = None,
                   contest: Optional[db.Contest] = None,
                   task: Optional[db.Task] = None,
diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py
index d43ed413..76ae59eb 100644
--- a/mo/web/org_contest.py
+++ b/mo/web/org_contest.py
@@ -17,7 +17,7 @@ import mo
 from mo.csv import FileFormat
 import mo.config as config
 import mo.db as db
-from mo.imports import ImportType, ContestImport, ContestImportRow, create_import
+from mo.imports import ImportType, ContestImportRow, create_import
 import mo.jobs.submit
 from mo.rights import Right, ContestRights
 import mo.util
@@ -249,7 +249,7 @@ class ParticipantAddForm(FlaskForm):
     save = wtforms.SubmitField("Přidat")
 
     def get_school_code(self) -> str:
-        return self.school_code.data if self.school_code else '#'+self.school.data
+        return self.school_code.data if self.school_code else '#'+str(self.school.data)
 
     def set_descriptions(self, contest: db.Contest):
         self.school_code.description = 'Kód školy najdete v <a href="' + url_for('org_place', id=contest.place.place_id)+ '">katalogu míst</a>.'
@@ -515,21 +515,14 @@ def org_contest_add_user(id: int, site_id: Optional[int] = None):
         row.rok_naroz = form.rok_naroz.data
         if form.participation_place:
             row.kod_mista = form.participation_place.data
+        elif site:
+            row.kod_mista = '#'+str(site.place_id)
 
-        imp = ContestImport()
-        imp.user = g.user
-        imp.round = contest.round
-        imp.contest = master_contest
-        imp.gatekeeper = mo.rights.Gatekeeper(g.user)
-        imp.setup()
-        imp.import_row(row)
-        errs = imp.errors
-        if len(errs) == 0:
-            db.get_session().commit()
-            imp.notify_users()
+        imp = create_import(user=g.user, type=ImportType.participants, round=master_contest.round, contest=master_contest)
+        if imp.run_on_row(row):
             return redirect(url_for('org_contest_list', id=id, site_id=site_id))
         else:
-            db.get_session().rollback()
+            errs = imp.errors
 
     return render_template(
         'org_contest_add_user.html',
-- 
GitLab