From e8147cd1775e540d7d2bd9bba5ad773d3ce4f553 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Tue, 6 Jul 2021 14:53:28 +0200
Subject: [PATCH] =?UTF-8?q?Protokoly:=20UI=20na=20objedn=C3=A1n=C3=AD=20zp?=
 =?UTF-8?q?racov=C3=A1n=C3=AD=20scan=C5=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mo/web/org_contest.py                       | 32 ++++++++++++++++++---
 mo/web/templates/org_contest_protocols.html | 24 +++++++++++++++-
 2 files changed, 51 insertions(+), 5 deletions(-)

diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py
index 8a00f279..38dc4d6d 100644
--- a/mo/web/org_contest.py
+++ b/mo/web/org_contest.py
@@ -1663,7 +1663,7 @@ def org_contest_add_user(ct_id: int, site_id: Optional[int] = None):
     )
 
 
-class ProtoGenForm(FlaskForm):
+class GenProtoForm(FlaskForm):
     num_universal = wtforms.IntegerField(
         'Univerzálních listů',
         default=0,
@@ -1680,6 +1680,11 @@ class ProtoGenForm(FlaskForm):
     gen_protos = wtforms.SubmitField('Vytvořit protokoly')
 
 
+class ProcessScansForm(FlaskForm):
+    files = wtforms.MultipleFileField('Soubory PDF se scany', validators=[validators.required()])
+    process_scans = wtforms.SubmitField('Zpracovat scany')
+
+
 @app.route('/org/contest/c/<int:ct_id>/protocols', methods=('GET', 'POST'))
 @app.route('/org/contest/c/<int:ct_id>/site/<int:site_id>/protocols', methods=('GET', 'POST'))
 def org_contest_protocols(ct_id: int, site_id: Optional[int] = None):
@@ -1687,16 +1692,23 @@ def org_contest_protocols(ct_id: int, site_id: Optional[int] = None):
     round, contest, site = ctx.round, ctx.contest, ctx.site
     assert contest
 
-    class PGF(ProtoGenForm):
+    class GPF(GenProtoForm):
+        pass
+
+    class PSF(ProcessScansForm):
         pass
 
     tasks = db.get_session().query(db.Task).filter_by(round=round).order_by(db.Task.code).all()
     for t in tasks:
-        setattr(PGF, f'task_{t.task_id}', wtforms.BooleanField(t.code, default=True))
+        setattr(GPF, f'task_{t.task_id}', wtforms.BooleanField(t.code, default=True))
+        setattr(PSF, f'task_{t.task_id}', wtforms.BooleanField(t.code, default=True))
 
-    gen_form = PGF()
+    gen_form = GPF()
     gen_task_fields = [f for f in gen_form if f.name.startswith('task_')]
 
+    proc_form = PSF()
+    proc_task_fields = [f for f in proc_form if f.name.startswith('task_')]
+
     if gen_form.validate_on_submit() and gen_form.gen_protos.data:
         mo.jobs.protocols.schedule_create_protocols(
             contest, site, g.user,
@@ -1707,9 +1719,21 @@ def org_contest_protocols(ct_id: int, site_id: Optional[int] = None):
         flash('Výroba prototokolů zahájena.', 'success')
         return redirect(url_for('org_jobs'))
 
+    if proc_form.validate_on_submit() and proc_form.process_scans.data:
+        files = request.files.getlist(proc_form.files.name)
+        mo.jobs.protocols.schedule_process_scans(
+            contest, site, g.user,
+            tasks=[t for t in tasks if getattr(proc_form, f'task_{t.task_id}').data],
+            in_file_names=[f.stream.name for f in files],
+        )
+        flash('Zpracování scanů zahájeno.', 'success')
+        return redirect(url_for('org_jobs'))
+
     return render_template(
         'org_contest_protocols.html',
         ctx=ctx,
         gen_form=gen_form,
         gen_task_fields=gen_task_fields,
+        proc_form=proc_form,
+        proc_task_fields=proc_task_fields,
     )
diff --git a/mo/web/templates/org_contest_protocols.html b/mo/web/templates/org_contest_protocols.html
index 0a51b8dc..cf1b8a53 100644
--- a/mo/web/templates/org_contest_protocols.html
+++ b/mo/web/templates/org_contest_protocols.html
@@ -12,8 +12,10 @@ Protokoly pro {{ ctx.round.name|lower }} kategorie {{ ctx.round.category }}
 <p>Zde je možné vytvořit PDF s formuláři protokolů pro všechny soutěžící. Každý
 formulář je opatřen unikátním QR kódem. FIXME: Dovysvětlit.
 
+<h3>Formuláře protokolů</h3>
+
 {% macro field(f) %}
-{{ wtf.form_field(f, form_type='horizontal', horizontal_columns=('lg', 3, 7), button_map={'gen_protos': 'primary'}) }}
+{{ wtf.form_field(f, form_type='horizontal', horizontal_columns=('lg', 3, 7), button_map={'gen_protos': 'primary', 'process_scans': 'primary'}) }}
 {% endmacro %}
 
 <form action="" method=POST class="form form-horizontal" role="form">
@@ -31,4 +33,24 @@ formulář je opatřen unikátním QR kódem. FIXME: Dovysvětlit.
 	{{ field(gen_form.num_universal) }}
 	{{ field(gen_form.num_blank) }}
 	{{ field(gen_form.gen_protos) }}
+</form>
+
+<h3>Zpracování scanů</h3>
+
+<form action="" method=POST class="form form-horizontal" role="form" enctype='multipart/form-data'>
+	{{ proc_form.csrf_token }}
+	{% if proc_task_fields %}
+		<div class='form-group'>
+			<label class='control-label col-lg-3' for='{{ proc_task_fields[0].id }}'>Úlohy</label>
+			<div class='col-lg-7'>
+				{% for f in proc_task_fields %}
+					{{ wtf.form_field(f) }}
+				{% endfor %}
+			</div>
+		</div>
+	{% endif %}
+	{{ field(proc_form.files) }}
+	{{ field(proc_form.process_scans) }}
+</form>
+
 {% endblock %}
-- 
GitLab