Skip to content
Snippets Groups Projects
Commit e18c00e7 authored by Jiří Kalvoda's avatar Jiří Kalvoda
Browse files

Import: Sjednocení a zobecnění importu organizátorů

parent 3e295f0d
No related branches found
No related tags found
1 merge request!97Import orgů
...@@ -21,8 +21,7 @@ from mo.util_format import format_decimal ...@@ -21,8 +21,7 @@ from mo.util_format import format_decimal
class ImportType(db.MOEnum): class ImportType(db.MOEnum):
participants = auto() participants = auto()
proctors = auto() orgs = auto()
judges = auto()
points = auto() points = auto()
def friendly_name(self) -> str: def friendly_name(self) -> str:
...@@ -31,8 +30,7 @@ class ImportType(db.MOEnum): ...@@ -31,8 +30,7 @@ class ImportType(db.MOEnum):
import_type_names = { import_type_names = {
ImportType.participants.name: 'účastníci', ImportType.participants.name: 'účastníci',
ImportType.proctors.name: 'dozor', ImportType.orgs.name: 'organizátoři',
ImportType.judges.name: 'opravovatelé',
ImportType.points.name: 'body', ImportType.points.name: 'body',
} }
...@@ -150,6 +148,12 @@ class Import: ...@@ -150,6 +148,12 @@ class Import:
self.place_cache[kod] = place self.place_cache[kod] = place
return 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]: def parse_school(self, kod: str) -> Optional[db.Place]:
if kod in self.school_place_cache: if kod in self.school_place_cache:
return self.school_place_cache[kod] return self.school_place_cache[kod]
...@@ -479,84 +483,49 @@ class ContestImport(Import): ...@@ -479,84 +483,49 @@ class ContestImport(Import):
@dataclass @dataclass
class ProctorImportRow(mo.csv.Row): class OrgsImportRow(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):
email: str = "" email: str = ""
krestni: str = "" krestni: str = ""
prijmeni: str = "" prijmeni: str = ""
kod_oblasti: str = "" kod_oblasti: str = ""
role: str = ""
class JudgeImport(Import): class OrgsImport(Import):
row_class = JudgeImportRow row_class = OrgsImportRow
row_example = JudgeImportRow( row_example = OrgsImportRow(
email='nekdo@example.org', email='nekdo@example.org',
krestni='Pokusný', krestni='Pokusný',
prijmeni='Králík', prijmeni='Králík',
kod_oblasti='B', kod_oblasti='#3333',
role='dozor',
) )
log_msg_prefix = 'Opravovatelé' log_msg_prefix = 'Organizátoři'
log_details = {'action': 'import-judges'} log_details = {'action': 'import-orgs'}
template_basename = 'sablona-oprav' template_basename = 'sablona-organizatori'
root_place: db.Place
def setup(self): def setup(self):
assert self.round is not None assert self.round is not None
self.root_place = db.get_root_place() self.root_place = db.get_root_place()
def import_row(self, r: mo.csv.Row): def import_row(self, r: mo.csv.Row):
assert isinstance(r, JudgeImportRow) assert isinstance(r, OrgsImportRow)
num_prev_errs = len(self.errors) num_prev_errs = len(self.errors)
email = self.parse_email(r.email) email = self.parse_email(r.email)
krestni = self.parse_name(r.krestni) krestni = self.parse_name(r.krestni)
prijmeni = self.parse_name(r.prijmeni) prijmeni = self.parse_name(r.prijmeni)
oblast = self.parse_opt_place(r.kod_oblasti, 'oblast') 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 if (len(self.errors) > num_prev_errs
or email is None or email is None
...@@ -568,12 +537,7 @@ class JudgeImport(Import): ...@@ -568,12 +537,7 @@ class JudgeImport(Import):
if user is None: if user is None:
return return
contest = self.obtain_contest(oblast, allow_none=True) self.add_role(user, oblast, role)
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)
@dataclass @dataclass
...@@ -737,10 +701,8 @@ def create_import(user: db.User, ...@@ -737,10 +701,8 @@ def create_import(user: db.User,
imp: Import imp: Import
if type == ImportType.participants: if type == ImportType.participants:
imp = ContestImport() imp = ContestImport()
elif type == ImportType.proctors: elif type == ImportType.orgs:
imp = ProctorImport() imp = OrgsImport()
elif type == ImportType.judges:
imp = JudgeImport()
elif type == ImportType.points: elif type == ImportType.points:
imp = PointsImport() imp = PointsImport()
else: else:
......
...@@ -417,7 +417,7 @@ class ImportForm(FlaskForm): ...@@ -417,7 +417,7 @@ class ImportForm(FlaskForm):
file = flask_wtf.file.FileField("Soubor", render_kw={'autofocus': True}) file = flask_wtf.file.FileField("Soubor", render_kw={'autofocus': True})
typ = wtforms.SelectField( typ = wtforms.SelectField(
"Typ dat", "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, coerce=ImportType.coerce,
default=ImportType.participants, default=ImportType.participants,
) )
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment