From eb568db55547fdfb760d9966e24dd8464b5274e8 Mon Sep 17 00:00:00 2001 From: WorldTeacher <41587052+WorldTeacher@users.noreply.github.com> Date: Tue, 30 Jul 2024 09:42:39 +0200 Subject: [PATCH] database changes --- src/logic/database.py | 77 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/src/logic/database.py b/src/logic/database.py index 0815f0e..0200bdd 100644 --- a/src/logic/database.py +++ b/src/logic/database.py @@ -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()