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

Výsledková listina upravena pro dělená kola

Pro dělená kola výsledkovka agreguje všechny úlohy z kol ve skupině.

Při zobrazení na webu je potřeba správně odkazovat na patřičné contesty:
* Proklik na účastníky zůstává ve stejném kole
* Proklik na záhlaví úlohy může vést i do jiného kola skupiny
* Proklik na submit může vést i do jiného kola skupiny

Issue #178
parent 0d425d10
No related branches found
No related tags found
1 merge request!48Dělená kola napotřetí
This commit is part of merge request !36. Comments created here will be created in the context of that merge request.
...@@ -105,12 +105,12 @@ class Score: ...@@ -105,12 +105,12 @@ class Score:
self.contest = contest self.contest = contest
self.part_states = part_states self.part_states = part_states
# Příprava subquery na účastníky # Příprava subquery na účastníky (contest_subq obsahuje master_contest_id)
sess = db.get_session() sess = db.get_session()
if contest: if contest:
contest_subq = [contest.contest_id] contest_subq = [contest.master_contest_id]
else: else:
contest_subq = sess.query(db.Contest.contest_id).filter_by(round=round) contest_subq = sess.query(db.Contest.master_contest_id).filter_by(round=round)
# Načtení účastníků # Načtení účastníků
data: List[Tuple[db.User, db.Participation, db.Participant]] = ( data: List[Tuple[db.User, db.Participation, db.Participant]] = (
...@@ -164,7 +164,9 @@ class Score: ...@@ -164,7 +164,9 @@ class Score:
num_participants = db.get_count(user_id_subq) num_participants = db.get_count(user_id_subq)
# Načtení úloh # Načtení úloh
tasks: List[db.Task] = sess.query(db.Task).filter_by(round=round).all() tasks: List[db.Task] = sess.query(db.Task).filter(db.Task.round_id.in_(
sess.query(db.Round.round_id).filter_by(master_round_id=round.master_round_id)
)).all()
for task in tasks: for task in tasks:
self._tasks[step][task.task_id] = ScoreTask(task) self._tasks[step][task.task_id] = ScoreTask(task)
self._tasks[step][task.task_id].num_solutions = num_participants self._tasks[step][task.task_id].num_solutions = num_participants
...@@ -202,7 +204,7 @@ class Score: ...@@ -202,7 +204,7 @@ class Score:
# Zkusíme nalézt kolo o `step` kroků zpět # Zkusíme nalézt kolo o `step` kroků zpět
prev_round = sess.query(db.Round).filter_by( prev_round = sess.query(db.Round).filter_by(
year=self.round.year, category=self.round.category, seq=self.round.seq - step year=self.round.year, category=self.round.category, seq=self.round.seq - step
).one_or_none() ).filter(db.Round.master_round_id == db.Round.round_id).one_or_none()
if prev_round is None: if prev_round is None:
return False return False
self._prev_rounds[step] = prev_round self._prev_rounds[step] = prev_round
...@@ -211,13 +213,13 @@ class Score: ...@@ -211,13 +213,13 @@ class Score:
# Pokud tvoříme výsledkovku pro contest, tak nás zajímají jen řešení # Pokud tvoříme výsledkovku pro contest, tak nás zajímají jen řešení
# z podoblastí contestu spadajícího pod hlavní # z podoblastí contestu spadajícího pod hlavní
desc_cte = db.place_descendant_cte(self.contest.place, max_level=prev_round.level) desc_cte = db.place_descendant_cte(self.contest.place, max_level=prev_round.level)
contest_subq = sess.query(db.Contest.contest_id).filter( contest_subq = sess.query(db.Contest.master_contest_id).filter(
db.Contest.round == prev_round, db.Contest.round == prev_round,
db.Contest.place_id.in_(select([desc_cte])) db.Contest.place_id.in_(select([desc_cte]))
) )
else: else:
# Pokud vytváříme výsledkovku pro celé kolo, bereme vše # Pokud vytváříme výsledkovku pro celé kolo, bereme vše
contest_subq = sess.query(db.Contest.contest_id).filter_by(round=prev_round) contest_subq = sess.query(db.Contest.master_contest_id).filter_by(round=prev_round)
self._load_tasks_and_sols(step, prev_round, contest_subq) self._load_tasks_and_sols(step, prev_round, contest_subq)
return True return True
......
from flask import render_template, request, g from flask import render_template, request, g
from flask.helpers import url_for from flask.helpers import url_for
from typing import Optional from typing import List, Optional
import werkzeug.exceptions import werkzeug.exceptions
import mo import mo
...@@ -102,6 +102,16 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None): ...@@ -102,6 +102,16 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
results = score.get_sorted_results() results = score.get_sorted_results()
messages = score.get_messages() messages = score.get_messages()
# Pro tvorbu odkazů na správné contesty ve výsledkovkách dělených kol
all_subcontests: List[db.Contest] = sess.query(db.Contest).filter(
db.Contest.round_id.in_(
sess.query(db.Round.round_id).filter_by(master_round_id=round.master_round_id)
)
).all()
subcontest_id_map = {}
for subcontest in all_subcontests:
subcontest_id_map[(subcontest.round_id, subcontest.master_contest_id)] = subcontest.contest_id
# Construct columns # Construct columns
is_export = (format != "") is_export = (format != "")
columns = [] columns = []
...@@ -123,13 +133,14 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None): ...@@ -123,13 +133,14 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
for task in tasks: for task in tasks:
title = task.code title = task.code
if contest_id: if 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=contest_id, task_id=task.task_id), url_for('org_contest_task', contest_id=local_ct_id, task_id=task.task_id),
task.code task.code
) )
if rr.can_edit_points(round): if rr.can_edit_points(round):
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=contest_id, task_id=task.task_id), url_for('org_contest_task_points', contest_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'))
...@@ -140,13 +151,14 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None): ...@@ -140,13 +151,14 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
for result in results: for result in results:
user, pant, pion = result.user, result.pant, result.pion user, pant, pion = result.user, result.pant, result.pion
school = pant.school_place school = pant.school_place
local_pion_ct_id = subcontest_id_map[(round.round_id, pion.contest_id)]
row = Row(keys={ row = Row(keys={
'order': OrderCell(result.order.place, result.order.span, result.order.continuation), 'order': OrderCell(result.order.place, result.order.span, result.order.continuation),
'winner': 'ano' if result.winner else '', 'winner': 'ano' if result.winner else '',
'successful': 'ano' if result.successful else '', 'successful': 'ano' if result.successful else '',
'user': user, 'user': user,
'email': user.email, 'email': user.email,
'participant': cell_pion_link(user, pion.contest_id, user.full_name()), 'participant': cell_pion_link(user, local_pion_ct_id, user.full_name()),
'contest': CellLink(pion.contest.place.name, url_for('org_contest', id=pion.contest_id)), 'contest': CellLink(pion.contest.place.name, url_for('org_contest', id=pion.contest_id)),
'pion_place': pion.place.name, 'pion_place': pion.place.name,
'school': CellLink(school.name, url_for('org_place', id=school.place_id)), 'school': CellLink(school.name, url_for('org_place', id=school.place_id)),
...@@ -157,8 +169,9 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None): ...@@ -157,8 +169,9 @@ def org_score(round_id: Optional[int] = None, contest_id: Optional[int] = None):
}) })
sols = result.get_sols_map() sols = result.get_sols_map()
for task in tasks: for task in tasks:
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=pion.contest_id, user=user, sol=sols.get(task.task_id) contest_id=local_sol_ct_id, user=user, sol=sols.get(task.task_id)
) )
if result.winner: if result.winner:
row.html_attr = {"class": "winner", "title": "Vítěz"} row.html_attr = {"class": "winner", "title": "Vítěz"}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment