-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathproject_DB.py
More file actions
407 lines (357 loc) Β· 14.8 KB
/
project_DB.py
File metadata and controls
407 lines (357 loc) Β· 14.8 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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
"""
CodeCraft PMS Project
νμΌλͺ
: project_DB.py
λ§μ§λ§ μμ λ μ§ : 2025/04/13
"""
import pymysql
import json
from mysql_connection import db_connect
from project import *
# νλ‘μ νΈ μμ± ν¨μ
# μμ±νλ €λ νλ‘μ νΈμ λ΄μ©κ³Ό νλ‘μ νΈ κ³ μ λ²νΈλ₯Ό λ§€κ° λ³μλ‘ λ°λλ€
def init_project(payload, pid):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
# payload.pperiodμ κ°μ split() λ©μλλ‘ μͺΌκ°κΈ°
total_period = payload.pperiod
p_startD, p_endD = total_period.split('-')
try:
add_project = """
INSERT INTO project(p_no, p_name, p_content, p_method, p_memcount, p_start, p_end, p_wizard, subj_no, dno, f_no)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, (SELECT dno FROM subject WHERE subj_no = %s), %s)
"""
cur.execute(add_project, (pid, payload.pname, payload.pdetails, payload.pmm, payload.psize, p_startD, p_endD, payload.wizard, payload.subject, payload.subject, payload.prof_id))
cur.execute("CALL create_sequence(%s)", (pid,))
connection.commit()
return True
except Exception as e:
connection.rollback()
print(f"Error [init_project] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈ μμ ν¨μ
# μμ νλ €λ νλ‘μ νΈμ λ΄μ©κ³Ό νλ‘μ νΈ κ³ μ λ²νΈλ₯Ό λ§€κ° λ³μλ‘ λ°λλ€ (pidλ payloadμ ν¬ν¨λμ΄ μμ)
def edit_project(payload):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
# payload.pperiodμ κ°μ split() λ©μλλ‘ μͺΌκ°κΈ°
total_period = payload.pperiod
p_startD, p_endD = total_period.split('-')
try:
edit_project = """
UPDATE project
SET p_name = %s,
p_content = %s,
p_method = %s,
p_memcount = %s,
p_start = %s,
p_end = %s,
p_wizard = %s,
subj_no = %s,
dno = %s,
f_no = %s
WHERE p_no = %s
"""
cur.execute(edit_project, (payload.pname, payload.pdetails, payload.pmm, payload.psize, p_startD, p_endD, payload.wizard, payload.subject, 10, payload.prof_id, payload.pid))
connection.commit()
return True
except Exception as e:
connection.rollback()
print(f"Error [edit_project] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈ μ 보 μ‘°ν ν¨μ
# νμμ νλ²μ λ§€κ° λ³μλ‘ λ°μμ ν΄λΉ νμμ΄ μ°Έμ¬νκ³ μλ λͺ¨λ νλ‘μ νΈλ₯Ό μ‘°ννλ€
def fetch_project_info(univ_id):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
fetch_project_info = """
SELECT p.p_no, p.p_name, p.p_content, p.p_method, p.p_memcount, p.p_start, p.p_end, p.p_wizard, f.f_no, f.f_name, s.subj_no, s.subj_name
FROM project p, project_user u, subject s, professor f
WHERE p.p_no = u.p_no AND p.subj_no = s.subj_no AND p.f_no = f.f_no
AND u.s_no = %s
"""
cur.execute(fetch_project_info, (univ_id,))
result = cur.fetchall()
return result
except Exception as e:
print(f"Error [fetch_project_info] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈ μ 보 μ‘°ν ν¨μ (κ΅μ μ μ©)
# κ΅μμ κ΅λ²μ λ§€κ° λ³μλ‘ λ°μμ κ΅μκ° λ΄λΉνκ³ μλ νμμ λͺ¨λ νλ‘μ νΈλ₯Ό μ‘°ννλ€
def fetch_project_info_for_professor(f_no):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
fetch_project_info_for_professor = """
SELECT p.p_no, p.p_name, p.p_content, p.p_method, p.p_memcount, p.p_start, p.p_end, p.p_wizard, f.f_no, f.f_name, s.subj_no, s.subj_name
FROM project p, subject s, professor f
WHERE p.subj_no = s.subj_no AND p.f_no = f.f_no
AND p_no IN (SELECT p_no
FROM project
WHERE f_no = %s)
"""
cur.execute(fetch_project_info_for_professor, (f_no,))
result = cur.fetchall()
return result
except Exception as e:
print(f"Error [fetch_project_info_for_professor] : {e}")
return e
finally:
cur.close()
connection.close()
# νΉμ νλ‘μ νΈμ λ΄λΉ κ΅μμ κ΅λ², κ΅μ μ΄λ¦μ μ‘°ννλ ν¨μ
# νλ‘μ νΈ λ²νΈλ₯Ό λ§€κ° λ³μλ‘ λ°λλ€
def fetch_project_professor_name(pid):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
cur.execute("SELECT f_no, f_name FROM professor WHERE f_no = (SELECT f_no FROM project WHERE p_no = %s)", (pid,))
result = cur.fetchone()
return result
except Exception as e:
print(f"Error [fetch_project_professor_name] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈ μμ ν¨μ
# μμ νλ €λ νλ‘μ νΈμ λ²νΈλ₯Ό λ§€κ° λ³μλ‘ λ°λλ€
def delete_project(pid):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
# λ§€κ° λ³μλ‘ λ°μ pid κ°μ κ°μ§ νλ‘μ νΈκ° μ‘΄μ¬νλμ§ νμΈνκΈ° μν΄ COUNT ν¨μλ₯Ό μ¬μ©
cur.execute("SELECT COUNT(*) AS cnt FROM project WHERE p_no = %s", (pid,))
result = cur.fetchone()
# λ§€κ° λ³μλ‘ λ°μ pid κ°μ κ°μ§ νλ‘μ νΈκ° μ‘΄μ¬νμ§ μμΌλ©΄ μ€λ₯ λ©μμ§ μΆλ ₯ λ° False λ°ν
if result['cnt'] == 0:
print(f"Error [delete_project] : Project UID {pid} does not exist.")
return False
# νλ‘μ νΈ ν
μ΄λΈμμ λ§€κ° λ³μλ‘ λ°μ νλ‘μ νΈ μμ
cur.execute("DELETE FROM project WHERE p_no = %s", (pid,))
connection.commit()
# νλ‘μ νΈκ° μμ λμμΌλ―λ‘, ν΄λΉ νλ‘μ νΈμ μ°Έμ¬νκ³ μμλ λͺ¨λ νμμ μλμΌλ‘ νλ‘μ νΈ μ°Έμ¬ ν΄μ
cur.execute("DELETE FROM project_user WHERE p_no = %s", (pid,))
connection.commit()
return True
except Exception as e:
connection.rollback()
print(f"Error [delete_project] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈ μ°Έμ¬μ μΆκ°(νμ μ΄λ) ν¨μ
# νλ‘μ νΈ λ²νΈ, νλ², PM κΆν μ¬λΆ(0/1), μν μ λ§€κ° λ³μλ‘ λ°λλ€
# μ£Όμμ¬ν : μ΄λνλ €λ μ¬μ©μ(νμ)λ νμκ°μ
μ΄ μ΄λ―Έ μλ£λμ΄ μμ΄μΌ νλ€
def add_project_user(pid, univ_id, permission, role):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
add_project_user = """
INSERT INTO project_user(p_no, s_no, permission, role, comment)
VALUES (%s, %s, %s, %s, NULL)
"""
cur.execute(add_project_user, (pid, univ_id, permission, role))
connection.commit()
return True
except Exception as e:
connection.rollback()
print(f"Error [add_project_user] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈ μ°Έμ¬μ μμ (νμ μ 보 μμ ) ν¨μ
# μμ νλ €λ νμμ νλ², νλ‘μ νΈ λ²νΈ, μν μ λ§€κ° λ³μλ‘ λ°λλ€
def edit_project_user(univ_id, pid, role):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
# νλ‘μ νΈ μ°Έμ¬ ν
μ΄λΈμμ νλ‘μ νΈ λ²νΈμ νλ²μΌλ‘ μμ ν νμμ μ ννκ³ μν μ μμ
cur.execute("UPDATE /*+ INDEX(project_user idx_project_user_pno_sno) */ project_user SET role = %s WHERE p_no = %s AND s_no = %s", (role, pid, univ_id))
connection.commit()
return True
except Exception as e:
connection.rollback()
print(f"Error [edit_project_user] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈ μ°Έμ¬μ μμ (νμ ν΄μΆ) ν¨μ
# νλ‘μ νΈ λ²νΈμ ν΄μΆνλ €λ νμμ νλ²μ λ§€κ° λ³μλ‘ λ°λλ€
def delete_project_user(pid, univ_id):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
cur.execute("SELECT /*+ INDEX(project_user idx_project_user_pno_sno) */ COUNT(*) AS cnt FROM project_user WHERE p_no = %s AND s_no = %s", (pid, univ_id))
result = cur.fetchone()
if result['cnt'] == 0:
print(f"Error [delete_project_user] : Project user {univ_id} does not exist in Project UID {pid}.")
return False
cur.execute("DELETE /*+ INDEX(project_user idx_project_user_pno_sno) */ FROM project_user WHERE p_no = %s AND s_no = %s", (pid, univ_id))
connection.commit()
return True
except Exception as e:
connection.rollback()
print(f"Error [delete_project_user] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈ μ°Έμ¬μ(νμ μ‘°ν) μ‘°ν ν¨μ
# μ‘°ννλ €λ νμμ΄ μν νλ‘μ νΈμ νλ‘μ νΈ λ²νΈλ₯Ό λ§€κ° λ³μλ‘ λ°λλ€
def fetch_project_user(pid):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
cur.execute("""
SELECT pu.*, s.s_name
FROM project_user pu
JOIN student s ON pu.s_no = s.s_no
WHERE pu.p_no = %s
""", (pid,))
result = cur.fetchall()
return result
except Exception as e:
print(f"Error [fetch_project_user] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈλ³λ‘ μ€μ μ°Έμ¬νκ³ μλ νμ μλ₯Ό μ‘°ννλ ν¨μ
# νλ²μ λ§€κ° λ³μλ‘ λ°μμ, νμ¬ μ¬μ©μκ° μ°Έμ¬νκ³ μλ λͺ¨λ νλ‘μ νΈμ λνμ¬ νλ‘μ νΈλ³λ‘ GROUP BY λ° COUNT ν¨μλ₯Ό μ¬μ©νμ¬ νμ μλ₯Ό μ‘°ννλ€
def fetch_project_user_count(univ_id):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
fetch_project_user_count = """
SELECT p_no, COUNT(*) AS count
FROM project_user
WHERE p_no IN (SELECT p_no
FROM project_user
WHERE s_no = %s)
GROUP BY p_no
ORDER BY p_no
"""
cur.execute(fetch_project_user_count, (univ_id,))
result = cur.fetchall()
return result
except Exception as e:
print(f"Error [fetch_project_user_count] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈμ μ€μ μ 보λ₯Ό μμ ν λ μ¬μ©μμ κΆν(PM κΆν)μ νμΈνλ ν¨μ
# νλ‘μ νΈ λ²νΈμ νλ²μ λ§€κ° λ³μλ‘ λ°λλ€
def validate_pm_permission(pid, univ_id):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
cur.execute("SELECT /*+ INDEX(project_user idx_project_user_pno_sno) */ permission FROM project_user WHERE p_no = %s AND s_no = %s", (pid, univ_id))
row = cur.fetchone()
if row['permission'] == 1:
return True
else:
return False
except Exception as e:
print(f"Error [validate_pm_permission] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈ κ³ μ ID(PUID)κ° λ°μ΄ν°λ² μ΄μ€μ μ‘΄μ¬νλμ§ νμΈ
def is_uid_exists(uid):
connection = db_connect()
cur = connection.cursor()
try:
cur.execute("SELECT COUNT(*) AS count FROM project WHERE p_no = %s", (uid))
result = cur.fetchone()
return result[0] > 0
except Exception as e:
print(f"Error [is_uid_exists] : {e}")
return e
finally:
cur.close()
connection.close()
# νλ‘μ νΈ Setup Wizard μλ£ μ¬λΆλ₯Ό True(1)λ‘ μ μ₯νλ ν¨μ
# μμ νλ €λ νλ‘μ νΈμ λ΄μ©κ³Ό νλ‘μ νΈ κ³ μ λ²νΈλ₯Ό λ§€κ° λ³μλ‘ λ°λλ€
def complete_setup_wizard(pid):
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
cur.execute("UPDATE project SET p_wizard = 1 WHERE p_no = %s", (pid,))
connection.commit()
return True
except Exception as e:
connection.rollback()
print(f"Error [complete_setup_wizard] : {e}")
return e
finally:
cur.close()
connection.close()
# LLMμ μ 곡ν νλ‘μ νΈμ λͺ¨λ μ 보λ₯Ό λ°ννλ ν¨μ
# νλ‘μ νΈ λ²νΈλ₯Ό λ§€κ° λ³μλ‘ λ°μμ νλ‘μ νΈμ μ
무, μ§μ²λ, λͺ¨λ μ°μΆλ¬Ό ν
μ΄λΈμ κ°κ° μ‘°ννκ³ JSONμΌλ‘ κ°κ³΅νμ¬ λ°ννλ€
def fetch_project_for_LLM(pid):
connection = db_connect()
cur = connection.cursor()
try:
cur.execute("SELECT p_no, p_name, p_content, p_method, p_memcount, p_start, p_end, s.subj_name FROM project p, subject s WHERE p.subj_no = s.subj_no AND p_no = %s", (pid,))
project = cur.fetchone()
cur.execute("SELECT w_name, w_person, w_start, w_end, w_checked FROM work WHERE p_no = %s", (pid,))
work_list = cur.fetchall()
cur.execute("SELECT group1, group2, group3, work, output_file, manager, ratio, start_date, end_date FROM progress WHERE p_no = %s", (pid,))
progress_list = cur.fetchall()
cur.execute("SELECT * FROM doc_meeting WHERE p_no = %s", (pid,))
meeting_list = cur.fetchall()
cur.execute("SELECT * FROM doc_summary WHERE p_no = %s", (pid,))
summary_list = cur.fetchall()
cur.execute("SELECT * FROM doc_require WHERE p_no = %s", (pid,))
requirement_list = cur.fetchall()
cur.execute("SELECT * FROM doc_test WHERE p_no = %s", (pid,))
test_list = cur.fetchall()
cur.execute("SELECT * FROM doc_report WHERE p_no = %s", (pid,))
report_list = cur.fetchall()
project_data = {
"project": project,
"work_list": work_list,
"progress_list": progress_list,
"meeting_list": meeting_list,
"summary_list": summary_list,
"requirement_list": requirement_list,
"test_list": test_list,
"report_list": report_list
}
return json.dumps(project_data, ensure_ascii=False, default=str)
except Exception as e:
print(f"Error [fetch_project_for_LLM] : {e}")
return e
finally:
cur.close()
connection.close()
# νμ¬ λ μ§ κΈ°μ€μΌλ‘ νλ‘μ νΈ μ’
λ£μΌμ΄ μ§λ νλ‘μ νΈμ μ 보λ₯Ό μ‘°ννλ ν¨μ
# λ§€κ° λ³μλ μλ€
def fetch_expired_projects():
connection = db_connect()
cur = connection.cursor(pymysql.cursors.DictCursor)
try:
cur.execute("SELECT * FROM project WHERE p_end < CURDATE()")
result = cur.fetchall()
return result
except Exception as e:
print(f"Error [fetch_expired_projects] : {e}")
return e
finally:
cur.close()
connection.close()