fix error where same prof can't be used twice for apparats

This commit is contained in:
WorldTeacher
2024-09-20 08:28:35 +02:00
parent 84689c70ed
commit 14627cb824
2 changed files with 114 additions and 91 deletions

View File

@@ -27,6 +27,8 @@ from src.logic.constants import SEMAP_MEDIA_ACCOUNTS
from src.logic.dataclass import ApparatData, BookData
from src.logic.log import MyLogger
from src.utils import create_blob, dump_pickle, load_pickle
from src.backend.semester import generateSemesterByDate
from icecream import ic
config = OmegaConf.load("config.yaml")
ascii_lowercase = "abcdefghijklmnopqrstuvwxyz0123456789)"
@@ -63,11 +65,11 @@ class Database:
def checkDatabaseStatus(self):
path = config.database.path
path = path.replace("~", str(Path.home()))
print(path)
# print(path)
path = os.path.abspath(path)
if not os.path.exists(path):
# create path
print(path)
# print(path)
os.makedirs(path)
if self.get_db_contents() == []:
self.logger.log_critical("Database does not exist, creating tables")
@@ -193,11 +195,14 @@ class Database:
# log_message = f"Querying database with query {query}"
self.logger.log_info(log_message)
cursor.execute(query, args)
rv = cursor.fetchall()
conn.commit()
self.close_connection(conn)
try:
cursor.execute(query, args)
rv = cursor.fetchall()
conn.commit()
self.close_connection(conn)
except sql.OperationalError as e:
self.logger.log_error(f"Error in query: {e}")
return None
return (rv[0] if rv else None) if one else rv
# Books
@@ -217,11 +222,12 @@ class Database:
t_query = (
f"SELECT bookdata FROM media WHERE app_id={app_id} AND prof_id={prof_id}"
)
# print(t_query)
self.logger.log_info(t_query)
# # print(t_query)
result = cursor.execute(t_query).fetchall()
result = [load_pickle(i[0]) for i in result]
if bookdata in result:
print("Bookdata already in database")
# print("Bookdata already in database")
# check if the book was deleted in the apparat
query = (
"SELECT deleted FROM media WHERE app_id=? AND prof_id=? AND bookdata=?"
@@ -229,7 +235,7 @@ class Database:
params = (app_id, prof_id, dump_pickle(bookdata))
result = cursor.execute(query, params).fetchone()
if result[0] == 1:
print("Book was deleted, updating bookdata")
# print("Book was deleted, updating bookdata")
query = "UPDATE media SET deleted=0 WHERE app_id=? AND prof_id=? AND bookdata=?"
params = (app_id, prof_id, dump_pickle(bookdata))
cursor.execute(query, params)
@@ -242,6 +248,8 @@ class Database:
converted = dump_pickle(bookdata)
params = (converted, app_id, prof_id, 0)
cursor.execute(query, params)
logMessage = f"Added book with signature {bookdata.signature} to database, data: {converted}"
self.logger.log_info(logMessage)
conn.commit()
self.close_connection(conn)
@@ -406,6 +414,8 @@ class Database:
f"SELECT id,bookdata,available FROM media WHERE (app_id={app_id} AND prof_id={prof_id}) AND (deleted={deleted if deleted == 0 else '1 OR deleted=0'})"
)
ret_result = []
if qdata is None:
return []
for result_a in qdata:
data = {"id": int, "bookdata": BookData, "available": int}
data["id"] = result_a[0]
@@ -422,9 +432,9 @@ class Database:
book_id (str): The id of the book
bookdata (BookData): The new metadata of the book
"""
self.query_db(
"UPDATE media SET bookdata=? WHERE id=?", (dump_pickle(bookdata), book_id)
)
query = "UPDATE media SET bookdata= ? WHERE id=?"
book = dump_pickle(bookdata)
self.query_db(query, (book, book_id))
def deleteBook(self, book_id):
"""
@@ -497,7 +507,7 @@ class Database:
delete=False, dir=tempdir_path, mode="wb", suffix=f".{filetype}"
)
file.write(blob)
print("file created")
# print("file created")
return file.name
def getFiles(self, app_id: Union[str, int], prof_id: int) -> list[tuple]:
@@ -525,7 +535,7 @@ class Database:
return [i[0] for i in data]
def insertSubjects(self):
print("Inserting subjects")
# print("Inserting subjects")
subjects = [
"Biologie",
"Chemie",
@@ -677,42 +687,9 @@ class Database:
)[0]
return f"{title} " if title is not None else ""
def getProfByName(self, prof_name: str) -> tuple:
"""get all the data of a professor based on the name
Args:
prof_name (str): the name of the professor
Returns:
tuple: the data of the professor
"""
return self.query_db(
"SELECT * FROM prof WHERE fullname=?", (prof_name,), one=True
)
def getProfId(self, prof_name: str) -> Optional[int]:
"""Get the id of a professor based on the name
Args:
prof_name (str): the name of the professor
Returns:
Optional[int]: the id of the professor, if the professor is not found, None is returned
"""
# get list of all current profs
profs = self.getProfs()
if profs == []:
return 1
data = self.getProfByName(prof_name.replace(",", ""))
if data is None:
# get last used id and return id + 1
profno = self.query_db("SELECT id FROM prof ORDER BY id DESC", one=True)[0]
return profno + 1
# return None
else:
return data[0]
def getSpecificProfData(self, prof_id: Union[str, int], fields: List[str]) -> tuple:
"""A customisable function to get specific data of a professor based on the id
@@ -746,30 +723,7 @@ class Database:
)
return data
def createProf(self, prof_details: dict):
"""Create a professor in the database
Args:
prof_details (dict): a dictionary containing the details of the professor
"""
prof_title = prof_details["prof_title"]
prof_fname = prof_details["profname"].split(",")[1]
prof_fname = prof_fname.strip()
prof_lname = prof_details["profname"].split(",")[0]
prof_lname = prof_lname.strip()
prof_fullname = prof_details["profname"].replace(",", "")
prof_mail = prof_details["prof_mail"]
prof_tel = prof_details["prof_tel"]
params = (
prof_title,
prof_fname,
prof_lname,
prof_mail,
prof_tel,
prof_fullname,
)
query = "INSERT OR IGNORE INTO prof (titel, fname, lname, mail, telnr, fullname) VALUES (?, ?, ?, ?, ?, ?)"
self.insertInto(query=query, params=params)
def getProfs(self) -> list[tuple]:
"""Return all the professors in the database
@@ -855,7 +809,7 @@ class Database:
if dauerapp:
self.query_db(
"UPDATE semesterapparat SET verlängerung_bis=?, dauerapp=? WHERE appnr=?",
"UPDATE semesterapparat SET verlängerung_bis=?, dauer=? WHERE appnr=?",
(newDate, dauerapp, app_id),
)
else:
@@ -893,15 +847,18 @@ class Database:
Returns:
Optional[int]: the id of the apparat
"""
prof_id = self.getProfId(apparat.profname)
ic(apparat)
prof_id = self.getProfByName(apparat.get_prof_details()["fullname"])
ic(prof_id, apparat.profname)
if prof_id:
prof_id = prof_id[0]
app_id = self.getApparatId(apparat.appname)
if app_id:
return AppPresentError(app_id)
self.createProf(apparat.get_prof_details())
prof_id = self.getProfId(apparat.profname)
# ic(prof_id)
if not prof_id:
prof_id = self.createProf(apparat.get_prof_details())
# self.getProfId(apparat.profname)
ic(prof_id)
query = f"INSERT OR IGNORE INTO semesterapparat (appnr, name, erstellsemester, dauer, prof_id, fach,deletion_status,konto) VALUES ('{apparat.appnr}', '{apparat.appname}', '{apparat.semester}', '{apparat.dauerapp}', {prof_id}, '{apparat.app_fach}', '{0}', '{SEMAP_MEDIA_ACCOUNTS[apparat.appnr]}')"
self.logger.log_info(query)
self.query_db(query)
@@ -1100,6 +1057,7 @@ class Database:
Returns:
list: the result of the query
"""
ic(query)
conn = self.connect()
cursor = conn.cursor()
result = cursor.execute(query).fetchall()
@@ -1116,15 +1074,20 @@ class Database:
return result
if "deletable" in kwargs.keys():
query = f"SELECT * FROM semesterapparat WHERE deletion_status=0 AND dauer=0 AND (erstellsemester!='{kwargs['deletesemester']}' OR verlängerung_bis!='{kwargs['deletesemester']}')"
query = f"""SELECT * FROM semesterapparat
WHERE deletion_status=0 AND dauer=0 AND
(
(erstellsemester!='{kwargs['deletesemester']}' AND verlängerung_bis IS NULL) OR
(erstellsemester!='{kwargs['deletesemester']}' AND verlängerung_bis!='{kwargs['deletesemester']}' AND verlängerung_bis!='{generateSemesterByDate(True)}')
)"""
return __query(query)
if "dauer" in kwargs.keys():
kwargs["dauer"] = kwargs["dauer"].replace("Ja", "1").replace("Nein", "0")
query = "SELECT * FROM semesterapparat WHERE "
for key, value in kwargs.items() if kwargs.items() is not None else {}:
print(key, value)
# print(key, value)
query += f"{key}='{value}' AND "
print(query)
# print(query)
# remove deletesemester part from normal query, as this will be added to the database upon deleting the apparat
if "deletesemester" in kwargs.keys():
query = query.replace(
@@ -1140,7 +1103,7 @@ class Database:
query = query.replace(
f"endsemester='{kwargs['endsemester']}' AND ", "xyz"
)
print("replaced")
# print("replaced")
query = query.replace(
"xyz",
f"(erstellsemester='{kwargs['endsemester']}' OR verlängerung_bis='{kwargs['endsemester']}') AND ",
@@ -1153,9 +1116,9 @@ class Database:
query = query[:-1]
query = query.strip()
print(query)
# print(query)
res = __query(query)
print(res)
# print(res)
return res
# Admin data
@@ -1438,7 +1401,7 @@ class Database:
blob = self.query_db(
"SELECT fileblob FROM elsa_files WHERE filename=?", (filename,), one=True
)[0]
print(blob)
# print(blob)
tempdir = config.database.tempdir
tempdir = tempdir.replace("~", str(Path.home()))
tempdir_path = Path(tempdir)
@@ -1448,7 +1411,7 @@ class Database:
delete=False, dir=tempdir_path, mode="wb", suffix=f".{filetype}"
)
file.write(blob)
print("file created")
# print("file created")
return file.name
def getElsaApparats(self):
@@ -1491,3 +1454,61 @@ class Database:
return self.query_db(
"SELECT filename, filetyp FROM elsa_files WHERE elsa_id=?", (elsa_id,)
)
###
def createProf(self, profdata):
conn = self.connect()
cursor = conn.cursor()
fname = profdata["profname"].split(", ")[1].strip()
lname = profdata["profname"].split(", ")[0].strip()
fullname = f"{lname} {fname}"
mail = profdata["prof_mail"]
telnr = profdata["prof_tel"]
title = profdata["title"]
query = f"INSERT INTO prof (fname, lname, fullname, mail, telnr,titel) VALUES ('{fname}','{lname}','{fullname}','{mail}','{telnr}','{title}')"
self.logger.log_info(query)
cursor.execute(query)
conn.commit()
conn.close()
return self.getProfId(profdata)
def getProfId(self, profdata):
conn = self.connect()
cursor = conn.cursor()
fname = profdata["profname"].split(", ")[1].strip()
lname = profdata["profname"].split(", ")[0].strip()
fullname = f"{lname} {fname}"
query = f"SELECT id FROM prof WHERE fullname = '{fullname}'"
self.logger.log_info(query)
cursor.execute(query)
result = cursor.fetchone()
if result:
return result[0]
else: return None
def getProfByName(self, fullname):
'''Get all Data of the prof based on fullname
Args:
fullname (str): The full name of the prof
'''
conn = self.connect()
cursor = conn.cursor()
query = f"SELECT * FROM prof WHERE fullname = '{fullname}'"
self.logger.log_info(query)
result = cursor.execute(query).fetchone()
if result:
return result
else: return None
def getProfNameByApparat(self, apprarat_id):
query = f"SELECT prof_id from semesterapparat WHERE appnr = '{apprarat_id}'"
data = self.query_db(query)
if data:
return data[0][0]
else: return None

View File

@@ -25,9 +25,11 @@ class ApparatData:
"profname": self.profname,
"prof_mail": self.prof_mail,
"prof_tel": self.prof_tel,
"fullname": self.profname,
"fullname": f"{self.profname.split(',')[0].strip()} {self.profname.split(',')[1].strip()}",
}
def translateToFullname(self):
return f"{self.profname.split(',')[0].strip()} {self.profname.split(',')[1].strip()}"
@dataclass
class BookData: