From d64b1cb276501821334712ecb3e6285cec4e9602 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Fri, 29 Sep 2023 18:34:41 +0200
Subject: [PATCH] =?UTF-8?q?Import:=20Varov=C3=A1n=C3=AD=20jsou=20fat=C3=A1?=
 =?UTF-8?q?ln=C3=AD,=20ale=20jdou=20overridovat?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mo/imports.py                            | 8 ++++----
 mo/web/imports.py                        | 3 ++-
 mo/web/templates/org_generic_import.html | 6 ++++++
 3 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/mo/imports.py b/mo/imports.py
index 18f86059..f326b767 100644
--- a/mo/imports.py
+++ b/mo/imports.py
@@ -383,7 +383,7 @@ class Import:
             return row.email  # type: ignore
         return None
 
-    def generic_import(self, path: str) -> bool:
+    def generic_import(self, path: str, despite_warnings: bool) -> bool:
         charset = self.fmt.get_charset()
         if charset != 'utf-8' and self.check_utf8(path):
             logger.info('Import: Uhodnuto kódování utf-8')
@@ -412,7 +412,7 @@ class Import:
             self.line_number += 1
         self.row_name = None
 
-        return len(self.errors) == 0
+        return len(self.errors) == 0 and (len(self.warnings) == 0 or despite_warnings)
 
     def notify_users(self) -> None:
         # Projde všechny uživatele a těm, kteří ještě nemají nastavené heslo,
@@ -436,10 +436,10 @@ class Import:
         mo.csv.write(file=out, fmt=self.fmt, row_class=self.row_class, rows=[self.row_example])
         return out.getvalue()
 
-    def run(self, path: str) -> bool:
+    def run(self, path: str, despite_warnings: bool = False) -> bool:
         self.log_start(path)
 
-        if not self.generic_import(path):
+        if not self.generic_import(path, despite_warnings):
             logger.info('Import: Rollback')
             db.get_session().rollback()
             return False
diff --git a/mo/web/imports.py b/mo/web/imports.py
index b5cf4366..efe5cb19 100644
--- a/mo/web/imports.py
+++ b/mo/web/imports.py
@@ -19,6 +19,7 @@ class ImportForm(FlaskForm):
         choices=FileFormat.choices(), coerce=FileFormat.coerce,
         default=FileFormat.cs_csv,
     )
+    despite_warnings = wtforms.BooleanField('Importovat navzdory varováním')
     submit = wtforms.SubmitField('Importovat')
     get_template = wtforms.SubmitField('Stáhnout šablonu')
 
@@ -35,7 +36,7 @@ def generic_import_page(form: ImportForm, imp: Optional[Import], redirect_url: s
                 file = form.file.data.stream
                 import_tmp = mo.util.link_to_dir(file.name, mo.util.data_dir('imports'), suffix='.csv')
 
-                if imp.run(import_tmp):
+                if imp.run(import_tmp, despite_warnings=form.despite_warnings.data):
                     if imp.cnt_rows == 0:
                         flash('Soubor neobsahoval žádné řádky s daty', 'danger')
                     else:
diff --git a/mo/web/templates/org_generic_import.html b/mo/web/templates/org_generic_import.html
index bd390668..467c086e 100644
--- a/mo/web/templates/org_generic_import.html
+++ b/mo/web/templates/org_generic_import.html
@@ -14,7 +14,12 @@ Import dat {% if contest or round %}do {% if contest %}soutěže {{ contest.plac
 {% for e in warnings %}
 {{ e }}
 {% endfor %}
+{% if not errs %}
+
+<em>Aby se import provedl, zopakujte ho znovu se zaškrtnutým „Importovat navzdory varováním“.</em>
+{% endif %}
 </div>
+
 {% endif %}
 
 {% if errs %}
@@ -38,6 +43,7 @@ Import dat {% if contest or round %}do {% if contest %}soutěže {{ contest.plac
 {{ form.csrf_token }}
 {{ wtf.form_field(form.file) }}
 {{ wtf.form_field(form.fmt) }}
+{{ wtf.form_field(form.despite_warnings) }}
 {% block import_form %}{% endblock %}
 	<div class="btn-group">
 		{{ wtf.form_field(form.submit, class='btn btn-primary') }}
-- 
GitLab