add grade
This commit is contained in:
@@ -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:
|
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):
|
if rank <= ceil(0.10 * student_count):
|
||||||
return "A"
|
return "A"
|
||||||
if rank <= ceil(0.30 * student_count):
|
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 = {
|
ASSESSMENT_SCORE_BANDS = {
|
||||||
"A": (92, 100),
|
"A": (92, 99),
|
||||||
"B": (84, 91),
|
"B": (84, 91),
|
||||||
"C": (76, 83),
|
"C": (76, 83),
|
||||||
"D": (68, 75),
|
"D": (68, 75),
|
||||||
@@ -184,7 +185,7 @@ def build_gradebook(filters: GradebookFilters):
|
|||||||
scores = {}
|
scores = {}
|
||||||
tutorial_total = 0.0
|
tutorial_total = 0.0
|
||||||
challenge_total = 0.0
|
challenge_total = 0.0
|
||||||
best_submission_score = 0.0
|
submitted_scores = []
|
||||||
submitted_task_count = 0
|
submitted_task_count = 0
|
||||||
missing_task_count = 0
|
missing_task_count = 0
|
||||||
|
|
||||||
@@ -209,8 +210,7 @@ def build_gradebook(filters: GradebookFilters):
|
|||||||
continue
|
continue
|
||||||
if submission:
|
if submission:
|
||||||
submitted_task_count += 1
|
submitted_task_count += 1
|
||||||
if cell_score > best_submission_score:
|
submitted_scores.append(cell_score)
|
||||||
best_submission_score = cell_score
|
|
||||||
else:
|
else:
|
||||||
missing_task_count += 1
|
missing_task_count += 1
|
||||||
if task["task_type"] == TaskTypeChoices.TUTORIAL:
|
if task["task_type"] == TaskTypeChoices.TUTORIAL:
|
||||||
@@ -220,6 +220,8 @@ def build_gradebook(filters: GradebookFilters):
|
|||||||
|
|
||||||
tutorial_total = _score(tutorial_total)
|
tutorial_total = _score(tutorial_total)
|
||||||
challenge_total = _score(challenge_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)
|
total_score = _score(tutorial_total + challenge_total)
|
||||||
average_score = (
|
average_score = (
|
||||||
_score(total_score / len(included_task_ids)) if included_task_ids else None
|
_score(total_score / len(included_task_ids)) if included_task_ids else None
|
||||||
@@ -233,7 +235,7 @@ def build_gradebook(filters: GradebookFilters):
|
|||||||
"grade": "E",
|
"grade": "E",
|
||||||
"assessment_grade": "E",
|
"assessment_grade": "E",
|
||||||
"assessment_score": 60,
|
"assessment_score": 60,
|
||||||
"best_submission_score": _score(best_submission_score),
|
"top3_score": top3_score,
|
||||||
"scores": scores,
|
"scores": scores,
|
||||||
"tutorial_total": tutorial_total,
|
"tutorial_total": tutorial_total,
|
||||||
"challenge_total": challenge_total,
|
"challenge_total": challenge_total,
|
||||||
@@ -249,14 +251,14 @@ def build_gradebook(filters: GradebookFilters):
|
|||||||
row["rank"] = index
|
row["rank"] = index
|
||||||
row["grade"] = _grade_for_rank(index, student_count)
|
row["grade"] = _grade_for_rank(index, student_count)
|
||||||
|
|
||||||
# 考核等级:按单题最高分单独排名后定级(不改变上面的总分排名)
|
# 考核等级:按最高三次提交均分单独排名后定级(不改变上面的总分排名)
|
||||||
assessment_order = sorted(
|
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):
|
for index, row in enumerate(assessment_order, start=1):
|
||||||
row["assessment_grade"] = _assessment_grade_for_rank(index, student_count)
|
row["assessment_grade"] = _assessment_grade_for_rank(index, student_count)
|
||||||
|
|
||||||
# 考核分数:在各等级段内按名次(沿用单题最高分排序)线性铺开到对应分数段
|
# 考核分数:在各等级段内按名次(沿用最高三次均分排序)线性铺开到对应分数段
|
||||||
grade_groups = defaultdict(list)
|
grade_groups = defaultdict(list)
|
||||||
for row in assessment_order:
|
for row in assessment_order:
|
||||||
grade_groups[row["assessment_grade"]].append(row)
|
grade_groups[row["assessment_grade"]].append(row)
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ class GradebookRow(Schema):
|
|||||||
grade: Literal["A", "B", "C", "D", "E"]
|
grade: Literal["A", "B", "C", "D", "E"]
|
||||||
assessment_grade: Literal["A", "B", "C", "D", "E"]
|
assessment_grade: Literal["A", "B", "C", "D", "E"]
|
||||||
assessment_score: int
|
assessment_score: int
|
||||||
best_submission_score: float
|
top3_score: float
|
||||||
scores: dict[int, GradebookCell]
|
scores: dict[int, GradebookCell]
|
||||||
tutorial_total: float
|
tutorial_total: float
|
||||||
challenge_total: float
|
challenge_total: float
|
||||||
|
|||||||
Reference in New Issue
Block a user