From 4497af940fe81b809347782fcdddf69be2b20c17 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sun, 28 Jun 2026 05:59:54 -0600 Subject: [PATCH] add grade --- submission/gradebook.py | 20 +++++++++++--------- submission/schemas.py | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/submission/gradebook.py b/submission/gradebook.py index 7fb4612..0098018 100644 --- a/submission/gradebook.py +++ b/submission/gradebook.py @@ -42,7 +42,7 @@ def _grade_for_rank(rank: int, student_count: int) -> str: def _assessment_grade_for_rank(rank: int, student_count: int) -> str: - # 考核等级:A10% B20% C40% D20% E10%,按单题最高分排名 + # 考核等级:A10% B20% C40% D20% E10%,按最高三次提交均分排名 if rank <= ceil(0.10 * student_count): return "A" if rank <= ceil(0.30 * student_count): @@ -55,8 +55,9 @@ def _assessment_grade_for_rank(rank: int, student_count: int) -> str: # 考核分数:各等级对应的分数段(高分→低分),段内按名次线性铺开 +# 最高分封顶 99,不出现满分 100 ASSESSMENT_SCORE_BANDS = { - "A": (92, 100), + "A": (92, 99), "B": (84, 91), "C": (76, 83), "D": (68, 75), @@ -184,7 +185,7 @@ def build_gradebook(filters: GradebookFilters): scores = {} tutorial_total = 0.0 challenge_total = 0.0 - best_submission_score = 0.0 + submitted_scores = [] submitted_task_count = 0 missing_task_count = 0 @@ -209,8 +210,7 @@ def build_gradebook(filters: GradebookFilters): continue if submission: submitted_task_count += 1 - if cell_score > best_submission_score: - best_submission_score = cell_score + submitted_scores.append(cell_score) else: missing_task_count += 1 if task["task_type"] == TaskTypeChoices.TUTORIAL: @@ -220,6 +220,8 @@ def build_gradebook(filters: GradebookFilters): tutorial_total = _score(tutorial_total) challenge_total = _score(challenge_total) + top3 = sorted(submitted_scores, reverse=True)[:3] + top3_score = _score(sum(top3) / len(top3)) if top3 else 0.0 total_score = _score(tutorial_total + challenge_total) average_score = ( _score(total_score / len(included_task_ids)) if included_task_ids else None @@ -233,7 +235,7 @@ def build_gradebook(filters: GradebookFilters): "grade": "E", "assessment_grade": "E", "assessment_score": 60, - "best_submission_score": _score(best_submission_score), + "top3_score": top3_score, "scores": scores, "tutorial_total": tutorial_total, "challenge_total": challenge_total, @@ -249,14 +251,14 @@ def build_gradebook(filters: GradebookFilters): row["rank"] = index row["grade"] = _grade_for_rank(index, student_count) - # 考核等级:按单题最高分单独排名后定级(不改变上面的总分排名) + # 考核等级:按最高三次提交均分单独排名后定级(不改变上面的总分排名) assessment_order = sorted( - rows, key=lambda row: (-row["best_submission_score"], row["username"]) + rows, key=lambda row: (-row["top3_score"], row["username"]) ) for index, row in enumerate(assessment_order, start=1): row["assessment_grade"] = _assessment_grade_for_rank(index, student_count) - # 考核分数:在各等级段内按名次(沿用单题最高分排序)线性铺开到对应分数段 + # 考核分数:在各等级段内按名次(沿用最高三次均分排序)线性铺开到对应分数段 grade_groups = defaultdict(list) for row in assessment_order: grade_groups[row["assessment_grade"]].append(row) diff --git a/submission/schemas.py b/submission/schemas.py index cb34917..67665b9 100644 --- a/submission/schemas.py +++ b/submission/schemas.py @@ -184,7 +184,7 @@ class GradebookRow(Schema): grade: Literal["A", "B", "C", "D", "E"] assessment_grade: Literal["A", "B", "C", "D", "E"] assessment_score: int - best_submission_score: float + top3_score: float scores: dict[int, GradebookCell] tutorial_total: float challenge_total: float