Added a whole lot of views.
Finished quiz API views Finished question generator and answer eval
This commit is contained in:
@ -1,5 +1,7 @@
|
||||
from ..data import data as data_dir
|
||||
|
||||
import json
|
||||
from random import shuffle
|
||||
|
||||
def load(filename:str):
|
||||
with open(f'./{data_dir}/{filename}') as file:
|
||||
@ -7,4 +9,26 @@ def load(filename:str):
|
||||
|
||||
def save(data:dict, filename:str):
|
||||
with open(f'./{data_dir}/{filename}', 'w') as file:
|
||||
json.dump(data, file, indent=4)
|
||||
json.dump(data, file, indent=4)
|
||||
|
||||
def check_is_json(file):
|
||||
if not '.' in file.filename or not file.filename.rsplit('.',1)[-1] == 'json': return False
|
||||
return True
|
||||
|
||||
def validate_json(file):
|
||||
file.stream.seek(0)
|
||||
data = json.loads(file.read())
|
||||
if not type(data) is list: return False
|
||||
|
||||
def randomise_list(list:list):
|
||||
_list = list.copy()
|
||||
shuffle(_list)
|
||||
return(_list)
|
||||
|
||||
def get_tag_list(dataset:list):
|
||||
output = []
|
||||
for block in dataset:
|
||||
if block['type'] == 'question': output = list(set(output) | set(block['tags']))
|
||||
if block['type'] == 'block':
|
||||
for question in block['questions']: output = list(set(output) | set(question['tags']))
|
||||
return output
|
@ -33,4 +33,13 @@ def value(min:int=0, max:int=None):
|
||||
value = field.data or 0
|
||||
if value < min or max != None and value > max:
|
||||
raise ValidationError(message)
|
||||
return length
|
||||
return length
|
||||
|
||||
def get_time_options():
|
||||
time_options = [
|
||||
('none', 'None'),
|
||||
('60', '1 hour'),
|
||||
('90', '1 hour 30 minutes'),
|
||||
('120', '2 hours')
|
||||
]
|
||||
return time_options
|
@ -1,2 +1,104 @@
|
||||
from .data import randomise_list
|
||||
|
||||
def parse_test_code(code):
|
||||
return code.replace('—', '').lower()
|
||||
return code.replace('—', '').lower()
|
||||
|
||||
def generate_questions(dataset:list):
|
||||
output = []
|
||||
for block in randomise_list(dataset):
|
||||
if block['type'] == 'question':
|
||||
question = {
|
||||
'type': 'question',
|
||||
'q_no': block['q_no'],
|
||||
'question_header': '',
|
||||
'text': block['text']
|
||||
}
|
||||
if block['q_type'] == 'Multiple Choice': question['options'] = randomise_list([*enumerate(block['options'])])
|
||||
else: question['options'] = block['options'].copy()
|
||||
output.append(question)
|
||||
elif block['type'] == 'block':
|
||||
for key, _question in enumerate(randomise_list(block['questions'])):
|
||||
question = {
|
||||
'type': 'block',
|
||||
'q_no': _question['q_no'],
|
||||
'question_header': block['question_header'] if 'question_header' in block else '',
|
||||
'block_length': len(block['questions']),
|
||||
'block_q_no': key,
|
||||
'text': _question['text']
|
||||
}
|
||||
if _question['q_type'] == 'Multiple Choice': question['options'] = randomise_list([*enumerate(_question['options'])])
|
||||
else: question['options'] = _question['options'].copy()
|
||||
output.append(question)
|
||||
return output
|
||||
|
||||
def evaluate_answers(answers:dict, key:list):
|
||||
score = 0
|
||||
max = 0
|
||||
tags = {}
|
||||
for block in key:
|
||||
if block['type'] == 'question':
|
||||
max += 1
|
||||
q_no = block['q_no']
|
||||
if str(q_no) in answers:
|
||||
submitted_answer = int(answers[str(q_no)])
|
||||
if submitted_answer == block['correct']:
|
||||
score += 1
|
||||
for tag in block['tags']:
|
||||
if tag not in tags:
|
||||
tags[tag] = {
|
||||
'scored': 1,
|
||||
'max': 1
|
||||
}
|
||||
else:
|
||||
tags[tag]['scored'] += 1
|
||||
tags[tag]['max'] += 1
|
||||
else:
|
||||
for tag in block['tags']:
|
||||
if tag not in tags:
|
||||
tags[tag] = {
|
||||
'scored': 0,
|
||||
'max': 1
|
||||
}
|
||||
else: tags[tag]['max'] += 1
|
||||
elif block['type'] == 'block':
|
||||
for question in block['questions']:
|
||||
max += 1
|
||||
q_no = question['q_no']
|
||||
if str(q_no) in answers:
|
||||
submitted_answer = int(answers[str(q_no)])
|
||||
if submitted_answer == question['correct']:
|
||||
score += 1
|
||||
for tag in question['tags']:
|
||||
if tag not in tags:
|
||||
tags[tag] = {
|
||||
'scored': 1,
|
||||
'max': 1
|
||||
}
|
||||
else:
|
||||
tags[tag]['scored'] += 1
|
||||
tags[tag]['max'] += 1
|
||||
else:
|
||||
for tag in question['tags']:
|
||||
if tag not in tags:
|
||||
tags[tag] = {
|
||||
'scored': 0,
|
||||
'max': 1
|
||||
}
|
||||
else: tags[tag]['max'] += 1
|
||||
grade = 'merit' if score/max >= .85 else 'pass' if score/max >= .70 else 'fail'
|
||||
return {
|
||||
'grade': grade,
|
||||
'tags': tags,
|
||||
'score': score,
|
||||
'max': max
|
||||
}
|
||||
|
||||
def get_correct_answers(dataset:list):
|
||||
output = {}
|
||||
for block in dataset:
|
||||
if block['type'] == 'question':
|
||||
output[str(block['q_no'])] = block['options'][block['correct']]
|
||||
if block['type'] == 'block':
|
||||
for question in block['questions']:
|
||||
output[str(question['q_no'])] = question['options'][question['correct']]
|
||||
return output
|
Reference in New Issue
Block a user