diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py index 7c1df9cfc9ab4968d22bff182878e9b4715c1433..a2e2f6dd3c4be9122624b4f4785cb4db99f65d9a 100644 --- a/mo/web/org_contest.py +++ b/mo/web/org_contest.py @@ -1696,29 +1696,51 @@ def org_contest_scans(ct_id: int, site_id: Optional[int] = None): round, contest, site = ctx.round, ctx.contest, ctx.site assert contest + sess = db.get_session() + class PSF(ProcessScansForm): pass - tasks = db.get_session().query(db.Task).filter_by(round=round).order_by(db.Task.code).all() + tasks = sess.query(db.Task).filter_by(round=round).order_by(db.Task.code).all() + tasks_map: Dict[int,db.Task] = {} for t in tasks: setattr(PSF, f'task_{t.task_id}', wtforms.BooleanField(t.code, default=True)) + tasks_map[t.task_id] = t proc_form = PSF() proc_task_fields = [f for f in proc_form if f.name.startswith('task_')] 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( + job_id = 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. Vyčkejte chvíli, než budou připraveny k roztřídění, poté je roztřiďte (tlačítko v seznamu dávek).', 'success') - return redirect(url_for('org_jobs')) + flash('Zpracování skenů zahájeno. Vyčkejte chvíli, než budou připraveny k roztřídění, poté je roztřiďte', 'success') + return redirect(url_for('org_contest_scans_process', id=id, site_id=site_id, job_id=job_id)) + + jobs_query = sess.query(db.Job).filter_by(type=db.JobType.process_scans) + if not g.user.is_admin: + jobs_query = jobs_query.filter_by(user=g.user) + jobs = [] + for job in jobs_query.all(): + if 'contest_id' not in job.in_json or job.in_json['contest_id'] != id: + continue + if site_id is not None and ('site_id' not in job.in_json or job.in_json['site_id'] != site_id): + continue + + job.tasks = [] + for task_id in job.in_json['task_ids']: + if task_id in tasks_map: + job.tasks.append(tasks_map[task_id]) + + jobs.append(job) return render_template( 'org_contest_scans.html', ctx=ctx, proc_form=proc_form, proc_task_fields=proc_task_fields, + jobs=jobs, ) diff --git a/mo/web/templates/org_contest_scans.html b/mo/web/templates/org_contest_scans.html index 59e628d102e7449da163b1a1c4958c8669ff72f5..d8fc942f34f3c9a71cdd335f4ecacbf4ab757d22 100644 --- a/mo/web/templates/org_contest_scans.html +++ b/mo/web/templates/org_contest_scans.html @@ -36,4 +36,40 @@ jejich přiřazení jednotlivým soutěžícím. {{ field(proc_form.process_scans) }} </form> +<h3>Nahráno k roztřídění</h3> +{% if jobs %} +<p>Smazat dávky lze v <a href="{{ url_for('org_jobs') }}">přehledu všech dávek</a>.</p> +<table class=data> + <thead> + <tr> + <th>Datum + <th>Úlohy + <th>Stav + {% if g.user.is_admin %}<th>Vlastník{% endif %} + <th>Akce + </tr> + </thead> + {% for job in jobs %} + <tr class="job-{{ job.state.name }}"> + <td>{{ job.created_at|timeformat }} + <td>{% for task in job.tasks %}{{ task.code }} {% endfor %} + <td> + {% if job.state == JobState.done %} + Připraveno k roztřídění + {% else %} + {{ job.state.friendly_name() }} + {% endif %} + {% if g.user.is_admin %}<td>{{ job.user|user_link }}{% endif %} + <td><div class="btn-group"> + {% if job.state == JobState.done %} + <a class="btn btn-xs btn-primary" href="{{ url_for('org_contest_scans_process', id=contest.contest_id, site_id=site_id, job_id=job.job_id) }}">Zpracovat skeny</a> + {% endif %} + </div> + </tr> + {% endfor %} +</table> +{% else %} +<p>Žádné nahrané skeny k roztřídění.</p> +{% endif %} + {% endblock %}