-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.py
129 lines (116 loc) · 4.46 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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import json
def load_course_test(course_number):
"""
Загружает тест для указанного курса из JSON файла
Args:
course_number: номер курса
Returns:
dict: данные теста или None, если тест не найден
"""
try:
with open('course_tests.json', 'r', encoding='utf-8') as f:
tests = json.load(f)
return tests.get(str(course_number))
except FileNotFoundError:
return None
def generate_test_html(course_number):
"""
Генерирует HTML код теста для указанного курса
Args:
course_number: номер курса
Returns:
str: HTML код теста или None, если тест не найден
"""
test_data = load_course_test(course_number)
if not test_data:
return None
html = f'<h4>{test_data["title"]}</h4>\n'
html += '<form id="quiz" action="/course{}" method="POST">\n'.format(course_number)
html += ' <div>\n'
for question in test_data['questions']:
html += f'''
<div class="quiztion">
<p>{question["id"]}. {question["text"]}</p>
<div class="btn-group col-md-12">
'''
for answer in question['answers']:
html += f'''
<input type="radio" class="btn-check"
name="q{question['id']}"
id="q{question['id']}_{answer['id']}"
autocomplete="off"
value="{answer['id']}" />
<label class="btn" for="q{question['id']}_{answer['id']}"
data-mdb-ripple-init>{answer['text']}</label>
'''
html += '''
</div>
</div>
'''
html += '''
<input type="submit" value="Сдать тест"
id="checkAnswers" class="btn btn-primary col-md-12">
</div>
</form>
<script>
// Функция для отправки результатов в БД
async function postTestResults(answers, timestamp, student_id) {
try {
const response = await fetch('/submit_test', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
course_id: window.COURSE_NUMBER,
answers: answers,
timestamp: timestamp,
user_id: student_id
})
});
return await response.json();
} catch (error) {
console.error('Ошибка при сохранении результатов:', error);
}
}
document.getElementById('quiz').addEventListener('submit', function (event) {
event.preventDefault();
const answers = {};
const questions = this.querySelectorAll('.quiztion');
// Собираем ответы
let allAnswered = true;
questions.forEach(function(question, index) {
const selected = question.querySelector('input[type="radio"]:checked');
if (!selected) {
allAnswered = false;
} else {
answers[index + 1] = selected.value;
}
});
if (!allAnswered) {
alert('Вы не ответили на все вопросы');
return;
}
// Отправляем ответы на сервер
fetch('/course' + window.COURSE_NUMBER, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(answers)
})
.then(response => response.json())
.then(async data => {
const timestamp = Date.now();
// Сохраняем результаты в базу с передачей всех необходимых аргументов
await postTestResults(answers, timestamp, window.USER_ID);
// Показываем сообщение об успешной отправке
alert('Тест успешно сдан');
// Отключаем форму
document.getElementById('quiz').style.pointerEvents = 'none';
document.getElementById('quiz').style.opacity = '0.7';
});
});
</script>
'''
return html