database changes

This commit is contained in:
WorldTeacher
2024-07-30 09:42:39 +02:00
parent e3d8403b7f
commit eb568db555

View File

@@ -2,9 +2,10 @@ import sqlite3 as sql
import os import os
from src import config from src import config
from pathlib import Path from pathlib import Path
from src.schemas import USERS, MEDIA, LOANS, User, Book from src.schemas import USERS, MEDIA, LOANS, User, Book, Loan
from src.utils.stringtodate import stringToDate from src.utils import stringToDate, Log
log = Log("Database")
class Database: class Database:
def __init__(self, db_path: str = None): def __init__(self, db_path: str = None):
""" """
@@ -23,6 +24,7 @@ class Database:
self.checkDatabaseStatus() self.checkDatabaseStatus()
def checkDatabaseStatus(self): def checkDatabaseStatus(self):
log.info("Checking Database Status")
if self.tableCheck() == []: if self.tableCheck() == []:
# self.logger.log_critical("Database does not exist, creating tables") # self.logger.log_critical("Database does not exist, creating tables")
self.createDatabase() self.createDatabase()
@@ -48,17 +50,30 @@ class Database:
conn.close() conn.close()
def createDatabase(self): def createDatabase(self):
print("Creating Database") log.info("Creating Database")
# print("Creating Database")
if not os.path.exists(config.database.path): if not os.path.exists(config.database.path):
os.makedirs(config.database.path) os.makedirs(config.database.path)
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute(USERS) cursor.execute(USERS)
log.debug("Creating Users Table")
cursor.execute(MEDIA) cursor.execute(MEDIA)
log.debug("Creating Media Table")
cursor.execute(LOANS) cursor.execute(LOANS)
log.debug("Creating Loans Table")
conn.commit() conn.commit()
self.close_connection(conn) 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): def tableCheck(self):
# check if database has tables # check if database has tables
""" """
@@ -96,6 +111,7 @@ class Database:
return users return users
def insertUser(self, username, userno, usermail): def insertUser(self, username, userno, usermail):
log.debug(f"Inserting User {userno}, {username}, {usermail}")
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute( cursor.execute(
@@ -111,8 +127,20 @@ class Database:
result = cursor.fetchone() result = cursor.fetchone()
self.close_connection(conn) self.close_connection(conn)
user = User(id=result[0], username=result[1], email=result[2]) user = User(id=result[0], username=result[1], email=result[2])
log.info(f"Returning User {user}")
return 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): def getActiveLoans(self, userid):
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
@@ -124,9 +152,31 @@ class Database:
except sql.OperationalError: except sql.OperationalError:
result = [] result = []
self.close_connection(conn) self.close_connection(conn)
log.info(f"Returning Active Loans {result}")
return str(len(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): 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}')" query = f"INSERT INTO loans (user_id, media_id, loan_date, return_date) Values ('{userid}', '{mediaid}', '{loandate}', '{duedate}')"
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
@@ -135,22 +185,30 @@ class Database:
self.close_connection(conn) self.close_connection(conn)
def insertMedia(self, media): 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() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute(query) cursor.execute(query)
conn.commit() conn.commit()
self.close_connection(conn) self.close_connection(conn)
return cursor.lastrowid 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]: 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}'" query = f"SELECT * FROM media WHERE id = '{media_id}'"
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute(query) cursor.execute(query)
result = cursor.fetchone() result = cursor.fetchone()
signature = result[1] signature = result[1]
print(signature) # print(signature)
query = f"SELECT * FROM media WHERE signature LIKE '%{signature}%'" query = f"SELECT * FROM media WHERE signature LIKE '%{signature}%'"
cursor.execute(query) cursor.execute(query)
result = cursor.fetchall() result = cursor.fetchall()
@@ -167,9 +225,11 @@ class Database:
database_id=res[0], database_id=res[0],
) )
) )
log.debug(f"Returning Similar Media {data}")
return data return data
def getMedia(self, media_id): def getMedia(self, media_id):
# log.info(f"Getting Media {media_id}")
query = f"SELECT * FROM media WHERE id = '{media_id}'" query = f"SELECT * FROM media WHERE id = '{media_id}'"
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
@@ -201,10 +261,11 @@ class Database:
book.returned = res[5] book.returned = res[5]
book.returned_date = res[6] book.returned_date = res[6]
books.append(book) books.append(book)
print(book) log.info(f"Returning All Media entries ({len(books)}) for user {user_id}")
return books return books
def checkMediaExists(self, media): def checkMediaExists(self, media):
log.info(f"Checking Media {media}")
conn = self.connect() conn = self.connect()
cursor = conn.cursor() 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}'" 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 return False
def checkLoanState(self, book_id): 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" query = f"SELECT * FROM loans WHERE media_id = '{book_id}' AND returned = 0"
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
@@ -228,6 +290,7 @@ class Database:
return result return result
def returnMedia(self, media_id, returndate): 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" query = f"UPDATE loans SET returned = 1, returned_date = '{returndate}' WHERE media_id = '{media_id}' AND returned = 0"
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
@@ -259,6 +322,7 @@ class Database:
# #
def selectClosestReturnDate(self, user_id): 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" 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() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
@@ -269,6 +333,7 @@ class Database:
return result[0] return result[0]
def extendLoanDuration(self, signature, newDate): def extendLoanDuration(self, signature, newDate):
log.info(f"Extending Loan Duration for {signature} to {newDate}")
book_id = self.checkMediaExists(Book(signature=signature)) book_id = self.checkMediaExists(Book(signature=signature))
query = f"UPDATE loans SET return_date = '{newDate}' WHERE media_id = '{book_id[0]}' AND returned = 0" query = f"UPDATE loans SET return_date = '{newDate}' WHERE media_id = '{book_id[0]}' AND returned = 0"
conn = self.connect() conn = self.connect()