-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtools.py
More file actions
131 lines (106 loc) · 4.03 KB
/
tools.py
File metadata and controls
131 lines (106 loc) · 4.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import string
from operator import itemgetter
from db.crud import *
from random import choice
from db import models
from sqlalchemy.orm import Session
from typing import List
from fastapi import Request, Response
from pydantic import ValidationError
from fastapi.templating import Jinja2Templates
from fastapi.encoders import jsonable_encoder
from Levenshtein import ratio
prepare_context = lambda request=None, empty=False: {'request': request} if not empty else {}
templates = Jinja2Templates('templates')
get_template = lambda name, context: templates.TemplateResponse(name, context)
async def form_to_obj(request: Request):
form = await request.form()
return jsonable_encoder(form)
def loc_by_exception(error: ValidationError):
return error['loc'][0] if error['type'].startswith('string') else error['msg'].replace('Value error, ', '')
# worst algo
def question_form_to_dict(form: dict):
question = form.pop('question')
answers = []
for key in form:
if 'check' in key:
continue
num = key.replace('answer', '')
index = int(num)
answers.append({
'answer_id': index,
'text': '',
'is_correct': False
})
for form_key, form_value in form.items():
num = form_key.replace('check', '').replace('answer', '')
index = int(num)
for answer in answers:
if index == answer['answer_id']:
if 'check' in form_key:
answer['is_correct'] = True
else:
answer['text'] = form_value
return [question, answers]
form_has_key = lambda word, form: any(word in key for key in form.keys())
def generate_random_string(length: int = 6):
letters = string.ascii_lowercase + string.ascii_uppercase + string.digits
result_str = ''.join(choice(letters) for _ in range(length))
return result_str
def generate_session_id():
return generate_random_string(6)
def delete_quiz_info(response: Response):
response.delete_cookie(key='current_question')
response.delete_cookie(key='quiz_id')
response.delete_cookie(key='session_id')
return response
def get_answers_ids(form: dict) -> list:
result = []
for key, _ in form.items():
if 'check' not in key:
continue
num = key.replace('check', '')
index = int(num)
result.append(index)
return result
def process_quiz(db: Session, user_marked: List[models.Session], user: models.User) -> list:
result = []
for marked in user_marked:
temp = {}
question = get_question_by_id(db, marked.question_id)
temp.update({'question': question.text})
answers = get_answers_by_question_id(db, question.id)
answers_list = []
for answer in answers:
piece = {
'text': answer.text,
'checked': True if answer.id in marked.marked else False,
'is_right': answer.is_correct
}
if piece['checked'] and piece['is_right']:
increment_user_score(db, user)
answers_list.append(piece)
temp.update({'answers': answers_list})
result.append(temp)
return result
def intelligent_search(query: str, quiz_items: List[models.Quiz]):
temporary = []
for item in quiz_items:
temporary.append([ratio(item.title, query), item])
sorted_items = sorted(temporary, key=itemgetter(0))
sorted_items.reverse()
result = [quiz[1] for quiz in sorted_items]
return result[0:5]
# for tests
def make_garbage(db: Session, count: int = 10, garbage_limit: int = 10):
for i in range(count):
quiz = models.Quiz(title=generate_random_string(garbage_limit),
description=generate_random_string(garbage_limit), author_id=1)
db.add(quiz)
db.commit()
return True
def remove_garbage(db: Session, count: int = 10):
garbage_items = db.query(models.Quiz).order_by(models.Quiz.id.desc()).limit(count).all()
for item in garbage_items:
db.delete(item)
db.commit()