From a3558a99e9dc08efb2b0ca26e909f3df35280757 Mon Sep 17 00:00:00 2001
From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz>
Date: Thu, 30 Sep 2021 18:11:19 +0200
Subject: [PATCH] =?UTF-8?q?Reforma=20import=C5=AF:=20Zru=C5=A1en=C3=AD=20c?=
=?UTF-8?q?reate=5Fimport?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bin/import-points | 7 ++-
mo/imports.py | 106 +++++++++++++++++++++++++-----------------
mo/web/imports.py | 1 +
mo/web/org_contest.py | 15 ++----
4 files changed, 72 insertions(+), 57 deletions(-)
diff --git a/bin/import-points b/bin/import-points
index 17055911..14227e98 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 a831f257..6c4156d0 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 928793d3..c9a84cb7 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 39444f90..fc22d418 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',
--
GitLab