-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.py
More file actions
165 lines (149 loc) · 5.76 KB
/
Copy pathdatabase.py
File metadata and controls
165 lines (149 loc) · 5.76 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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# database.py
import sqlite3
DB_FILE = "bugtracker.db"
def get_connection():
conn = sqlite3.connect(DB_FILE)
conn.row_factory = sqlite3.Row # чтобы возвращались словари
return conn
def init_db():
conn = get_connection()
cursor = conn.cursor()
# 1. users — пользователи
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
patronymic VARCHAR(100),
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
# 2. projects — проекты
cursor.execute("""
CREATE TABLE IF NOT EXISTS projects (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(255) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
# 3. issues — задачи/баги
cursor.execute("""
CREATE TABLE IF NOT EXISTS issues (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title VARCHAR(255) NOT NULL,
description TEXT,
status VARCHAR(50) DEFAULT 'open',
priority VARCHAR(50) DEFAULT 'medium',
project_id INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (project_id) REFERENCES projects(id)
)
""")
# 4. teams — команды
cursor.execute("""
CREATE TABLE IF NOT EXISTS teams (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(255) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
# 5. project_members — связь пользователей с проектами
cursor.execute("""
CREATE TABLE IF NOT EXISTS project_members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
project_id INTEGER NOT NULL,
role VARCHAR(50) DEFAULT 'member',
joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (project_id) REFERENCES projects(id),
UNIQUE(user_id, project_id)
)
""")
# 6. team_members — связь пользователей с командами
cursor.execute("""
CREATE TABLE IF NOT EXISTS team_members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
team_id INTEGER NOT NULL,
role VARCHAR(50) DEFAULT 'member',
joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (team_id) REFERENCES teams(id),
UNIQUE(user_id, team_id)
)
""")
# 7. team_projects — связь команд с проектами
cursor.execute("""
CREATE TABLE IF NOT EXISTS team_projects (
id INTEGER PRIMARY KEY AUTOINCREMENT,
team_id INTEGER NOT NULL,
project_id NOT NULL,
assigned_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (team_id) REFERENCES teams(id),
FOREIGN KEY (project_id) REFERENCES projects(id),
UNIQUE(team_id, project_id)
)
""")
# 8. comments — комментарии к задачам
cursor.execute("""
CREATE TABLE IF NOT EXISTS comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text TEXT NOT NULL,
issue_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (issue_id) REFERENCES issues(id),
FOREIGN KEY (user_id) REFERENCES users(id)
)
""")
conn.commit()
conn.close()
print("База данных создана/обновлена: 8 таблиц готово!")
def add_user(first_name: str, last_name: str, patronymic: str = '', email: str = '', password: str = '') -> int:
"""Добавляет пользователя. Возвращает ID."""
conn = get_connection()
cursor = conn.cursor()
cursor.execute(
"INSERT INTO users (first_name, last_name, patronymic, email, password_hash) VALUES (?, ?, ?, ?, ?)",
(first_name, last_name, patronymic, email, password)
)
conn.commit()
user_id = cursor.lastrowid
conn.close()
return user_id
def get_all_users() -> list:
"""Возвращает всех пользователей."""
conn = get_connection()
cursor = conn.cursor()
cursor.execute("SELECT id, first_name, last_name, patronymic, email, created_at FROM users ORDER BY id")
rows = cursor.fetchall()
conn.close()
return [dict(row) for row in rows]
def get_user_by_email(email: str):
"""Ищет пользователя по email. Возвращает dict или None."""
conn = get_connection()
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE email = ?", (email,))
row = cursor.fetchone()
conn.close()
return dict(row) if row else None
def delete_user(user_id: int) -> bool:
"""Удаляет пользователя по ID. Возвращает True, если удалён."""
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute("DELETE FROM users WHERE id = ?", (user_id,))
conn.commit()
if cursor.rowcount == 0:
return False
return True
except Exception as e:
print(f"Ошибка удаления: {e}")
return False
finally:
conn.close()