Skip to content
Snippets Groups Projects
Commit e944a661 authored by Martin Mareš's avatar Martin Mareš
Browse files

Protokoly: UI na objednání zpracování scanů

parent f1d70cb0
No related branches found
No related tags found
No related merge requests found
This commit is part of merge request !81. Comments created here will be created in the context of that merge request.
...@@ -1635,7 +1635,7 @@ def org_contest_edit(id: int): ...@@ -1635,7 +1635,7 @@ def org_contest_edit(id: int):
) )
class ProtoGenForm(FlaskForm): class GenProtoForm(FlaskForm):
num_universal = wtforms.IntegerField( num_universal = wtforms.IntegerField(
'Univerzálních listů', 'Univerzálních listů',
default=0, default=0,
...@@ -1652,21 +1652,33 @@ class ProtoGenForm(FlaskForm): ...@@ -1652,21 +1652,33 @@ class ProtoGenForm(FlaskForm):
gen_protos = wtforms.SubmitField('Vytvořit protokoly') 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>/protocols', methods=('GET', 'POST'))
@app.route('/org/contest/c/<int:id>/site/<int:site_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): def org_contest_protocols(id: int, site_id: Optional[int] = None):
sc = get_solution_context(id, None, None, site_id) sc = get_solution_context(id, None, None, site_id)
class PGF(ProtoGenForm): class GPF(GenProtoForm):
pass
class PSF(ProcessScansForm):
pass pass
tasks = db.get_session().query(db.Task).filter_by(round=sc.round).order_by(db.Task.code).all() tasks = db.get_session().query(db.Task).filter_by(round=sc.round).order_by(db.Task.code).all()
for t in tasks: 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_')] 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: if gen_form.validate_on_submit() and gen_form.gen_protos.data:
mo.jobs.protocols.schedule_create_protocols( mo.jobs.protocols.schedule_create_protocols(
sc.contest, sc.site, g.user, sc.contest, sc.site, g.user,
...@@ -1677,6 +1689,16 @@ def org_contest_protocols(id: int, site_id: Optional[int] = None): ...@@ -1677,6 +1689,16 @@ def org_contest_protocols(id: int, site_id: Optional[int] = None):
flash('Výroba prototokolů zahájena.', 'success') flash('Výroba prototokolů zahájena.', 'success')
return redirect(url_for('org_jobs')) 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( return render_template(
'org_contest_protocols.html', 'org_contest_protocols.html',
contest=sc.contest, contest=sc.contest,
...@@ -1684,4 +1706,6 @@ def org_contest_protocols(id: int, site_id: Optional[int] = None): ...@@ -1684,4 +1706,6 @@ def org_contest_protocols(id: int, site_id: Optional[int] = None):
site=sc.site, site=sc.site,
gen_form=gen_form, gen_form=gen_form,
gen_task_fields=gen_task_fields, gen_task_fields=gen_task_fields,
proc_form=proc_form,
proc_task_fields=proc_task_fields,
) )
...@@ -13,8 +13,10 @@ Protokoly pro {{ round.name|lower }} kategorie {{ round.category }} ...@@ -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ý <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. formulář je opatřen unikátním QR kódem. FIXME: Dovysvětlit.
<h3>Formuláře protokolů</h3>
{% macro field(f) %} {% 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 %} {% endmacro %}
<form action="" method=POST class="form form-horizontal" role="form"> <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. ...@@ -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_universal) }}
{{ field(gen_form.num_blank) }} {{ field(gen_form.num_blank) }}
{{ field(gen_form.gen_protos) }} {{ 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 %} {% endblock %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment