Finished client result API.
Need to work on adjustment user codes and server email notifications.
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
import os
|
||||
import pathlib
|
||||
from json import dump, loads
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from flask.json import jsonify
|
||||
from main import app
|
||||
@ -99,4 +99,93 @@ def generate_questions(dataset:dict):
|
||||
else:
|
||||
question['options'] = _question['options'].copy()
|
||||
output.append(question)
|
||||
return output
|
||||
return output
|
||||
|
||||
def evaluate_answers(dataset: dict, answers: dict):
|
||||
score = 0
|
||||
max = 0
|
||||
tags = {}
|
||||
for block in dataset['questions']:
|
||||
if block['type'] == 'question':
|
||||
max += 1
|
||||
q_no = block['q_no']
|
||||
if str(q_no) in answers:
|
||||
correct = block['correct']
|
||||
correct_answer = block['options'][correct]
|
||||
if answers[str(q_no)] == correct_answer:
|
||||
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
|
||||
if block['type'] == 'block':
|
||||
for question in block['questions']:
|
||||
max += 1
|
||||
q_no = question['q_no']
|
||||
if str(q_no) in answers:
|
||||
correct = question['correct']
|
||||
correct_answer = question['options'][correct]
|
||||
if answers[str(q_no)] == correct_answer:
|
||||
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_tags_list(dataset:dict):
|
||||
output = []
|
||||
blocks = dataset['questions']
|
||||
for block in blocks:
|
||||
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
|
||||
|
||||
|
||||
def get_time_options():
|
||||
time_options = [
|
||||
('none', 'None'),
|
||||
('60', '1 hour'),
|
||||
('90', '1 hour 30 minutes'),
|
||||
('120', '2 hours')
|
||||
]
|
||||
return time_options
|
@ -37,11 +37,22 @@ def encrypt(input):
|
||||
def decrypt(input):
|
||||
if not check_keyfile_exists():
|
||||
raise EncryptionKeyMissing
|
||||
input = input.encode()
|
||||
_encryption_key = load_key()
|
||||
fernet = Fernet(_encryption_key)
|
||||
output = fernet.decrypt(input)
|
||||
return output.decode()
|
||||
if type(input) == str:
|
||||
input = input.encode()
|
||||
output = fernet.decrypt(input)
|
||||
return output.decode()
|
||||
if type(input) == dict:
|
||||
output = {}
|
||||
for key, value in input.items():
|
||||
if type(value) == dict:
|
||||
output[key] = decrypt(value)
|
||||
else:
|
||||
value = value.encode()
|
||||
output[key] = fernet.decrypt(value)
|
||||
output[key] = output[key].decode()
|
||||
return output
|
||||
|
||||
class EncryptionKeyMissing(Exception):
|
||||
def __init__(self, message='There is no encryption keyfile.'):
|
||||
|
@ -15,7 +15,7 @@ def decrypt_find(collection:collection, query:dict):
|
||||
if not query:
|
||||
output_list.append(decrypted_document)
|
||||
else:
|
||||
if set(query.items()).issubset(set(decrypted_document.items())):
|
||||
if query.items() <= decrypted_document.items():
|
||||
output_list.append(decrypted_document)
|
||||
return output_list
|
||||
|
||||
|
Reference in New Issue
Block a user