From e18c00e70eea41ce2252baee6bfc2477114a71b8 Mon Sep 17 00:00:00 2001
From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz>
Date: Sat, 25 Sep 2021 19:58:19 +0200
Subject: [PATCH] =?UTF-8?q?Import:=20Sjednocen=C3=AD=20a=20zobecn=C4=9Bn?=
=?UTF-8?q?=C3=AD=20importu=20organiz=C3=A1tor=C5=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
mo/imports.py | 104 ++++++++++++++----------------------------
mo/web/org_contest.py | 2 +-
2 files changed, 34 insertions(+), 72 deletions(-)
diff --git a/mo/imports.py b/mo/imports.py
index 926308a9..73ec1a6f 100644
--- a/mo/imports.py
+++ b/mo/imports.py
@@ -21,8 +21,7 @@ from mo.util_format import format_decimal
class ImportType(db.MOEnum):
participants = auto()
- proctors = auto()
- judges = auto()
+ orgs = auto()
points = auto()
def friendly_name(self) -> str:
@@ -31,8 +30,7 @@ class ImportType(db.MOEnum):
import_type_names = {
ImportType.participants.name: 'účastníci',
- ImportType.proctors.name: 'dozor',
- ImportType.judges.name: 'opravovatelé',
+ ImportType.orgs.name: 'organizátoři',
ImportType.points.name: 'body',
}
@@ -150,6 +148,12 @@ class Import:
self.place_cache[kod] = place
return place
+ def parse_role(self, name):
+ if name not in db.RoleType.__members__:
+ return self.error(f"Role {name} neexistuje. Podívejte se do manuálu na existující role.")
+
+ return db.RoleType[name]
+
def parse_school(self, kod: str) -> Optional[db.Place]:
if kod in self.school_place_cache:
return self.school_place_cache[kod]
@@ -479,84 +483,49 @@ class ContestImport(Import):
@dataclass
-class ProctorImportRow(mo.csv.Row):
- email: str = ""
- krestni: str = ""
- prijmeni: str = ""
- kod_mista: str = ""
-
-
-class ProctorImport(Import):
- row_class = ProctorImportRow
- row_example = ProctorImportRow(
- email='nekdo@example.org',
- krestni='Pokusný',
- prijmeni='Králík',
- kod_mista='#3333',
- )
- log_msg_prefix = 'Dozor'
- log_details = {'action': 'import-proctors'}
- template_basename = 'sablona-dozor'
-
- def setup(self):
- assert self.round is not None
-
- def import_row(self, r: mo.csv.Row):
- assert isinstance(r, ProctorImportRow)
- num_prev_errs = len(self.errors)
- email = self.parse_email(r.email)
- krestni = self.parse_name(r.krestni)
- prijmeni = self.parse_name(r.prijmeni)
- misto = self.parse_opt_place(r.kod_mista, 'místo')
-
- if misto is None:
- return self.error('Kód místa je povinné uvést')
-
- if (len(self.errors) > num_prev_errs
- or email is None
- or krestni is None
- or prijmeni is None):
- return
-
- user = self.find_or_create_user(email, krestni, prijmeni, is_org=True)
- if user is None:
- return
-
- self.add_role(user, misto, db.RoleType.dozor)
-
-
-@dataclass
-class JudgeImportRow(mo.csv.Row):
+class OrgsImportRow(mo.csv.Row):
email: str = ""
krestni: str = ""
prijmeni: str = ""
kod_oblasti: str = ""
+ role: str = ""
-class JudgeImport(Import):
- row_class = JudgeImportRow
- row_example = JudgeImportRow(
+class OrgsImport(Import):
+ row_class = OrgsImportRow
+ row_example = OrgsImportRow(
email='nekdo@example.org',
krestni='Pokusný',
prijmeni='Králík',
- kod_oblasti='B',
+ kod_oblasti='#3333',
+ role='dozor',
)
- log_msg_prefix = 'Opravovatelé'
- log_details = {'action': 'import-judges'}
- template_basename = 'sablona-oprav'
- root_place: db.Place
+ log_msg_prefix = 'Organizátoři'
+ log_details = {'action': 'import-orgs'}
+ template_basename = 'sablona-organizatori'
def setup(self):
assert self.round is not None
self.root_place = db.get_root_place()
def import_row(self, r: mo.csv.Row):
- assert isinstance(r, JudgeImportRow)
+ assert isinstance(r, OrgsImportRow)
num_prev_errs = len(self.errors)
email = self.parse_email(r.email)
krestni = self.parse_name(r.krestni)
prijmeni = self.parse_name(r.prijmeni)
oblast = self.parse_opt_place(r.kod_oblasti, 'oblast')
+ role = self.parse_role(r.role)
+
+ if role == db.RoleType.opravovatel:
+ if oblast is None:
+ return self.error('Kód místa je povinné uvést')
+
+ if role != db.RoleType.opravovatel:
+ contest = self.obtain_contest(oblast, allow_none=True)
+ place = contest.place if contest else self.root_place
+ if not self.check_rights(place):
+ return self.error(f'Nemáte práva na správu soutěže {place.name_locative()}')
if (len(self.errors) > num_prev_errs
or email is None
@@ -568,12 +537,7 @@ class JudgeImport(Import):
if user is None:
return
- contest = self.obtain_contest(oblast, allow_none=True)
- place = contest.place if contest else self.root_place
- if not self.check_rights(place):
- return self.error(f'Nemáte práva na správu soutěže {place.name_locative()}')
-
- self.add_role(user, place, db.RoleType.opravovatel)
+ self.add_role(user, oblast, role)
@dataclass
@@ -737,10 +701,8 @@ def create_import(user: db.User,
imp: Import
if type == ImportType.participants:
imp = ContestImport()
- elif type == ImportType.proctors:
- imp = ProctorImport()
- elif type == ImportType.judges:
- imp = JudgeImport()
+ elif type == ImportType.orgs:
+ imp = OrgsImport()
elif type == ImportType.points:
imp = PointsImport()
else:
diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py
index a68bd79a..f2524acc 100644
--- a/mo/web/org_contest.py
+++ b/mo/web/org_contest.py
@@ -417,7 +417,7 @@ class ImportForm(FlaskForm):
file = flask_wtf.file.FileField("Soubor", render_kw={'autofocus': True})
typ = wtforms.SelectField(
"Typ dat",
- choices=[(x.name, x.friendly_name()) for x in (ImportType.participants, ImportType.proctors, ImportType.judges)],
+ choices=[(x.name, x.friendly_name()) for x in (ImportType.participants, ImportType.orgs)],
coerce=ImportType.coerce,
default=ImportType.participants,
)
--
GitLab