diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py index c642a1ca1219be1114bfa08ef1b29870fab88685..1583d0520eaaa620fb3d0023fbde6b554a0785a0 100644 --- a/mo/web/org_contest.py +++ b/mo/web/org_contest.py @@ -190,6 +190,7 @@ class ParticipantsActionForm(FlaskForm): class DownloadButtonForm(FlaskForm): download = wtforms.SubmitField('Stáhnout všechna řešení jako ZIP') + download_feedback = wtforms.SubmitField('Stáhnout opravená jako ZIP') def get_contest(id: int) -> db.Contest: @@ -691,6 +692,23 @@ def get_solutions_query( return query +def download_solutions(form: DownloadButtonForm, solutions: List[db.Solution], subject: str) -> bool: + if not form.validate_on_submit(): + return False + + if form.download.data: + paper_ids = [sol.final_submit for sol in solutions if sol.final_submit is not None] + mo.jobs.submit.schedule_download_submits(paper_ids, f'Odevzdaná řešení {subject}', g.user) + flash('Příprava odevzdaných řešení ke stažení zahájena.', 'success') + return True + + if form.download_feedback.data: + paper_ids = [sol.final_feedback or sol.final_submit for sol in solutions if sol.final_submit is not None] + mo.jobs.submit.schedule_download_submits(paper_ids, f'Opravená řešení {subject}', g.user) + flash('Příprava opravených řešení ke stažení zahájena.', 'success') + return True + + @app.route('/org/contest/c/<int:contest_id>/task/<int:task_id>/', methods=('GET', 'POST')) @app.route('/org/contest/c/<int:contest_id>/site/<int:site_id>/task/<int:task_id>/', methods=('GET', 'POST')) def org_contest_task_submits(contest_id: int, task_id: int, site_id: Optional[int] = None): @@ -702,12 +720,8 @@ def org_contest_task_submits(contest_id: int, task_id: int, site_id: Optional[in rows.sort(key=lambda r: r[0].user.sort_key()) download_form = DownloadButtonForm() - if request.method == 'POST' and download_form.validate_on_submit(): - if download_form.download.data: - paper_ids = [sol.final_submit for pion, sol in rows if sol is not None and sol.final_submit is not None] - mo.jobs.submit.schedule_download_submits(paper_ids, f'Odevzdaná řešení úlohy {sc.task.code}', g.user) - flash('Příprava řešení ke stažení zahájena.', 'success') - return redirect(url_for('org_jobs')) + if request.method == 'POST' and download_solutions(download_form, [sol for pion, sol in rows if sol is not None], f'úlohy {sc.task.code}'): + return redirect(url_for('org_jobs')) # Count papers for each solution paper_counts = {} @@ -833,12 +847,8 @@ def org_contest_solutions(id: int, site_id: Optional[int] = None): paper_counts[(user_id, task_id, type.name)] = count download_form = DownloadButtonForm() - if request.method == 'POST' and download_form.validate_on_submit(): - if download_form.download.data: - paper_ids = [sol.final_submit for sol in sols if sol is not None and sol.final_submit is not None] - mo.jobs.submit.schedule_download_submits(paper_ids, 'Odevzdaná řešení', g.user) - flash('Příprava řešení ke stažení zahájena.', 'success') - return redirect(url_for('org_jobs')) + if request.method == 'POST' and download_solutions(download_form, [sol for sol in sols if sol is not None], sc.round.round_code()): + return redirect(url_for('org_jobs')) task_sols: Dict[int, Dict[int, db.Solution]] = {} for t in tasks: