diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py index 8a00f2798f0ab19e1417afa7b14f6f8e444cc56b..38dc4d6dfa9f454b1f28f37d0573e96cf4f379e0 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 0a51b8dc5d0cffef492bb4ab1a2c2b22ecfc8a86..cf1b8a53b846881d538f9d2b484bfebf29a254d8 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 %}