diff --git a/bin/import-points b/bin/import-points index 17055911b7a7e5f2d95f4ca0c481a67b98b3d62e..14227e981031282456cd5d01b6de61c81b574ac9 100755 --- a/bin/import-points +++ b/bin/import-points @@ -5,7 +5,7 @@ import sys from mo.csv import FileFormat import mo.db as db -from mo.imports import create_import, ImportType +from mo.imports import PointsImport import mo.users import mo.util from mo.util import die @@ -37,14 +37,13 @@ user = mo.users.user_by_email(args.user) if user is None: die(f"Uživatel {args.user} neexistuje") -imp = create_import( +imp = PointsImport( user, - type=ImportType.points, - fmt=FileFormat.tsv, round=round, task=task, allow_add_del=args.add_del, ) +imp.fmt = FileFormat.tsv if args.import_file: if not imp.run(args.import_file): diff --git a/mo/imports.py b/mo/imports.py index a831f25783218cc7cc6d1f516aa69412627694ee..6c4156d073a043e5f9ec04417436331b01744bfa 100644 --- a/mo/imports.py +++ b/mo/imports.py @@ -54,12 +54,10 @@ class Import: # Interní: Co a jak zrovna importujeme user: db.User - round: Optional[db.Round] - contest: Optional[db.Contest] - only_region: Optional[db.Place] - task: Optional[db.Task] # pro Import bodů - allow_add_del: bool # pro Import bodů: je povoleno zakládat/mazat řešení - allow_change_user_to_org: bool = False # pro Import orgů: je povoleno vyrobit orga z účastníka + round: Optional[db.Round] = None + contest: Optional[db.Contest] = None + only_region: Optional[db.Place] = None + task: Optional[db.Task] = None # pro Import bodů fmt: FileFormat row_class: Type[mo.csv.Row] row_example: mo.csv.Row @@ -74,12 +72,14 @@ class Import: line_number: int = 0 row_name: Optional[str] = None - def __init__(self): + def __init__(self, user: db.User): self.errors = [] self.warnings = [] self.place_cache = {} self.school_place_cache = {} self.new_user_ids = [] + self.gatekeeper = mo.rights.Gatekeeper(user) + self.user = user def setup(self): # Definováno odvozenými třídami @@ -461,6 +461,25 @@ class ContestImport(Import): log_details = {'action': 'import'} template_basename = 'sablona-ucast' + def __init__( + self, + user: db.User, + type: ImportType, + round: Optional[db.Round] = None, + contest: Optional[db.Contest] = None, + only_region: Optional[db.Place] = None, + task: Optional[db.Task] = None, + default_place: Optional[db.Place] = None + ): + super().__init__(user) + self.user = user + self.round = round + self.contest = contest + self.only_region = only_region + self.task = task + self.default_place = default_place + self.setup() + def setup(self): assert self.round is not None assert not self.round.is_subround() @@ -521,6 +540,25 @@ class OrgsImport(Import): log_details = {'action': 'import-orgs'} template_basename = 'sablona-organizatori' + allow_change_user_to_org: bool = False # je povoleno vyrobit orga z účastníka + + def __init__( + self, + user: db.User, + round: Optional[db.Round] = None, + contest: Optional[db.Contest] = None, + only_region: Optional[db.Place] = None, + allow_change_user_to_org: bool = False, + default_place: Optional[db.Place] = None + ): + super().__init__(user) + self.round = round + self.contest = contest + self.only_region = only_region + self.default_place = default_place + self.setup() + self.allow_change_user_to_org = allow_change_user_to_org + def setup(self): assert self.round is not None self.root_place = db.get_root_place() @@ -571,6 +609,25 @@ class PointsImport(Import): row_class = PointsImportRow log_msg_prefix = 'Body' + allow_add_del: bool # je povoleno zakládat/mazat řešení + + def __init__( + self, + user: db.User, + round: Optional[db.Round] = None, + contest: Optional[db.Contest] = None, + task: Optional[db.Task] = None, + only_region: Optional[db.Place] = None, + allow_add_del: bool = False, + ): + super().__init__(user) + self.round = round + self.contest = contest + self.task = task + self.only_region = only_region + self.allow_add_del = allow_add_del + self.setup() + def setup(self): assert self.round is not None assert self.task is not None @@ -710,38 +767,3 @@ class PointsImport(Import): def get_after_import_message(self) -> str: return f'Importováno ({self.cnt_rows} řádků, {self.cnt_set_points} řešení přebodováno, {self.cnt_add_sols} založeno a {self.cnt_del_sols} smazáno)' - - -def create_import(user: db.User, - type: ImportType, - fmt: FileFormat, - round: Optional[db.Round] = None, - contest: Optional[db.Contest] = None, - only_region: Optional[db.Place] = None, - task: Optional[db.Task] = None, - allow_add_del: bool = False, - allow_change_user_to_org: bool = False, - default_place: Optional[db.Place] = None): - imp: Import - if type == ImportType.participants: - imp = ContestImport() - elif type == ImportType.orgs: - imp = OrgsImport() - imp.allow_change_user_to_org = allow_change_user_to_org - elif type == ImportType.points: - imp = PointsImport() - else: - assert False, "Neznámý typ importu" - - imp.user = user - imp.round = round - imp.contest = contest - imp.only_region = only_region - imp.task = task - imp.allow_add_del = allow_add_del - imp.fmt = fmt - imp.gatekeeper = mo.rights.Gatekeeper(user) - imp.default_place = default_place - imp.setup() - - return imp diff --git a/mo/web/imports.py b/mo/web/imports.py index 928793d3413ae976a58166c40cee248bd48da134..c9a84cb76cf63223e235ddf0fda24840fccdb5e3 100644 --- a/mo/web/imports.py +++ b/mo/web/imports.py @@ -27,6 +27,7 @@ def generic_import_page(form: ImportForm, imp: Optional[Import], redirect_url: s warnings = [] if imp: fmt = form.fmt.data + imp.fmt = fmt if form.submit.data: if form.file.data is not None: file = form.file.data.stream diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py index 39444f908331fa99ec3b42fe37e938ab67fa6fe9..fc22d418671abf19f329884fa1127c64fa291e2a 100644 --- a/mo/web/org_contest.py +++ b/mo/web/org_contest.py @@ -19,7 +19,7 @@ import mo from mo.csv import FileFormat import mo.config as config import mo.db as db -from mo.imports import ImportType, create_import +from mo.imports import ImportType, create_import, PointsImport, ContestImport, OrgsImport import mo.jobs.submit from mo.rights import Right, RoundRights import mo.util @@ -430,11 +430,8 @@ def org_import_user(round_id: Optional[int] = None, hier_id: Optional[int] = Non form = UserImportForm() imp = None if form.validate_on_submit(): - fmt = form.fmt.data - imp = create_import( + imp = ContestImport( user=g.user, - type=ImportType.participants, - fmt=fmt, round=round, contest=contest, only_region=ctx.hier_place, @@ -465,11 +462,8 @@ def org_import_org(round_id: Optional[int] = None, hier_id: Optional[int] = None form = OrgImportForm() imp = None if form.validate_on_submit(): - fmt = form.fmt.data - imp = create_import( + imp = OrgsImport( user=g.user, - type=ImportType.orgs, - fmt=fmt, round=round, contest=contest, only_region=ctx.hier_place, @@ -1326,8 +1320,7 @@ def org_generic_batch_points(task_id: int, round_id: Optional[int] = None, hier_ form = BatchPointsForm() imp = None if form.validate_on_submit(): - fmt = form.fmt.data - imp = create_import(user=g.user, type=ImportType.points, fmt=fmt, round=round, only_region=hier_place, contest=contest, task=task, allow_add_del=form.add_del_sols.data) + imp = PointsImport(user=g.user, round=round, only_region=hier_place, contest=contest, task=task, allow_add_del=form.add_del_sols.data) return generic_import_page( form, imp, ctx.url_home(), template='org_generic_batch_points.html',