-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcard_model.py
More file actions
132 lines (106 loc) · 4.71 KB
/
Copy pathcard_model.py
File metadata and controls
132 lines (106 loc) · 4.71 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
132
# Работа с таблицей карточек
from db import get_connection
from sqlite3 import IntegrityError, Row
def _create_card(deck_id: int, question: str, answer: str) -> int | None:
"""Создаёт новую карточку с заданным именем."""
try:
with get_connection() as conn:
cursor = conn.execute(
"INSERT INTO cards (deck_id, question, answer) VALUES (?, ?, ?)",
(deck_id, question, answer),
)
return cursor.lastrowid
except IntegrityError:
return None
def _get_cards_by_deck(deck_id: int) -> list[Row]:
"""Возвращает все карточки заданной колоды."""
with get_connection() as conn:
cursor = conn.execute("SELECT * FROM cards WHERE deck_id = ?", (deck_id,))
return cursor.fetchall()
def _get_card_by_id(card_id) -> Row:
"""Возвращает карточку по её идентификатору"""
with get_connection() as conn:
cursor = conn.execute("SELECT * FROM cards WHERE id = ?", (card_id,))
return cursor.fetchone()
def _update_card(
card_id: int, question: str = None, answer: str = None, deck_id: int = None
):
"""Обновляет данные карточки по её идентификатору."""
try:
with get_connection() as conn:
current = conn.execute(
"SELECT question, answer, deck_id FROM cards WHERE id = ?", (card_id,)
).fetchone()
if not current:
return None
new_question = question if question is not None else current[0]
new_answer = answer if answer is not None else current[1]
new_deck_id = deck_id if deck_id is not None else current[2]
query = """
UPDATE cards
SET question = ?, answer = ?, deck_id = ?
WHERE id = ?
"""
cursor = conn.execute(
query, (new_question, new_answer, new_deck_id, card_id)
)
return cursor.rowcount > 0
except IntegrityError:
print(
f"Ошибка: Не удалось обновить карточку. Колоды с ID {deck_id} не существует"
)
return False
def _delete_card(card_id: int) -> bool:
"""Удаляет карточку по её идентификатору"""
with get_connection() as conn:
cursor = conn.execute("DELETE FROM cards WHERE id = ?", (card_id,))
return cursor.rowcount > 0
def _get_cards_for_review(deck_id: int) -> list[Row]:
"""Возвращает карточки, срок повторения которых наступил или прошёл"""
query = """
SELECT *
FROM cards
WHERE deck_id = ?
AND next_review <= datetime('now')
ORDER BY next_review ASC
"""
with get_connection() as conn:
cursor = conn.execute(query, (deck_id,))
return cursor.fetchall()
def _update_card_sm2(card_id: int, interval: int, repetitions: int, next_review: str):
"""Обновляет SM-2 карточки по её идентификатору."""
with get_connection() as conn:
query = """
UPDATE cards
SET interval = ?, repetitions = ?, next_review = ?
WHERE id = ?
"""
cursor = conn.execute(query, (interval, repetitions, next_review, card_id))
return cursor.rowcount > 0
if __name__ == "__main__":
# Тест на получение всех карточек колоды
cards = _get_cards_by_deck(1)
for c in cards:
print(f"{c['id']} - {c['question']} - {c['answer']}")
# SUCCESS
# Тест на обновление SM-2 данных карточки по её идентификатору
# print(update_card_sm2(1, 2, 3, "2025-10-15 14:30:00"))
# SUCCESS
# Тест на обновление внешни данных карточки по её идентификатору.
# print(update_card(1, question="Произвондая от X", answer="1"))
# SUCCESS
# Тест на создание карточки
# create_card(1, "Вопрос", "Ответ")
# SUCCESS
# Тест на получение карточки по её идентификатору
# card = get_card_by_id(2)
# print(f"{card['id']} - {card['question']} - {card['answer']}")
# SUCCESS
# Тест на получение карточек для повторения
# cards = get_cards_for_review(1)
# for c in cards:
# print(f"{c['id']} - {c['question']} - {c['answer']}")
# SUCCESS
# Тест на удаление карточки
# delete_card(2)
# SUCCESS