diff --git a/mo/imports.py b/mo/imports.py index 6bccc47d8a2d6e8f56f424acced6a3a0f48047a1..b8c34f96702b3073f11eeb6be0180515da11d701 100644 --- a/mo/imports.py +++ b/mo/imports.py @@ -104,9 +104,12 @@ class Import: except ValueError: return self.error('ID uživatele není číslo') - def parse_email(self, email: str) -> Optional[str]: + def parse_email(self, email: str, optional: bool) -> Optional[str]: if email == "": - return self.error('Chybí e-mailová adresa') + if optional: + return "" + else: + return self.error('Chybí e-mailová adresa') try: # XXX: Zde si nemůžeme dovolit kontrolovat existenci domén, @@ -213,12 +216,11 @@ class Import: def find_or_create_user(self, email: str, krestni: Optional[str], prijmeni: Optional[str], is_org: bool) -> Optional[db.User]: try: - 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.") + 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: @@ -387,9 +389,11 @@ class Import: return False def get_row_name(self, row: mo.csv.Row) -> Optional[str]: - if hasattr(row, 'email'): - # čtení prvku potomka + # čteme prvky potomka třídy Row + if hasattr(row, 'email') and row.email: return row.email # type: ignore + if hasattr(row, 'krestni') and hasattr(row, 'prijmeni') and row.krestni and row.prijmeni: + return row.krestni + ' ' + row.prijmeni # type: ignore return None def generic_import(self, path: str, despite_warnings: bool) -> bool: @@ -514,7 +518,7 @@ class ContestImport(Import): assert self.round assert isinstance(r, ContestImportRow) num_prev_errs = len(self.errors) - email = self.parse_email(r.email) + email = self.parse_email(r.email, optional=True) krestni = self.parse_name(r.krestni) if r.krestni else None prijmeni = self.parse_name(r.prijmeni) if r.prijmeni else None school_place = self.parse_school(r.kod_skoly) if r.kod_skoly else None @@ -522,6 +526,7 @@ class ContestImport(Import): school_place = self.default_place rocnik = self.parse_grade(r.rocnik, (school_place.school if school_place else None)) if r.rocnik else None rok_naroz = self.parse_born(r.rok_naroz) if r.rok_naroz else None + misto = self.parse_opt_place(r.kod_mista, 'místo') if misto and not self.check_rights(self.round, misto): return self.error(f'Nemáte práva na správu soutěže {misto.name_locative()}') @@ -530,10 +535,13 @@ class ContestImport(Import): if oblast and not self.check_rights(self.round, oblast): return self.error(f'Nemáte práva na správu soutěže {oblast.name_locative()}') - if (len(self.errors) > num_prev_errs - or email is None): + if len(self.errors) > num_prev_errs: return + try: + email = mo.users.email_or_synthesize(email, krestni, prijmeni, rocnik, school_place) + except mo.CheckError as e: + return self.error(str(e)) user = self.find_or_create_user(email, krestni, prijmeni, is_org=False) if user is None: return @@ -604,7 +612,7 @@ class OrgsImport(Import): def import_row(self, r: mo.csv.Row) -> None: assert isinstance(r, OrgsImportRow) or isinstance(r, GlobalOrgsImportRow) num_prev_errs = len(self.errors) - email = self.parse_email(r.email) + email = self.parse_email(r.email, optional=False) krestni = self.parse_name(r.krestni) prijmeni = self.parse_name(r.prijmeni) role = self.parse_role(r.role)