/
dataBaseManager.py
425 lines (360 loc) · 14.6 KB
/
dataBaseManager.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
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
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
"""
Модуль общения с базой данных, непосредственно
направляющий и обрабатывающий запросы к бд
TODO:
[ ] !!! Написать все запросы
[+] !!! Разработать и реализовать интерфейс модуля
"""
import sqlite3
from sqlite3 import Error
import dataBaseReqs as dbr
from models import User, Offer, Assessment
database = None # Используемая база данных
cursor = None # Объект взаимодействия с database
databaseName = 'truejob_database.db'
"""
DataBaseManager Interface
"""
# Общие функции
def connect():
"""
Подключиться к базе данных
return: True, если подключение успешно, False иначе
"""
global database
global cursor
database = sqlite3.connect('truejob_database.db')
cursor = database.cursor()
if database is None or cursor is None:
return False
return True
def closeConnect():
"""
Закрыть соединение с базой данных.
"""
global database
database.close()
def initNewConnect():
"""
Инициировать новую бд и подключиться к ней
return: True, если создание и подключение успешно, False иначе
"""
result = connect()
if result:
cursor.execute(dbr.create_assessments_table)
cursor.execute(dbr.create_liked_offers_table)
cursor.execute(dbr.create_offers_table)
cursor.execute(dbr.create_reports_table)
cursor.execute(dbr.create_users_table)
database.commit()
return True
return False
# Функции связанные с User
def addUser(user: User):
"""
Добавить пользователя в бд
return: True добавление пользователя с новым vkid успешно, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT vkid FROM users WHERE vkid = (?)", (user.vkid, ))
if cursor.fetchone() is None:
cursor.execute("INSERT INTO users VALUES (?, ?, ?, ?, ?, ?)",
(user.vkid, user.type, user.employer_rating,
user.worker_rating, user.status, user.is_blocked))
db.commit()
return True
return False
def updateUser(user: User):
"""
Обновить существующего пользователя в бд
return: True пользователь есть в бд и успешно обновлен, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT vkid FROM users WHERE vkid = (?)", (user.vkid, ))
if cursor.fetchone() is not None:
cursor.execute("UPDATE users SET \
vkid = (?), type = (?), \
employer_rating = (?), worker_rating = (?), \
status = (?), is_blocked = (?) \
WHERE vkid = (?)",
(user.vkid, user.type, user.employer_rating,
user.worker_rating, user.status, user.is_blocked,
user.vkid))
db.commit()
return True
return False
def getUser(vkid: str):
"""
Получить пользователя по vkid
return: User с id == vkid, иначе None
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT * FROM users WHERE vkid = (?)", (vkid, ))
row = cursor.fetchone()
if row is not None:
"""
cursor.description возвращает имена столбцов из последнего запроса.
он возвращает кортеж из 7 значений, где последние 6 = None.
на нулевой позиции лежит название столбца, поэтому его и используем для
формирования словаря.
"""
rowDict = dict(zip([column[0] for column in cursor.description], row))
user = User(**rowDict)
return user
return None
def deleteUser(vkid: str):
"""
Удалить пользователя из бд
return: True, если успешно, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT vkid FROM users WHERE vkid = (?)", (vkid, ))
if cursor.fetchone() is not None:
cursor.execute("DELETE FROM users WHERE vkid = (?)", (vkid, ))
db.commit()
return True
return False
# Функции связанные с Offer
def addOffer(offer: Offer):
"""
Добавить объявление в бд
return: True добавление успешно, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT offer_id FROM offers WHERE offer_id = (?)", (offer.offer_id, ))
if cursor.fetchone() is None:
cursor.execute("INSERT INTO offers VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(offer.offer_id, offer.name, offer.description, offer.price, offer.exp_date,
offer.location, offer.status, offer.owner, offer.priority, offer.time_created,
offer.views_counter, offer.likes_counter))
db.commit()
return True
return False
def updateOffer(offer: Offer):
"""
Обновить существующее объявление в бд
return: True пользователь есть в бд и успешно обновлен, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT offer_id FROM offers WHERE offer_id = (?)", (offer.offer_id, ))
if cursor.fetchone() is not None:
cursor.execute("UPDATE offers SET \
offer_id = (?), name = (?), \
description = (?), price = (?), \
exp_date = (?), location = (?), \
status = (?), owner = (?), \
priority = (?), time_created = (?), \
views_counter = (?), likes_counter = (?) \
WHERE offer_id = (?)",
(offer.offer_id, offer.name, offer.description, offer.price, offer.exp_date,
offer.location, offer.status, offer.owner, offer.priority, offer.time_created,
offer.views_counter, offer.likes_counter, offer.offer_id))
db.commit()
return True
return False
def getOffer(id: int):
"""
Получить объявление по id
return: Offer с offed_id == id, иначе None
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT * FROM offers WHERE offer_id = (?)", (id, ))
row = cursor.fetchone() # создаём строку из таблицы объявлений для удобства проверки
# и последующей конвертации строки в словарь.
if row is not None:
"""
cursor.description возвращает имена столбцов из последнего запроса.
он возвращает кортеж из 7 значений, где последние 6 = None.
на нулевой позиции лежит название столбца, поэтому его и используем для
формирования словаря.
"""
rowDict = dict(zip([column[0] for column in cursor.description], row))
offer = Offer(**rowDict)
return offer
return None
def deleteOffer(id: int):
"""
Удалить объявление из бд
return: True, если успешно, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT offer_id FROM offers WHERE offer_id = (?)", (id, ))
if cursor.fetchone() is not None:
cursor.execute("DELETE FROM offers WHERE offer_id = (?)", (id, ))
db.commit()
return True
return False
def getOffersByUser(vkid: str):
"""
Получить объявления опубликованные пользователм с vkid
return: [Offer, ...] если такие есть, иначе None
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT * FROM offers WHERE owner = (?)", (vkid, ))
rows = cursor.fetchall()
if rows is not None:
list_of_offers = list()
for row in rows:
rowDict = dict(zip([column[0] for column in cursor.description], row))
list_of_offers.append(Offer(**rowDict))
return list_of_offers
return None
def getLikedOffersByUser(vkid: str):
"""
Получить лайкнутые пользователем с vkid объявления
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT offers.* FROM offers, likedOffers \
WHERE likedOffers.vkid = (?) AND likedOffers.offer_id = offers.offer_id",
(vkid, ))
rows = cursor.fetchall()
if rows is not None:
list_of_liked_offers = list()
for row in rows:
rowDict = dict(zip([column[0] for column in cursor.description], row))
list_of_liked_offers.append(Offer(**rowDict))
return list_of_liked_offers
return None
def getAllOffers():
"""
Получить все объявления
return: [Offer, ...] Все объявления, если есть, иначе None
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT * FROM offers")
rows = cursor.fetchall()
if rows is not None:
list_of_offers = list()
for row in rows:
rowDict = dict(zip([column[0] for column in cursor.description], row))
list_of_offers.append(Offer(**rowDict))
return list_of_offers
return None
# Функции связанные с Like & Report & Assessment
def addOfferLike(vkid: str, offer_id: int):
"""
Добвить запись о лайке в таблицу TABLE-3 LikedOffers
return: True, если добавление успешно, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT vkid, offer_id FROM likedOffers \
WHERE vkid = (?) AND offer_id = (?)", (vkid, offer_id))
if cursor.fetchone() is None:
cursor.execute("INSERT INTO likedOffers VALUES (?, ?)", (vkid, offer_id))
db.commit()
return True
return False
def deleteOfferLike(vkid: str, offer_id: int):
"""
Удалить запись о лайке в таблицу TABLE-3 LikedOffers
return: True, если запись была и успешно удалена, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT vkid, offer_id FROM likedOffers \
WHERE vkid = (?) AND offer_id = (?)", (vkid, offer_id))
if cursor.fetchone() is not None:
cursor.execute("DELETE FROM likedOffers \
WHERE vkid = (?), offer_id = (?)", (vkid, offer_id))
db.commit()
return True
return False
def addReport(vkid: str, reported_offer: int):
"""
Добавить запись о репорте в таблицу TABLE-5 Reports
return: True, если добавление успешно, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor = db.cursor()
cursor.execute("SELECT vkid, offer_id FROM reports \
WHERE vkid = (?) AND offer_id = (?)", (vkid, reported_offer))
if cursor.fetchone() is None:
cursor.execute("INSERT INTO reports VALUES (?, ?)", (vkid, reported_offer))
db.commit()
return True
return False
def addAssessment(assessment: Assessment):
"""
Добавить запись об оценке в таблицу TABLE-4 Assessments
return: True, если добавление успешно, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor.execute("SELECT user, assessed_user FROM assessments \
WHERE user = (?) AND assessed_user = (?)", (assessment.user, assessment.assessed_user))
if cursor.fetchone() is None:
cursor.execute("INSERT INTO assessments VALUES (?, ?, ?, ?)",
(assessment.user, assessment.assessed_user,
assessment.assessment_as_worker, assessment.assessment_as_employer))
db.commit()
return True
return False
def getAssessment(vkid: str, assessed_vkid: str):
"""
Получить существующую оценку
return: Assesment, если такая оценка есть, иначе None
"""
with sqlite3.connect(databaseName) as db:
cursor.execute("SELECT * FROM assessments \
WHERE user = (?) AND assessed_user = (?)",
(vkid, assessed_vkid))
row = cursor.fetchone()
if row is not None:
"""
cursor.description возвращает имена столбцов из последнего запроса.
он возвращает кортеж из 7 значений, где последние 6 = None.
на нулевой позиции лежит название столбца, поэтому его и используем для
формирования словаря.
"""
rowDict = dict(zip([column[0] for column in cursor.description], row))
assessment = Assessment(rowDict)
return assessment
return None
def updateAsssessment(assessment: Assessment):
"""
Обновить запись об оценке, если такая есть
return: True, если такая есть и обновление успешно, иначе False
"""
with sqlite3.connect(databaseName) as db:
cursor.execute("SELECT user, assessed_user FROM assessments \
WHERE user = (?) AND assessed_user = (?)",
(assessment.user, assessment.assessed_user))
if cursor.fetchone() is not None:
cursor.execute("UPDATE assessments SET \
user = (?), assessed_user = (?), \
assessment_as_worker = (?), assessment_as_employer = (?) \
WHERE user = (?) AND assessed_user = (?)",
(assessment.user, assessment.assessed_user,
assessment.assessment_as_worker, assessment.assessment_as_employer,
assessment.user, assessment.assessed_user))
db.commit()
return True
return False
def getAllAssessments(assessed_vkid: str):
"""
Получить все оценки оцененного пользователя
return: [Assessment, ...] все оценки, если есть, иначе None
"""
with sqlite3.connect(databaseName) as db:
cursor.execute("SELECT * FROM assessments \
WHERE assessed_user = (?)",
(assessed_vkid, ))
rows = cursor.fetchall()
if rows is not None:
list_of_assessment = list()
for row in rows:
rowDict = dict(zip([column[0] for column in cursor.description], row))
list_of_assessment.append(Assessment(rowDict))
return list_of_assessment
return None