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