From 88ccc5547a77affed7241e026fd5ac0316fb7541 Mon Sep 17 00:00:00 2001 From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz> Date: Sun, 1 Aug 2021 19:11:09 +0200 Subject: [PATCH] =?UTF-8?q?Nepovinn=C3=A9=20vstupy=20funkc=C3=AD=20find=5F?= =?UTF-8?q?or=5Fcreate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Funkce find_or_create_user a find_or_create_participant mohou jako jméno resp. školu, ročník a rok narození brát None. V případě, že daný uživatel/registrace existuje, tak vše proběhne v pořádku. V případě, že neexistuje, tak funkce spadne s chybou. --- mo/users.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/mo/users.py b/mo/users.py index 6fef5ec9..04435f11 100644 --- a/mo/users.py +++ b/mo/users.py @@ -49,11 +49,13 @@ def validate_and_find_school(kod: str) -> db.Place: return place -def find_or_create_user(email: str, krestni: str, prijmeni: str, is_org: bool, reason: str) -> Tuple[db.User, bool]: +def find_or_create_user(email: str, krestni: Optional[str], prijmeni: Optional[str], is_org: bool, reason: str) -> Tuple[db.User, bool]: sess = db.get_session() user = sess.query(db.User).filter_by(email=email).one_or_none() is_new = user is None if user is None: # HACK: Podmínku je nutné zapsat znovu místo užití is_new, jinak si s tím mypy neporadí + if not krestni or not prijmeni: + raise mo.CheckError('Osoba s daným emailem zatím neexistuje, je nutné uvést její jméno.') user = db.User(email=email, first_name=krestni, last_name=prijmeni, is_org=is_org) sess.add(user) sess.flush() # Aby uživatel dostal user_id @@ -64,7 +66,7 @@ def find_or_create_user(email: str, krestni: str, prijmeni: str, is_org: bool, r details={'action': 'create-user', 'reason': reason, 'new': db.row2dict(user)}, ) else: - if user.first_name != krestni or user.last_name != prijmeni: + if (krestni and user.first_name != krestni) or (prijmeni and user.last_name != prijmeni): raise mo.CheckError(f'Osoba již registrována s odlišným jménem {user.full_name()}') if (user.is_admin or user.is_org) != is_org: if is_org: @@ -74,11 +76,17 @@ def find_or_create_user(email: str, krestni: str, prijmeni: str, is_org: bool, r return user, is_new -def find_or_create_participant(user: db.User, year: int, school_id: int, birth_year: int, grade: str, reason: str) -> Tuple[db.Participant, bool]: +def find_or_create_participant(user: db.User, year: int, school_id: Optional[int], birth_year: Optional[int], grade: Optional[str], reason: str) -> Tuple[db.Participant, bool]: sess = db.get_session() part = sess.query(db.Participant).get((user.user_id, year)) is_new = part is None if part is None: + if not school_id: + raise mo.CheckError('Osoba s daným emailem zatím není zaregistrovaná do ročníku, je nutné uvést školu.') + if not birth_year: + raise mo.CheckError('Osoba s daným emailem zatím není zaregistrovaná do ročníku, je nutné uvést rok narození.') + if not grade: + raise mo.CheckError('Osoba s daným emailem zatím není zaregistrovaná do ročníku, je nutné uvést ročník.') part = db.Participant(user=user, year=year, school=school_id, birth_year=birth_year, grade=grade) sess.add(part) logger.info(f'{reason.title()}: Založen účastník #{user.user_id}') @@ -88,9 +96,9 @@ def find_or_create_participant(user: db.User, year: int, school_id: int, birth_y details={'action': 'create-participant', 'reason': reason, 'new': db.row2dict(part)}, ) else: - if (part.school != school_id - or part.grade != grade - or part.birth_year != birth_year): + if ((school_id and part.school != school_id) + or (grade and part.grade != grade) + or (birth_year and part.birth_year != birth_year)): raise mo.CheckError('Účastník již zaregistrován s odlišnou školou/ročníkem/rokem narození') return part, is_new -- GitLab