add grade

This commit is contained in:
2026-06-28 05:59:54 -06:00
parent ae32732cf6
commit 4497af940f
2 changed files with 12 additions and 10 deletions

View File

@@ -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)

View File

@@ -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