From fec7c76f000b8be58eb4d11af6d7720e1c658854 Mon Sep 17 00:00:00 2001
From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz>
Date: Tue, 28 Sep 2021 20:24:10 +0200
Subject: [PATCH] =?UTF-8?q?P=C5=99ev=C3=A1d=C4=9Bn=C3=AD=20na=20orga=20z?=
 =?UTF-8?q?=20formul=C3=A1=C5=99e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mo/users.py         |  2 +-
 mo/web/org_users.py | 36 ++++++++++++++++++++++++++++++++----
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/mo/users.py b/mo/users.py
index aae885ac..851ddf09 100644
--- a/mo/users.py
+++ b/mo/users.py
@@ -103,7 +103,7 @@ def find_or_create_user(email: str, krestni: Optional[str], prijmeni: Optional[s
                 else:
                     raise CheckErrorOrgIsUser('Nelze předefinovat účastníka na organizátora.')
             else:
-                raise CheckError('Nelze předefinovat organizátora na účastníka.')
+                raise mo.CheckError('Nelze předefinovat organizátora na účastníka.')
     return user, is_new, is_change_user_to_org
 
 
diff --git a/mo/web/org_users.py b/mo/web/org_users.py
index 0f8b055a..9633b3b4 100644
--- a/mo/web/org_users.py
+++ b/mo/web/org_users.py
@@ -398,6 +398,7 @@ class UserEditForm(FlaskForm):
     note = wtforms.TextAreaField("Poznámka")
     is_test = wtforms.BooleanField("Testovací účet")
     allow_duplicate_name = wtforms.BooleanField("Přidat účet s duplicitním jménem")
+    allow_change_user_to_org = wtforms.BooleanField("Povolit převedení účastníka na organizátora")
     submit = wtforms.SubmitField("Uložit")
 
 
@@ -422,6 +423,7 @@ def org_user_edit(id: int):
 
     form = UserEditForm(obj=user)
     del form.allow_duplicate_name
+    del form.allow_change_user_to_org
     if (user.is_org or user.is_admin) and not g.user.is_admin:
         # emaily u organizátorů může editovat jen správce
         del form.email
@@ -471,12 +473,35 @@ def org_user_new():
     form = UserEditForm()
     form.submit.label.text = 'Vytvořit'
     is_duplicate_name = False
+    allow_change_user_to_org_show_field = False
     if form.validate_on_submit():
         check = True
 
-        if mo.users.user_by_email(form.email.data) is not None:
-            flash('Účet s daným e-mailem již existuje', 'danger')
-            check = False
+        old_user = mo.users.user_by_email(form.email.data)
+        if old_user is not None:
+            if is_org and not old_user.is_org:
+                allow_change_user_to_org_show_field = True
+                if form.allow_change_user_to_org.data:
+                    try:
+                        mo.users.find_or_create_user(
+                            email=form.email.data,
+                            krestni=form.first_name.data,
+                            prijmeni=form.last_name.data,
+                            is_org=True,
+                            reason="web",
+                            allow_change_user_to_org=True)
+                    except mo.CheckError as e:
+                        flash(str(e), 'danger')
+                        check = False
+                    if check:
+                        mo.db.get_session().commit()
+                        return redirect(url_for('org_org', id=old_user.user_id))
+                if check:
+                    flash('Účet s daným e-mailem již existuje. Převedení účastníka na organizátora můžete povolit ve formuláři.', 'danger')
+                    check = False
+            if check:
+                flash('Účet s daným e-mailem již existuje.', 'danger')
+                check = False
 
         if is_org:
             if (mo.db.get_session().query(db.User)
@@ -514,8 +539,11 @@ def org_user_new():
                 return redirect(url_for('org_org', id=new_user.user_id))
             return redirect(url_for('org_user', id=new_user.user_id))
 
-    if not is_duplicate_name:
+    if not is_duplicate_name and not form.allow_duplicate_name.data:
         del form.allow_duplicate_name
+
+    if not (is_org and allow_change_user_to_org_show_field):
+        del form.allow_change_user_to_org
     return render_template('org_user_new.html', form=form, is_org=is_org)
 
 
-- 
GitLab