Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • devel
  • fo
  • fo-base
  • honza/add-contestant
  • honza/kolo-vs-soutez
  • honza/mr6
  • honza/mr7
  • honza/mra
  • honza/mrd
  • honza/mrf
  • honza/submit-images
  • jh-stress-test-wip
  • jirka/typing
  • jk/issue-196
  • jk/issue-96
  • master
  • mj/submit-images
  • shorten-schools
18 results

Target

Select target project
  • mj/mo-submit
1 result
Select Git revision
  • devel
  • fo
  • fo-base
  • honza/add-contestant
  • honza/kolo-vs-soutez
  • honza/mr6
  • honza/mr7
  • honza/mra
  • honza/mrd
  • honza/mrf
  • honza/submit-images
  • jh-stress-test-wip
  • jirka/typing
  • jk/issue-196
  • jk/issue-96
  • master
  • mj/submit-images
  • shorten-schools
18 results
Show changes
Commits on Source (3)
......@@ -451,13 +451,14 @@ class SolutionContext:
contest: db.Contest
round: db.Round
pion: db.Participation
solution: db.Solution
task: db.Task
solution: Optional[db.Solution]
allow_view: bool
allow_upload_solutions: bool
allow_upload_feedback: bool
def get_solution_context(contest_id, user_id, task_id) -> SolutionContext:
def get_solution_context(contest_id: int, site_id: Optional[int], user_id: int, task_id: int) -> SolutionContext:
sess = db.get_session()
# Nejprve zjistíme, zda existuje soutěž
......@@ -472,37 +473,36 @@ def get_solution_context(contest_id, user_id, task_id) -> SolutionContext:
if not pion:
raise werkzeug.exceptions.NotFound()
# Najdeme jeho řešení úlohy
sol = (sess.query(db.Solution)
.filter_by(user_id=user_id, task_id=task_id)
.options(joinedload(db.Solution.task))
.one_or_none())
if not sol:
# 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()
# Zkontrolujeme, že úloha je součástí soutěže
if sol.round != 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_id != round:
raise werkzeug.exceptions.NotFound()
# Má uživatel práva skrz contest?
rr = Rights(g.user)
rr.get_for_contest(contest)
all_rights = rr.current_rights
# Najdeme řešení úlohy (nemusí existovat)
sol = (sess.query(db.Solution)
.filter_by(user_id=user_id, task_id=task_id)
.one_or_none())
# Má práva skrz soutěžní místo?
if pion.place != contest.place:
rr.get_for_contest_site(contest, pion.place)
all_rights = all_rights | rr.current_rights
# 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
rr = Rights(g.user)
rr.get_for_contest_site(contest, site)
# Kdo má právo na jaké operace
allow_upload_solutions = (Right.manage_contest in all_rights
or (Right.upload_solutions in all_rights and round.state == db.RoundState.running))
allow_upload_feedback = (Right.manage_contest in all_rights
or (Right.upload_feedback in all_rights and round.state == db.RoundState.grading))
allow_view = (Right.manage_contest in all_rights
or (Right.upload_solutions in all_rights and round.state != db.RoundState.preparing)
or (Right.upload_feedback in all_rights and round.state in (db.RoundState.preparing, db.RoundState.running, db.RoundState.closed)))
allow_upload_solutions = (rr.have_right(Right.manage_contest)
or (rr.have_right(Right.upload_solutions) and round.state == db.RoundState.running))
allow_upload_feedback = (rr.have_right(Right.manage_contest)
or (rr.have_right(Right.upload_feedback) and round.state == db.RoundState.grading))
allow_view = (rr.have_right(Right.manage_contest)
or (rr.have_right(Right.upload_solutions) and round.state in (db.RoundState.running, db.RoundState.grading, db.RoundState.closed))
or (rr.have_right(Right.upload_feedback) and round.state in (db.RoundState.grading, db.RoundState.closed)))
if not allow_view:
raise werkzeug.exceptions.Forbidden()
......@@ -510,6 +510,7 @@ def get_solution_context(contest_id, user_id, task_id) -> SolutionContext:
contest=contest,
round=round,
pion=pion,
task=task,
solution=sol,
allow_view=allow_view,
allow_upload_solutions=allow_upload_solutions,
......@@ -519,7 +520,34 @@ def get_solution_context(contest_id, user_id, task_id) -> SolutionContext:
@app.route('/org/contest/c/<int:contest_id>/submit/<int:user_id>/<int:task_id>/')
def org_submit_list(contest_id, user_id, task_id):
sc = get_solution_context(contest_id, user_id, task_id)
sc = get_solution_context(contest_id, None, user_id, task_id)
# FIXME
return render_template('not_implemented.html')
@app.route('/org/contest/c/<int:contest_id>/site/<int:site_id>/submit/<int:user_id>/<int:task_id>/')
def org_submit_site_list(contest_id, site_id, user_id, task_id):
sc = get_solution_context(contest_id, site_id, user_id, task_id)
# FIXME
return render_template('not_implemented.html')
@app.route('/org/contest/c/<int:contest_id>/paper/<int:paper_id>/')
def org_submit_paper(contest_id, paper_id):
# sc = get_solution_context(contest_id, None, user_id, task_id)
# FIXME
return render_template('not_implemented.html')
@app.route('/org/contest/c/<int:contest_id>/site/<int:site_id>/paper/<int:paper_id>/')
def org_submit_site_paper(contest_id, paper_id):
# sc = get_solution_context(contest_id, None, user_id, task_id)
# FIXME
......