Skip to content
Snippets Groups Projects
Commit 0528462e authored by Jiří Setnička's avatar Jiří Setnička
Browse files

Předělání get_solution_context tak, aby i user_id bylo nepovinné

V této osekané variantě se hodí pro získávání práv, jestli si někdo může
vylistovat všechna odevzdaná řešení.
parent 5a4da8a0
Branches
No related tags found
2 merge requests!13Tabulky řešení,!9WIP: Zárodek uživatelské části webu a submitování
......@@ -452,20 +452,29 @@ class SolutionContext:
contest: db.Contest
round: db.Round
pion: db.Participation
user: db.User
user: Optional[db.User]
task: db.Task
site: Optional[db.Place]
allow_view: bool
allow_upload_solutions: bool
allow_upload_feedback: bool
def get_solution_context(contest_id: int, user_id: int, task_id: int, site_id: Optional[int]) -> SolutionContext:
def get_solution_context(contest_id: int, user_id: Optional[int], task_id: int, site_id: Optional[int]) -> SolutionContext:
sess = db.get_session()
# Nejprve zjistíme, zda existuje soutěž
contest = get_contest(contest_id)
round = contest.round
# Najdeme úlohu a ověříme, že je součástí soutěže
task = sess.query(db.Task).get(task_id)
if not task or task.round != round:
raise werkzeug.exceptions.NotFound()
site = None
user = None
if user_id is not None:
# Zkontrolujeme, zda se účastník opravdu účastní soutěže
pion = (sess.query(db.Participation)
.filter_by(user_id=user_id, contest_id=contest_id)
......@@ -474,23 +483,25 @@ def get_solution_context(contest_id: int, user_id: int, task_id: int, site_id: O
.one_or_none())
if not pion:
raise werkzeug.exceptions.NotFound()
user = pion.user
# A zda soutěží na zadaném soutěžním místě, je-li určeno
if site_id is not None and site_id != pion.site_id:
raise werkzeug.exceptions.NotFound()
# Najdeme úlohu a ověříme, že je součástí soutěže
task = sess.query(db.Task).get(task_id)
if not task or task.round != round:
if site_id is not None and site_id != pion.place_id:
raise werkzeug.exceptions.NotFound()
# Pokud je uvedeno soutěžní místo, hledáme práva k němu, jinak k soutěži
if site_id is not None:
site = pion.place
else:
site = contest.place
pion = None
if site_id is not None:
site = sess.query(db.Place).get(site_id)
if not site:
raise werkzeug.exceptions.NotFound()
rr = Rights(g.user)
rr.get_for_contest_site(contest, site)
rr.get_for_contest_site(contest, site or contest.place)
# Kdo má právo na jaké operace
allow_upload_solutions = (rr.have_right(Right.manage_contest)
......@@ -507,8 +518,9 @@ def get_solution_context(contest_id: int, user_id: int, task_id: int, site_id: O
contest=contest,
round=round,
pion=pion,
user=pion.user,
user=user,
task=task,
site=site,
allow_view=allow_view,
allow_upload_solutions=allow_upload_solutions,
allow_upload_feedback=allow_upload_feedback,
......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment