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

Účastnický submit ošetřuje kolize

Closes #206
parent 1195ddeb
No related branches found
No related tags found
1 merge request!129Bezpečné transakce při zakládání uživatelů/účastníků/účastí
...@@ -5,6 +5,7 @@ import flask_wtf.file ...@@ -5,6 +5,7 @@ import flask_wtf.file
import hashlib import hashlib
import hmac import hmac
from sqlalchemy import and_ from sqlalchemy import and_
from sqlalchemy.dialects.postgresql import insert as pgsql_insert
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
from typing import List, Tuple, Optional from typing import List, Tuple, Optional
import werkzeug.exceptions import werkzeug.exceptions
...@@ -409,22 +410,25 @@ def user_contest_task(contest_id: int, task_id: int): ...@@ -409,22 +410,25 @@ def user_contest_task(contest_id: int, task_id: int):
flash(f'Chyba: {e}', 'danger') flash(f'Chyba: {e}', 'danger')
return redirect(url_for('user_contest_task', contest_id=contest_id, task_id=task_id)) return redirect(url_for('user_contest_task', contest_id=contest_id, task_id=task_id))
is_broken = paper.is_broken()
sess.add(paper) sess.add(paper)
sess.flush()
# FIXME: Bylo by hezké použít INSERT ... ON CONFLICT UPDATE sess.connection().execute(
# (SQLAlchemy to umí, ale ne přes ORM, jen core rozhraním) pgsql_insert(db.Solution.__table__)
sol = (sess.query(db.Solution) .values(
.filter_by(task=task, user=g.user) task_id=task.task_id,
.with_for_update() user_id=g.user.user_id,
.one_or_none()) final_submit=paper.paper_id,
if sol is None: )
sol = db.Solution(task=task, user=g.user) .on_conflict_do_update(
sess.add(sol) constraint='solutions_pkey',
sol.final_submit_obj = paper set_={'final_submit': paper.paper_id},
)
)
sess.commit() sess.commit()
if paper.is_broken(): if is_broken:
flash('Soubor není korektní PDF, ale přesto jsme ho přijali a pokusíme se ho zpracovat. ' + flash('Soubor není korektní PDF, ale přesto jsme ho přijali a pokusíme se ho zpracovat. ' +
'Zkontrolujte prosím, že se na vašem počítači zobrazuje správně.', 'Zkontrolujte prosím, že se na vašem počítači zobrazuje správně.',
'warning') 'warning')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment