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