diff --git a/mo/imports.py b/mo/imports.py index 927539ffa74edce5e1ab6211b7ef9a2fbd47214c..4e80e51577071f16bf0ed4f3bea7cc19c2bbf5f1 100644 --- a/mo/imports.py +++ b/mo/imports.py @@ -47,6 +47,7 @@ class Import: cnt_set_points: int = 0 cnt_add_sols: int = 0 cnt_del_sols: int = 0 + cnt_change_user_to_org: int = 0 # pro Import orgů: Počet provedených/požadovaných změn účastnka na orga # Veřejné vlastnosti importu template_basename: str = "sablona" @@ -58,6 +59,7 @@ class Import: 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 fmt: FileFormat row_class: Type[mo.csv.Row] row_example: mo.csv.Row @@ -195,7 +197,12 @@ class Import: def find_or_create_user(self, email: str, krestni: Optional[str], prijmeni: Optional[str], is_org: bool) -> Optional[db.User]: try: - user, is_new, is_change_user_to_org = mo.users.find_or_create_user(email, krestni, prijmeni, is_org, reason='import') + try: + user, is_new, is_user_to_org = mo.users.find_or_create_user(email, krestni, prijmeni, is_org, allow_change_user_to_org=self.allow_change_user_to_org, reason='import') + self.cnt_change_user_to_org += is_user_to_org + except mo.users.CheckErrorOrgIsUser as e: + self.cnt_change_user_to_org += 1 + raise mo.CheckError(str(e) + " Změnu můžete povolit ve formuláři.") except mo.CheckError as e: return self.error(str(e)) if is_new: @@ -276,6 +283,10 @@ class Import: ur = db.UserRole(user=user, place=place, role=role, category=round.category, year=round.year, seq=round.seq, assigned_by_user=self.user) + + if not self.gatekeeper.can_set_role(ur): + return self.error('Roli "{new_role}" nelze přidělit, není podmnožinou žádné vaší role') + sess.add(ur) sess.flush() logger.info(f'Import: {role.name.title()} user=#{user.user_id} place=#{place.place_id} user_role=#{ur.user_role_id}') @@ -517,10 +528,6 @@ class OrgsImport(Import): 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 @@ -697,12 +704,14 @@ def create_import(user: db.User, contest: Optional[db.Contest] = None, only_region: Optional[db.Place] = None, task: Optional[db.Task] = None, - allow_add_del: bool = False): + allow_add_del: bool = False, + allow_change_user_to_org: bool = False): 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: