Skip to content
Snippets Groups Projects

Reforma orgovského rozhraní ke kolům a soutěžím

1 file
+ 10
5
Compare changes
  • Side-by-side
  • Inline
+ 23
32
@@ -9,6 +9,7 @@ import mo.db as db
@@ -9,6 +9,7 @@ import mo.db as db
from mo.rights import Right
from mo.rights import Right
from mo.score import Score
from mo.score import Score
from mo.web import app
from mo.web import app
 
from mo.web.org_contest import get_context
from mo.web.table import Cell, CellLink, Column, Row, Table, cell_pion_link
from mo.web.table import Cell, CellLink, Column, Row, Table, cell_pion_link
from mo.util_format import format_decimal
from mo.util_format import format_decimal
@@ -42,11 +43,13 @@ class SolPointsCell(Cell):
@@ -42,11 +43,13 @@ class SolPointsCell(Cell):
contest_id: int
contest_id: int
user: db.User
user: db.User
sol: Optional[db.Solution]
sol: Optional[db.Solution]
 
link_to_paper: bool
def __init__(self, contest_id: int, user: db.User, sol: Optional[db.Solution]):
def __init__(self, contest_id: int, user: db.User, sol: Optional[db.Solution], link_to_paper: bool):
self.contest_id = contest_id
self.contest_id = contest_id
self.user = user
self.user = user
self.sol = sol
self.sol = sol
 
self.link_to_paper = link_to_paper
def __str__(self) -> str:
def __str__(self) -> str:
if not self.sol:
if not self.sol:
@@ -63,7 +66,9 @@ class SolPointsCell(Cell):
@@ -63,7 +66,9 @@ class SolPointsCell(Cell):
else:
else:
points = format_decimal(self.sol.points)
points = format_decimal(self.sol.points)
if self.sol.final_feedback_obj:
if not self.link_to_paper:
 
return f'<td>{points}'
 
elif self.sol.final_feedback_obj:
url = mo.web.util.org_paper_link(self.contest_id, None, self.user, self.sol.final_feedback_obj)
url = mo.web.util.org_paper_link(self.contest_id, None, self.user, self.sol.final_feedback_obj)
return f'<td><a href="{url}" title="Zobrazit finální opravu">{points}</a>'
return f'<td><a href="{url}" title="Zobrazit finální opravu">{points}</a>'
elif self.sol.final_submit_obj:
elif self.sol.final_submit_obj:
@@ -74,34 +79,18 @@ class SolPointsCell(Cell):
@@ -74,34 +79,18 @@ class SolPointsCell(Cell):
@app.route('/org/contest/r/<int:round_id>/score')
@app.route('/org/contest/r/<int:round_id>/score')
@app.route('/org/contest/c/<int:contest_id>/score')
@app.route('/org/contest/c/<int:ct_id>/score')
def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
def org_score(round_id: Optional[int] = None, ct_id: Optional[int] = None):
if round_id is None and contest_id is None:
ctx = get_context(round_id=round_id, ct_id=ct_id)
raise werkzeug.exceptions.BadRequest()
contest = ctx.contest
if round_id is not None and contest_id is not None:
round = ctx.round
raise werkzeug.exceptions.BadRequest()
format = request.args.get('format', "")
format = request.args.get('format', "")
sess = db.get_session()
sess = db.get_session()
if round_id:
contest = None
if not ctx.rights.have_right(Right.view_contestants):
round = sess.query(db.Round).options(
joinedload(db.Round.master)
).get(round_id)
if not round:
raise werkzeug.exceptions.NotFound()
rr = g.gatekeeper.rights_for_round(round, True)
else:
contest = sess.query(db.Contest).options(
joinedload(db.Contest.round).joinedload(db.Round.master)
).get(contest_id)
if not contest:
raise werkzeug.exceptions.NotFound()
round = contest.round
rr = g.gatekeeper.rights_for_contest(contest)
if not rr.have_right(Right.view_submits):
raise werkzeug.exceptions.Forbidden()
raise werkzeug.exceptions.Forbidden()
 
can_view_submits = ctx.rights.have_right(Right.view_submits)
score = Score(round.master, contest)
score = Score(round.master, contest)
tasks = score.get_tasks()
tasks = score.get_tasks()
@@ -127,7 +116,7 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
@@ -127,7 +116,7 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
columns.append(Column(key='participant', name='ucastnik', title='Účastník'))
columns.append(Column(key='participant', name='ucastnik', title='Účastník'))
if is_export:
if is_export:
columns.append(Column(key='email', name='email'))
columns.append(Column(key='email', name='email'))
if not contest_id:
if not ct_id:
columns.append(Column(key='contest', name='oblast', title=round.get_level().name.title()))
columns.append(Column(key='contest', name='oblast', title=round.get_level().name.title()))
if is_export:
if is_export:
columns.append(Column(key='pion_place', name='soutezni_misto'))
columns.append(Column(key='pion_place', name='soutezni_misto'))
@@ -140,12 +129,12 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
@@ -140,12 +129,12 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
if contest:
if contest:
local_ct_id = subcontest_id_map[(task.round_id, contest.master_contest_id)]
local_ct_id = subcontest_id_map[(task.round_id, contest.master_contest_id)]
title = '<a href="{}">{}</a>'.format(
title = '<a href="{}">{}</a>'.format(
url_for('org_contest_task', contest_id=local_ct_id, task_id=task.task_id),
url_for('org_contest_task', ct_id=local_ct_id, task_id=task.task_id),
task.code
task.code
)
)
if rr.can_edit_points():
if ctx.rights.can_edit_points():
title += ' <a href="{}" title="Editovat body" class="icon">✎</a>'.format(
title += ' <a href="{}" title="Editovat body" class="icon">✎</a>'.format(
url_for('org_contest_task_points', contest_id=local_ct_id, task_id=task.task_id),
url_for('org_contest_task_points', ct_id=local_ct_id, task_id=task.task_id),
)
)
columns.append(Column(key=f'task_{task.task_id}', name=task.code, title=title))
columns.append(Column(key=f'task_{task.task_id}', name=task.code, title=title))
columns.append(Column(key='total_points', name='celkove_body', title='Celkové body'))
columns.append(Column(key='total_points', name='celkove_body', title='Celkové body'))
@@ -177,7 +166,7 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
@@ -177,7 +166,7 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
'user': user,
'user': user,
'email': user.email,
'email': user.email,
'participant': cell_pion_link(user, local_pion_ct_id, user.full_name()),
'participant': cell_pion_link(user, local_pion_ct_id, user.full_name()),
'contest': CellLink(pion.contest.place.name or "?", url_for('org_contest', id=pion.contest_id)),
'contest': CellLink(pion.contest.place.name or "?", url_for('org_contest', ct_id=pion.contest_id)),
'pion_place': pion.place.name,
'pion_place': pion.place.name,
'school': CellLink(school.name or "?", url_for('org_place', id=school.place_id)),
'school': CellLink(school.name or "?", url_for('org_place', id=school.place_id)),
'grade': pant.grade,
'grade': pant.grade,
@@ -190,7 +179,8 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
@@ -190,7 +179,8 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
for task in tasks:
for task in tasks:
local_sol_ct_id = subcontest_id_map[(task.round_id, pion.contest_id)]
local_sol_ct_id = subcontest_id_map[(task.round_id, pion.contest_id)]
row.keys[f'task_{task.task_id}'] = SolPointsCell(
row.keys[f'task_{task.task_id}'] = SolPointsCell(
contest_id=local_sol_ct_id, user=user, sol=sols.get(task.task_id)
contest_id=local_sol_ct_id, user=user, sol=sols.get(task.task_id),
 
link_to_paper=can_view_submits
)
)
if result.winner:
if result.winner:
row.html_attr = {"class": "winner", "title": "Vítěz"}
row.html_attr = {"class": "winner", "title": "Vítěz"}
@@ -214,6 +204,7 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
@@ -214,6 +204,7 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
if format == "":
if format == "":
return render_template(
return render_template(
'org_score.html',
'org_score.html',
 
ctx=ctx,
contest=contest, round=round, tasks=tasks,
contest=contest, round=round, tasks=tasks,
table=table, messages=messages,
table=table, messages=messages,
group_rounds=group_rounds,
group_rounds=group_rounds,
Loading