diff --git a/mo/imports.py b/mo/imports.py index 926308a9d9783360e695b21ff8d14edf1ab9dead..73ec1a6f85476dc4e84cfea8260d50812aa3638f 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 a68bd79a44bb5417931c6efb4075cec51cc8f003..f2524acc0ac046ea583a0581111373d6e8f4ff80 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, )