add and edit stuff

master
gtitov 3 years ago
parent 9d874ce014
commit 3d2d415c5e

@ -3,6 +3,9 @@ from fastapi.middleware.cors import CORSMiddleware # CORS
import json import json
import random import random
from pathlib import Path from pathlib import Path
from datetime import datetime
from settings import WAVE, END_TEST_PASSWORD, QUIZ_LENGTH
app = FastAPI() app = FastAPI()
@ -18,10 +21,11 @@ app.add_middleware( # CORS
allow_headers=["*"], allow_headers=["*"],
) )
# student_answers_example = { # student_answers_example = {
# "version": 1, # "version": 1,
# "student": "asd", # "student": "asd",
# "attempt": 0, # "wave": 0,
# "questions": [ # "questions": [
# { # {
# "id": 4, # "id": 4,
@ -35,8 +39,9 @@ app.add_middleware( # CORS
with open("questions.json", "r", encoding="UTF-8") as f: with open("questions.json", "r", encoding="UTF-8") as f:
content = json.load(f) content = json.load(f)
all_questions = content["questions"] all_questions = content["questions"]
topics = ["теодолит"] topics_questions = all_questions # don't use topics for now. see next to lines to use topics
topics_questions = [q for q in all_questions if q.get("topic") in topics] # topics = ["теодолит"] # move topics to VARIABLES
# topics_questions = [q for q in all_questions if q.get("topic") in topics]
remove_keys = ["author", "answer", "topic"] remove_keys = ["author", "answer", "topic"]
quiz_questions = [{key: value for key, value in q.items() if key not in remove_keys} for q in topics_questions] quiz_questions = [{key: value for key, value in q.items() if key not in remove_keys} for q in topics_questions]
@ -74,19 +79,20 @@ def get_quiz(student_id, student: str):
Returns: Returns:
obj: json-like quiz obj: json-like quiz
""" """
quiz_length = 1 quiz_length = QUIZ_LENGTH
questions_for_student = random.sample(quiz_questions, len(quiz_questions))[:quiz_length] # random order and only first n questions questions_for_student = random.sample(quiz_questions, len(quiz_questions))[:quiz_length] # random order and only first n questions
return { return {
"version": 1, "version": 1,
"student_id": student_id, "student_id": student_id,
"student": student, "student": student,
"attempt": 0, # TODO how to count attempts? "wave": WAVE, # волна сдачи теста
"start_time": datetime.now().strftime("%Y-%m-%dT%H-%M-%S"),
"questions": questions_for_student "questions": questions_for_student
} }
@app.get("/send_student_answers") @app.get("/save_student_answers")
def send_student_answers(student_answers: str): def send_student_answers(student_answers: str):
"""Save answers as-is and checked answers """Save answers as-is and check answers
Args: Args:
student_answers (str): json-like string with student's answers student_answers (str): json-like string with student's answers
@ -95,12 +101,37 @@ def send_student_answers(student_answers: str):
str: student name str: student name
""" """
json_answers = json.loads(student_answers) json_answers = json.loads(student_answers)
print(json_answers) timestamp_str = datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
path_to_answers = f'answers/{json_answers["student"]}_{json_answers["attempt"]}.json' json_answers["end_time"] = timestamp_str
path_to_answers = f'answers/{json_answers["student"]}_{json_answers["wave"]}_{timestamp_str}.json'
with open(path_to_answers, 'w', encoding='utf-8') as f: with open(path_to_answers, 'w', encoding='utf-8') as f:
json.dump(json_answers, f, ensure_ascii=False) json.dump(json_answers, f, ensure_ascii=False)
path_to_results = f'results/{json_answers["student"]}_{json_answers["attempt"]}.json' path_to_results = f'results/{json_answers["student"]}_{json_answers["wave"]}_{timestamp_str}.json'
with open(path_to_results, 'w', encoding='utf-8') as f: with open(path_to_results, 'w', encoding='utf-8') as f:
json.dump(check_answers(json_answers), f, ensure_ascii=False) # TODO move checking to background? json.dump(check_answers(json_answers), f, ensure_ascii=False) # TODO move checking to background?
return json_answers["student"] return json_answers["student"]
@app.get("/end_quiz")
def end_test(password: str):
"""End test and save results to csv
Args:
password (str): password to end test
"""
if password == END_TEST_PASSWORD:
csv_string = "student,percent,start,end\n"
for file_in_results in Path("results").iterdir():
if file_in_results.is_file() and file_in_results.suffix == ".json":
print(file_in_results)
with open(file_in_results, "r", encoding="UTF-8") as f:
content = json.load(f)
csv_string += f"{content['student']},{content['correct_percent']},{content['start_time']},{content['end_time']}\n"
timestamp = datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
results_path = Path(f"results/results_{timestamp}.csv")
with open(results_path, "w", encoding='utf-8') as f:
f.write(csv_string)
return(f"Тестирование завершено. Сводные результаты сохранены в {results_path.resolve()}")
else:
return("Неверный пароль")

@ -0,0 +1,3 @@
WAVE = 1
END_TEST_PASSWORD = "qwe"
QUIZ_LENGTH = 3
Loading…
Cancel
Save