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

Commit b61bea2

Browse files
committed
Add: support for microparsons autograding
1 parent ef333bd commit b61bea2

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

models/db_ebook.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,21 @@
248248
migrate=bookserver_owned("webwork_answers"),
249249
)
250250

251+
# webwork_answers
252+
# ------------
253+
db.define_table(
254+
"microparsons_answers",
255+
Field("timestamp", "datetime"),
256+
Field("div_id", "string"),
257+
Field("sid", "string"),
258+
Field("course_name", "string"),
259+
Field("answer", "json"),
260+
Field("correct", "boolean"),
261+
Field("percent", "double"),
262+
migrate=bookserver_owned("microparsons_answers"),
263+
)
264+
265+
251266
# payments
252267
# --------
253268
db.define_table(

modules/rs_grading.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,18 @@ def _score_one_parsons(row, points, autograde):
121121
return _score_from_pct_correct(pct_correct, points, autograde)
122122

123123

124+
def _score_one_microparsons(row, points, autograde):
125+
# row is from microparsons_answers
126+
if autograde == "pct_correct" and "percent" in row and row.percent is not None:
127+
pct_correct = int(round(row.percent * 100))
128+
else:
129+
if row.correct:
130+
pct_correct = 100
131+
else:
132+
pct_correct = 0
133+
return _score_from_pct_correct(pct_correct, points, autograde)
134+
135+
124136
def _score_one_fitb(row, points, autograde):
125137
# row is from fitb_answers
126138
if autograde == "pct_correct" and "percent" in row and row.percent is not None:
@@ -329,6 +341,30 @@ def _scorable_parsons_answers(
329341
return db(query).select(orderby=db.parsons_answers.timestamp)
330342

331343

344+
def _scorable_microparsons_answers(
345+
course_name,
346+
sid,
347+
question_name,
348+
points,
349+
deadline,
350+
practice_start_time=None,
351+
db=None,
352+
now=None,
353+
):
354+
query = (
355+
(db.microparsons_answers.course_name == course_name)
356+
& (db.microparsons_answers.sid == sid)
357+
& (db.microparsons_answers.div_id == question_name)
358+
)
359+
if deadline:
360+
query = query & (db.microparsons_answers.timestamp < deadline)
361+
if practice_start_time:
362+
query = query & (db.microparsons_answers.timestamp >= practice_start_time)
363+
if now:
364+
query = query & (db.microparsons_answers.timestamp <= now)
365+
return db(query).select(orderby=db.microparsons_answers.timestamp)
366+
367+
332368
def _scorable_fitb_answers(
333369
course_name,
334370
sid,
@@ -708,6 +744,21 @@ def _autograde_one_q(
708744
scoring_fn = _score_one_webwork
709745
logger.debug("AGDB - done with webwork")
710746

747+
elif question_type == "hparsons":
748+
logger.debug("grading a microparsons!!")
749+
results = _scorable_microparsons_answers(
750+
course_name,
751+
sid,
752+
question_name,
753+
points,
754+
deadline,
755+
practice_start_time,
756+
db=db,
757+
now=now,
758+
)
759+
scoring_fn = _score_one_microparsons
760+
logger.debug("AGDB - done with microparsons")
761+
711762
elif question_type == "codelens":
712763
if (
713764
autograde == "interact"

0 commit comments

Comments
 (0)