This repository has been archived by the owner on Jul 3, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.py
111 lines (87 loc) · 3.24 KB
/
utils.py
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
from flask import g, Response, redirect, url_for, flash, request
from functools import wraps
from json import dumps
from random import shuffle
from datetime import datetime, timedelta
from app import app
from models import User, Answer, UserAnswer, db
def shuffle_return(x):
shuffle(x)
return x
def find_user(name):
return User.query.filter_by(name=name).one_or_none()
def get_user(user_id):
return User.query.get(user_id)
def is_browser_supported():
ua = request.user_agent
v = tuple(map(int, ua.version.split('.')))[:2]
return ua.browser in ('chrome', 'firefox') and v >= (60, 0)
def remaining_time(user):
time_to_solve = app.config.get('TIME_TO_SOLVE', 3600)
if user.start_time is None:
return time_to_solve
max_end_time = user.start_time + timedelta(seconds=time_to_solve)
return (max_end_time - datetime.utcnow()).total_seconds()
def finish_test(user):
if user.end_time is None:
if remaining_time(user) <= 0:
time_to_solve = app.config.get('TIME_TO_SOLVE', 3600)
user.end_time = user.start_time + timedelta(seconds=time_to_solve)
else:
user.end_time = datetime.utcnow()
user.points = 0
for a in user.answers:
if a.is_correct:
user.points += a.question.points
db.session.commit()
def save_answer(answer_id):
user = g.user
if user is None:
return 'Not logged in', 4
if answer_id is None:
return 'Not found', 2
if user.end_time is not None:
return 'Test finished', 1
if remaining_time(user) <= 0:
return 'Test timed out', 3
answer = Answer.query.get(answer_id)
if answer is None:
return 'Not found', 2
user_answer = UserAnswer.query.filter_by(user_id=user.id,
question_id=answer.question_id).first()
if user_answer is not None:
user_answer.answer_id = answer_id
user_answer.receive_time = datetime.utcnow()
else:
user_answer = UserAnswer(user_id=user.id, question_id=answer.question_id,
answer_id=answer_id, receive_time=datetime.utcnow())
db.session.add(user_answer)
db.session.commit()
return True
def back(default='welcome'):
return request.referrer or url_for(default)
def response(data, status=200, mimetype=None, **kwargs):
return Response(response=data, status=status, mimetype=mimetype, **kwargs)
def json_response(data, status=200, **kwargs):
if not isinstance(data, str):
data = dumps(data)
return response(data, status, 'application/json', **kwargs)
def login_required(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
if g.user is None:
flash('Ты не вошёл в аккаунт!')
return redirect(url_for('welcome'))
return fn(*args, **kwargs)
return wrapper
def admin_required(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
if g.user is None:
flash('Вы не вошли в аккаунт')
return redirect(url_for('welcome'))
if not g.user.is_admin:
flash('Нет доступа')
return redirect(url_for('welcome'))
return fn(*args, **kwargs)
return wrapper