Skip to content

Commit d5f072b

Browse files
committed
use display_name for tasks and update related logic in scoreboard templates and scripts
1 parent 124d5a6 commit d5f072b

8 files changed

Lines changed: 44 additions & 19 deletions

File tree

scoreboard/html_renderer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def render_threads_page(
2727
texts: dict,
2828
repo_salt: str,
2929
threads_vmax: int,
30-
thread_tasks: List[str],
30+
thread_tasks: List[Any],
3131
) -> str:
3232
env = _environment()
3333
template = env.get_template("threads_table.html.j2")

scoreboard/main.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from datetime import datetime
99
from pathlib import Path
1010

11+
from builder import load_scoreboard
1112
from data_loader import SCRIPT_DIR
1213
from html_renderer import (
1314
render_index_page,
@@ -18,8 +19,6 @@
1819
from student import Student
1920
from texts import TEXT
2021

21-
from scoreboard import Scoreboard
22-
2322
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
2423
logger = logging.getLogger(__name__)
2524

@@ -49,7 +48,7 @@ def main() -> None:
4948
output_dir = Path(args.output)
5049
output_dir.mkdir(parents=True, exist_ok=True)
5150

52-
board = Scoreboard.from_files(repo_salt=REPO_SALT)
51+
board = load_scoreboard(repo_salt=REPO_SALT)
5352

5453
css = _load_css()
5554
generated_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@@ -67,7 +66,7 @@ def main() -> None:
6766
threads_vmax=int(
6867
(board.points_info.get("threads", {}) or {}).get("variants_max", 1)
6968
),
70-
thread_tasks=[t.name for t in board.thread_tasks],
69+
thread_tasks=board.thread_tasks,
7170
)
7271
proc_vmaxes = [task.variants_max for task in board.process_tasks]
7372
processes_html = render_processes_page(
@@ -98,7 +97,7 @@ def main() -> None:
9897
threads_vmax=int(
9998
(board.points_info.get("threads", {}) or {}).get("variants_max", 1)
10099
),
101-
thread_tasks=[t.name for t in board.thread_tasks],
100+
thread_tasks=board.thread_tasks,
102101
)
103102
fname = f"threads_{_slugify(group)}.html"
104103
(output_dir / fname).write_text(html, encoding="utf-8")

scoreboard/scoreboard.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,10 @@ def _build_thread_tasks(self) -> list[ThreadTask]:
166166
tasks: list[ThreadTask] = []
167167
for cfg in tasks_cfg:
168168
name = str(cfg.get("name"))
169+
display_name = cfg.get("title") or name
169170
task = ThreadTask(
170171
name=name,
172+
display_name=display_name,
171173
s_points=int(cfg.get("S", 0)),
172174
a_points=int(cfg.get("A", 0)),
173175
r_points=int(cfg.get("R", 0)),
@@ -187,8 +189,9 @@ def _build_process_tasks(self) -> list[ProcessTask]:
187189
self.deadline_shifts.get("processes_base", {}),
188190
)
189191
tasks: list[ProcessTask] = []
190-
for cfg, deadline in zip(tasks_cfg, deadlines):
192+
for idx, (cfg, deadline) in enumerate(zip(tasks_cfg, deadlines), start=1):
191193
name = str(cfg.get("name"))
194+
display_name = cfg.get("title") or f"Task {idx}"
192195
mpi_blk = cfg.get("mpi", {})
193196
seq_blk = cfg.get("seq", {})
194197

@@ -206,6 +209,7 @@ def _extract(block: dict | list, key: str) -> int:
206209

207210
task = ProcessTask(
208211
name=name,
212+
display_name=display_name,
209213
mpi_points=mpi_points,
210214
seq_points=seq_points,
211215
r_points=int(cfg.get("R", 0)),

scoreboard/static/variant.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,19 @@
129129
}
130130
}
131131

132-
async function fillProcessesTable(repoSalt, vmaxes, showTaskLabels = false) {
132+
async function fillProcessesTable(repoSalt, vmaxes, titles) {
133133
const rows = document.querySelectorAll('tr[data-last]');
134134
for (const tr of rows) {
135135
const vs = await computeProcessesVariants(studentFromDataset(tr), repoSalt, vmaxes);
136-
if (vs && tr.querySelector('.variant-cell')) tr.querySelector('.variant-cell').innerHTML = vs.join('<br/>');
136+
if (vs && tr.querySelector('.variant-cell')) {
137+
const labels = Array.isArray(titles) && titles.length === vs.length
138+
? titles
139+
: vs.map((_, idx) => `Task ${idx + 1}`);
140+
const html = vs
141+
.map((val, idx) => `${labels[idx]}: ${val}`)
142+
.join('<br/>');
143+
tr.querySelector('.variant-cell').innerHTML = html;
144+
}
137145
}
138146
}
139147

@@ -160,7 +168,9 @@
160168
const pv = await computeProcessesVariants(student, repoSalt, procVmaxes);
161169
if (!pv) throw new Error('Fill Last, First, Group');
162170
res.style.color = '#2563eb';
163-
res.innerHTML = `${window.variantTexts?.processesVariantLabel || 'Processes'}: <b>${pv[0]} / ${pv[1]} / ${pv[2]}</b>`;
171+
const labels = procVmaxes.map((_, idx) => `Task ${idx + 1}`);
172+
const variants = pv.map((v, idx) => `${labels[idx]}=${v}`).join(' / ');
173+
res.innerHTML = `${window.variantTexts?.processesVariantLabel || 'Processes'}: <b>${variants}</b>`;
164174
}
165175
} catch (e) {
166176
res.textContent = (window.variantTexts?.fillPrompt) || 'Fill Last, First, Group';

scoreboard/tasks.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ class ThreadTask(Task):
164164
def __init__(
165165
self,
166166
name: str,
167+
display_name: str | None,
167168
s_points: int,
168169
a_points: int,
169170
r_points: int,
@@ -183,6 +184,7 @@ def __init__(
183184
self.s_points = s_points
184185
self.a_points = a_points
185186
self.r_points = r_points
187+
self.display_name = display_name or name
186188

187189
def calculate_score(
188190
self, student, submission: ThreadSubmission | None
@@ -276,6 +278,7 @@ class ProcessTask(Task):
276278
def __init__(
277279
self,
278280
name: str,
281+
display_name: str | None,
279282
mpi_points: dict,
280283
seq_points: dict,
281284
r_points: int,
@@ -300,6 +303,7 @@ def __init__(
300303
self.seq_points = {k: int(v) for k, v in seq_points.items()}
301304
self.r_points = int(r_points)
302305
self.variants_max = int(variants_max)
306+
self.display_name = display_name or name
303307

304308
def calculate_score(
305309
self, student, submission: ProcessSubmission | None

scoreboard/templates/processes_table.html.j2

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
{% set mpi_letters = ['S','P','A','E','D','C'] %}
2828
<th colspan="{{ seq_letters|length + mpi_letters|length + 1 }}" class="task-header">
2929
<div class="task-title">
30-
<span class="task-name">Task {{ loop.index }}</span>
30+
<span class="task-name">{{ task.display_name }}</span>
3131
{% if deadlines[loop.index0] %}<span class="deadline">{{ deadlines[loop.index0] }}</span>{% endif %}
3232
</div>
3333
</th>
@@ -81,7 +81,11 @@
8181
</tbody>
8282
</table>
8383
<script>
84-
variantCalc.fillProcessesTable({{ repo_salt | tojson | safe }}, {{ proc_vmaxes | tojson | safe }});
84+
variantCalc.fillProcessesTable(
85+
{{ repo_salt | tojson | safe }},
86+
{{ proc_vmaxes | tojson | safe }},
87+
{{ proc_tasks | map(attribute='display_name') | list | tojson | safe }}
88+
);
8589
</script>
8690
</div>
8791
</body>

scoreboard/templates/threads_table.html.j2

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,19 @@
2424
<th rowspan="2">Name</th>
2525
<th rowspan="2" class="narrow">V</th>
2626
{% for task in thread_tasks %}
27-
{% set letters = ['S','D','C','R'] if task == 'seq' else ['S','P','A','E','D','C','R'] %}
27+
{% set letters = ['S','D','C','R'] if task.name == 'seq' else ['S','P','A','E','D','C','R'] %}
2828
<th colspan="{{ letters | length }}" class="task-header">
2929
<div class="task-title">
30-
<span class="task-name">{{ task }}</span>
31-
{% if deadlines.get(task) %}<span class="deadline">{{ deadlines.get(task) }}</span>{% endif %}
30+
<span class="task-name">{{ task.display_name }}</span>
31+
{% if deadlines.get(task.name) %}<span class="deadline">{{ deadlines.get(task.name) }}</span>{% endif %}
3232
</div>
3333
</th>
3434
{% endfor %}
3535
<th rowspan="2" class="narrow">Total</th>
3636
</tr>
3737
<tr>
3838
{% for task in thread_tasks %}
39-
{% set letters = ['S','D','C','R'] if task == 'seq' else ['S','P','A','E','D','C','R'] %}
39+
{% set letters = ['S','D','C','R'] if task.name == 'seq' else ['S','P','A','E','D','C','R'] %}
4040
{% for letter in letters %}
4141
<th class="narrow">{{ letter }}</th>
4242
{% endfor %}
@@ -49,8 +49,8 @@
4949
<td class="name">{{ row.name|safe }}</td>
5050
<td class="narrow variant-cell">—</td>
5151
{% for task in thread_tasks %}
52-
{% set cell = row.cells[task] %}
53-
{% if task == 'seq' %}
52+
{% set cell = row.cells[task.name] %}
53+
{% if task.name == 'seq' %}
5454
<td class="narrow {{ cell.solution_class }}">{{ cell.solution_points }}</td>
5555
<td class="narrow deadline-cell">{{ cell.deadline_penalty }}</td>
5656
<td class="narrow {{ cell.copy_class }}">{{ cell.copy_penalty }}</td>

scoreboard/templates/variants.html.j2

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@
4343
{{ proc_vmaxes | tojson | safe }}
4444
);
4545
variantCalc.fillThreadsTable({{ repo_salt | tojson | safe }}, {{ threads_vmax | int }});
46-
variantCalc.fillProcessesTable({{ repo_salt | tojson | safe }}, {{ proc_vmaxes | tojson | safe }}, true);
46+
variantCalc.fillProcessesTable(
47+
{{ repo_salt | tojson | safe }},
48+
{{ proc_vmaxes | tojson | safe }},
49+
{{ proc_tasks | map(attribute='display_name') | list | tojson | safe }}
50+
);
4751
</script>
4852
</div>
4953
</body>

0 commit comments

Comments
 (0)