diff --git a/mo/users.py b/mo/users.py
index 6fef5ec9ad8280e6f5bf6693abdb76782885de6e..04435f11741d9ca7b2f35e798ce7b37561a3b789 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