diff --git a/mo/imports.py b/mo/imports.py index 51aa689b4e9a77adbbfc85124a688f0e0e552507..10261ecc146c8d8360c0d0ce5e99403eca4e2a6f 100644 --- a/mo/imports.py +++ b/mo/imports.py @@ -149,21 +149,16 @@ class Import: return place def parse_school(self, kod: str) -> Optional[db.Place]: - if kod == "": - return self.error('Škola je povinná') - if kod in self.school_place_cache: return self.school_place_cache[kod] - place = db.get_place_by_code(kod, fetch_school=True) - if not place: - return self.error(f'Škola s kódem "{kod}" nenalezena'+ - ('. Nechybí vám # na začátku?' if re.fullmatch(r'\d+', kod) else '')) - - if place.type != db.PlaceType.school: - return self.error(f'Kód školy "{kod}" neodpovídá škole') + try: + place = mo.users.validate_and_find_school(kod) + except mo.CheckError as e: + return self.error(str(e)) self.school_place_cache[kod] = place + return place def parse_grade(self, rocnik: str, school: Optional[db.School]) -> Optional[str]: @@ -174,24 +169,21 @@ class Import: # lidé připisují všechny možné i nemožné znaky, které vypadají jako apostrof :) rocnik = re.sub('[\'"\u00b4\u2019]', "", rocnik) - if (not re.fullmatch(r'\d(/\d)?', rocnik)): - return self.error(f'Ročník má neplatný formát, musí to být buď číslice, nebo číslice/číslice') - - if (not school.is_zs and re.fullmatch(r'\d', rocnik)): - return self.error(f'Ročník pro střední školu ({school.place.name}) zapisujte ve formátu číslice/číslice') - - if (not school.is_ss and re.fullmatch(r'\d/\d', rocnik)): - return self.error(f'Ročník pro základní školu ({school.place.name}) zapisujte jako číslici 1–9') - - return rocnik + try: + return mo.users.normalize_grade(rocnik, school) + except mo.CheckError as e: + return self.error(str(e)) def parse_born(self, rok: str) -> Optional[int]: if not re.fullmatch(r'\d{4}', rok): return self.error('Rok narození musí být čtyřciferné číslo') r = int(rok) - if r < 2000 or r > 2099: - return self.error('Rok narození musí být v intervalu [2000,2099]') + + try: + mo.users.validate_born_year(r) + except mo.CheckError as e: + return self.error(str(e)) return r diff --git a/mo/users.py b/mo/users.py index 503276570d83c2962f82a7b67b8b28be1192d716..8fd5d0e0068bfc8dcc8b01a1409ed2254bbfd3a7 100644 --- a/mo/users.py +++ b/mo/users.py @@ -13,6 +13,41 @@ import mo.util import mo.tokens +def normalize_grade(rocnik: str, school: db.School) -> str: + """ Aktuálně provádí jen kontrolu formátu. """ + + if not re.fullmatch(r'\d(/\d)?', rocnik): + raise mo.CheckError('Ročník má neplatný formát, musí to být buď číslice, nebo číslice/číslice') + + if not school.is_zs and re.fullmatch(r'\d', rocnik): + raise mo.CheckError(f'Ročník pro střední školu ({school.place.name}) zapisujte ve formátu číslice/číslice') + + if not school.is_ss and re.fullmatch(r'\d/\d', rocnik): + raise mo.CheckError(f'Ročník pro základní školu ({school.place.name}) zapisujte jako číslici 1–9') + + return rocnik + + +def validate_born_year(r: int) -> None: + if r < 2000 or r > 2099: + raise mo.CheckError('Rok narození musí být v intervalu [2000,2099]') + + +def validate_and_find_school(kod: str) -> db.Place: + if kod == "": + raise mo.CheckError('Škola je povinná') + + place = db.get_place_by_code(kod, fetch_school=True) + if not place: + raise mo.CheckError(f'Škola s kódem "{kod}" nenalezena' + + ('. Nechybí vám # na začátku?' if re.fullmatch(r'\d+', kod) else '')) + + if place.type != db.PlaceType.school: + raise mo.CheckError(f'Kód školy "{kod}" neodpovídá škole') + + return place + + def normalize_email(addr: str) -> str: if not re.fullmatch(r'.+@.+', addr): raise mo.CheckError('V e-mailové adrese chybí zavináč')