diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py
index 28e5b810ed95c3032417dcdda1efd02cf322c276..05d75962836430d42f03e5c2c525b1a920dbe501 100644
--- a/mo/web/org_contest.py
+++ b/mo/web/org_contest.py
@@ -1635,7 +1635,7 @@ def org_contest_edit(id: int):
)
-class ProtoGenForm(FlaskForm):
+class GenProtoForm(FlaskForm):
num_universal = wtforms.IntegerField(
'Univerzálních listů',
default=0,
@@ -1652,21 +1652,33 @@ 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:id>/protocols', methods=('GET', 'POST'))
@app.route('/org/contest/c/<int:id>/site/<int:site_id>/protocols', methods=('GET', 'POST'))
def org_contest_protocols(id: int, site_id: Optional[int] = None):
sc = get_solution_context(id, None, None, site_id)
- class PGF(ProtoGenForm):
+ class GPF(GenProtoForm):
+ pass
+
+ class PSF(ProcessScansForm):
pass
tasks = db.get_session().query(db.Task).filter_by(round=sc.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(
sc.contest, sc.site, g.user,
@@ -1677,6 +1689,16 @@ def org_contest_protocols(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(
+ sc.contest, sc.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',
contest=sc.contest,
@@ -1684,4 +1706,6 @@ def org_contest_protocols(id: int, site_id: Optional[int] = None):
site=sc.site,
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 550aa5d9762361b9c5838466b5774105c7849600..51a2a79c9264bbef7f556d068df0c91c4b7322de 100644
--- a/mo/web/templates/org_contest_protocols.html
+++ b/mo/web/templates/org_contest_protocols.html
@@ -13,8 +13,10 @@ Protokoly pro {{ round.name|lower }} kategorie {{ 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">
@@ -32,4 +34,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 %}