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