From fe5b030b2f586bee5d67d5007c32867dcff0e8b7 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Sun, 15 Oct 2023 20:57:33 +0200
Subject: [PATCH] =?UTF-8?q?Import:=20Duplicitn=C3=AD=20=C3=BA=C4=8Dastn?=
 =?UTF-8?q?=C3=ADky=20nezakl=C3=A1d=C3=A1me?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Varování vypíšeme a přidání účastníka neprovedeme.
Ostatní účastníci budou korektně založeni.
---
 mo/imports.py | 33 +++++++++++++++++----------------
 1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/mo/imports.py b/mo/imports.py
index fe075389..e222be91 100644
--- a/mo/imports.py
+++ b/mo/imports.py
@@ -537,6 +537,10 @@ class ContestImport(Import):
         if oblast and not self.check_rights(self.round, oblast):
             return self.error(f'Nemáte práva na správu soutěže {oblast.name_locative()}')
 
+        contest = self.obtain_contest(self.round, oblast)
+        if contest is None:
+            return
+
         if len(self.errors) > num_prev_errs:
             return
 
@@ -549,31 +553,28 @@ class ContestImport(Import):
             return self.error(f'Účastník není rozlišitelný od toho z řádku {self.email_last_seen[email]}. Případné jmenovce vyřešte ručním přidáním účastníka.')
         self.email_last_seen[email] = self.line_number
 
-        user = self.find_or_create_user(email, krestni, prijmeni, is_org=False)
-        if user is None:
-            return
-
-        part = self.find_or_create_participant(user, self.round.year, school_place.place_id if school_place else None, rok_naroz, rocnik)
-        if part is None:
-            return
-
-        contest = self.obtain_contest(self.round, oblast)
-        if contest is None:
-            return
-
-        self.find_or_create_participation(user, contest, misto)
-
         # Kontrola na jmenovce
         sess = db.get_session()
         similar_users = (sess.query(db.User)
                              .join(db.Participation)
                              .filter(db.User.first_name == krestni)
                              .filter(db.User.last_name == prijmeni)
+                             .filter(db.User.email != email)
                              .filter(db.Participation.contest == contest)
-                             .filter(db.User != user)
                              .all())
         if similar_users:
-            self.warning('Účastník stejného jména a příjmení už na tomto místě soutěží, ověřte prosím, zda to není duplicita')
+            self.warning('Účastník stejného jména a příjmení už na tomto místě soutěží, nepřidáváme ho znovu. Případné jmenovce vyřešte ručním přidáním účastníka.')
+            return
+
+        user = self.find_or_create_user(email, krestni, prijmeni, is_org=False)
+        if user is None:
+            return
+
+        part = self.find_or_create_participant(user, self.round.year, school_place.place_id if school_place else None, rok_naroz, rocnik)
+        if part is None:
+            return
+
+        self.find_or_create_participation(user, contest, misto)
 
     def get_after_import_message(self) -> str:
         return f'Importováno ({self.cnt_rows} řádků, založeno {self.cnt_new_users} uživatelů, {self.cnt_new_participations} účastí, {self.cnt_new_contests} soutěží)'
-- 
GitLab