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
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()