Skip to content
Snippets Groups Projects
Commit 88ccc554 authored by Jiří Kalvoda's avatar Jiří Kalvoda
Browse files

Nepovinné vstupy funkcí find_or_create

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.
parent f81c85b2
No related branches found
No related tags found
1 merge request!93Nepovinné parametry u již známých soutěžících při přidávání do soutěže
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment