database changes
This commit is contained in:
@@ -2,9 +2,10 @@ import sqlite3 as sql
|
||||
import os
|
||||
from src import config
|
||||
from pathlib import Path
|
||||
from src.schemas import USERS, MEDIA, LOANS, User, Book
|
||||
from src.utils.stringtodate import stringToDate
|
||||
from src.schemas import USERS, MEDIA, LOANS, User, Book, Loan
|
||||
from src.utils import stringToDate, Log
|
||||
|
||||
log = Log("Database")
|
||||
class Database:
|
||||
def __init__(self, db_path: str = None):
|
||||
"""
|
||||
@@ -23,6 +24,7 @@ class Database:
|
||||
self.checkDatabaseStatus()
|
||||
|
||||
def checkDatabaseStatus(self):
|
||||
log.info("Checking Database Status")
|
||||
if self.tableCheck() == []:
|
||||
# self.logger.log_critical("Database does not exist, creating tables")
|
||||
self.createDatabase()
|
||||
@@ -48,17 +50,30 @@ class Database:
|
||||
conn.close()
|
||||
|
||||
def createDatabase(self):
|
||||
print("Creating Database")
|
||||
log.info("Creating Database")
|
||||
# print("Creating Database")
|
||||
if not os.path.exists(config.database.path):
|
||||
os.makedirs(config.database.path)
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(USERS)
|
||||
log.debug("Creating Users Table")
|
||||
cursor.execute(MEDIA)
|
||||
log.debug("Creating Media Table")
|
||||
cursor.execute(LOANS)
|
||||
log.debug("Creating Loans Table")
|
||||
conn.commit()
|
||||
self.close_connection(conn)
|
||||
|
||||
def getLoanCount(self):
|
||||
query = "SELECT COUNT(*) FROM loans"
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(query)
|
||||
result = cursor.fetchone()
|
||||
self.close_connection(conn)
|
||||
return result[0]
|
||||
|
||||
def tableCheck(self):
|
||||
# check if database has tables
|
||||
"""
|
||||
@@ -96,6 +111,7 @@ class Database:
|
||||
return users
|
||||
|
||||
def insertUser(self, username, userno, usermail):
|
||||
log.debug(f"Inserting User {userno}, {username}, {usermail}")
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(
|
||||
@@ -111,8 +127,20 @@ class Database:
|
||||
result = cursor.fetchone()
|
||||
self.close_connection(conn)
|
||||
user = User(id=result[0], username=result[1], email=result[2])
|
||||
log.info(f"Returning User {user}")
|
||||
return user
|
||||
|
||||
def updateUser(self, username, userno, usermail):
|
||||
log.debug(f"Updating User {userno}, {username}, {usermail}")
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(
|
||||
f"UPDATE users SET username = '{username}', usermail = '{usermail}' WHERE id = '{userno}'"
|
||||
)
|
||||
conn.commit()
|
||||
|
||||
self.close_connection(conn)
|
||||
|
||||
def getActiveLoans(self, userid):
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
@@ -124,9 +152,31 @@ class Database:
|
||||
except sql.OperationalError:
|
||||
result = []
|
||||
self.close_connection(conn)
|
||||
log.info(f"Returning Active Loans {result}")
|
||||
return str(len(result))
|
||||
|
||||
def getAllLoans(self):
|
||||
loan_data = []
|
||||
query = "SELECT * FROM loans"
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(query)
|
||||
loans = cursor.fetchall()
|
||||
for loan in loans:
|
||||
l = Loan(
|
||||
loan[0],
|
||||
loan[1],
|
||||
loan[2],
|
||||
stringToDate(loan[3]),
|
||||
stringToDate(loan[4]),
|
||||
loan[5],
|
||||
stringToDate(loan[6]),
|
||||
self.getMedia(loan[2]),
|
||||
)
|
||||
loan_data.append(l)
|
||||
return loan_data
|
||||
def insertLoan(self, userid, mediaid, loandate, duedate):
|
||||
log.debug(f"Inserting Loan {userid}, {mediaid}, {loandate}, {duedate}")
|
||||
query = f"INSERT INTO loans (user_id, media_id, loan_date, return_date) Values ('{userid}', '{mediaid}', '{loandate}', '{duedate}')"
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
@@ -135,22 +185,30 @@ class Database:
|
||||
self.close_connection(conn)
|
||||
|
||||
def insertMedia(self, media):
|
||||
query = f"INSERT OR IGNORE INTO media (ppn, title, signature, isbn) VALUES ('{media.ppn}', '{media.title}', '{media.signature}', '{media.isbn}')" # , '{media.link}'
|
||||
log.debug(f"Inserting Media {media}")
|
||||
query = f"INSERT OR IGNORE INTO media (ppn, title, signature, isbn,link) VALUES ('{media.ppn}', '{media.title}', '{media.signature}', '{media.isbn}','{media.link}')" # , '{media.link}'
|
||||
log.info(f"Query: |{query}|")
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(query)
|
||||
|
||||
conn.commit()
|
||||
|
||||
self.close_connection(conn)
|
||||
return cursor.lastrowid
|
||||
|
||||
def getLoansBy(self, field, value):
|
||||
# query all loans, sort by date descending and return
|
||||
pass
|
||||
def getMediaSimilarSignatureByID(self, media_id) -> list[Book]:
|
||||
log.info(f"Getting Media Similar to {media_id}")
|
||||
query = f"SELECT * FROM media WHERE id = '{media_id}'"
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(query)
|
||||
result = cursor.fetchone()
|
||||
signature = result[1]
|
||||
print(signature)
|
||||
# print(signature)
|
||||
query = f"SELECT * FROM media WHERE signature LIKE '%{signature}%'"
|
||||
cursor.execute(query)
|
||||
result = cursor.fetchall()
|
||||
@@ -167,9 +225,11 @@ class Database:
|
||||
database_id=res[0],
|
||||
)
|
||||
)
|
||||
log.debug(f"Returning Similar Media {data}")
|
||||
return data
|
||||
|
||||
def getMedia(self, media_id):
|
||||
# log.info(f"Getting Media {media_id}")
|
||||
query = f"SELECT * FROM media WHERE id = '{media_id}'"
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
@@ -201,10 +261,11 @@ class Database:
|
||||
book.returned = res[5]
|
||||
book.returned_date = res[6]
|
||||
books.append(book)
|
||||
print(book)
|
||||
log.info(f"Returning All Media entries ({len(books)}) for user {user_id}")
|
||||
return books
|
||||
|
||||
def checkMediaExists(self, media):
|
||||
log.info(f"Checking Media {media}")
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
query = f"SELECT id, signature FROM media WHERE ppn = '{media.ppn}' OR title = '{media.title}' OR isbn = '{media.isbn}' OR signature = '{media.signature}'"
|
||||
@@ -219,6 +280,7 @@ class Database:
|
||||
return False
|
||||
|
||||
def checkLoanState(self, book_id):
|
||||
log.info(f"Checking Loan State for {book_id}")
|
||||
query = f"SELECT * FROM loans WHERE media_id = '{book_id}' AND returned = 0"
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
@@ -228,6 +290,7 @@ class Database:
|
||||
return result
|
||||
|
||||
def returnMedia(self, media_id, returndate):
|
||||
log.info(f"Returning Media {media_id}")
|
||||
query = f"UPDATE loans SET returned = 1, returned_date = '{returndate}' WHERE media_id = '{media_id}' AND returned = 0"
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
@@ -259,6 +322,7 @@ class Database:
|
||||
|
||||
#
|
||||
def selectClosestReturnDate(self, user_id):
|
||||
log.info(f"Selecting Closest Return Date for {user_id}")
|
||||
query = f"SELECT return_date FROM loans WHERE user_id = '{user_id}' AND returned = 0 ORDER BY return_date ASC LIMIT 1"
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
@@ -269,6 +333,7 @@ class Database:
|
||||
return result[0]
|
||||
|
||||
def extendLoanDuration(self, signature, newDate):
|
||||
log.info(f"Extending Loan Duration for {signature} to {newDate}")
|
||||
book_id = self.checkMediaExists(Book(signature=signature))
|
||||
query = f"UPDATE loans SET return_date = '{newDate}' WHERE media_id = '{book_id[0]}' AND returned = 0"
|
||||
conn = self.connect()
|
||||
|
||||
Reference in New Issue
Block a user