Skip to content
This repository was archived by the owner on Jun 30, 2024. It is now read-only.

Commit 0841a5a

Browse files
committed
Better overview of autograde
1 parent d956bf4 commit 0841a5a

File tree

4 files changed

+89
-19
lines changed

4 files changed

+89
-19
lines changed

controllers/assignments.py

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,32 @@ def calculate_totals():
123123
return json.dumps(_calculate_totals(sid=sid, assignment_name=assignment_name))
124124

125125

126+
@auth.requires(
127+
lambda: verifyInstructorStatus(auth.user.course_name, auth.user),
128+
requires_login=True,
129+
)
130+
def get_summary():
131+
assignment_name = request.vars.assignment
132+
assignment = (
133+
db(
134+
(db.assignments.name == assignment_name)
135+
& (db.assignments.course == auth.user.course_id)
136+
)
137+
.select()
138+
.first()
139+
)
140+
res = db.executesql(
141+
f"""
142+
select name, min(score), max(score), to_char(avg(score), '00.999') as mean, count(score) from assignment_questions join questions on question_id = questions.id join question_grades on name = div_id
143+
where assignment_id = {assignment.id} and course_name = '{auth.user.course_name}'
144+
group by name
145+
""",
146+
as_dict=True,
147+
)
148+
149+
return json.dumps(res)
150+
151+
126152
def _autograde(
127153
sid=None,
128154
student_rownum=None,
@@ -223,16 +249,20 @@ def autograde():
223249
enforce_deadline = request.vars.get("enforceDeadline", None)
224250
assignment_name = request.vars.assignment
225251
timezoneoffset = session.timezoneoffset if "timezoneoffset" in session else None
226-
227-
return json.dumps(
228-
_autograde(
229-
sid=sid,
230-
question_name=question_name,
231-
enforce_deadline=enforce_deadline,
232-
assignment_name=assignment_name,
233-
timezoneoffset=timezoneoffset,
234-
)
252+
res = _autograde(
253+
sid=sid,
254+
question_name=question_name,
255+
enforce_deadline=enforce_deadline,
256+
assignment_name=assignment_name,
257+
timezoneoffset=timezoneoffset,
235258
)
259+
tres = _calculate_totals(sid=sid, assignment_name=assignment_name)
260+
if "computed_score" in tres:
261+
res["total_mess"] = tres["computed_score"]
262+
else:
263+
res["total_mess"] = tres["message"]
264+
265+
return json.dumps(res)
236266

237267

238268
@auth.requires(
@@ -304,7 +334,7 @@ def record_grade():
304334
& (db.question_grades.div_id == request.vars["acid"])
305335
& (db.question_grades.course_name == auth.user.course_name)
306336
),
307-
**updates
337+
**updates,
308338
)
309339
except IntegrityError:
310340
logger.error(

static/js/admin.js

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -157,24 +157,36 @@ function autoGrade() {
157157
(async function (students, ajax_params) {
158158
// Grade each student provided.
159159
let student_array = Object.keys(students);
160+
let total = 0;
161+
$("#gradingprogresstitle").html("<h3>Grading Progress</h3>");
162+
$("#autogradingprogress").html("");
160163
for (let index = 0; index < student_array.length; ++index) {
161164
let student = student_array[index];
162165
ajax_params.data.sid = student;
163166
res = await jQuery.ajax(ajax_params);
164-
$("#autogradingprogress").html(
165-
`Student ${index + 1} of ${student_array.length}: ${
167+
$("#autogradingprogress").append(
168+
`${index + 1} of ${student_array.length}: ${student} ${
166169
res.message
167-
} for ${student}`
170+
} Score: ${res.total_mess} <br>`
168171
);
172+
total = total + res.total_mess;
173+
$("#autogradingprogress").animate({
174+
scrollTop: $("#autogradingprogress").height(),
175+
});
169176
}
170-
// Clear the graing progress.
171-
$("#autogradingprogress").html("");
172-
calculateTotals();
177+
$("#autogradingprogress").append(
178+
`Average Score: ${total / student_array.length}`
179+
);
180+
$("#autogradingprogress").animate({
181+
scrollTop: $("#autogradingprogress").height(),
182+
});
183+
184+
gradingSummary("autogradingsummary");
173185
$("#autogradesubmit").prop("disabled", false);
174186
})(students, params);
175187
} else {
176188
jQuery.ajax(params).always(function () {
177-
calculateTotals();
189+
gradingSummary("autogradingsummary");
178190
$("#autogradesubmit").prop("disabled", false);
179191
});
180192
}
@@ -213,6 +225,28 @@ function calculateTotals(sid) {
213225
});
214226
}
215227

228+
function gradingSummary(container) {
229+
let assignment = getSelectedItem("assignment");
230+
jQuery.ajax({
231+
url: `${eBookConfig.app}/assignments/get_summary`,
232+
dataType: "JSON",
233+
data: {
234+
assignment: assignment,
235+
},
236+
success: function (retdata) {
237+
// retdata is array of rows in dictionary form.
238+
$("#gradingsummarytitle").html("<h3>Grading Summary</h3>");
239+
container = document.getElementById(container);
240+
$(container).html("");
241+
var hot = new Handsontable(container, {
242+
data: retdata,
243+
colHeaders: Object.keys(retdata[0]),
244+
licenseKey: "non-commercial-and-evaluation",
245+
});
246+
},
247+
});
248+
}
249+
216250
function saveManualTotal() {
217251
var assignment = getSelectedItem("assignment");
218252
var studentID = getSelectedItem("student");

views/_sphinx_static_files.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
<script type="text/javascript" src="{{=base_static_url}}/jquery.tablesorter.js"></script>
2323
<script type="text/javascript" src="{{=base_static_url}}/jquery-ui-1.10.3.custom.min.js"></script>
2424

25+
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/handsontable.full.js"></script>
26+
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/handsontable.full.min.css" rel="stylesheet" media="screen">
27+
2528
<link rel="stylesheet" type="text/css" href="{{=URL('static', 'jquery.datetimepicker.min.css')}}" />
2629
<link href="{{=base_static_url}}/jquery-ui-1.10.3.custom.min.css" rel="stylesheet" type="text/css"/>
2730
<link rel="stylesheet" href="{{=base_static_url}}/pygments.css" type="text/css"/>

views/admin/grading.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,12 @@ <h3>Students</h3>
6161
<strong>Warning</strong> Autograde does not support multiple selections yet.
6262
</div>
6363

64-
<div id="autogradingprogress">
64+
<div>
65+
<div id="gradingprogresstitle"></div>
66+
<div id="autogradingprogress" style="max-height: 100px; overflow: auto;"></div>
67+
<div id="gradingsummarytitle"></div>
68+
<div id="autogradingsummary"></div>
6569
</div>
66-
6770
<div id="assignmentTotalform" style="text-align: center; visibility: hidden; background-color: rgba(219,103,14,.71); margin: 10px; padding: 5px; border-radius: 10px;">
6871
<strong>Override student score for whole assignment.</strong>
6972
<form>

0 commit comments

Comments
 (0)