icp/oer/exercise-formats/choice/multiple/controller.py

96 lines
2.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Standardized types do not require authors to specify any control script as
# it can be generated on import. However when provided it will overwrite the
# default behaivior.
import sys
import re
def grade(ctx):
grade = 'FAIL'
# counter
correct = 0
correct_chosen = []
min_correct = -1
incorrect = 0
incorrect_chosen = []
max_incorrect = 0
choices = ctx.data['data']['choices']
solution = ctx.data['solution']
print(choices, file=sys.stderr)
print(solution, file=sys.stderr)
if ctx.data['data']['input_type'] in ['radio']:
# choose one
# a correct selection is found? => return 'PASS'
# a incorrect selection is found? => return 'FAIL'
for choice in choices:
print(choice['value'], file=sys.stderr)
print(solution, file=sys.stderr)
if choice['is'] in ['correct', 'required']:
if choice['value'] in solution:
correct_chosen.append(choice['value'])
grade = 'PASS'
break
else:
if choice['value'] in solution:
incorrect_chosen.append(choice['value'])
grade = 'FAIL'
break
else:
# choose many/multiple
#for choice in ctx.data['choices']:
for choice in choices:
print(choice['value'], file=sys.stderr)
print(solution, file=sys.stderr)
if choice['is'] in ['correct', 'required']:
correct += 1
if choice['value'] in solution:
correct_chosen.append(choice['value'])
else:
incorrect += 1
if choice['value'] in solution:
incorrect_chosen.append(choice['value'])
if min_correct == -1:
min_correct = correct
print({
'correct': correct,
'correct_chosen': correct_chosen,
'min_correct': min_correct,
'incorrect': incorrect,
'incorrect_chosen': incorrect_chosen,
'max_incorrect': max_incorrect,
}, file=sys.stderr)
ctx.response_data['correct'] = correct_chosen
ctx.response_data['incorrect'] = incorrect_chosen
if len(incorrect_chosen) > max_incorrect:
return 'FAIL'
elif len(correct_chosen) < min_correct:
return 'FAIL'
if len(correct_chosen) == correct:
return 'PASS'
# grading
# max_incorrect
# min_correct
ctx.response_data['correct'] = correct_chosen
ctx.response_data['incorrect'] = incorrect_chosen
return grade