This repository was archived by the owner on Sep 1, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstandardGrading.py
More file actions
93 lines (71 loc) · 3.84 KB
/
standardGrading.py
File metadata and controls
93 lines (71 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from UI import uiHelpers
from Canvas import Canvas
from Grade import grade, score, post, gradesheets
import pandas as pd
async def standardGrading(**kwargs):
statusAssignments: pd.DataFrame = kwargs['canvas'].getStatusAssignments()
kwargs['canvas'].updateStatusAssignmentScores()
statusAssignmentScores: pd.DataFrame = kwargs['canvas'].getStatusAssignmentScores()
uiHelpers.setupAssignments(kwargs['canvas'])
# select gradesheet to grade with
print("Please enter action to take:")
print("1) Gradescope")
print("2) Runestone")
print("3) PrairieLearn")
choice = uiHelpers.getUserInput(allowedLowerRange=1, allowedUpperRange=3)
if choice == 1:
gradesheetsToGrade: dict[int, pd.DataFrame] = uiHelpers.setupGradescopeGrades(kwargs['canvas'])
elif choice == 2:
gradesheetsToGrade: dict[int, pd.DataFrame] = uiHelpers.setupRunestoneGrades(kwargs['canvas'])
else:
gradesheetsToGrade: dict[int, pd.DataFrame] = await uiHelpers.setupPLGrades(kwargs['canvas'], kwargs['azure'])
specialCasesDF = uiHelpers.setupSpecialCases()
assignmentsToGrade: pd.DataFrame = kwargs['canvas'].getAssignmentsToGrade()
print("\n===\tGenerating Grades\t===\n")
for assignmentID, gradesDF in gradesheetsToGrade.items():
# we know that if we got here that the id will exist and only map to one assignment
currentAssignment: pd.DataFrame = assignmentsToGrade.loc[assignmentsToGrade['id'] == assignmentID]
print(f"Now grading {currentAssignment['name'].values[0]}...")
scaleFactor, standardPoints, maxPoints, xcScaleFactor = uiHelpers.setupScaling(
currentAssignment['points'].values[0])
gradesheetsToGrade[assignmentID] = \
grade.scaleScores(gradesDF, scaleFactor, standardPoints, maxPoints, xcScaleFactor)
missingScore, exceptions = uiHelpers.setupMissingAssignments()
gradesheetsToGrade[assignmentID] = \
grade.scoreMissingAssignments(gradesDF, score=missingScore, exceptions=exceptions)
gradesheetsToGrade[assignmentID], specialCasesDF, statusAssignmentScores = \
grade.calculateLatePenalty(gradesDF, specialCasesDF, statusAssignments, statusAssignmentScores,
currentAssignment['common_name'].values[0], kwargs['latePenalty'])
if len(statusAssignments) != 0:
print("Updating Status Assignments...", end="")
for i, row in statusAssignments.iterrows():
currentAssignment: pd.DataFrame = \
statusAssignmentScores.loc[statusAssignmentScores['status_assignment_id'] == row['id']]
# if there are no assignments found
if len(currentAssignment) == 0:
continue
gradesheetsToGrade[row['id']] = gradesheets.convertStatusAssignmentToGradesheet(currentAssignment)
# 'activate' the assignments so that they can be graded
kwargs['canvas'].selectAssignmentsToGrade([row['common_name']])
assignmentsToGrade = kwargs['canvas'].getAssignmentsToGrade()
print("Done")
print("\nGrades have been generated. Would you like to continue?")
usrYN = uiHelpers.getUserInput("y/n")
if usrYN.lower() != 'y':
return False
print("\n===\tGenerating Canvas Scores\t===\n")
studentScores = score.createCanvasScoresForAssignments(
gradesheetsToGrade,
kwargs['canvas'],
assignmentsToGrade
)
print("Scores have been generated. Would you like to continue?")
usrYN = uiHelpers.getUserInput("y/n")
if usrYN.lower() != 'y':
return False
print("\n===\tPosting Scores\t===\n")
if post.writeUpdatedGradesheets(gradesheetsToGrade, assignmentsToGrade) \
and post.updateSpecialCases(specialCasesDF) \
and post.postToCanvas(kwargs['canvas'], studentScores):
return True
return False