diff --git a/.trunk/configs/ruff.toml b/.trunk/configs/ruff.toml index 6b2283a..2bac1c8 100644 --- a/.trunk/configs/ruff.toml +++ b/.trunk/configs/ruff.toml @@ -3,3 +3,20 @@ select = ["B", "D3", "D4", "E", "F"] # Never enforce `E501` (line length violations). This should be handled by formatters. ignore = ["E501","F401"] +exclude = [ + ".trunk", + ".git", + ".github", + "build", + "dist", + "docs", + "examples", + "tests", + ".history", + ".vscode", + "venv", + ".venv", + "__pycache__", +] +line-length = 88 +indent-width = 4 diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index b9446a7..d0c9a1e 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -25,6 +25,7 @@ lint: - trivy - trufflehog enabled: + - osv-scanner@1.6.1 - sql-formatter@15.1.2 - sqlfluff@2.3.5 - isort@5.13.2 diff --git a/__main__.py b/__main__.py new file mode 100644 index 0000000..e69de29 diff --git a/database_testing.py b/database_testing.py new file mode 100644 index 0000000..b02ec3a --- /dev/null +++ b/database_testing.py @@ -0,0 +1,19 @@ +from src.backend.database import Database +from src.logic.dataclass import ApparatData + +apparat = ApparatData() +apparat.appname = "testapparat123" +apparat.appnr = 155 +apparat.dauerapp = True +apparat.profname = "Mustermanns, Max" +apparat.subject = "Physik" +apparat.semester = "SoSe 2021" + + +files = {"name": "test.png", "type": "png", + "path": r"C:\Users\aky547\Desktop\test.png"} +db = Database() +# print(db.recreate_file("testfile.pdf",files,3)) +# db.insert_file(files,3) +# recreate_file("test.pdf",files,1))#insert_file(files,1)) +db.get_apparats_name(70) \ No newline at end of file diff --git a/db_testing.py b/db_testing.py new file mode 100644 index 0000000..627e487 --- /dev/null +++ b/db_testing.py @@ -0,0 +1,46 @@ +from omegaconf import OmegaConf + +from codebase import Database +from codebase.pickles import load_pickle, make_pickle +from webrequest import BibTextTransformer, WebRequest + +config = OmegaConf.load("config.yaml") +db = Database() +# # # f = db.get_media(1, 1) +# # # dataclass_objects = [] + +# # # for dataclass_str in f: +# # # print(f"dataclass {dataclass_str}") +# # # # dataclass_obj = ast.literal_eval(dataclass_str[0]) +# # # dataclass_objects.append(dataclass_str) + +# # # cla = BookData().from_string(dataclass_objects[0]) +# # # print(type(cla)) +# # book = ( +# # BibTextTransformer("ARRAY") +# # .get_data(WebRequest().get_ppn("ST 250 U42 (15)").get_data()) +# # .return_data() +# # ) +# # print(book) + +# # bpickle = make_pickle(book) +# # print(bpickle) + +# # print(load_pickle(bpickle)) + + +# # # print(pickle.dumps(book), type(pickle.dumps(book))) + +# # # db.add_medium(book, "2", "1") +# # # db.get_app_data("1", "Testapparat") + +# # books = db.get_media(1, 1, 0) + +# # print(len(books)) +# book = db.get_specific_book(16) + +# print(book) + + +if __name__ == "__main__": + print(db.get_media(15, 2)) diff --git a/log.py b/log.py new file mode 100644 index 0000000..c8051a9 --- /dev/null +++ b/log.py @@ -0,0 +1,65 @@ +import logging +import os + +if not os.path.exists("logs"): + os.mkdir("logs") +with open("logs/application.log", "w") as f: + pass + +# Create a common file handler for all loggers +common_file_handler = logging.FileHandler("logs/application.log") +common_file_handler.setLevel(logging.DEBUG) +formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") +common_file_handler.setFormatter(formatter) + + +class MyLogger: + def __init__(self, logger_name): + self.logger = logging.getLogger(logger_name) + self.logger.setLevel(logging.DEBUG) + self.logger.addHandler(common_file_handler) + self.encoding = "utf-8" + + def log_info(self, message: str): + # ensure that the message is encoded in utf-8 + self.logger.info(message.encode(self.encoding)) + + def log_debug(self, message: str): + self.logger.debug(message.encode(self.encoding)) + + def log_warning(self, message: str): + self.logger.warning(message.encode(self.encoding)) + + def log_error(self, message: str): + self.logger.error(message.encode(self.encoding)) + + def log_critical(self, message: str): + self.logger.critical(message.encode(self.encoding)) + + def log_exception(self, message: str): + self.logger.exception(message) + + +# Usage example: +if __name__ == "__main__": + logger1 = MyLogger("Logger1") + logger2 = MyLogger("Logger2") + + logger1.log_info("This is an info message from Logger1") + logger1.log_debug("This is a debug message from Logger1") + logger1.log_warning("This is a warning message from Logger1") + logger1.log_error("This is an error message from Logger1") + logger1.log_critical("This is a critical message from Logger1") + + logger2.log_info("This is an info message from Logger2") + logger2.log_debug("This is a debug message from Logger2") + logger2.log_warning("This is a warning message from Logger2") + logger2.log_error("This is an error message from Logger2") + logger2.log_critical("This is a critical message from Logger2") + + try: + # Simulate an exception + raise Exception("An exception occurred") + except Exception as e: + logger1.log_exception("An exception occurred in Logger1") + logger2.log_exception("An exception occurred in Logger2") diff --git a/sap.db b/sap.db new file mode 100644 index 0000000..54d1ca2 Binary files /dev/null and b/sap.db differ diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/__init__.py b/src/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/admin_console.py b/src/backend/admin_console.py new file mode 100644 index 0000000..379103f --- /dev/null +++ b/src/backend/admin_console.py @@ -0,0 +1,52 @@ +import hashlib +import random + +from src.backend.database import Database + + +# change passwords for apparats, change passwords for users, list users, create and delete users etc +# create a class that has all commands. for each command, create a function that does the thing +class AdminCommands: + def __init__(self): + self.db = Database() + + def create_password(self, password): + salt = self.create_salt() + hashed_password = self.hash_password(password) + return (hashed_password,salt) + def create_salt(self): + return "".join( + random.choices( + "abcdefghijklmnopqrstuvwxyzQWERTZUIOPLKJHGFDSAYXCVBNM0123456789", k=16 + ) + ) + + def create_admin(self): + salt = self.create_salt() + hashed_password = self.hash_password("admin") + self.db.create_user("admin", salt+hashed_password, "admin", salt) + + def hash_password(self, password): + hashed = hashlib.sha256((password).encode("utf-8")).hexdigest() + return hashed + + def list_users(self): + return self.db.get_users() + + def delete_user(self, username): + self.db.delete_user(username) + + def change_password(self, username, password): + hashed_password = self.hash_password(password) + self.db.change_password(username, hashed_password) + + +if __name__ == "__main__": + c = AdminCommands() + c.create_user("test", "test", "user") + c.create_user("admin", "admin", "admin") + print(c.list_users()) + c.delete_user("test") + print(c.list_users()) + c.change_password("admin", "nopass") + print(c.list_users()) diff --git a/src/backend/database.py b/src/backend/database.py new file mode 100644 index 0000000..21bea2b --- /dev/null +++ b/src/backend/database.py @@ -0,0 +1,748 @@ +import datetime +import os +import re +import shutil +import sqlite3 as sql3 +import tempfile +from typing import Any + +from omegaconf import OmegaConf + +from src.backend.db import main as template +# from src.data import pickles +import pickle +from src.logic.constants import SEMAP_MEDIA_ACCOUNTS +from src.logic.dataclass import ApparatData, BookData +from log import MyLogger +from icecream import ic +config = OmegaConf.load("config.yaml") + +logger = MyLogger("Database") + + +class Database: + logger.log_info("Database imported") + + def __init__(self) -> None: + # TODO: change path later on to a variable based on the settings + self.database_path = f"{config.database.path}{config.database.name}" + ic(self.database_path) + # self.database_path = "sap.db" + logger.log_info("Connecting to database") + self.database = sql3.connect(self.database_path) + self.cur = self.database.cursor() + + pass + def create_database(self): + #create database from template + template(self.database_path) + subjects = config.subjects + for subject in subjects: + self.cur.execute(f"INSERT INTO subjects (name) VALUES ('{subject}')") + self.database.commit() + + def create_blob(self, file): + with open(file, "rb") as f: + blob = f.read() + return blob + + def recreate_file(self, filename, app_id: int): + blob = self.get_blob(filename, app_id) + # write the blob to the file and save it to a preset destination + # with open(filename, "wb") as f: + # f.write(blob) + #use tempfile to create a temporary file + if not os.path.exists(config.database.tempdir): + os.mkdir(config.database.tempdir) + tempfile.NamedTemporaryFile(filename=filename,delete=False,dir=config.database.tempdir,mode="wb").write(blob) + + # user = os.getlogin() + # home = os.path.expanduser("~") + + # # check if the folder exists, if not, create it + # if not os.path.exists(f"{home}/Desktop/SemApp/{user}"): + # os.mkdir(f"{home}/Desktop/SemApp/{user}") + # shutil.move(filename, f"{home}/Desktop/SemApp/{user}") + + def get_blob(self, filename: str, app_id: int): + query = f"SELECT fileblob FROM files WHERE filename='{filename}' AND app_id={app_id}" + logger.log_info(f"Retrieving blob for {filename}, Appid {app_id} from database") + result = self.cur.execute(query).fetchone() + return result[0] + + def get_kto_no(self, app_id: int): + query = f"SELECT konto FROM semesterapparat WHERE id={app_id}" + result = self.cur.execute(query).fetchone() + return result[0] + + def insert_file(self, file: list[dict], app_id: int, prof_id): + for f in file: + filename = f["name"] + path = f["path"] + filetyp = f["type"] + print(f"filename: {filename}, path: {path}, filetyp: {filetyp}") + if path == "Database": + continue + blob = self.create_blob(path) + + query = "INSERT OR IGNORE INTO files (filename, fileblob, app_id, filetyp,prof_id) VALUES (?, ?, ?, ?,?)" + params = (filename, blob, app_id, filetyp, prof_id) + self.cur.execute(query, params) + logger.log_info( + f"Inserted {len(file)} file(s) of Apparat {app_id} into database" + ) + self.database.commit() + + def get_files(self, app_id: int, prof_id: int): + query = f"SELECT filename, filetyp FROM files WHERE app_id={app_id} AND prof_id={prof_id}" + result: list[tuple] = self.cur.execute(query).fetchall() + return result + + def get_prof_name_by_id(self, id, add_title: bool = False): + if add_title is True: + query = f"SELECT titel, fname, lname FROM prof WHERE id={id}" + result = self.cur.execute(query).fetchone() + name = " ".join(result[0:3]) + return name + else: + query = f"SELECT fullname FROM prof WHERE id={id}" + print(query) + result = self.cur.execute(query).fetchone() + name = result[0] + return name + + def get_prof_id(self, profname: str): + query = f"SELECT id FROM prof WHERE fullname='{profname.replace(',', '')}'" + result = self.cur.execute(query).fetchone() + if result is None: + return None + return self.cur.execute(query).fetchone()[0] + + def get_app_id(self, appname: str): + query = f"SELECT id FROM semesterapparat WHERE name='{appname}'" + result = self.cur.execute(query).fetchone() + if result is None: + return None + return self.cur.execute(query).fetchone()[0] + + def get_profs(self): + query = "select * from prof" + return self.cur.execute(query).fetchall() + + def app_exists(self, appnr: str) -> bool: + query = f"SELECT appnr FROM semesterapparat WHERE appnr='{appnr}'" + result = self.cur.execute(query).fetchone() + if result is None: + return False + return True + + def get_prof_data(self, profname: str = None, id: int = None) -> dict[str, str]: + if profname is not None: + profname = profname.replace(",", "") + profname = re.sub(r"\s+", " ", profname).strip() + if id: + query = "Select prof_id FROM semesterapparat WHERE appnr=?" + params = (id,) + result = self.cur.execute(query, params).fetchone() + id = result[0] + query = ( + f"SELECT * FROM prof WHERE fullname='{profname}'" + if id is None + else f"SELECT * FROM prof WHERE id={id}" + ) + result = self.cur.execute(query).fetchone() + return_data = { + "prof_title": result[1], + "profname": f"{result[3], result[2]}", + "prof_mail": result[5], + "prof_tel": result[6], + "id": result[0], + } + print(return_data) + # select the entry that contains the first name + return return_data + + def set_new_sem_date(self, appnr, new_sem_date, dauerapp=False): + # Todo: use extend_semester in new release + date = datetime.datetime.now().strftime("%Y-%m-%d") + + query = f"UPDATE semesterapparat SET verlängert_am='{date}', verlängerung_bis='{new_sem_date}' WHERE appnr='{appnr}'" + if dauerapp is not False: + query = f"UPDATE semesterapparat SET verlängert_am='{date}', verlängerung_bis='{new_sem_date}', dauerapp='{dauerapp} WHERE appnr='{appnr}'" + self.cur.execute(query) + + self.database.commit() + + def create_apparat(self, ApparatData: ApparatData): + prof_id = self.get_prof_id(ApparatData.profname) + app_id = self.get_app_id(ApparatData.appname) + if app_id is None: + if prof_id is None: + self.create_prof(ApparatData.get_prof_details()) + prof_id = self.get_prof_id(ApparatData.profname) + + query = f"INSERT OR IGNORE INTO semesterapparat (appnr, name, erstellsemester, dauer, prof_id, fach,deletion_status,konto) VALUES ('{ApparatData.appnr}', '{ApparatData.appname}', '{ApparatData.semester}', '{ApparatData.dauerapp}', {prof_id}, '{ApparatData.app_fach}', '{ApparatData.deleted}', '{SEMAP_MEDIA_ACCOUNTS[ApparatData.appnr]}')" + print(query) + self.cur.execute(query) + self.database.commit() + logger.log_info(f"Created new apparat {ApparatData.appname}") + app_id = self.get_app_id(ApparatData.appname) + # if ApparatData.media_list is not None: #! Deprecated + # for media in ApparatData.media_list: + # self.insert_file(media, app_id) + # self.database.commit() + return app_id + + def create_prof(self, prof_details: dict): + 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"] + + query = f'INSERT OR IGNORE INTO prof (titel, fname, lname, fullname, mail, telnr) VALUES ("{prof_title}", "{prof_fname}", "{prof_lname}", "{prof_fullname}", "{prof_mail}", "{prof_tel}")' + self.cur.execute(query) + self.database.commit() + pass + + def get_apparat_nrs(self) -> list: + try: + self.cur.execute( + "SELECT appnr FROM semesterapparat Where deletion_status=0" + ) + except sql3.OperationalError: + return [] + return [i[0] for i in self.cur.fetchall()] + + def get_all_apparts(self, deleted=0): + + self.cur.execute( + f"SELECT * FROM semesterapparat WHERE deletion_status={deleted}" + ) + return self.cur.fetchall() + + # + def get_app_data(self, appnr, appname) -> ApparatData: + result = self.cur.execute( + f"SELECT * FROM semesterapparat WHERE appnr='{appnr}' AND name='{appname}'" + ).fetchone() + print(f"result: {result}") + # app_id=result[0] + data = ApparatData() + data.appnr = appnr + data.app_fach = result[3] + data.appname = result[1] + profname = self.get_prof_name_by_id(result[2]) + # set profname to lastname, firstname + profname = f"{profname.split(' ')[0]}, {profname.split(' ')[1]}" + data.profname = profname + prof_data = self.get_prof_data(data.profname) + data.prof_mail = prof_data["prof_mail"] + data.prof_tel = prof_data["prof_tel"] + data.prof_title = prof_data["prof_title"] + data.erstellsemester = result[5] + data.semester = result[8] + data.deleted = result[9] + data.apparat_adis_id = result[12] + data.prof_adis_id = None + + print(data) + # data.media_list=self.get_media(app_id) + + return data + + def add_medium(self, bookdata: BookData, app_id: str, prof_id: str, *args): + # insert the bookdata into the media table + # try to retrieve the bookdata from the media table, check if the to be inserted bookdata is already in the table for the corresponding apparat + # if yes, do not insert the bookdata + # if no, insert the bookdata + t_query = ( + f"SELECT bookdata FROM media WHERE app_id={app_id} AND prof_id={prof_id}" + ) + # print(t_query) + result = self.cur.execute(t_query).fetchall() + result = [pickle.loads(i[0]) for i in result] + if bookdata in result: + 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=?" + ) + params = (app_id, prof_id, pickle.dumps(bookdata)) + result = self.cur.execute(query, params).fetchone() + if result[0] == 1: + 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, pickle.dumps(bookdata)) + self.cur.execute(query, params) + self.database.commit() + return + + query = ( + "INSERT INTO media (bookdata, app_id, prof_id,deleted) VALUES (?, ?, ?,?)" + ) + converted = pickle.dumps(bookdata) + params = (converted, app_id, prof_id, 0) + self.cur.execute(query, params) + self.database.commit() + + def request_medium(self, app_id, prof_id, signature) -> int: + query = "SELECT bookdata, id FROM media WHERE app_id=? AND prof_id=?" + params = (app_id, prof_id) + result = self.cur.execute(query, params).fetchall() + books = [(i[1], pickle.loads(i[0])) for i in result] + print(books) + book = [i[0] for i in books if i[1].signature == signature] + return book[0] + + def add_message(self, message: dict, user, appnr): + def __get_user_id(user): + query = "SELECT id FROM user WHERE username=?" + params = (user,) + result = self.cur.execute(query, params).fetchone() + return result[0] + + user_id = __get_user_id(user) + query = "INSERT INTO messages (message, user_id, remind_at) VALUES (?, ?, ?)" + params = (message["message"], user_id, message["remind_at"]) + self.cur.execute(query, params) + self.database.commit() + + def get_messages(self, date: str): + def __get_user_name(id): + query = "SELECT username FROM user WHERE id=?" + params = (id,) + result = self.cur.execute(query, params).fetchone() + return result[0] + + query = f"SELECT * FROM messages WHERE remind_at='{date}'" + result = self.cur.execute(query).fetchall() + ret = [ + { + "message": i[2], + "user": __get_user_name(i[4]), + "apparatnr": i[5], + "id": i[0], + } + for i in result + ] + return ret + + def get_apparat_id(self, appname): + query = f"SELECT appnr FROM semesterapparat WHERE name='{appname}'" + result = self.cur.execute(query).fetchone() + return result[0] + + + def get_apparats_by_semester(self, semester: str): + query = f"SELECT * FROM semesterapparat WHERE erstellsemester='{semester}'" + result = self.cur.execute(query).fetchall() + return result + + def get_semester(self) -> list[str]: + query = "SELECT DISTINCT erstellsemester FROM semesterapparat" + result = self.cur.execute(query).fetchall() + return [i for i in result] + + def is_eternal(self, id): + query = f"SELECT dauer FROM semesterapparat WHERE id={id}" + result = self.cur.execute(query).fetchone() + return result[0] + + def statistic_request(self, **kwargs: Any): + def __query(query): + result = self.cur.execute(query).fetchall() + for result_a in result: + orig_value = result_a + prof_name = self.get_prof_name_by_id(result_a[2]) + # replace the prof_id with the prof_name + result_a = list(result_a) + result_a[2] = prof_name + result_a = tuple(result_a) + result[result.index(orig_value)] = result_a + + 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']}')" + 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) + query += f"{key}='{value}' AND " + 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( + f"deletesemester='{kwargs['deletesemester']}' AND ", "" + ) + if "endsemester" in kwargs.keys(): + if "erstellsemester" in kwargs.keys(): + query = query.replace(f"endsemester='{kwargs['endsemester']}' AND ", "") + query = query.replace( + f"erstellsemester='{kwargs['erstellsemester']} AND ", "xyz" + ) + else: + query = query.replace( + f"endsemester='{kwargs['endsemester']}' AND ", "xyz" + ) + print("replaced") + query = query.replace( + "xyz", + f"(erstellsemester='{kwargs['endsemester']}' OR verlängerung_bis='{kwargs['endsemester']}') AND ", + ) + #remove all x="" parts from the query where x is a key in kwargs + + query = query[:-5] + print(query) + return __query(query) + + def get_app_count_by_semester(self) -> tuple[list[str], list[int]]: + """get the apparats created and deleted in the distinct semesters""" + + # get unique semesters + query = "SELECT DISTINCT erstellsemester FROM semesterapparat" + result = self.cur.execute(query).fetchall() + semesters = [i[0] for i in result] + created = [] + deleted = [] + for semester in semesters: + query = f"SELECT COUNT(*) FROM semesterapparat WHERE erstellsemester='{semester}'" + result = self.cur.execute(query).fetchone() + created.append(result[0]) + query = f"SELECT COUNT(*) FROM semesterapparat WHERE deletion_status=1 AND deleted_date='{semester}'" + result = self.cur.execute(query).fetchone() + deleted.append(result[0]) + # store data in a tuple + ret = [] + e_tuple = () + for sem in semesters: + e_tuple = ( + sem, + created[semesters.index(sem)], + deleted[semesters.index(sem)], + ) + ret.append(e_tuple) + return ret + # get the count of apparats created in the semesters + + def apparats_by_semester(self, semester: str): + """Get a list of all created and deleted apparats in the given semester""" + # get a list of apparats created and in the given semester + query = f"SELECT name,prof_id FROM semesterapparat WHERE erstellsemester='{semester}'" + result = self.cur.execute(query).fetchall() + c_tmp = [] + for i in result: + c_tmp.append((i[0], self.get_prof_name_by_id(i[1]))) + query = ( + f"SELECT name,prof_id FROM semesterapparat WHERE deleted_date='{semester}'" + ) + result = self.cur.execute(query).fetchall() + d_tmp = [] + for i in result: + d_tmp.append((i[0], self.get_prof_name_by_id(i[1]))) + # group the apparats by prof + c_ret = {} + for i in c_tmp: + if i[1] not in c_ret.keys(): + c_ret[i[1]] = [i[0]] + else: + c_ret[i[1]].append(i[0]) + d_ret = {} + for i in d_tmp: + if i[1] not in d_ret.keys(): + d_ret[i[1]] = [i[0]] + else: + d_ret[i[1]].append(i[0]) + return {"created": c_ret, "deleted": d_ret} + + def delete_message(self, message_id): + query = "DELETE FROM messages WHERE id=?" + params = (message_id,) + self.cur.execute(query, params) + self.database.commit() + + def delete_medium(self, title_id): + # delete the bookdata from the media table + query = "UPDATE media SET deleted=1 WHERE id=?" + params = (title_id,) + self.cur.execute(query, params) + self.database.commit() + pass + + def update_bookdata(self, bookdata: BookData, title_id): + query = "UPDATE media SET bookdata=? WHERE id=?" + converted = pickle.dumps(bookdata) + params = (converted, title_id) + self.cur.execute(query, params) + self.database.commit() + + def get_specific_book(self, book_id): + query = "SELECT bookdata FROM media WHERE id=?" + params = (book_id,) + result = self.cur.execute(query, params).fetchone() + return pickle.loads(result[0]) + + def get_media(self, app_id, prof_id, del_state=0) -> list[dict[int, BookData, int]]: + """request media from database and return result as list. + + Args: + ---- + - app_id (int): ID of the apparat + - prof_id (int): ID of the prof + - del_state (int, optional): If deleted books should be requested as well. 1 = yes 0 = no. Defaults to 0. + + Returns: + ------- + - list[dict[int,BookData,int]]: Returns a list of dictionaries containing the bookdata, the id and the availability of the book in the following format: + ------- + {"id": int, + "bookdata": BookData, + "available": int} + """ + query = f"SELECT id,bookdata,available FROM media WHERE (app_id={app_id} AND prof_id={prof_id}) AND (deleted={del_state if del_state == 0 else '1 OR deleted=0'})" + logger.log_info(f"Requesting media from database with query: {query}") + result = self.cur.execute(query).fetchall() + ret_result = [] + for result_a in result: + ic(result_a) + data = {"id": int, "bookdata": BookData, "available": int} + data["id"] = result_a[0] + data["bookdata"] = pickle.loads(result_a[1]) + data["available"] = result_a[2] + ret_result.append(data) + return ret_result + + def get_subjects_and_aliases(self): + query = "SELECT subjects.name, aliases.name FROM subjects LEFT JOIN aliases ON subjects.id = aliases.subject_id" + return self.cur.execute(query).fetchall() + + def get_subjects(self): + query = "SELECT id,name FROM subjects" + return self.cur.execute(query).fetchall() + + def get_aliases(self,subject_id): + query = f"SELECT name FROM aliases WHERE subject_id={subject_id}" + return self.cur.execute(query).fetchall() + + def add_subject(self,subject_name): + query = f"INSERT INTO subjects (name) VALUES ('{subject_name}')" + self.cur.execute(query) + self.database.commit() + + def get_apparats_by_prof(self,prof_id): + query = f"SELECT * FROM semesterapparat WHERE prof_id={prof_id}" + return self.cur.execute(query).fetchall() + def add_alias(self,alias_name,subject): + query = f"SELECT id FROM subjects WHERE name='{subject}'" + subject_id = self.cur.execute(query).fetchone()[0] + query = f"INSERT INTO aliases (name,subject_id) VALUES ('{alias_name}',{subject_id})" + self.cur.execute(query) + self.database.commit() + + def update_apparat(self, apparat_data: ApparatData): + data = apparat_data + query = f"UPDATE semesterapparat SET name = ?, fach = ?, dauer = ?, prof_id = ? WHERE appnr = ?" + params = ( + data.appname, + data.app_fach, + data.dauerapp, + self.get_prof_id(data.profname), + data.appnr, + ) + print(query) + self.cur.execute(query, params) + self.database.commit() + + def delete_apparat(self, appnr: str, semester: str): + # update the deletion status to 1 and the deleted_state to semester for the given apparat + query = f"UPDATE semesterapparat SET deletion_status=1, deleted_date='{semester}' WHERE appnr='{appnr}'" + self.cur.execute(query) + self.database.commit() + + def get_book_id(self, bookdata: BookData, app_id: int, prof_id: int): + query = "SELECT id FROM media WHERE bookdata=? AND app_id=? AND prof_id=?" + params = (pickle.loads(bookdata), app_id, prof_id) + result = self.cur.execute(query, params).fetchone() + return result + + + + def set_availability(self, book_id, available): + query = "UPDATE media SET available=? WHERE id=?" + params = (available, book_id) + self.cur.execute(query, params) + self.database.commit() + + def get_latest_book_id(self): + query = "SELECT id FROM media ORDER BY id DESC LIMIT 1" + result = self.cur.execute(query).fetchone() + return result[0] + + def close(self): + self.database.close() + + def login(self, username, hashed_password) -> bool: + # check if the user and password exist in the database + # if yes, return True + # if no, return False + query = "SELECT salt FROM user WHERE username=?" + params = (username,) + result = self.cur.execute(query, params).fetchone() + + if result is None: + return False + salt = result[0] + print(salt) + query = "SELECT password FROM user WHERE username=?" + params = (str(username),) + result = self.cur.execute(query, params).fetchone() + password = result[0] + if password == f"{salt}{hashed_password}": + return True + else: + return False + + # admin stuff below here + def get_users(self): + query = "SELECT * FROM user" + return self.cur.execute(query).fetchall() + + def get_apparats(self) -> list[tuple]: + query = "SELECT * FROM semesterapparat" + return self.cur.execute(query).fetchall() + + def change_password(self, user, password): + saltq = "SELECT salt FROM user WHERE username=?" + params = (user,) + salt = self.cur.execute(saltq, params).fetchone()[0] + password = f"{salt}{password}" + query = "UPDATE user SET password=? WHERE username=?" + params = (password, user) + self.cur.execute(query, params) + self.database.commit() + + def get_role(self, username): + query = "SELECT role FROM user WHERE username=?" + params = (username,) + result = self.cur.execute(query,params).fetchone() + return result[0] + + def get_roles(self): + query = "SELECT role FROM user" + return self.cur.execute(query).fetchall() + + def create_user(self, username, password, role, salt): + """Create a user based on passed data. + + Args: + ---- + - username (str): Username to be used + - password (str): the salted password + - role (str): Role of the user + - salt (str): a random salt for the user + """ + query = "INSERT OR IGNORE INTO user (username, password, role, salt) VALUES (?, ?, ?, ?)" + params = (username, password, role, salt) + self.cur.execute(query, params) + self.database.commit() + + def delete_user(self, user): + query = "DELETE FROM user WHERE username=?" + params = (user,) + self.cur.execute(query, params) + self.database.commit() + + def get_faculty_members(self,name:str=None): + query = "SELECT titel, fname,lname,mail,telnr,fullname FROM prof" + if name: + query = query.replace(",fullname", "") + query += f" WHERE fullname='{name}'" + return self.cur.execute(query).fetchall() + + def update_faculty_member(self,data,oldlname,oldfname): + placeholders = ', '.join(f"{k} = :{k}" for k in data.keys()) + sql = f"UPDATE prof SET {placeholders} WHERE lname = :oldlname AND fname = :oldfname" + data["oldlname"] = oldlname + data["oldfname"] = oldfname + print(sql, data) + self.cur.execute(sql, data) + self.database.commit() + + def faculty_data(self,name): + query = f"SELECT * FROM prof WHERE fullname='{name}'" + result = self.cur.execute(query).fetchone() + return result + + def update_user(self,username, data:dict[str,str]): + + query = "UPDATE user SET " + for key,value in data.items(): + if key == "username": + continue + query += f"{key}='{value}'," + query = query[:-1] + query += " WHERE username=?" + params = (username,) + + self.cur.execute(query,params) + self.database.commit() + + def check_username(self,username): + query = "SELECT username FROM user WHERE username=?" + params = (username,) + result = self.cur.execute(query,params).fetchone() + if result is None: + return False + return True + def get_apparats_name(self, app_id,prof_id): + query = f"SELECT name FROM semesterapparat WHERE appnr={app_id} AND prof_id={prof_id}" + ic(query) + result = self.cur.execute(query).fetchone() + return result[0] + + def search_book(self, data:dict[str,str])->list[tuple[BookData,int]]: + query = "SELECT * FROM media " + result = self.database.execute(query).fetchall() + ret = [] + #get length of data dict + length = len(data) + mode = 0 + if length == 1: + if "signature" in data.keys(): + mode = 1 + elif "title" in data.keys(): + mode = 2 + elif length == 2: + mode = 3 + else: + return None + print(len(result)) + for res in result: + bookdata = pickle.loads(res[1]) + app_id = res[2] + prof_id = res[3] + #if signature and title present in dict: + #if signature present in dict: + if mode == 1: + if data["signature"] in bookdata.signature: + ret.append((bookdata,app_id,prof_id)) + #if title present in dict: + elif mode == 2: + if data["title"] in bookdata.title: + ret.append((bookdata,app_id,prof_id)) + elif mode == 3: + if data["signature"] in bookdata.signature and data["title"] in bookdata.title: + ret.append((bookdata,app_id,prof_id)) + return ret + + +if __name__ == "__main__": + db = Database() + print(db.login("kirchner", "loginpass")) diff --git a/src/backend/db.py b/src/backend/db.py new file mode 100644 index 0000000..8fb0e02 --- /dev/null +++ b/src/backend/db.py @@ -0,0 +1,130 @@ +import sqlite3 +from omegaconf import OmegaConf +config = OmegaConf.load("config.yaml") +subjects = config.subjects + +# Connect to the database +def main(database): + conn = sqlite3.connect(database) + conn.execute( + """CREATE TABLE app_kontos ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + app_id INTEGER, + konto INTEGER, + passwort TEXT, + FOREIGN KEY (app_id) REFERENCES semesterapparat (id) + )""" + ) + + conn.execute( + """CREATE TABLE files ( + id INTEGER PRIMARY KEY, + filename TEXT, + fileblob BLOB, + app_id INTEGER, + filetyp TEXT, + prof_id INTEGER REFERENCES prof (id), + FOREIGN KEY (app_id) REFERENCES semesterapparat (id) + )""" + ) + + conn.execute( + """CREATE TABLE media ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + bookdata BLOB, + app_id INTEGER, + prof_id INTEGER, + deleted INTEGER DEFAULT (0), + available BOOLEAN, + reservation BOOLEAN, + FOREIGN KEY (prof_id) REFERENCES prof (id), + FOREIGN KEY (app_id) REFERENCES semesterapparat (id) + )""" + ) + + conn.execute( + """CREATE TABLE messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + created_at date NOT NULL DEFAULT CURRENT_TIMESTAMP, + message TEXT NOT NULL, + remind_at date NOT NULL DEFAULT CURRENT_TIMESTAMP, + user_id INTEGER NOT NULL, + appnr INTEGER, + FOREIGN KEY (user_id) REFERENCES user (id) + )""" + ) + + conn.execute( + """CREATE TABLE prof ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + titel TEXT, + fname TEXT, + lname TEXT, + fullname TEXT NOT NULL UNIQUE, + mail TEXT, + telnr TEXT + )""" + ) + + conn.execute( + """CREATE TABLE semesterapparat ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name TEXT, + prof_id INTEGER, + fach TEXT, + appnr INTEGER, + erstellsemester TEXT, + verlängert_am TEXT, + dauer BOOLEAN, + verlängerung_bis TEXT, + deletion_status INTEGER, + deleted_date TEXT, + apparat_id_adis INTEGER, + prof_id_adis INTEGER, + konto INTEGER REFERENCES app_kontos (id), + FOREIGN KEY (prof_id) REFERENCES prof (id) + )""" + ) + + conn.execute( + """CREATE TABLE user ( + id integer NOT NULL PRIMARY KEY AUTOINCREMENT, + created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + username TEXT NOT NULL UNIQUE, + password TEXT NOT NULL, + salt TEXT NOT NULL, + role TEXT NOT NULL, + email TEXT UNIQUE, + name TEXT + )""" + ) + conn.execute( + """ +CREATE TABLE subjects ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name TEXT NOT NULL UNIQUE +) +""" + ) + + conn.execute( + """ + CREATE TABLE aliases ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name TEXT NOT NULL UNIQUE, + subject_id INTEGER, + FOREIGN KEY (subject_id) REFERENCES subjects (id) +) +""" + ) + + # Commit the changes and close the connection + conn.commit() + #insert subjects + + + conn.close() + + +if __name__ == "__main__": + main() diff --git a/src/backend/pickles.py b/src/backend/pickles.py new file mode 100644 index 0000000..5b4e104 --- /dev/null +++ b/src/backend/pickles.py @@ -0,0 +1,9 @@ +import pickle +from typing import ByteString, Any + +def make_pickle(data:Any): + return pickle.dumps(data) + + +def load_pickle(data:ByteString): + return pickle.loads(data) diff --git a/src/backend/settings.py b/src/backend/settings.py new file mode 100644 index 0000000..1390d78 --- /dev/null +++ b/src/backend/settings.py @@ -0,0 +1,26 @@ +from dataclasses import dataclass, field + +import yaml + + +@dataclass +class Settings: + """Settings for the app.""" + + save_path: str + database_name: str + database_path: str + bib_id: str + default_apps: bool = True + custom_applications: list[dict] = field(default_factory=list) + + def save_settings(self): + """Save the settings to the config file.""" + with open("config.yaml", "w") as f: + yaml.dump(self.__dict__, f) + + def load_settings(self): + """Load the settings from the config file.""" + with open("config.yaml", "r") as f: + data = yaml.safe_load(f) + return data diff --git a/src/logic/__init__.py b/src/logic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/logic/c_sort.py b/src/logic/c_sort.py new file mode 100644 index 0000000..3a27726 --- /dev/null +++ b/src/logic/c_sort.py @@ -0,0 +1,59 @@ +from typing import List, Tuple + +from natsort import natsorted + + +def custom_sort(unsorted: List[Tuple[str, int, int]]) -> List[Tuple[str, int, int]]: + """Sort a list of semesters in the format "SoSe n" and "WiSe n/n+1" in the correct order. + Where n == year in 2 digit format + + Args: + ---- + unsorted (list[tuple]): List of semesters in the format "SoSe n" and "WiSe n/n+1" + + Returns: + ------- + ret (list[tuple]): Sorted list in correct order of WiSe n/n+1 and SoSe n + """ + summer = natsorted([i for i in unsorted if "SoSe" in i[0]]) + winter = natsorted([i for i in unsorted if "WiSe" in i[0]]) + summer = natsorted(summer, key=lambda x: x[0]) + winter = natsorted(winter, key=lambda x: x[0]) + + # Merge the lists + ret = [] + i = 0 + j = 0 + while i < len(summer) and j < len(winter): + if summer[i][0][5:] <= winter[j][0][5:]: + ret.append(summer[i]) + i += 1 + else: + ret.append(winter[j]) + j += 1 + + # Append the remaining items + while i < len(summer): + ret.append(summer[i]) + i += 1 + while j < len(winter): + ret.append(winter[j]) + j += 1 + + return ret + + # Test the function + + pass + + +if __name__ == "__main__": + unsorted = [ + ("WiSe 23/24", 7, 5), + ("SoSe 23", 5, 0), + ("SoSe 22", 1, 0), + ("WiSe 22/23", 1, 0), + ("SoSe 15", 1, 0), + ] + + print(custom_sort(unsorted)) diff --git a/src/logic/constants.py b/src/logic/constants.py new file mode 100644 index 0000000..9ed0a78 --- /dev/null +++ b/src/logic/constants.py @@ -0,0 +1,221 @@ +APP_NRS = [i for i in range(1, 181)] + +PROF_TITLES = [ + "Dr. mult.", + "Dr. paed.", + "Dr. rer. pol.", + "Dr. sc. techn.", + "Drs.", + "Dr. agr.", + "Dr. habil.", + "Dr. oec.", + "Dr. med.", + "Dr. e. h.", + "Dr. oec. publ.", + "Dr. -Ing.", + "Dr. theol.", + "Dr. med. vet.", + "Dr. ing.", + "Dr. rer. nat.", + "Dr. des.", + "Dr. sc. mus.", + "Dr. h. c.", + "Dr. pharm.", + "Dr. med. dent.", + "Dr. phil. nat.", + "Dr. phil.", + "Dr. iur.", + "Dr.", + "Kein Titel", +] +SEMAP_MEDIA_ACCOUNT_PREFIX = "10080" +semaps = { + "1": "0005", + "2": "0018", + "3": "0021", + "4": "0034", + "5": "0047", + "6": "0050", + "7": "0063", + "8": "0076", + "9": "0089", + "10": "0092", + "11": "0104", + "12": "0117", + "13": "0120", + "14": "0133", + "15": "0146", + "16": "0159", + "17": "0162", + "18": "0175", + "19": "0188", + "20": "0191", + "21": "0203", + "22": "0216", + "23": "0229", + "24": "0232", + "25": "0245", + "26": "0258", + "27": "0261", + "28": "0274", + "29": "0287", + "30": "0290", + "31": "0302", + "32": "0315", + "33": "0328", + "34": "0331", + "35": "0344", + "36": "0357", + "37": "0360", + "38": "0373", + "39": "0386", + "40": "0399", + "41": "0401", + "42": "0414", + "43": "0427", + "44": "0430", + "45": "0443", + "46": "0456", + "47": "0469", + "48": "0472", + "49": "0485", + "50": "0498", + "51": "0500", + "52": "0513", + "53": "0526", + "54": "0539", + "55": "0542", + "56": "0555", + "57": "0568", + "58": "0571", + "59": "0584", + "60": "0597", + "61": "0609", + "62": "0612", + "63": "0625", + "64": "0638", + "65": "0641", + "66": "0654", + "67": "0667", + "68": "0670", + "69": "0683", + "70": "0696", + "71": "0708", + "72": "0711", + "73": "0724", + "74": "0737", + "75": "0740", + "76": "0753", + "77": "0766", + "78": "0779", + "79": "0782", + "80": "0795", + "81": "0807", + "82": "0810", + "83": "0823", + "84": "0836", + "85": "0849", + "86": "0852", + "87": "0865", + "88": "0878", + "89": "0881", + "90": "0894", + "91": "0906", + "92": "0919", + "93": "0922", + "94": "0935", + "95": "0948", + "96": "0951", + "97": "0964", + "98": "0977", + "99": "0980", + "100": "0993", + "101": "1002", + "102": "1015", + "103": "1028", + "104": "1031", + "105": "1044", + "106": "1057", + "107": "1060", + "108": "1073", + "109": "1086", + "110": "1099", + "111": "1101", + "112": "1114", + "113": "1127", + "114": "1130", + "115": "1143", + "116": "1156", + "117": "1169", + "118": "1172", + "119": "1185", + "120": "1198", + "121": "1200", + "122": "1213", + "123": "1226", + "124": "1239", + "125": "1242", + "126": "1255", + "127": "1268", + "128": "1271", + "129": "1284", + "130": "1297", + "131": "1309", + "132": "1312", + "133": "1325", + "134": "1338", + "135": "1341", + "136": "1354", + "137": "1367", + "138": "1370", + "139": "1383", + "140": "1396", + "141": "1408", + "142": "1411", + "143": "1424", + "144": "1437", + "145": "1440", + "146": "1453", + "147": "1466", + "148": "1479", + "149": "1482", + "150": "1495", + "151": "1507", + "152": "1510", + "153": "1523", + "154": "1536", + "155": "1549", + "156": "1552", + "157": "1565", + "158": "1578", + "159": "1581", + "160": "1594", + "161": "1606", + "162": "1619", + "163": "1622", + "164": "1635", + "165": "1648", + "166": "1651", + "167": "1664", + "168": "1677", + "169": "1680", + "170": "1693", + "171": "1705", + "172": "1718", + "173": "1721", + "174": "1734", + "175": "1747", + "176": "1750", + "177": "1763", + "178": "1776", + "179": "1789", + "180": "1792", +} +# take the semaps dict and add the prefix to the values +for key, value in semaps.items(): + semaps[key] = f"{SEMAP_MEDIA_ACCOUNT_PREFIX}{value}{value[-1]}" +SEMAP_MEDIA_ACCOUNTS = semaps + +# for s in SEMAP_MEDIA_ACCOUNTS: +# assert len(SEMAP_MEDIA_ACCOUNTS[s]) == 10, f"semap {s} has wrong length" +# print(f"{SEMAP_MEDIA_ACCOUNTS[s]}") diff --git a/src/logic/csvparser.py b/src/logic/csvparser.py new file mode 100644 index 0000000..821b461 --- /dev/null +++ b/src/logic/csvparser.py @@ -0,0 +1,27 @@ +import csv + +import pandas as pdf + + +def csv_to_list(path: str) -> list[str]: + """ + Extracts the data from a csv file and returns it as a pandas dataframe + """ + with open(path, newline='') as csvfile: + reader = csv.reader(csvfile, delimiter=';', quotechar='|') + data = [] + for row in reader: + for i in range(len(row)): + row[i] = row[i].replace('"', "") + data.append(row) + ret= [] + for i in data: + ret.append(i[0]) + return ret + + + +if __name__ == "__main__": + text = csv_to_list("C:/Users/aky547/Desktop/semap/71.csv") + #remove linebreaks + print(text) \ No newline at end of file diff --git a/src/logic/dataclass.py b/src/logic/dataclass.py new file mode 100644 index 0000000..796b1a1 --- /dev/null +++ b/src/logic/dataclass.py @@ -0,0 +1,76 @@ +import re +from dataclasses import dataclass, field + + +@dataclass +class ApparatData: + prof_title: str | None = None + profname: str | None = None + dauerapp: bool = False + appnr: int | None = None + appname: str | None = None + app_fach: str | None = None + semester: str | None = None + erstellsemester: str | None = None + prof_mail: str | None = None + prof_tel: int | None = None + deleted: int = 0 + prof_adis_id: int | None = None + apparat_adis_id: int | None = None + + def get_prof_details(self) -> dict: + return { + "prof_title": self.prof_title, + "profname": self.profname, + "prof_mail": self.prof_mail, + "prof_tel": self.prof_tel, + "fullname": self.profname, + } + + +@dataclass +class BookData: + ppn: str | None = None + title: str | None = None + signature: str | None = None + edition: str | None = None + link: str | None = None + isbn: str | list | None = field(default_factory=list) + author: str | None = None + language: str | list | None = field(default_factory=list) + publisher: str | None = None + year: str | None = None + pages: str | None = None + # avaliability: dict | None = field(default_factory=dict) + # def assign(self, field,value): + # self.__setattr__(field,value) + + def from_dict(self, data: dict): + for key, value in data.items(): + setattr(self, key, value) + + def to_dict(self): + return self.__dict__ + + def from_dataclass(self, dataclass): + for key, value in dataclass.__dict__.items(): + setattr(self, key, value) + + def from_string(self, data: str): + if not data.startswith("BookData"): + raise ValueError("No valid BookData string") + else: + pattern = r"(\w+)='([^']*)'" + data_dict = dict(re.findall(pattern, data)) + print(data_dict) + for key, value in data_dict.items(): + setattr(self, key, value) + return self + + +@dataclass +class MailData: + subject: str | None = None + body: str | None = None + mailto: str | None = None + prof: str | None = None diff --git a/src/logic/fileparser.py b/src/logic/fileparser.py new file mode 100644 index 0000000..d527daa --- /dev/null +++ b/src/logic/fileparser.py @@ -0,0 +1,45 @@ +import csv + +import pandas as pd +from docx import Document + + +def csv_to_list(path: str) -> list[str]: + """ + Extracts the data from a csv file and returns it as a pandas dataframe + """ + with open(path, newline="") as csvfile: + reader = csv.reader(csvfile, delimiter=";", quotechar="|") + data = [] + for row in reader: + for i in range(len(row)): + row[i] = row[i].replace('"', "") + data.append(row) + ret = [] + for i in data: + ret.append(i[0]) + return ret + + +def word_docx_to_csv(path) -> pd.DataFrame: + doc = Document(path) + tables = doc.tables + + m_data = [] + for table in tables: + data = [] + for row in table.rows: + row_data = [] + for cell in row.cells: + text = cell.text + text = text.replace("\n", "") + row_data.append(text) + data.append(row_data) + df = pd.DataFrame(data) + df.columns = df.iloc[0] + df = df.iloc[1:] + + m_data.append(df) + + df = m_data[2] + return df diff --git a/src/logic/get_msword_content.py b/src/logic/get_msword_content.py new file mode 100644 index 0000000..1f44218 --- /dev/null +++ b/src/logic/get_msword_content.py @@ -0,0 +1,31 @@ +from docx import Document + +data={} +wordDoc = Document('files/Semesterapparat - Anmeldung.docx') +paragraphs = wordDoc.tables +for table in paragraphs: + for column in table.columns: + cellcount=0 + for cell in column.cells: + if cellcount<12: + cellcount+=1 + print(f'cell:{cell.text}') + + + # print(f'paragraphs[{i}]: {paragraphs[i]}') + # data[i] = paragraphs[i] + +# for i in range(0, len(paragraphs)): +# for i in range(2, len(paragraphs)): +# data[i] = paragraphs[i] + +print(data) + +# for table in wordDoc.tables: +# for row in table.rows: +# print('---') +# for cell in row.cells: +# print(f'cell:{cell.text}') + + + diff --git a/src/logic/get_pdf_content.py b/src/logic/get_pdf_content.py new file mode 100644 index 0000000..2a3d6ed --- /dev/null +++ b/src/logic/get_pdf_content.py @@ -0,0 +1,11 @@ +import tabula + + +file="files/Semesterapparat - Anmeldung.pdf" + +def extract_book_data(file): + tables=tabula.read_pdf(file,pages="all",encoding="utf-8",multiple_tables=True) + tabula.convert_into(file, file.replace(".pdf"), output_format="csv", pages="all") + with open("files/Semesterapparat - Anmeldung.csv", "r") as f: + content=f.read() + diff --git a/src/logic/mail.py b/src/logic/mail.py new file mode 100644 index 0000000..e69de29 diff --git a/src/logic/pdfparser.py b/src/logic/pdfparser.py new file mode 100644 index 0000000..5c0482e --- /dev/null +++ b/src/logic/pdfparser.py @@ -0,0 +1,30 @@ +# add depend path to system path +import os +import sys + +import pandas as pd +from pdfquery import PDFQuery + + +def pdf_to_csv(path: str) -> pd.DataFrame: + """ + Extracts the data from a pdf file and returns it as a pandas dataframe + """ + file = PDFQuery(path) + file.load() + #get the text from the pdf file + text_elems = file.extract([ + ('with_formatter', 'text'), + ('all_text', '*') + ]) + extracted_text = text_elems['all_text'] + + return extracted_text + + +if __name__ == "__main__": + text = pdf_to_csv("54_pdf.pdf") + #remove linebreaks + text = text.replace("\n", "") + print(text) + diff --git a/src/logic/settings.py b/src/logic/settings.py new file mode 100644 index 0000000..3e7cda3 --- /dev/null +++ b/src/logic/settings.py @@ -0,0 +1,20 @@ +import yaml +from dataclasses import dataclass, field + +@dataclass +class Settings: + """Settings for the app.""" + save_path: str + database_name: str + database_path: str + default_apps:bool = True + custom_applications: list[dict] = field(default_factory=list) + def save_settings(self): + """Save the settings to the config file.""" + with open("config.yaml", "w") as f: + yaml.dump(self.__dict__, f) + +#open the config file and load the settings +with open("config.yaml", "r") as f: + data = yaml.safe_load(f) + diff --git a/src/logic/threads.py b/src/logic/threads.py new file mode 100644 index 0000000..7cc7e99 --- /dev/null +++ b/src/logic/threads.py @@ -0,0 +1,195 @@ +import threading +import time + +from PyQt6.QtCore import QThread, pyqtSignal + +from src.backend.database import Database +from log import MyLogger +from src.transformers import RDS_AVAIL_DATA +from src.logic.webrequest import BibTextTransformer, WebRequest +import sqlite3 + +class BookGrabber(QThread): + updateSignal = pyqtSignal(int, int) + + def __init__( + self, + mode: str = None, + data: list = None, + app_id: int = None, + prof_id: int = None, + parent=None, + ): + super().__init__(parent) + self.logger = MyLogger("Worker") + self.logger.log_info("Starting worker thread") + self.logger.log_info("Worker thread started") + self.app_id = app_id + self.prof_id = prof_id + self.mode = mode + self.data = data + self.book_id = None + self.db_lock = threading.Lock() + + def run(self): + self.db = Database() + item = 0 + for entry in self.data: + signature = str(entry) + self.logger.log_info("Processing entry: " + signature) + + webdata = WebRequest().get_ppn(entry).get_data() + if webdata == "error": + continue + bd = BibTextTransformer(self.mode).get_data(webdata).return_data() + transformer = BibTextTransformer("RDS") + rds = transformer.get_data(webdata).return_data("rds_availability") + bd.signature = entry + with self.db_lock: + #confirm lock is acquired + print("lock acquired, adding book to database") + self.db.add_medium(bd, self.app_id, self.prof_id) + # get latest book id + self.book_id = self.db.get_latest_book_id() + self.logger.log_info("Added book to database") + state = 0 + for rds_item in rds.items: + sign = rds_item.superlocation + loc = rds_item.location + # print(item.location) + if self.app_id in sign or self.app_id in loc: + state = 1 + book_id = None + # for book in self.books: + # if book["bookdata"].signature == entry: + # book_id = book["id"] + # break + self.logger.log_info(f"State of {signature}: {state}") + with self.db_lock: + print( + "lock acquired, updating availability of " + + str(book_id) + + " to " + + str(state) + ) + try: + self.db.set_availability(self.book_id, state) + except sqlite3.OperationalError as e: + self.logger.log_error(f"Failed to update availability: {e}") + break + + # time.sleep(5) + item += 1 + self.updateSignal.emit(item, len(self.data)) + self.logger.log_info("Worker thread finished") + # teminate thread + + self.quit() + + +class AvailChecker(QThread): + updateSignal = pyqtSignal(str, int) + + def __init__( + self, links: list = [], appnumber: int = None, parent=None, books=list[dict] + ): + if links is None: + links = [] + super().__init__(parent) + self.logger = MyLogger("AvailChecker") + self.logger.log_info("Starting worker thread") + self.logger.log_info( + "Checking availability for " + + str(links) + + " with appnumber " + + str(appnumber) + + "..." + ) + self.links = links + self.appnumber = appnumber + self.books = books + self.db_lock = threading.Lock() + + def run(self): + self.db = Database() + state = 0 + + for link in self.links: + self.logger.log_info("Processing entry: " + str(link)) + data = WebRequest().get_ppn(link).get_data() + transformer = BibTextTransformer("RDS") + rds = transformer.get_data(data).return_data("rds_availability") + print(rds) + for item in rds.items: + sign = item.superlocation + loc = item.location + # print(item.location) + if self.appnumber in sign or self.appnumber in loc: + state = 1 + book_id = None + for book in self.books: + if book["bookdata"].signature == link: + book_id = book["id"] + break + self.logger.log_info(f"State of {link}: " + str(state)) + with self.db_lock: + print( + "lock acquired, updating availability of " + + str(book_id) + + " to " + + str(state) + ) + self.db.set_availability(book_id, state) + break + self.updateSignal.emit(item.callnumber, state) + + self.logger.log_info("Worker thread finished") + # teminate thread + + self.quit() + + +class AutoAdder(QThread): + updateSignal = pyqtSignal(int) + + setTextSignal = pyqtSignal(int) + progress = pyqtSignal(int) + + def __init__(self, data=None, app_id=None, prof_id=None, parent=None): + super().__init__(parent) + self.logger = MyLogger("AutoAdder") + self.data = data + self.app_id = app_id + self.prof_id = prof_id + + print("Launched AutoAdder") + print(self.data, self.app_id, self.prof_id) + + def run(self): + self.db = Database() + # show the dialog, start the thread to gather data and dynamically update progressbar and listwidget + self.logger.log_info("Starting worker thread") + item = 0 + for entry in self.data: + try: + # webdata = WebRequest().get_ppn(entry).get_data() + # bd = BibTextTransformer("ARRAY").get_data(webdata).return_data() + # bd.signature = entry + self.updateSignal.emit(item) + self.setTextSignal.emit(entry) + # qsleep + item += 1 + self.progress.emit(item) + print(item, len(self.data)) + time.sleep(1) + + except Exception as e: + print(e) + self.logger.log_exception( + f"The query failed with message {e} for signature {entry}" + ) + continue + if item == len(self.data): + self.logger.log_info("Worker thread finished") + # teminate thread + self.finished.emit() diff --git a/src/logic/userInterface.py b/src/logic/userInterface.py new file mode 100644 index 0000000..a24622a --- /dev/null +++ b/src/logic/userInterface.py @@ -0,0 +1,1974 @@ +# encoding: utf-8 +import atexit +import os + +# import re +import sys +import tempfile +import time +from pathlib import Path + +from natsort import natsorted +from omegaconf import OmegaConf +from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6.QtCore import QDate, QThread, pyqtSignal +from PyQt6.QtGui import QColor, QRegularExpressionValidator + +from src.logic import c_sort +from src.backend.database import Database +from src.logic.constants import APP_NRS, PROF_TITLES +from src.logic.dataclass import ApparatData, BookData, MailData +from log import MyLogger +from src.logic.threads import BookGrabber,AvailChecker +from src.ui import ( + App_Ext_Dialog, + FilePicker, + GraphWidget, + Mail_Dialog, + Message_Widget, + Settings, + StatusWidget, + Ui_Semesterapparat, + edit_bookdata_ui, + fileparser_ui, + login_ui, + medienadder_ui, + parsed_titles_ui, + popus_confirm, + reminder_ui, + settings_ui, + new_subject_ui, +) +# from src.logic.webrequest import BibTextTransformer, WebRequest +from src.backend.admin_console import AdminCommands +from src.logic.csvparser import csv_to_list +from src.logic.wordparser import word_docx_to_csv +from icecream import ic +config = OmegaConf.load("config.yaml") + + +class Medien(medienadder_ui): + def __init__(self) -> None: + self.logger = MyLogger("Medien") + super().__init__() + self.mode = "" + self.data = [] + + def get_list_data(self) -> list: + signatures = self.listWidget.findItems("*", QtCore.Qt.MatchFlag.MatchWildcard) + return [signature.text() for signature in signatures] + + def get_mode(self) -> str: + return self.comboBox.currentText() + + +# class Setup(SetupWizard): +# def __init__(self, MainWindow): +# super().__init__() +# self.setupUi(MainWindow) +# self.settings = Settings() +# self.setWindowTitle("Semesterapparatsmanagement Setup") +# self.btn_save_path_select.clicked.connect(self.select_save_path) +# # self.setWindowIcon(QtGui.QIcon("ui\icon.png")) + +# def select_save_path(self) -> None: +# # open a dialog to select a save path +# dialog = QtWidgets.QFileDialog() +# dialog.setFileMode(QtWidgets.QFileDialog.FileMode.Directory) +# dialog.setOption(QtWidgets.QFileDialog.Option.ShowDirsOnly) +# dialog.exec() +# self.settings.save_path = dialog.selectedFiles()[0] +# self.save_path.setText(self.settings.save_path) +# self.settings.save_settings() +class MyComboBox(QtWidgets.QComboBox): + + def __init__(self, parent=None): + super().__init__(parent) + +valid_input = (0, 0, 0, 0, 0, 0) + + +class MessageCalendar(QtWidgets.QCalendarWidget): + #Widget for MessageCalendar + def __init__(self, parent=None): + super().__init__(parent) + self.messages = {} # Dictionary to store dates with messages + + def setMessages(self, messages): + for message in messages: + print(message) + # Convert the date string to a QDate object + date = QDate.fromString(message["remind_at"], "yyyy-MM-dd") + # Store the message for the date + self.messages[date] = message["message"] + self.updateCells() + + def updateCells(self): + self.repaint() + + def paintCell(self, painter, rect, date): + super().paintCell(painter, rect, date) + + # Check if there is a message for the current date + if date in self.messages: + # If there is a message, color the cell background + painter.fillRect(rect, QColor("#a7e681")) + + def change_stylesheet_cell(self, date: QDate, color: str): + # change the stylesheet of a cell + self.setStyleSheet( + f"QCalendarWidget QTableView QTableCornerButton::section {{background-color: {color};}}" + ) + + +class Ui(Ui_Semesterapparat): + # use the Ui_MainWindow class from mainwindow.py + def __init__(self, MainWindow, username: str) -> None: + self.logger = MyLogger("Ui") + self.logger.log_info("Starting Semesterapparatsmanagement") + super().__init__() + self.active_user = username + self.setupUi(MainWindow) + self.MainWindow = MainWindow + # set the window title + MainWindow.setWindowTitle("Semesterapparatsmanagement") + + self.db = Database() + # self.show() + # self.setWindowTitle("Semesterapparatsmanagement") + # self.setWindowIcon(QIcon("ui\icon.png")) + # self.sem_sommer.clicked.connect(self.buttonClicked) + self.btn_add_document.clicked.connect(self.add_document) + self.check_file.clicked.connect( + self.btn_check_file_threaded + ) # default: self.add_media_from_file) + self.create_new_app.clicked.connect(self.btn_create_new_apparat) + # self.load_app.clicked.connect(self.btn_load_apparat) + self.btn_apparat_save.clicked.connect(self.btn_save_apparat) + self.btn_apparat_apply.clicked.connect(self.update_apparat) + self.btn_open_document.clicked.connect(self.open_document) + self.add_medium.clicked.connect(self.btn_add_medium) + self.btn_copy_adis_command.clicked.connect(self.text_to_clipboard) + self.btn_reserve.clicked.connect(self.check_availability) + self.calendarWidget = MessageCalendar(self.frame_2) + self.calendarWidget.setGeometry(QtCore.QRect(0, 0, 291, 191)) + self.calendarWidget.setGridVisible(True) + self.calendarWidget.setVerticalHeaderFormat( + QtWidgets.QCalendarWidget.VerticalHeaderFormat.NoVerticalHeader + ) + self.calendarWidget.setObjectName("MessageCalendar") + self.calendarWidget.clicked.connect(self.open_reminder) + self.tableWidget_apparat_media.horizontalHeader().setSectionResizeMode( + QtWidgets.QHeaderView.ResizeMode.Stretch + ) + self.tableWidget_apparate.horizontalHeader().setSectionResizeMode( + QtWidgets.QHeaderView.ResizeMode.Stretch + ) + self.tableWidget_apparate.setSortingEnabled(True) + # self.tableWidget_apparate.text + self.actionEinstellungen.triggered.connect(self.open_settings) + # set validators + self.sem_year.setValidator(QtGui.QIntValidator()) + self.sem_year.setText(str(QtCore.QDate.currentDate().year())) + self.prof_mail.setValidator( + QRegularExpressionValidator( + QtCore.QRegularExpression( + r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}" + ) + ) + ) + self.prof_tel_nr.setValidator(QtGui.QIntValidator()) + # set the validator for the app name, allow all letters and umlauts + self.app_fach.setValidator( + QtGui.QRegularExpressionValidator( + QtCore.QRegularExpression(r"[a-zA-Z\s\W]+") + ) + ) + + # allow only letters, numbers, whitespaces, symbols for the apparat name + self.app_name.setValidator( + QtGui.QRegularExpressionValidator( + QtCore.QRegularExpression(r"[a-zA-Z0-9\s\W]+") + ) + ) + self.tableWidget_apparate.addScrollBarWidget( + QtWidgets.QScrollBar(), QtCore.Qt.AlignmentFlag.AlignRight + ) + # connect contextmenuevent to tablewidget + self.tableWidget_apparate.setContextMenuPolicy( + QtCore.Qt.ContextMenuPolicy.CustomContextMenu + ) + self.tableWidget_apparate.customContextMenuRequested.connect( + self.open_context_menu + ) + self.tableWidget_apparat_media.setContextMenuPolicy( + QtCore.Qt.ContextMenuPolicy.CustomContextMenu + ) + self.tableWidget_apparat_media.customContextMenuRequested.connect( + self.media_context_menu + ) + #enable automatic resizing of columns for book_search_result + self.book_search_result.horizontalHeader().setSectionResizeMode( + QtWidgets.QHeaderView.ResizeMode.Stretch + ) + self.tableWidget_apparate.doubleClicked.connect(self.load_app_data) + self.load_app.hide() + print(f"user:{self.active_user}") + userrole = self.db.get_role(self.active_user) + if userrole == "admin": + self.tabWidget.setTabVisible(2, True) + else: + self.tabWidget.setTabVisible(2, False) + # self.update_app_media_list() + self.populate_prof_dropdown() + self.frame.setEnabled(False) + # if the focus is changed from the prof name dropdown, set the prof data if the prof exists in the database, otherwise show a message + self.drpdwn_prof_name.currentIndexChanged.connect(self.set_prof_data) + self.cancel_active_selection.clicked.connect(self.btn_cancel_active_selection) + self.check_eternal_app.stateChanged.connect(self.set_state) + # validate inputs + self.prof_mail.textChanged.connect(self.validate_prof_mail) + self.drpdwn_prof_name.editTextChanged.connect(self.validate_prof_name) + self.prof_tel_nr.textChanged.connect(self.validate_prof_tel) + self.app_name.textChanged.connect(self.validate_app_name) + self.app_fach.currentTextChanged.connect(self.validate_app_fach) + self.sem_year.textChanged.connect(self.validate_semester) + self.check_eternal_app.stateChanged.connect(self.validate_semester) + self.chkbx_show_del_media.setEnabled(False) + self.chkbx_show_del_media.stateChanged.connect(self.update_app_media_list) + self.label_info.hide() + self.progress_label.setText("Bitte warten...") + self.line_2.hide() + self.progress_label.hide() + self.message_frame.hide() + self.btn_reserve.hide() + self.check_deletable.stateChanged.connect(self.gridchange) + self.tableWidget.horizontalHeader().setSectionResizeMode( + QtWidgets.QHeaderView.ResizeMode.Stretch + ) + self.btn_del_select_apparats.setEnabled(False) + self.btn_del_select_apparats.clicked.connect(self.delete_selected_apparats) + self.statistics_table.doubleClicked.connect(self.display_detailed_data) + self.tabWidget_2.currentChanged.connect(self.tabW2_changed) + self.tabWidget.currentChanged.connect(self.tabW1_changed) + self.tableWidget.resizeColumnsToContents() + self.tableWidget.resizeRowsToContents() + # set self.app_fach viable inputs to be + + # create a thread, that continually checks the validity of the inputs + self.grabbers = [] + self.thread = QThread() + self.validate_thread = QThread() + self.validate_thread.started.connect(self.thread_check) + self.validate_thread.start() + + # get all current apparats and cache them in a list + self.apparats = self.db.get_all_apparts(deleted=0) + print(self.apparats) + self.apparats = natsorted(self.apparats, key=lambda x: x[4], reverse=True) + + for apparat in self.apparats: + self.insert_apparat_into_table(apparat) + + self.old_apparats = self.apparats #create a clone to compare against later + # if length of apparats changes, update box_apparats + # if tab is changed, gather data needed + self.tabWidget.currentChanged.connect(self.tab_changed) + self.btn_search.clicked.connect(self.statistics) + # self.thread_check() + + ### Admin interface ### + #!admin - create user + #!admin - delete user + #!admin - change user + #TODO:admin - change faculty + self.select_action_box.addItem("") + self.select_action_box.setCurrentText("") + self.hide_all() + self.select_action_box.currentTextChanged.connect(self.admin_action_changed) + self.edit_faculty_member_select_member.currentTextChanged.connect(self.edit_faculty_member_set_data) + self.book_search.clicked.connect(self.search_book) + + #enable click functionality for the combobox to allow selection of roles + + #admin buttons + self.user_frame_addUser.clicked.connect(self.add_user) + self.pushButton.clicked.connect(self.delete_user) + self.update_user.clicked.connect(self.update_user_data) + self.update_faculty_member.clicked.connect(self.edit_faculty_member_action) + + + def tabW1_changed(self): + if self.tabWidget.currentIndex() == 1: + # self.tabWidget.setCurrentIndex(1) + self.tabWidget_2.setCurrentIndex(1) + self.tabWidget_2.setCurrentIndex(0) + + + def search_book(self): + self.book_search_result.setRowCount(0) + signature = self.seach_by_signature.text() + title = self.search_by_title.text() + params = { + "signature": signature if signature != "" else None, + "title": title if title != "" else None + } + params = {key: value for key, value in params.items() if value is not None} + ic(params) + retdata = self.db.search_book(params) + + for book in retdata: + ic(book) + self.book_search_result.insertRow(0) + self.book_search_result.setItem(0,0,QtWidgets.QTableWidgetItem(book[0].title)) + self.book_search_result.setItem(0,1,QtWidgets.QTableWidgetItem(book[0].signature)) + print(book[1]) + self.book_search_result.setItem(0,2,QtWidgets.QTableWidgetItem(self.db.get_apparats_name(book[1],book[2]))) + + + def edit_faculty_member_set_data(self): + #get the selected member + name = self.edit_faculty_member_select_member.currentText() + fullname = name.replace(",","") + print(fullname,name) + #get the data for the selected member + data = self.db.faculty_data(fullname) + #set the data + print(data) + if data == None: + self.edit_faculty_member_title.setText("") + self.faculty_member_old_telnr.setText("") + self.faculty_member_oldmail.setText("") + self.edit_faculty_member_title.setText("") + else: + self.edit_faculty_member_title.setText(data[1]) + self.faculty_member_old_telnr.setText(data[6]) + self.faculty_member_oldmail.setText(data[5]) + self.edit_faculty_member_title.setText(data[1]) if data[1] != None else self.edit_faculty_member_title.setText("") + + + # self.edit_faculty_member_name.setText(f"{data[3]} {data[2]}") + # self.edit_faculty_member_title.setCurrentText(data[1]) + # self.edit_faculty_member_mail.setText(data[4]) + # self.edit_faculty_member_tel.setText(data[5]) + # self.edit_faculty_member_adis_id.setText(str(data[0])) + # self.edit_faculty_member_id.setText(str(data[6])) + + def add_user(self): + username = self.user_create_frame_username.text() + password = self.user_create_frame_password.text() + role = self.user_frame_userrole.currentText() + if self.db.check_username(username): + ic("username already exists") + # self.user_create_frame_error.setText("Der Nutzername ist bereits vergeben")#TODO: implement error message + return + userdata = AdminCommands().create_password(password) + self.db.create_user(username=username, password=f"{userdata[1]}{userdata[0]}", salt=userdata[1], role=role) + self.user_create_frame_username.clear() + self.user_create_frame_password.clear() + self.user_frame_userrole.setCurrentText("") + self.admin_action_changed() + + def delete_user(self): + if self.user_delete_confirm.isChecked(): + username = self.user_delete_frame_user_select.currentText() + self.db.delete_user(username) + self.user_delete_frame_user_select.removeItem(self.user_delete_frame_user_select.currentIndex()) + self.user_delete_confirm.setChecked(False) + else: + # self.user_delete_err_message.setText("Bitte bestätigen Sie die Löschung des Nutzers") # TODO: implement error message + ic("please confirm the deletion of the user") + + def update_user_data(self): + username = self.user_edit_frame_user_select.currentText() + password = self.user_edit_frame_new_password.text() if self.user_edit_frame_new_password.text() != "" else None + role = self.user_edit_frame_role_select.currentText() if self.user_edit_frame_role_select.currentText() != "" else None + + userdata = AdminCommands().create_password(password) + data = { + "password": f"{userdata[1]}{userdata[0]}", + "salt": userdata[1], + "role": role + } + data = {key: value for key, value in data.items() if value is not None} + print(data) + self.db.update_user(username=username,data = data) + self.user_edit_frame_user_select.setCurrentText("") + self.user_edit_frame_new_password.clear() + self.user_edit_frame_role_select.setCurrentText("") + + def edit_faculty_member_action(self): + def __gen_fullname(fname,lname,data): + if fname == "" and lname == "": + return data[3] + if fname == ""and lname != "": + return f"{lname} {data[1]}" + if fname != "" and lname == "": + return f"{data[2]} {fname}" + if fname != "" and lname != "": + return f"{lname} {fname}" + #get the data and use new value if it is not none and does not mach the old value + if self.edit_faculty_member_select_member.currentText(""): + return + olddata = self.db.get_faculty_members(self.edit_faculty_member_select_member.currentText()) + + data = olddata[0] + oldlname = data[2] + oldfname = data[1] + #take data except first and last entry + + titel = self.edit_faculty_member_new_title.currentText() if self.edit_faculty_member_new_title.currentText() != "Kein Titel" else None + fname = self.edit_faculty_member_new_surname.text() if self.edit_faculty_member_new_surname.text() != "" else self.edit_faculty_member_select_member.currentText().split(" ")[1].strip() + lname = self.user_faculty_member_new_name.text() if self.user_faculty_member_new_name.text() != "" else self.edit_faculty_member_select_member.currentText().split(" ")[0].strip() + fullname = __gen_fullname(fname,lname,data) + mail = self.user_faculty_member_new_telnr.text() + telnr = self.user_faculty_member_new_mail.text() + new_data = { + "titel":titel, + "fname":fname, + "lname":lname, + "fullname":fullname, + "mail":mail, + "telnr":telnr, + } + new_data = {key: value for key, value in new_data.items() if value != ""} + self.db.update_faculty_member(data = new_data,oldlname=oldlname,oldfname=oldfname) + self.add_faculty_member_data() + self.edit_faculty_member_new_title.setCurrentText("") + self.edit_faculty_member_new_surname.clear() + self.user_faculty_member_new_name.clear() + self.user_faculty_member_new_telnr.clear() + self.user_faculty_member_new_mail.clear() + + def hide_all(self): + self.user_create_frame.hide() + self.user_edit_frame.hide() + self.user_delete_frame.hide() + self.edit_faculty_member.hide() + + def admin_action_changed(self): + action = self.select_action_box.currentText() + roles = self.db.get_roles() + roles = [role[0] for role in roles] + #remove duplicates + roles = list(dict.fromkeys(roles)) + users = self.db.get_users() + users = [user[2] for user in users] + users.remove(self.active_user) + if "admin" in users: + users.remove("admin") + if action == "Nutzer anlegen": + self.hide_all() + self.user_create_frame.show() + self.user_frame_userrole.addItems(roles) + elif action == "Nutzer aktualisieren": + self.hide_all() + self.user_edit_frame.show() + self.user_edit_frame_role_select.addItems(roles) + self.user_edit_frame_user_select.addItems(users) + elif action == "Nutzer löschen": + self.hide_all() + self.user_delete_frame.show() + self.user_delete_frame_user_select.addItems(users) + self.user_delete_frame_user_select.setCurrentText("") + self.user_delete_frame_user_select.addItems(users) + + elif action == "Lehrperson bearbeiten": + self.hide_all() + self.edit_faculty_member.show() + self.add_faculty_member_data() + self.edit_faculty_member_new_title.addItems(PROF_TITLES) + + + else: + self.hide_all() + return + + def add_faculty_member_data(self): + faculty_members = self.db.get_faculty_members() + names = [f"{member[5]}" for member in faculty_members] + self.edit_faculty_member_select_member.clear() + self.edit_faculty_member_select_member.addItems(names) + self.edit_faculty_member_select_member.addItem("") + self.edit_faculty_member_select_member.setCurrentText("") + + def tabW2_changed(self): + + if self.tabWidget_2.currentIndex() == 0: + self.stackedWidget_4.setCurrentIndex(0) + else: + self.stackedWidget_4.setCurrentIndex(1) + + def generateSemester(self, today=False): + """Generates the current semester. + + Args: + ----- + today (bool, optional): If True, the current semester is generated. Defaults to False. + Returns: + -------- + str: The current semester + """ + if today: + currentYear = QDate.currentDate().year() + currentYear = int(str(currentYear)[-2:]) + month = QDate.currentDate().month() + if month >= 4 and month <= 9: + return "SoSe " + str(currentYear) + else: + return f"WiSe {currentYear}/{currentYear+1}" + currentYear = self.sem_year.text() + currentYear = int(currentYear[-2:]) + + semester = ( + self.sem_sommer.text() + if self.sem_sommer.isChecked() + else self.sem_winter.text() + ) + if semester == "Sommer": + return "SoSe " + str(currentYear) + else: + return f"WiSe {currentYear}/{currentYear+1}" + + def display_detailed_data(self): + selected_semester = self.statistics_table.item( + self.statistics_table.currentRow(), 0 + ).text() + # get all apparats from the selected semester + data = self.db.apparats_by_semester(selected_semester) + # replace keys for german names + # split to two lists + created = {"Erstellt": data["created"]} + deleted = {"Gelöscht": data["deleted"]} + created_status = StatusWidget(created, selected_semester) + deleted_status = StatusWidget(deleted, selected_semester) + created_status.setSizePolicy( + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Expanding, + ) + deleted_status.setSizePolicy( + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Expanding, + ) + + # add them to the gridLayout_4 + self.gridLayout_4.addWidget(created_status, 1, 0) + self.gridLayout_4.addWidget(deleted_status, 1, 1) + created_status.person_double_clicked.connect(self.open_apparat) + deleted_status.person_double_clicked.connect(self.open_apparat) + + def open_apparat(self, header:str, apparat:str, parent_depth:int): + print(header) + if header == "deleted" and parent_depth == 2: + #TODO: warn message here + print("warning") + if parent_depth == 1: + print(apparat) + #person selected case - open all apparats from this person in the tableWidget + self.tableWidget.setRowCount(0) + prof_id = self.db.get_prof_id(apparat.split("(")[0].strip()) + apparats = self.db.get_apparats_by_prof(prof_id) + for app in apparats: + print(app) + #set the items 0 = clickable checkbox, 1 = appname, 2 = profname, 3 = fach + #insert new row + self.tableWidget.insertRow(0) + self.tableWidget.setItem(0,0, QtWidgets.QTableWidgetItem("")) + self.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(app[1])) + self.tableWidget.setItem( + 0, 2, QtWidgets.QTableWidgetItem(str(app[4])) + ) + self.tableWidget.setItem(0, 3, QtWidgets.QTableWidgetItem(app[2])) + self.tableWidget.setItem(0, 4, QtWidgets.QTableWidgetItem(app[3])) + # replace the 0 with a checkbox + checkbox = QtWidgets.QCheckBox() + checkbox.setChecked(False) + self.tableWidget.setCellWidget(0, 0, checkbox) + # if i[9] is 1, set the background of the row to red + if int(app[9]) == 1: + for j in range(5): + self.tableWidget.item(0, j).setBackground(QtGui.QColor(235, 74, 71)) + # disable the checkbox + self.tableWidget.cellWidget(0, 0).setEnabled(False) + # set the tooltip + self.tableWidget.cellWidget(0, 0).setToolTip( + "Dieser Semesterapparat kann nicht gelöscht werden, da er bereits gelöscht wurde" + ) + elif parent_depth == 2: + #apparat selected case - open the apparat in the frame + self.load_app_data(apparat) + #change tab focus to tab 0 + self.tabWidget.setCurrentIndex(0) + return + + def gridchange(self): + if self.check_deletable.isChecked(): + self.box_semester.setEnabled(False) + self.box_semester.clear() + self.box_appnrs.setEnabled(False) + self.box_appnrs.clear() + self.box_person.setEnabled(False) + self.box_person.clear() + self.box_fach.setEnabled(False) + self.box_fach.clear() + self.box_erstellsemester.setEnabled(False) + self.box_erstellsemester.clear() + self.box_dauerapp.setEnabled(False) + self.box_dauerapp.clear() + else: + self.box_semester.setEnabled(True) + self.box_appnrs.setEnabled(True) + self.box_person.setEnabled(True) + self.box_fach.setEnabled(True) + self.box_erstellsemester.setEnabled(True) + self.box_dauerapp.setEnabled(True) + self.tab_changed() + + def populate_tab(self): + #add default values to the dropdowns + self.box_appnrs.clear() + self.box_appnrs.addItem("") + self.box_appnrs.setCurrentText("") + self.box_person.clear() + self.box_person.addItem("") + self.box_person.setCurrentText("") + self.box_fach.clear() + self.box_fach.addItem("") + self.box_fach.setCurrentText("") + self.box_erstellsemester.clear() + self.box_erstellsemester.addItem("") + self.box_erstellsemester.setCurrentText("") + self.box_semester.clear() + self.box_semester.addItem("") + self.box_semester.setCurrentText("") + self.box_dauerapp.clear() + self.box_dauerapp.addItems(["Ja", "Nein", ""]) + self.box_dauerapp.setCurrentText("") + #add custom vaules + appnrs = self.db.get_apparat_nrs() + apparats = natsorted(appnrs) + apparats = [str(apparat) for apparat in apparats] + self.box_appnrs.addItems(apparats) + persons = self.db.get_profs() + self.box_person.addItems( + [f"{person[3]}, {person[2]}" for person in persons] + ) + self.box_fach.addItems(subject[1] for subject in self.db.get_subjects()) + semester = self.db.get_semester() + self.box_erstellsemester.addItems([sem[0] for sem in semester]) + self.statistics_table.setRowCount(0) + + #set data for table and graph in tab 2 tableWidget_3 + data = self.db.get_app_count_by_semester() + data = c_sort.custom_sort(data) + # self.tabWidget_3.clear() + self.tabWidget_3.removeTab(1) + self.statistics_table.setRowCount(len(data)) + for i in range(len(data)): + self.statistics_table.setItem( + i, 0, QtWidgets.QTableWidgetItem(data[i][0]) + ) + self.statistics_table.setItem( + i, 1, QtWidgets.QTableWidgetItem(str(data[i][1])) + ) + self.statistics_table.setItem( + i, 2, QtWidgets.QTableWidgetItem(str(data[i][2])) + ) + self.statistics_table.resizeColumnsToContents() + self.statistics_table.resizeRowsToContents() + # create graph + + graph_data = { + "x": [i[0] for i in data], + "y": [i[1] for i in data], + "y2": [i[2] for i in data], + } + graph = GraphWidget(data=graph_data, legend_labels=["Erstellt", "Gelöscht"]) + + # place the graph into tabWidget_3 + self.tabWidget_3.addTab(graph, "Erstellte und gelöschte Semesterapparate") + self.tabWidget_3.setCurrentIndex(0) + + def tab_changed(self): + curr_tab = self.tabWidget.currentIndex() + if curr_tab == 0: # create tab + return + elif curr_tab == 1: # statistics tab + self.populate_tab() + elif curr_tab == 2: #admin tab + self.populate_admin_tab() + + def populate_admin_tab(self): + pass + + def populate_dropdown(self, box, data): + box.clear() + box.addItem("") + box.setCurrentText("") + box.addItems(data) + + def delete_selected_apparats(self): + # get all selected apparats + selected_apparats = [] + for i in range(self.tableWidget.rowCount()): + if self.tableWidget.cellWidget(i, 0).isChecked(): + selected_apparats.append(self.tableWidget.item(i, 2).text()) + # delete all selected apparats + print(selected_apparats) + for apparat in selected_apparats: + self.db.delete_apparat(apparat, self.generateSemester(today=True)) + # refresh the table + self.tab_changed() + self.btn_del_select_apparats.setEnabled(False) + + def statistics(self): + """Generate the statistics based on the selected filters.""" + self.db_err_message.setText("") + self.btn_del_select_apparats.setEnabled(True) + params = { + "appnr": self.box_appnrs.currentText() + if self.box_appnrs.currentText() != "" + else None, + "prof_id": self.db.get_prof_id(self.box_person.currentText()) + if self.box_person.currentText() != "" + else None, + "fach": self.box_fach.currentText() + if self.box_fach.currentText() != "" + else None, + "erstellsemester": self.box_erstellsemester.currentText() + if self.box_erstellsemester.currentText() != "" + else None, + "dauer": "1" + if self.box_dauerapp.currentText() == "Ja" + else "0" + if self.box_dauerapp.currentText() == "Nein" + else None, + "endsemester": self.box_semester.currentText() + if self.box_semester.currentText() != "" + else None, + "deletable": "True" if self.check_deletable.isChecked() else None, + "deletesemester": self.generateSemester(today=True), + } + params = {key: value for key, value in params.items() if value is not None} #remove empty lines to prevent errors + print(params) + params = {key: value for key, value in params.items() if value != "Alle"} #remove empty lines to prevent errors + print(params) + result = self.db.statistic_request(**params) + # add QTableWidgetItems to the table + self.tableWidget.setRowCount(len(result)) + if len(result) == 0: + self.db_err_message.setText("Keine Ergebnisse gefunden") + return + for i in range(len(result)): + print(result[i]) + # set the items 0 = clickable checkbox, 1 = appname, 2 = profname, 3 = fach + self.tableWidget.setItem(i, 0, QtWidgets.QTableWidgetItem("")) + self.tableWidget.setItem(i, 1, QtWidgets.QTableWidgetItem(result[i][1])) + self.tableWidget.setItem( + i, 2, QtWidgets.QTableWidgetItem(str(result[i][4])) + ) + self.tableWidget.setItem(i, 3, QtWidgets.QTableWidgetItem(result[i][2])) + self.tableWidget.setItem(i, 4, QtWidgets.QTableWidgetItem(result[i][3])) + # replace the 0 with a checkbox + checkbox = QtWidgets.QCheckBox() + checkbox.setChecked(False) + self.tableWidget.setCellWidget(i, 0, checkbox) + # if i[9] is 1, set the background of the row to red + if int(result[i][9]) == 1: + for j in range(5): + self.tableWidget.item(i, j).setBackground(QtGui.QColor(235, 74, 71)) + # disable the checkbox + self.tableWidget.cellWidget(i, 0).setEnabled(False) + # set the tooltip + self.tableWidget.cellWidget(i, 0).setToolTip( + "Dieser Semesterapparat kann nicht gelöscht werden, da er bereits gelöscht wurde" + ) + + + + def populate_frame(self, appdata: ApparatData): + # populate the frame with the data from the database + self.drpdwn_app_nr.setCurrentText(str(appdata.appnr)) + self.drpdwn_prof_title.setCurrentText(appdata.prof_title) + self.drpdwn_prof_name.setCurrentText(appdata.profname) + self.prof_mail.setText(appdata.prof_mail) + self.prof_tel_nr.setText(appdata.prof_tel) + self.app_name.setText(appdata.appname) + self.app_fach.setCurrentText(appdata.app_fach) + if appdata.semester is not None: + self.sem_sommer.setChecked( + True if appdata.semester.split(" ")[0] == "SoSe" else False + ) + self.sem_winter.setChecked( + True if appdata.semester.split(" ")[0] == "WiSe" else False + ) + self.sem_year.setText(appdata.semester.split(" ")[1]) + else: + self.sem_sommer.setChecked( + True if appdata.erstellsemester.split(" ")[0] == "SoSe" else False + ) + self.sem_winter.setChecked( + True if appdata.erstellsemester.split(" ")[0] == "WiSe" else False + ) + self.sem_year.setText(appdata.erstellsemester.split(" ")[1]) + self.check_eternal_app.setChecked(appdata.dauerapp) + self.prof_id_adis.setText(str(appdata.prof_adis_id)) + self.apparat_id_adis.setText(str(appdata.apparat_adis_id)) + self.frame.setEnabled(True) + + def update_apparat(self): + appdata = ApparatData() + appdata.app_fach = self.app_fach.text() + appdata.appname = self.app_name.text() + appdata.appnr = self.active_apparat() + appdata.dauerapp = self.check_eternal_app.isChecked() + appdata.prof_mail = self.prof_mail.text() + appdata.prof_tel = self.prof_tel_nr.text() + appdata.prof_title = self.drpdwn_prof_title.currentText() + appdata.profname = self.drpdwn_prof_name.currentText() + appdata.semester = ( + self.sem_sommer.text() + " " + self.sem_year.text() + if self.sem_sommer.isChecked() + else self.sem_winter.text() + " " + self.sem_year.text() + ) + appdata.prof_adis_id = self.prof_id_adis.text() + self.add_files() + appdata.apparat_adis_id = self.apparat_id_adis.text() + + self.db.update_apparat(appdata) + + self.update_app_media_list() + self.cancel_active_selection.click() + + + + def confirm_popup(self, message: str): + dial = QtWidgets.QDialog() + popup = popus_confirm() + popup.setupUi(dial) + popup.textEdit.setReadOnly(True) + popup.textEdit.setText(message) + dial.exec() + return dial.result() + + def threads(self): + while True: + self.validate_prof_mail() + self.validate_prof_name() + self.validate_prof_tel() + self.validate_app_name() + self.validate_app_fach() + self.validate_semester() + + def thread_check(self): + self.prof_mail.textChanged.connect(self.validate_prof_mail) + self.drpdwn_prof_name.editTextChanged.connect(self.validate_prof_name) + self.prof_tel_nr.textChanged.connect(self.validate_prof_tel) + self.app_name.textChanged.connect(self.validate_app_name) + self.app_fach.currentTextChanged.connect(self.validate_app_fach) + self.sem_year.textChanged.connect(self.validate_semester) + self.check_eternal_app.stateChanged.connect(self.validate_semester) + + def validate_prof_name(self): + if self.frame.isEnabled(): + if "," in self.drpdwn_prof_name.currentText(): + self.drpdwn_prof_name.setStyleSheet("border: 1px solid green;") + self.profname_mand.setText("") + self.change_state(0, 1) + else: + self.drpdwn_prof_name.setStyleSheet("border: 1px solid red;") + self.profname_mand.setText("*") + self.change_state(0, 0) + else: + self.drpdwn_prof_name.setStyleSheet("border: 1px solid black;") + + def validate_prof_mail(self): + if self.frame.isEnabled(): + if self.prof_mail.hasAcceptableInput(): + self.prof_mail.setStyleSheet("border: 1px solid green;") + self.mail_mand.setText("") + self.change_state(1, 1) + else: + self.prof_mail.setStyleSheet("border: 1px solid red;") + self.mail_mand.setText("*") + self.change_state(1, 0) + else: + self.prof_mail.setStyleSheet("border: 1px solid black;") + + def validate_prof_tel(self): + if self.frame.isEnabled(): + if self.prof_tel_nr.text() != "": + self.prof_tel_nr.setStyleSheet("border: 1px solid green;") + self.telnr_mand.setText("") + self.change_state(2, 1) + else: + self.prof_tel_nr.setStyleSheet("border: 1px solid red;") + self.telnr_mand.setText("*") + self.change_state(2, 0) + + def validate_app_name(self): + if self.frame.isEnabled(): + if self.app_name.hasAcceptableInput(): + self.app_name.setStyleSheet("border: 1px solid green;") + self.appname_mand.setText("") + self.change_state(3, 1) + else: + self.app_name.setStyleSheet("border: 1px solid red;") + self.appname_mand.setText("*") + self.change_state(3, 0) + + def validate_app_fach(self): + if self.frame.isEnabled(): + if self.app_fach.currentText() != "": + self.app_fach.setStyleSheet("border: 1px solid green;") + self.fach_mand.setText("") + self.change_state(4, 1) + else: + self.app_fach.setStyleSheet("border: 1px solid red;") + self.fach_mand.setText("*") + self.change_state(4, 0) + + def validate_semester(self): + if self.frame.isEnabled(): + if ( + (self.sem_sommer.isChecked() or self.sem_winter.isChecked()) + and self.sem_year.hasAcceptableInput() + ) or self.check_eternal_app.isChecked(): + self._mand.setText("") + self.change_state(5, 1) + else: + self._mand.setText("*") + self.change_state(5, 0) + + def change_state(self, index, state): + global valid_input + valid_input = list(valid_input) + valid_input[index] = state + valid_input = tuple(valid_input) + + def set_state(self): + # set state of semester and year + if self.check_eternal_app.isChecked(): + self.sem_winter.setEnabled(False) + self.sem_sommer.setEnabled(False) + self.sem_year.setEnabled(False) + else: + self.sem_winter.setEnabled(True) + self.sem_sommer.setEnabled(True) + self.sem_year.setEnabled(True) + + def validate_fields(self): + return all(valid_input) + + # def req_fields_filled(self): + # # check if all required fields are filled + # values = [] + # for item in self.frame.findChildren(QtWidgets.QLabel): + # # if label name contains "req" and the text is empty, return false + # if "mand" in item.objectName() and item.text() == "": + # values.append(True) + # elif "mand" in item.objectName() and item.text() != "": + # values.append(False) + # return all(values) + # + def buttonClicked(self): + print("Button clicked") + + def set_prof_data(self): + if "," not in self.drpdwn_prof_name.currentText(): + self.prof_mail.clear() + self.prof_tel_nr.clear() + return + selected_prof = self.drpdwn_prof_name.currentText() + data = self.db.get_prof_data(selected_prof) + prof_title = data["prof_title"] + if prof_title == "None": + prof_title = "Kein Titel" + self.drpdwn_prof_title.setCurrentText(prof_title) + self.prof_tel_nr.setText(data["prof_tel"]) + self.prof_mail.setText(data["prof_mail"]) + + def get_index_of_value(self, table_widget, value): + for i in range(table_widget.rowCount()): + for j in range(table_widget.columnCount()): + if table_widget.item(i, j) is not None and table_widget.item(i, j).text() == value: + return i, j + return None + + def load_app_data(self,app_id=None): + print(type(app_id)) + if isinstance(app_id, str): + #double click the tableWidget_apparate row with the given app_id + row,column = self.get_index_of_value(self.tableWidget_apparate,app_id) + #set the current index to the row + self.tableWidget_apparate.setCurrentCell(row,0) + app_pos = self.tableWidget_apparate.currentIndex() + appnr = self.tableWidget_apparate.item(app_pos.row(), 0).text() + appname = self.tableWidget_apparate.item(app_pos.row(), 1).text() + self.sem_sommer.setEnabled(False) + self.sem_winter.setEnabled(False) + self.sem_year.setEnabled(False) + self.dokument_list.setRowCount(0) + self.chkbx_show_del_media.setEnabled(True) + appdata = self.db.get_app_data(appnr, appname) + self.populate_frame(appdata) + self.btn_apparat_save.hide() + self.btn_reserve.show() + self.drpdwn_app_nr.setDisabled(True) + self.app_fach.setDisabled(True) + self.update_app_media_list() + self.update_documemt_list() + + def update_documemt_list(self): + app_id = self.active_apparat() + prof_id = self.db.get_prof_id( + self.drpdwn_prof_name.currentText().replace(", ", " ") + ) + files = self.db.get_files(app_id, prof_id) + for file in files: + self.dokument_list.insertRow(0) + self.dokument_list.setItem(0, 0, QtWidgets.QTableWidgetItem(file[0])) + self.dokument_list.setItem(0, 1, QtWidgets.QTableWidgetItem(file[1])) + self.dokument_list.setItem(0, 2, QtWidgets.QTableWidgetItem("")) + self.dokument_list.setItem(0, 3, QtWidgets.QTableWidgetItem("Database")) + + # def btn_load_apparat(self): + # # remove all rows from table + # #get all + # self.tableWidget_apparate.sortItems(0, QtCore.Qt.SortOrder.AscendingOrder) + # self.frame.setDisabled(True) + # for child in self.frame.findChildren(QtWidgets.QLineEdit): + # child.clear() + + def btn_create_new_apparat(self): + global valid_input + # *create a new apparat + self.btn_apparat_save.show() if self.btn_apparat_save.isHidden() else None + # clear dokumemt_list + self.dokument_list.setRowCount(0) + self.frame.setEnabled(True) + + self.sem_year.setEnabled(True) + self.sem_sommer.setEnabled(True) + self.sem_winter.setEnabled(True) + self.chkbx_show_del_media.setEnabled(True) + self.drpdwn_app_nr.setEnabled(True) + self.app_fach.setEnabled(True) + self.app_fach.addItems([subject[1] for subject in self.db.get_subjects()]) + self.app_fach.addItem("") + self.app_fach.setCurrentText("") + if self.tableWidget_apparat_media.rowCount() > 0: + self.tableWidget_apparat_media.setRowCount(0) + # clear all fields + for item in self.frame.findChildren(QtWidgets.QLineEdit): + item.clear() + self.drpdwn_app_nr.clear() + self.drpdwn_prof_title.clear() + self.drpdwn_prof_name.clear() + # set drop down menu for apparat numbers to only available numbers + self.drpdwn_app_nr.addItems( + [str(i) for i in APP_NRS if i not in self.db.get_apparat_nrs()] + ) + self.drpdwn_prof_title.addItems(PROF_TITLES) + valid_input = (0, 0, 0, 0, 0, 0) + self.populate_prof_dropdown() + # self.horizontalLayout_6.show() + # increase size by 300px + + def update_progress_label(self, curr, total): + text = f"Medium {curr}/{total}" + self.logger.log_info(text) + self.progress_label.setText(text) + # update tableWidget_apparat_media + self.update_app_media_list() + + def hide_progress_label(self): + self.logger.log_info("Finished adding media, hiding progress label") + self.progress_label.hide() + self.line_2.hide() + self.label_info.hide() + + def btn_add_medium(self): + if not self.frame.isEnabled(): + self.confirm_popup("Bitte erst einen Apparat auswählen!") + return + + def __new_ui(): + dialog = QtWidgets.QDialog() + frame = Medien() + frame.setupUi(dialog) + dialog.exec() + mode = frame.get_mode() + data = frame.get_list_data() + return mode, data, dialog.result() + + self.progress_label.show() + self.line_2.show() + self.label_info.show() + self.progress_label.setText("Bitte warten...") + mode, data, result = __new_ui() + if result == 1: + if data == []: + self.confirm_popup("Bitte mindestens ein Medium hinzufügen!") + + app_id = self.active_apparat() + prof_id = self.db.get_prof_id(self.drpdwn_prof_name.currentText()) + # check if app_id is in database + if not self.db.app_exists(app_id): + # create apparat + self.btn_save_apparat() + # create a thread that updates the progress label after each medium + count = len(data) + thread = QThread() + grabber = BookGrabber(mode, data, app_id, prof_id) + grabber.moveToThread(thread) + grabber.finished.connect(thread.quit) + grabber.finished.connect(grabber.deleteLater) + grabber.finished.connect(self.hide_progress_label) + grabber.finished.connect(self.update_app_media_list) + grabber.updateSignal.connect(self.update_progress_label) + # worker.finished.connect(worker.deleteLater) + + grabber.start() + self.thread = thread + self.grabbers.append(grabber) + + # for book in data: + # # self.progress_label.setText(f"Medium {ct}/{len(data)}") + # # update the progress label + # self.logger.log_info(f"trying to add BookData for Signature {book}") + # webdata = WebRequest().get_ppn(book).get_data() + # bd: BookData = BibTextTransformer(mode).get_data(webdata).return_data() + # bd.signature = book + # self.db.add_medium(bookdata=bd, app_id=app_id, prof_id=prof_id) + + # get all media list books + + else: + return + + def check_availability(self): + # get all links from the table + # if no index in tableWidget_apparat_media is selected, check all + if self.tableWidget_apparat_media.currentRow() == -1: + links = [ + self.tableWidget_apparat_media.item(i, 1).text() + for i in range(self.tableWidget_apparat_media.rowCount()) + if self.tableWidget_apparat_media.item(i, 4).text() == "❌" + or self.tableWidget_apparat_media.item(i, 4).text() == "" + ] + else: + links = [ + self.tableWidget_apparat_media.item( + self.tableWidget_apparat_media.currentRow(), 1 + ).text() + ] + + self.label_info.setText("Verfügbarkeit wird geprüft, bitte warten...") + self.label_info.show() + books = self.db.get_media( + self.active_apparat(), + self.db.get_prof_id(self.drpdwn_prof_name.currentText()), + del_state=0, + ) + + thread = QThread() + appnumber = self.active_apparat() + print(links) + availcheck = AvailChecker(links, appnumber, books=books) + availcheck.moveToThread(thread) + availcheck.finished.connect(thread.quit) + availcheck.finished.connect(availcheck.deleteLater) + availcheck.finished.connect(self.hide_progress_label) + availcheck.finished.connect(self.update_app_media_list) + availcheck.start() + self.thread = thread + self.grabbers.append(availcheck) + + def btn_cancel_active_selection(self): + # clear the rows of the table + self.tableWidget_apparat_media.setRowCount(0) + self.dokument_list.setRowCount(0) + self.frame.setEnabled(False) + for child in self.frame.findChildren(QtWidgets.QLineEdit): + child.clear() + + def update_app_media_list(self): + deleted = 0 if not self.chkbx_show_del_media.isChecked() else 1 + app_id = self.active_apparat() + prof_id = self.db.get_prof_id(self.drpdwn_prof_name.currentText()) + books: list[dict[int, BookData, int]] = self.db.get_media( + app_id, prof_id, deleted + ) + + # print(books) + # take the dataclass from the tuple + # booklist:list[BookData]=[book[0] for book in books] + self.tableWidget_apparat_media.setRowCount(0) + for book in books: + book_id = book["id"] + book_data = book["bookdata"] + availability = book["available"] + # bd = BookData().from_string(book) + # print(bd, type(bd)) + # create a new row below the last one + self.tableWidget_apparat_media.insertRow( + self.tableWidget_apparat_media.rowCount() + ) + # #set the data + self.tableWidget_apparat_media.setItem( + self.tableWidget_apparat_media.rowCount() - 1, + 0, + QtWidgets.QTableWidgetItem(book_data.title), + ) + self.tableWidget_apparat_media.setItem( + self.tableWidget_apparat_media.rowCount() - 1, + 1, + QtWidgets.QTableWidgetItem(book_data.signature), + ) + self.tableWidget_apparat_media.setItem( + self.tableWidget_apparat_media.rowCount() - 1, + 2, + QtWidgets.QTableWidgetItem(book_data.edition), + ) + self.tableWidget_apparat_media.setItem( + self.tableWidget_apparat_media.rowCount() - 1, + 3, + QtWidgets.QTableWidgetItem(book_data.author), + ) + self.tableWidget_apparat_media.setItem( + self.tableWidget_apparat_media.rowCount() - 1, + 6, + QtWidgets.QTableWidgetItem(book_data.link), + ) + if availability == 1: + # display green checkmark at column 4 in the row + self.tableWidget_apparat_media.setItem( + self.tableWidget_apparat_media.rowCount() - 1, + 4, + QtWidgets.QTableWidgetItem("✅"), + ) + # set tooltip + self.tableWidget_apparat_media.item( + self.tableWidget_apparat_media.rowCount() - 1, 4 + ).setToolTip("Das Medium wurde im Apparat gefunden") + else: + self.tableWidget_apparat_media.setItem( + self.tableWidget_apparat_media.rowCount() - 1, + 4, + QtWidgets.QTableWidgetItem("❌"), + ) + self.tableWidget_apparat_media.item( + self.tableWidget_apparat_media.rowCount() - 1, 4 + ).setToolTip("Das Medium wurde nicht im Apparat gefunden") + + # make table link clickable + self.tableWidget_apparat_media.itemClicked.connect(self.open_link) + + def open_link(self, item): + # get the name of the column + columnname = self.tableWidget_apparat_media.horizontalHeaderItem( + item.column() + ).text() + if columnname == "Link": + QtGui.QDesktopServices.openUrl(QtCore.QUrl(item.text())) + else: + pass + + def text_to_clipboard(self): + app_id = self.active_apparat() + text = f"SQ=select distinct akkey from aupr01 where aufst='{app_id}' union select pr_isn from aks4pd where akruf ='{app_id}'" + clipboard = QtWidgets.QApplication.clipboard() + clipboard.setText(text) + + def populate_prof_dropdown(self): + profs = self.db.get_profs() + # add empty entry to dropdown and set it as current + self.drpdwn_prof_name.addItem("Kein Name") + for prof in profs: + self.drpdwn_prof_name.addItem(f"{prof[3]}, {prof[2]}") + + def add_document(self): + print("Add document") + picker = FilePicker() + files = picker.pick_files() + + for file in files: + print(file) + filename = file.split("/")[-1] + filetype = filename.split(".")[-1] + self.dokument_list.insertRow(0) + self.dokument_list.setItem(0, 0, QtWidgets.QTableWidgetItem(filename)) + self.dokument_list.setItem(0, 1, QtWidgets.QTableWidgetItem(filetype)) + self.dokument_list.setItem(0, 2, QtWidgets.QTableWidgetItem("*")) + self.dokument_list.setItem(0, 3, QtWidgets.QTableWidgetItem(file)) + # set tooltip of row 3 to the file path for each row + self.dokument_list.item(0, 3).setToolTip(file) + +# self.db.insert_file(files, self.active_apparat(), self.db.get_prof_id(self.drpdwn_prof_name.currentText())) + + def open_document(self): + print("trying to open document:") + + _selected_doc_name = "" + _selected_doc_filetype = "" + try: + _selected_doc_name = self.dokument_list.item( + self.dokument_list.currentRow(), 0 + ).text() + _selected_doc_location = self.dokument_list.item( + self.dokument_list.currentRow(), 3 + ).text() + _selected_doc_filetype = self.dokument_list.item( + self.dokument_list.currentRow(), 1 + ).text() + except AttributeError: + self.confirm_popup("Bitte erst ein Dokument auswählen!") + return + print(_selected_doc_name, _selected_doc_filetype) + if not _selected_doc_location == "Database": + path = Path(_selected_doc_location) + path = path + "/" + _selected_doc_name + if os.getenv("OS") == "Windows_NT": + path = path.resolve() + os.startfile(path) + else: + path = path.resolve() + os.system(f"open {path}") + else: + try: + self.db.recreate_file(_selected_doc_name, self.active_apparat()) + except Exception as e: + self.logger.log_exception(e) + path = config.save_path + _selected_doc_name + # if ~ in path, replace it with the home directory + if "~" in path: + path = path.replace("~", str(Path.home())) + path = Path(path) + if os.getenv("OS") == "Windows_NT": + path = path.resolve() + os.startfile(path) + else: + path = path.resolve() + os.system(f"open {path}") + # filebytes = self.db.get_blob( + # _selected_doc_name, + # self.active_apparat(), + # ) + # # use io.BytesIO to create a file-like object from the bytes and open it in the respective program + # file = io.BytesIO(filebytes) + # file.name = _selected_doc_name + + # QtGui.QDesktopServices.openUrl(QtCore.QUrl(file)) + # print(type(filebytes)) + + def add_media_from_file(self): + def __open_dialog(signatures): + dialog = QtWidgets.QDialog() + frame = parsed_titles_ui() + frame.setupUi(dialog) + dialog.show() + frame.signatures = signatures + frame.populate_table() + frame.progressBar.setMaximum(len(signatures)) + frame.progressBar.setValue(0) + frame.progressBar.show() + frame.count.setText(str(len(signatures))) + frame.toolButton.click() + data = frame.return_data() + print(data) + # if no data was returned, return + + return data + # get + + # if files are in the table, and are selected, check for books in the file + if self.dokument_list.rowCount() == 0: + return + else: + # if file is selected, check for books in the file + if self.dokument_list.currentRow() != -1: + print("File selected") + file = self.dokument_list.item( + self.dokument_list.currentRow(), 3 + ).text() + + file_type = self.dokument_list.item( + self.dokument_list.currentRow(), 1 + ).text() + file_location = self.dokument_list.item( + self.dokument_list.currentRow(), 3 + ).text() + file_name = self.dokument_list.item( + self.dokument_list.currentRow(), 0 + ).text() + if file_location == "Database": + # create a temporaty file to use, delete it after use + temp_file = tempfile.NamedTemporaryFile( + delete=False, suffix="." + file_type + ) + temp_file.write( + self.db.get_blob(file_name, int(self.active_apparat())) + ) + temp_file.close() + file = temp_file.name + print(file) + if file_type == "pdf": + # Todo: implement parser here + self.confirm_popup("PDF Dateien werden nochnicht unterstützt!") + return + if file_type == "csv": + signatures = utils.csv_to_list(file) + data = __open_dialog(signatures) + # get the app_id and prof_id + app_id = self.active_apparat() + prof_id = self.db.get_prof_id(self.drpdwn_prof_name.currentText()) + # add the data to the database + for book in data: + if type(book) != BookData: + continue + self.db.add_medium( + bookdata=book, app_id=app_id, prof_id=prof_id + ) + if file_type == "docx": + data = utils.word_docx_to_csv(file) + signatures = [ + i + for i in data["Standnummer"].values + if i != "\u2002\u2002\u2002\u2002\u2002" + ] + data = __open_dialog(signatures) + # if no data was returned, return + if data == []: + return + # get the app_id and prof_id + app_id = self.active_apparat() + prof_id = self.db.get_prof_id(self.drpdwn_prof_name.currentText()) + # add the data to the database + for book in data: + if type(book) != BookData: + continue + self.db.add_medium( + bookdata=book, app_id=app_id, prof_id=prof_id + ) + self.update_app_media_list() + print(len(signatures)) + + def btn_check_file_threaded(self): + # get active app_id and prof_id + self.tableWidget_apparate.setEnabled(False) + self.tableWidget_apparate.setToolTip( + "Bitte warten, bis alle Medien hinzugefügt wurden" + ) + app_id = self.active_apparat() + prof_id = self.db.get_prof_id(self.drpdwn_prof_name.currentText()) + # check if apparat in database + if not self.db.app_exists(app_id): + # create apparat + self.btn_save_apparat() + if self.dokument_list.rowCount() == 0: + self.tableWidget_apparate.setEnabled(True) + self.tableWidget_apparate.setToolTip("") + return + + # if file is selected, check for books in the file + if self.dokument_list.currentRow() != -1: + print("File selected") + file = self.dokument_list.item(self.dokument_list.currentRow(), 3).text() + + file_type = self.dokument_list.item( + self.dokument_list.currentRow(), 1 + ).text() + file_location = self.dokument_list.item( + self.dokument_list.currentRow(), 3 + ).text() + file_name = self.dokument_list.item( + self.dokument_list.currentRow(), 0 + ).text() + if file_location == "Database": + # create a temporaty file to use, delete it after use + temp_file = tempfile.NamedTemporaryFile( + delete=False, suffix="." + file_type + ) + temp_file.write(self.db.get_blob(file_name, int(self.active_apparat()))) + temp_file.close() + file = temp_file.name + print(file) + if file_type == "pdf": + # Todo: implement parser here + self.confirm_popup("PDF Dateien werden nochnicht unterstützt!") + return + if file_type == "csv": + signatures = csv_to_list(file) + # add the data to the database + if file_type == "docx": + data = word_docx_to_csv(file) + signatures = [ + i + for i in data["Standnummer"].values + if i != "\u2002\u2002\u2002\u2002\u2002" + ] + + signatures = [i for i in signatures if i != ""] + thread = QThread() + grabber = BookGrabber("ARRAY", signatures, app_id, prof_id) + grabber.moveToThread(thread) + self.label_info.show() + self.progress_label.show() + self.line_2.show() + grabber.finished.connect(thread.quit) + grabber.finished.connect(grabber.deleteLater) + grabber.finished.connect(self.hide_progress_label) + grabber.finished.connect(self.update_app_media_list) + grabber.finished.connect(self.unlock_apparate) + grabber.updateSignal.connect(self.update_progress_label) + # worker.finished.connect(worker.deleteLater) + + grabber.start() + # self.thread = thread + self.grabbers.append(grabber) + + def unlock_apparate(self): + self.tableWidget_apparate.setEnabled(True) + self.tableWidget_apparate.setToolTip("") + + def btn_save_apparat(self): + def __clear_fields(): + self.drpdwn_app_nr.clear() + self.drpdwn_prof_title.clear() + self.drpdwn_prof_name.clearMask() + self.app_name.clear() + self.prof_mail.clear() + self.prof_tel_nr.clear() + self.app_fach.clear() + self.app_name.clear() + self.sem_year.clear() + self.dokument_list.setRowCount(0) + self.sem_winter.setChecked(False) + self.sem_sommer.setChecked(False) + self.check_eternal_app.setChecked(False) + self.prof_id_adis.clear() + self.prof_id_adis.clear() + self.apparat_id_adis.clear() + self.drpdwn_prof_name.clear() + self.tableWidget_apparat_media.setRowCount(0) + self.frame.setEnabled(False) + + if not self.validate_fields(): + self.confirm_popup("Bitte alle Pflichtfelder ausfüllen!") + return + appd = ApparatData() + appd.appnr = self.active_apparat() + appd.prof_title = ( + None + if self.drpdwn_prof_title.currentText() == "Kein Titel" + else self.drpdwn_prof_title.currentText() + ) + appd.profname = self.drpdwn_prof_name.currentText() + appd.appname = self.app_name.text() + appd.semester = self.generateSemester() + appd.dauerapp = 1 if self.check_eternal_app.isChecked() else 0 + appd.prof_tel = self.prof_tel_nr.text() + appd.prof_mail = self.prof_mail.text() + app_fach = self.app_fach.currentText() + curr_fach_alias = self.db.get_subjects_and_aliases() + for fach in curr_fach_alias: + if app_fach in fach: + appd.app_fach = app_fach + break + else: + #create a popup to ask for the correct subject + dialog = QtWidgets.QDialog() + popup = new_subject_ui() + popup.setupUi(dialog) + new_subject = popup.return_state() + dialog.exec() + if dialog.result() == QtWidgets.QDialog.DialogCode.Accepted: + appd.app_fach = new_subject + self.db.add_subject(new_subject) + else: + return + + appd.deleted = 0 + appd.prof_adis_id = self.prof_id_adis.text() + appd.apparat_adis_id = self.apparat_id_adis.text() + self.add_files() + if not self.validate_fields(): + pass + self.db.create_apparat(appd) + if self.dokument_list.rowCount() > 0: + self.add_files() + appdata = self.db.get_apparats() + # merge self.appdata and appdata, remove duplicates + self.apparats = list(set(self.apparats + appdata)) + self.apparats = natsorted(self.apparats, key=lambda x: x[4], reverse=True) + self.update_apparat_list() + + # self.btn_load_apparat() + + __clear_fields() + + def active_apparat(self): + return self.drpdwn_app_nr.currentText() + + def add_files(self): + files = [] + for i in range(self.dokument_list.rowCount()): + files.append( + { + "name": self.dokument_list.item(i, 0).text(), + "type": self.dokument_list.item(i, 1).text(), + "date": self.dokument_list.item(i, 2).text(), + "path": self.dokument_list.item(i, 3).text(), + } + ) + self.dokument_list.item(i, 2).setText("") + self.db.insert_file(files, self.active_apparat(), self.db.get_prof_id(self.drpdwn_prof_name.currentText())) + + def update_apparat_list(self): + # get a list of new apparats based on self.apparats and self.old_apparats + new_apparats = [ + apparat for apparat in self.apparats if apparat not in self.old_apparats + ] + print(new_apparats) + # insert the new apparats into the table + for apparat in new_apparats: + self.insert_apparat_into_table(apparat) + # sort the table by apparat number using natural sorting + self.tableWidget_apparate.sortItems(0, QtCore.Qt.SortOrder.AscendingOrder) + self.old_apparats = self.apparats + + def insert_apparat_into_table(self, apparat): + def __dauer_check(apparat): + result = self.db.is_eternal(apparat[0]) + return "Ja" if result == ("True" or "1") else "Nein" + + self.tableWidget_apparate.insertRow(0) + self.tableWidget_apparate.setItem( + 0, 0, QtWidgets.QTableWidgetItem(str(apparat[4])) + ) + self.tableWidget_apparate.setItem( + 0, 1, QtWidgets.QTableWidgetItem(str(apparat[1])) + ) + self.tableWidget_apparate.setItem( + 0, + 2, + QtWidgets.QTableWidgetItem( + self.db.get_prof_name_by_id(apparat[2], add_title=False) + ), + ) + self.tableWidget_apparate.setItem( + 0, + 3, + QtWidgets.QTableWidgetItem( + str(apparat[8]) if apparat[8] != None else apparat[5] + ), + ) + self.tableWidget_apparate.setItem( + 0, 4, QtWidgets.QTableWidgetItem(__dauer_check(apparat)) + ) + self.tableWidget_apparate.setItem( + 0, 5, QtWidgets.QTableWidgetItem(str(apparat[13])) + ) + self.logger.log_info(f"Inserted apparat {apparat[4]}") + + def open_context_menu(self, position): + menu = QtWidgets.QMenu() + extend_action = menu.addAction("Verlängern") + contact_action = menu.addAction("Kontaktieren") + delete_action = menu.addAction("Löschen") + remind_action = menu.addAction("Erinnerung") + menu.addAction(extend_action) + menu.addActions([contact_action, delete_action, remind_action]) + extend_action.triggered.connect(self.extend_apparat) + delete_action.triggered.connect(self.delete_apparat) + contact_action.triggered.connect(self.contact_prof) + remind_action.triggered.connect(self.reminder) + menu.exec(self.tableWidget_apparate.mapToGlobal(position)) + + def reminder(self): + dialog = QtWidgets.QDialog() + reminder = reminder_ui() + reminder.setupUi(dialog) + dialog.exec() + if dialog.result() == QtWidgets.QDialog.DialogCode.Accepted: + data = reminder.return_message() + print(data) + self.db.add_message( + data, + self.active_user, + self.active_apparat if self.active_apparat() != "" else None, + ) + self.calendarWidget.setMessages([data]) + self.calendarWidget.updateCells() + # self.db.update_bookdata(data, book_id) + # self.db.update_bookdata(data) + self.logger.log_info("Commited message to database") + # self.update_app_media_list() + + def get_reminders(self): + messages = self.db.get_messages() + self.logger.log_info(f"Got {len(messages)} messages from database") + self.calendarWidget.setMessages(messages) + self.calendarWidget.updateCells() + + def open_reminder(self): + def __update_message(): + message_select = self.spin_select_message.value() + try: + message = messages[message_select - 1] + except IndexError: + self.message_frame.hide() + return + self.message_box.setText(message["message"]) + self.line_app_info.setText( + message["apparatnr"] if message["apparatnr"] != None else "/" + ) + + def __delete_message(): + message = messages[self.spin_select_message.value() - 1] + self.db.delete_message(message["id"]) + # remove message from list + messages.remove(message) + self.spin_select_message.setMaximum(len(messages)) + self.spin_select_message.setValue(1) + self.label_total_day_messages.setText("/ " + str(len(messages))) + + selected_date = self.calendarWidget.selectedDate().toString("yyyy-MM-dd") + print(selected_date) + messages = self.db.get_messages(selected_date) + if messages == []: + self.message_frame.hide() if self.message_frame.isVisible() else None + return + print(messages) + message_count = len(messages) + self.spin_select_message.setMaximum(message_count) + self.message_frame.show() + self.label_total_day_messages.setText("/ " + str(message_count)) + # if there is only one message, disable the spinbox + self.spin_select_message.setEnabled( + False + ) if message_count == 1 else self.spin_select_message.setEnabled(True) + self.spin_select_message.setValue(1) + # load the first message + __update_message() + # on valuechanged, update the message + self.spin_select_message.valueChanged.connect(__update_message) + self.btn_delete_message.clicked.connect(__delete_message) + + def open_settings(self): + dialog = QtWidgets.QDialog() + settings = settings_ui() + settings.setupUi(dialog) + dialog.exec() + if dialog.result() == QtWidgets.QDialog.DialogCode.Accepted: + data = settings.return_data() + print(data) + OmegaConf.save(data, "config.yaml") + #re-load the config + config = OmegaConf.load("config.yaml") + self.logger.log_info("Saved settings to config.yaml") + self.reload() + + def reload(self): + #create a new connection to the database, refresh table data and replace the old connection + self.db = Database() + self.apparats = self.db.get_all_apparts(deleted=0) + self.apparats = natsorted(self.apparats, key=lambda x: x[4], reverse=True) + self.tableWidget_apparate.setRowCount(0) + for apparat in self.apparats: + self.insert_apparat_into_table(apparat) + + def media_context_menu(self, position): + menu = QtWidgets.QMenu() + delete_action = menu.addAction("Löschen") + edit_action = menu.addAction("Bearbeiten") + menu.addAction(delete_action) + menu.addAction(edit_action) + delete_action.triggered.connect(self.delete_medium) + edit_action.triggered.connect(self.edit_medium) + menu.exec(self.tableWidget_apparat_media.mapToGlobal(position)) + + def edit_medium(self): + book = self.tableWidget_apparat_media.item( + self.tableWidget_apparat_media.currentRow(), 1 + ).text() + book_id = self.db.request_medium( + app_id=self.active_apparat(), + signature=book, + prof_id=self.db.get_prof_id(self.drpdwn_prof_name.currentText()), + ) + data = self.db.get_specific_book(book_id) + widget = QtWidgets.QDialog() + bookedit = edit_bookdata_ui() + bookedit.setupUi(widget) + # change title of dialog + widget.setWindowTitle("Metadaten") + bookedit.populate_fields(data) + widget.exec() + if widget.result() == QtWidgets.QDialog.DialogCode.Accepted: + data = bookedit.get_data() + print(data) + self.db.update_bookdata(data, book_id) + # self.db.update_bookdata(data) + print("accepted") + self.update_app_media_list() + else: + return + pass + + def delete_medium(self): + selected_apparat_id = self.tableWidget_apparate.item( + self.tableWidget_apparate.currentRow(), 0 + ).text() + signature = self.tableWidget_apparat_media.item( + self.tableWidget_apparat_media.currentRow(), 1 + ).text() + # bookdata= self.db.request_medium(selected_apparat_id,prof_id=self.db.get_prof_id(self.drpdwn_prof_name.currentText()),signature=signature) + book_id = self.db.request_medium( + selected_apparat_id, + prof_id=self.db.get_prof_id(self.drpdwn_prof_name.currentText()), + signature=signature, + ) + message = f'Soll das Medium "{self.tableWidget_apparat_media.item(self.tableWidget_apparat_media.currentRow(),0).text()}" wirklich gelöscht werden?' + state = self.confirm_popup(message) + print(state) + if state == 1: + self.db.delete_medium(book_id) + self.update_app_media_list() + pass + + def extend_apparat(self): + framework = QtWidgets.QDialog() + frame = App_Ext_Dialog() + frame.setupUi(framework) + frame.sem_year.setValidator(QtGui.QIntValidator()) + frame.sem_year.setText(str(QtCore.QDate.currentDate().year())) + framework.exec() + # return data from dialog if ok is pressed + if framework.result() == QtWidgets.QDialog.DialogCode.Accepted: + data = frame.get_data() + print(data) + # return data + selected_apparat_id = self.tableWidget_apparate.item( + self.tableWidget_apparate.currentRow(), 0 + ).text() + print(selected_apparat_id) + # update self.apparats with the new data + # find matching apparat + # for apparat in self.apparats: + # if apparat[4] == int(selected_apparat_id): + # apparat[5]=data["semester"] + # apparat[7]=data["dauerapp"] + # break + # self.old_apparats = self.apparats + self.db.set_new_sem_date( + selected_apparat_id, data["semester"], dauerapp=data["dauerapp"] + ) + else: + return + + def contact_prof(self): + dialog = QtWidgets.QDialog() + mail_prev = Mail_Dialog() + mail_prev.setupUi(dialog) + mail_prevs = os.listdir("mail_vorlagen") + if self.app_name.text() == "": + mail_prevs.remove("Information zum Semesterapparat.eml") + mail_prev.comboBox.addItems(mail_prevs) + active_apparat_id = self.tableWidget_apparate.item( + self.tableWidget_apparate.currentRow(), 0 + ).text() + general_data = { + "Appname": self.app_name.text(), + "AppSubject": self.app_fach.text(), + "appnr": active_apparat_id, + } + print(active_apparat_id) + mail_prev.appid = active_apparat_id + base_data = self.db.get_prof_data(id=active_apparat_id) + profname = self.db.get_prof_name_by_id(base_data["id"]) + profname = profname.split(" ") + profname = f"{profname[1]} {profname[0]}" + pass_data = { + "prof_name": profname, + "mail_name": base_data["prof_mail"], + "general": general_data, + } + + mail_prev.set_data(pass_data) + mail_prev.set_mail() + dialog.exec() + + def delete_apparat(self): + selected_apparat_id = self.tableWidget_apparate.item( + self.tableWidget_apparate.currentRow(), 0 + ).text() + message = f"Soll der Apparat {selected_apparat_id} wirklich gelöscht werden?" + state = self.confirm_popup(message) + print(state) + if state == 1: + self.db.delete_apparat( + selected_apparat_id, self.generateSemester(today=True) + ) + # delete the corresponding entry from self.apparats + for apparat in self.apparats: + if apparat[4] == int(selected_apparat_id): + self.apparats.remove(apparat) + break + self.old_apparats = self.apparats + print(self.apparats) + # remove the row from the table + self.tableWidget_apparate.removeRow(self.tableWidget_apparate.currentRow()) + # if state==QtWidgets.QDialog.DialogCode.Accepted: + # self.db.delete_apparat(selected_apparat_id) + # pass + + +def launch_gui(): + print("trying to login") + print("checking if database available") + # database = config.database.path + config.database.name + # print(database) + # if not os.path.exists(database): + # print("Database not found, creating new database") + # db = Database() + # db.create_database() + app = QtWidgets.QApplication(sys.argv) + login_dialog = QtWidgets.QDialog() + ui = login_ui() + ui.setupUi(login_dialog) + login_dialog.exec() # This will block until the dialog is closed + + if ui.lresult == 1: + # if login is successful, open main window + # show login dialog + print(ui.lusername) + MainWindow = QtWidgets.QMainWindow() + aui = Ui(MainWindow, username=ui.lusername) + + print(aui.active_user) + MainWindow.show() + atexit.register(aui.thread.terminate) + sys.exit(app.exec()) + elif ui.lresult == 0: + warning_dialog = QtWidgets.QMessageBox() + warning_dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) + warning_dialog.setText("Invalid username or password. Please try again.") + warning_dialog.setWindowTitle("Login Failed") + warning_dialog.exec() + elif ui.lresult == 2: + # TODO: implement admin functionality here + """change passwords for apparats, change passwords for users, list users, create and delete users etc""" + # open a console window + # console = "" + print("admin") + + +if __name__ == "__main__": + print("This is the main window") + # app = QtWidgets.QApplication(sys.argv) + # window = MainWindow() + # app.exec() + # open login screen + launch_gui() diff --git a/src/logic/webrequest.py b/src/logic/webrequest.py new file mode 100644 index 0000000..455718e --- /dev/null +++ b/src/logic/webrequest.py @@ -0,0 +1,176 @@ +import requests +from bs4 import BeautifulSoup +from omegaconf import OmegaConf + +from src.logic.dataclass import BookData +from log import MyLogger +from src.transformers import ARRAYData, BibTeXData, COinSData, RDSData, RISData +#import sleep_and_retry decorator to retry requests +from ratelimit import limits, sleep_and_retry + +logger = MyLogger(__name__) +config = OmegaConf.load("config.yaml") + +API_URL = "https://rds.ibs-bw.de/phfreiburg/opac/RDSIndexrecord/{}/" +PPN_URL = 'https://rds.ibs-bw.de/phfreiburg/opac/RDSIndex/Search?lookfor="{}"+&type=AllFields&limit=10&sort=py+desc%2C+title' +TITLE = "RDS_TITLE" +SIGNATURE = "RDS_SIGNATURE" +EDITION = "RDS_EDITION" +ISBN = "RDS_ISBN" +AUTHOR = "RDS_PERSON" + +HEADERS = { + "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 \ + (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36", + "Accept-Language": "en-US, en;q=0.5", +} + + +class WebRequest: + def __init__(self) -> None: + """Request data from the web, and format it depending on the mode.""" + self.signature = None + self.ppn = None + self.data = None + logger.log_info("Initialized WebRequest") + + def get_ppn(self, signature): + self.signature = signature + if "+" in signature: + signature = signature.replace("+", "%2B") + if "doi.org" in signature: + signature = signature.split("/")[-1] + url = PPN_URL.format(signature) + page = requests.get(url) + + soup = BeautifulSoup(page.content, "html.parser", from_encoding="utf-8") + if soup.find("div", class_="media") is None: + logger.log_error(f"No data found for {signature}") + return self + ppn = soup.find("div", class_="media").get("id") + self.ppn = ppn + return self + + def get_link_data(self): + page = requests.get(PPN_URL.format(self.ppn)) + soup = BeautifulSoup(page.content, "html.parser") + # find div that contains daia_ in the id + # find the pre tag in that div + # return the text + # div = soup.find("div",id=lambda x: x and "daia_" in x) + # pre = div.find("pre") + return soup + + def get_data(self) -> list[str] | str: + # url = API_URL.format(self.ppn) + if self.ppn is None: + logger.log_error("No PPN found") + return "error" + page = requests.get(API_URL.format(self.ppn)) + logger.log_info(f"Requesting data from {API_URL.format(self.ppn)}") + logger.log_info(f"Status code: {page.status_code}") + # print(page.content) + soup = BeautifulSoup(page.content, "html.parser") + pre_tag = soup.find_all("pre") + # print(pre_tag) + return_data = [] + + if pre_tag: + for tag in pre_tag: + data = tag.text.strip() + return_data.append(data) + return return_data + else: + print("No
 tag found")
+            logger.log_error("No 
 tag found")
+            return return_data
+
+
+class BibTextTransformer:
+    def __init__(self, mode: str) -> None:
+        self.mode = mode
+        self.field = None
+        # print(self.field)
+        self.data = None
+        # self.bookdata = BookData(**self.data)
+
+    def get_data(self, data: list) -> str:
+        RIS_IDENT = "TY  -"
+        ARRAY_IDENT = "[kid]"
+        COinS_IDENT = "ctx_ver"
+        BIBTEX_IDENT = "@book"
+        RDS_IDENT = "RDS ---------------------------------- "
+        if self.mode == "RIS":
+            for line in data:
+                if RIS_IDENT in line:
+                    self.data = line
+        elif self.mode == "ARRAY":
+            for line in data:
+                if ARRAY_IDENT in line:
+                    self.data = line
+        elif self.mode == "COinS":
+            for line in data:
+                if COinS_IDENT in line:
+                    self.data = line
+        elif self.mode == "BibTeX":
+            for line in data:
+                if BIBTEX_IDENT in line:
+                    self.data = line
+        elif self.mode == "RDS":
+            for line in data:
+                if RDS_IDENT in line:
+                    self.data = line
+        return self
+
+    def return_data(self, option=None) -> BookData:
+        """Return Data to caller.
+
+        Args:
+            option (string, optional): Option for RDS as there are two filetypes. Use rds_availability or rds_data. Anything else gives a dict of both responses. Defaults to None.
+
+        Returns:
+            BookData: _description_
+        """
+        if self.mode == "ARRAY":
+            return ARRAYData().transform(self.data)
+        elif self.mode == "COinS":
+            return COinSData().transform(self.data)
+        elif self.mode == "BibTeX":
+            return BibTeXData().transform(self.data)
+        elif self.mode == "RIS":
+            return RISData().transform(self.data)
+        elif self.mode == "RDS":
+            return RDSData().transform(self.data).return_data(option)
+
+
+def cover(isbn):
+    test_url = f"https://www.buchhandel.de/cover/{isbn}/{isbn}-cover-m.jpg"
+    print(test_url)
+    data = requests.get(test_url, stream=True)
+    return data.content
+
+
+def get_content(soup, css_class):
+    return soup.find("div", class_=css_class).text.strip()
+
+
+if __name__ == "__main__":
+    print("main")
+    link = "ZE 77000 W492"
+    data = WebRequest().get_ppn(link).get_data()
+
+    print(data)
+    # # data.get_ppn("ME 3000 S186 (2)")
+    # # print(data.ppn)
+    # # desc=data.get_data()
+    # # print(type(desc))
+    # # print(desc)
+    # txt = (
+    #     BibTextTransformer("RIS")
+    #     .get_data(WebRequest().get_ppn("ST 250 U42 (15)").get_data())
+    #     .return_data()
+    # )
+    # print(txt)
+
+    # print(data)
+    # print(BibTextTransformer(data).bookdata)
diff --git a/src/logic/wordparser.py b/src/logic/wordparser.py
new file mode 100644
index 0000000..716a135
--- /dev/null
+++ b/src/logic/wordparser.py
@@ -0,0 +1,26 @@
+import pandas as pd
+from docx import Document
+
+
+def word_docx_to_csv(path) -> pd.DataFrame:
+    doc = Document(path)
+    tables = doc.tables
+
+    m_data = []
+    for table in tables:
+        data = []
+        for row in table.rows:
+            row_data = []
+            for cell in row.cells:
+                text = cell.text
+                text = text.replace("\n", "")
+                row_data.append(text)
+            data.append(row_data)
+        df = pd.DataFrame(data)
+        df.columns = df.iloc[0]
+        df = df.iloc[1:]
+
+        m_data.append(df)
+
+    df = m_data[2]
+    return df
diff --git a/src/transformers/__init__.py b/src/transformers/__init__.py
new file mode 100644
index 0000000..ea68985
--- /dev/null
+++ b/src/transformers/__init__.py
@@ -0,0 +1 @@
+from .transformers import RDS_AVAIL_DATA, ARRAYData, COinSData, BibTeXData, RISData, RDSData
\ No newline at end of file
diff --git a/src/transformers/transformers.py b/src/transformers/transformers.py
new file mode 100644
index 0000000..760afdd
--- /dev/null
+++ b/src/transformers/transformers.py
@@ -0,0 +1,310 @@
+from __future__ import annotations
+
+import json
+import re
+from dataclasses import dataclass
+from dataclasses import field as dataclass_field
+from typing import Any, List, Optional
+
+from pydantic import BaseModel, Field
+
+from src.logic.dataclass import BookData
+from log import MyLogger
+
+logger = MyLogger("transformers.py")
+
+
+###Pydatnic models
+@dataclass
+class Item:
+    superlocation: str | None = dataclass_field(default_factory=str)
+    status: str | None = dataclass_field(default_factory=str)
+    availability: str | None = dataclass_field(default_factory=str)
+    notes: str | None = dataclass_field(default_factory=str)
+    limitation: str | None = dataclass_field(default_factory=str)
+    duedate: str | None = dataclass_field(default_factory=str)
+    id: str | None = dataclass_field(default_factory=str)
+    item_id: str | None = dataclass_field(default_factory=str)
+    ilslink: str | None = dataclass_field(default_factory=str)
+    number: int | None = dataclass_field(default_factory=int)
+    barcode: str | None = dataclass_field(default_factory=str)
+    reserve: str | None = dataclass_field(default_factory=str)
+    callnumber: str | None = dataclass_field(default_factory=str)
+    department: str | None = dataclass_field(default_factory=str)
+    locationhref: str | None = dataclass_field(default_factory=str)
+    location: str | None = dataclass_field(default_factory=str)
+
+    def from_dict(self, data: dict) -> self:
+        """Import data from dict"""
+        data = data["items"]
+        for entry in data:
+            for key, value in entry.items():
+                setattr(self, key, value)
+        return self
+
+
+@dataclass
+class RDS_AVAIL_DATA:
+    """Class to store RDS availability data"""
+
+    library_sigil: str = dataclass_field(default_factory=str)
+    items: List[Item] = dataclass_field(default_factory=list)
+
+    def import_from_dict(self, data: str) -> self:
+        """Import data from dict"""
+        edata = json.loads(data)
+        # library sigil is first key
+
+        self.library_sigil = str(list(edata.keys())[0])
+        # get data from first key
+        edata = edata[self.library_sigil]
+        for location in edata:
+            item = Item(superlocation=location).from_dict(edata[location])
+
+            self.items.append(item)
+        return self
+
+
+@dataclass
+class RDS_DATA:
+    """Class to store RDS data"""
+
+    RDS_SIGNATURE: str = dataclass_field(default_factory=str)
+    RDS_STATUS: str = dataclass_field(default_factory=str)
+    RDS_LOCATION: str = dataclass_field(default_factory=str)
+    RDS_URL: Any = dataclass_field(default_factory=str)
+    RDS_HINT: Any = dataclass_field(default_factory=str)
+    RDS_COMMENT: Any = dataclass_field(default_factory=str)
+    RDS_HOLDING: Any = dataclass_field(default_factory=str)
+    RDS_HOLDING_LEAK: Any = dataclass_field(default_factory=str)
+    RDS_INTERN: Any = dataclass_field(default_factory=str)
+    RDS_PROVENIENCE: Any = dataclass_field(default_factory=str)
+    RDS_LOCAL_NOTATION: str = dataclass_field(default_factory=str)
+    RDS_LEA: Any = dataclass_field(default_factory=str)
+
+    def import_from_dict(self, data: dict) -> RDS_DATA:
+        """Import data from dict"""
+        for key, value in data.items():
+            setattr(self, key, value)
+        return self
+
+
+@dataclass
+class RDS_GENERIC_DATA:
+    LibrarySigil: str = dataclass_field(default_factory=str)
+    RDS_DATA: List[RDS_DATA] = dataclass_field(default_factory=list)
+
+    def import_from_dict(self, data: str) -> RDS_GENERIC_DATA:
+        """Import data from dict"""
+        edata = json.loads(data)
+        # library sigil is first key
+        self.LibrarySigil = str(list(edata.keys())[0])
+        # get data from first key
+        edata = edata[self.LibrarySigil]
+        for entry in edata:
+            rds_data = RDS_DATA()  # Create a new RDS_DATA instance
+            # Populate the RDS_DATA instance from the entry
+            # This assumes that the entry is a dictionary that matches the structure of the RDS_DATA class
+            rds_data.import_from_dict(entry)
+            self.RDS_DATA.append(rds_data)  # Add the RDS_DATA instance to the list
+        return self
+
+
+class BaseStruct:
+    def __init__(self, **kwargs):
+        for key, value in kwargs.items():
+            setattr(self, key, value)
+
+
+class ARRAYData:
+    def __init__(self):
+        pass
+
+    def transform(self, data: str) -> BookData:
+        def _get_line(source: str, search: str) -> str:
+            try:
+                return (
+                    source.split(search)[1]
+                    .split("\n")[0]
+                    .strip()
+                    .replace("=>", "")
+                    .strip()
+                )
+
+            except Exception as e:
+                logger.log_exception("ARRAYData.transform failed")
+                return ""
+
+        def _get_list_entry(source: str, search: str, entry: str) -> str:
+            try:
+                source = source.replace("\t", "").replace("\r", "")
+                source = source.split(search)[1].split(")")[0]
+                return _get_line(source, entry).replace("=>", "").strip()
+            except:
+                return ""
+
+        def _get_isbn(source: str) -> list:
+            try:
+                isbn = source.split("[isbn]")[1].split(")")[0].strip()
+                isbn = isbn.split("(")[1]
+                isbns = isbn.split("=>")
+                ret = []
+                for _ in isbns:
+                    # remove _ from list
+                    isb = _.split("\n")[0].strip()
+                    if isb == "":
+                        continue
+                    ret.append(isb) if isb not in ret else None
+                return ret
+            except:
+                isbn = []
+                return isbn
+
+        return BookData(
+            ppn=_get_line(data, "[kid]"),
+            title=_get_line(data, "[ti_long]").split("/")[0].strip(),
+            author=_get_list_entry(data, "[au]", "[0]"),
+            edition=_get_list_entry(data, "[ausgabe]", "[0]").replace(",", ""),
+            link=f"https://rds.ibs-bw.de/phfreiburg/link?kid={_get_line(data,'[kid]')}",
+            isbn=_get_isbn(data),
+            # [self._get_list_entry(data,"[isbn]","[0]"),self._get_list_entry(data,"[is]","[1]")],
+            language=_get_list_entry(data, "[la_facet]", "[0]"),
+            publisher=_get_list_entry(data, "[hg]", "[0]"),
+            year=_get_line(data, "[py]"),
+            pages=_get_list_entry(data, "[umfang]", "[0]").split(":")[0].strip(),
+        )
+
+
+class COinSData:
+    def __init__(self) -> None:
+        pass
+
+    def transform(self, data: str) -> BookData:
+        def _get_line(source: str, search: str) -> str:
+            try:
+                data = source.split(f"{search}=")[1]  # .split("")[0].strip()
+                return data.split("rft")[0].strip() if "rft" in data else data
+            except:
+                return ""
+
+        return BookData(
+            ppn=_get_line(data, "rft_id").split("=")[1],
+            title=_get_line(data, "rft.btitle"),
+            author=f"{_get_line(data,'rft.aulast')}, {_get_line(data,'rft.aufirst')}",
+            edition=_get_line(data, "rft.edition"),
+            link=_get_line(data, "rft_id"),
+            isbn=_get_line(data, "rft.isbn"),
+            publisher=_get_line(data, "rft.pub"),
+            year=_get_line(data, "rft.date"),
+            pages=_get_line(data, "rft.tpages").split(":")[0].strip(),
+        )
+
+
+class RISData:
+    def __init__(self) -> None:
+        pass
+
+    def transform(self, data: str) -> BookData:
+        def _get_line(source: str, search: str) -> str:
+            try:
+                data = source.split(f"{search}  - ")[1]  # .split("")[0].strip()
+                return data.split("\n")[0].strip() if "\n" in data else data
+            except:
+                return ""
+
+        return BookData(
+            ppn=_get_line(data, "DP").split("=")[1],
+            title=_get_line(data, "TI"),
+            signature=_get_line(data, "CN"),
+            edition=_get_line(data, "ET").replace(",", ""),
+            link=_get_line(data, "DP"),
+            isbn=_get_line(data, "SN").split(","),
+            author=_get_line(data, "AU").split("[")[0].strip(),
+            language=_get_line(data, "LA"),
+            publisher=_get_line(data, "PB"),
+            year=_get_line(data, "PY"),
+            pages=_get_line(data, "SP"),
+        )
+
+
+class BibTeXData:
+    def __init__(self):
+        pass
+
+    def transform(self, data: str) -> BookData:
+        def _get_line(source: str, search: str) -> str:
+            try:
+                return (
+                    data.split(search)[1]
+                    .split("\n")[0]
+                    .strip()
+                    .split("=")[1]
+                    .strip()
+                    .replace("{", "")
+                    .replace("}", "")
+                    .replace(",", "")
+                    .replace("[", "")
+                    .replace("];", "")
+                )
+            except:
+                return ""
+
+        return BookData(
+            ppn=None,
+            title=_get_line(data, "title"),
+            signature=_get_line(data, "bestand"),
+            edition=_get_line(data, "edition"),
+            isbn=_get_line(data, "isbn"),
+            author=";".join(_get_line(data, "author").split(" and ")),
+            language=_get_line(data, "language"),
+            publisher=_get_line(data, "publisher"),
+            year=_get_line(data, "year"),
+            pages=_get_line(data, "pages"),
+        )
+
+
+class RDSData:
+    retlist = []
+
+    def transform(self, data: str):
+        # rds_availability = RDS_AVAIL_DATA()
+        # rds_data = RDS_GENERIC_DATA()
+        def __get_raw_data(data: str) -> list:
+            # create base data to be turned into pydantic classes
+            data = data.split("RDS ----------------------------------")[1]
+            edata = data.strip()
+            edata = edata.split("\n", 9)[9]
+            edata = edata.split("\n")[1:]
+            entry_1 = edata[0]
+            edata = edata[1:]
+            entry_2 = "".join(edata)
+            edata = []
+            edata.append(entry_1)
+            edata.append(entry_2)
+            return edata
+
+        ret_data = __get_raw_data(data)
+        # assign data[1] to RDS_AVAIL_DATA
+        # assign data[0] to RDS_DATA
+        self.rds_data = RDS_GENERIC_DATA().import_from_dict(ret_data[1])
+        self.rds_availability = RDS_AVAIL_DATA().import_from_dict(ret_data[0])
+        self.retlist.append(self.rds_availability)
+        self.retlist.append(self.rds_data)
+        return self
+
+    def return_data(self, option=None):
+        if option == "rds_availability":
+            return self.retlist[0]
+        elif option == "rds_data":
+            return self.retlist[1]
+        else:
+            return {"rds_availability": self.retlist[0], "rds_data": self.retlist[1]}
+
+
+if __name__ == "__main__":
+    with open("daiadata", "r") as f:
+        data = f.read()
+
+    ret = RDSData().transform(data)
+    data = ret.return_data("rds_availability")
+    print(data)
diff --git a/src/ui/Ui_plotdata.py b/src/ui/Ui_plotdata.py
new file mode 100644
index 0000000..e0ee261
--- /dev/null
+++ b/src/ui/Ui_plotdata.py
@@ -0,0 +1,47 @@
+# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\plotdata.ui'
+#
+# Created by: PyQt6 UI code generator 6.3.1
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic6 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt6 import QtCore, QtWidgets
+
+
+class Ui_MainWindow(object):
+    def setupUi(self, MainWindow):
+        MainWindow.setObjectName("MainWindow")
+        MainWindow.resize(640, 480)
+        self.centralwidget = QtWidgets.QWidget(MainWindow)
+        self.centralwidget.setObjectName("centralwidget")
+        self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
+        self.graphicsView.setGeometry(QtCore.QRect(330, 10, 256, 192))
+        self.graphicsView.setObjectName("graphicsView")
+        self.widget = QtWidgets.QWidget(self.centralwidget)
+        self.widget.setGeometry(QtCore.QRect(10, 0, 251, 271))
+        self.widget.setObjectName("widget")
+        self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
+        self.stackedWidget.setGeometry(QtCore.QRect(300, 220, 291, 201))
+        self.stackedWidget.setObjectName("stackedWidget")
+        self.page = QtWidgets.QWidget()
+        self.page.setObjectName("page")
+        self.stackedWidget.addWidget(self.page)
+        self.page_2 = QtWidgets.QWidget()
+        self.page_2.setObjectName("page_2")
+        self.stackedWidget.addWidget(self.page_2)
+        MainWindow.setCentralWidget(self.centralwidget)
+        self.menubar = QtWidgets.QMenuBar(MainWindow)
+        self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 21))
+        self.menubar.setObjectName("menubar")
+        MainWindow.setMenuBar(self.menubar)
+        self.statusbar = QtWidgets.QStatusBar(MainWindow)
+        self.statusbar.setObjectName("statusbar")
+        MainWindow.setStatusBar(self.statusbar)
+
+        self.retranslateUi(MainWindow)
+        QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+    def retranslateUi(self, MainWindow):
+        _translate = QtCore.QCoreApplication.translate
+        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
diff --git a/src/ui/Ui_semesterapparat_ui.py b/src/ui/Ui_semesterapparat_ui.py
new file mode 100644
index 0000000..8115464
--- /dev/null
+++ b/src/ui/Ui_semesterapparat_ui.py
@@ -0,0 +1,1445 @@
+# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate-refactor\src\ui\semesterapparat_ui.ui'
+#
+# Created by: PyQt6 UI code generator 6.3.1
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic6 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt6 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+    def setupUi(self, MainWindow):
+        MainWindow.setObjectName("MainWindow")
+        MainWindow.setWindowModality(QtCore.Qt.WindowModality.WindowModal)
+        MainWindow.setEnabled(True)
+        MainWindow.resize(1593, 800)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
+        MainWindow.setSizePolicy(sizePolicy)
+        MainWindow.setMinimumSize(QtCore.QSize(1278, 800))
+        MainWindow.setMaximumSize(QtCore.QSize(1920, 800))
+        MainWindow.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu)
+        self.centralwidget = QtWidgets.QWidget(MainWindow)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
+        self.centralwidget.setSizePolicy(sizePolicy)
+        self.centralwidget.setObjectName("centralwidget")
+        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
+        self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 1271, 761))
+        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
+        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
+        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.gridLayout = QtWidgets.QGridLayout()
+        self.gridLayout.setObjectName("gridLayout")
+        self.tabWidget = QtWidgets.QTabWidget(self.verticalLayoutWidget)
+        self.tabWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.tabWidget.setObjectName("tabWidget")
+        self.tab = QtWidgets.QWidget()
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tab.sizePolicy().hasHeightForWidth())
+        self.tab.setSizePolicy(sizePolicy)
+        self.tab.setObjectName("tab")
+        self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.tab)
+        self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 1261, 163))
+        self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
+        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.formLayout = QtWidgets.QFormLayout()
+        self.formLayout.setObjectName("formLayout")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.verticalLayout_2.addItem(spacerItem)
+        self.load_app = QtWidgets.QPushButton(self.horizontalLayoutWidget_2)
+        self.load_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.load_app.setObjectName("load_app")
+        self.verticalLayout_2.addWidget(self.load_app)
+        self.create_new_app = QtWidgets.QPushButton(self.horizontalLayoutWidget_2)
+        self.create_new_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.create_new_app.setObjectName("create_new_app")
+        self.verticalLayout_2.addWidget(self.create_new_app)
+        self.cancel_active_selection = QtWidgets.QPushButton(self.horizontalLayoutWidget_2)
+        self.cancel_active_selection.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.cancel_active_selection.setObjectName("cancel_active_selection")
+        self.verticalLayout_2.addWidget(self.cancel_active_selection)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.verticalLayout_2.addItem(spacerItem1)
+        self.formLayout.setLayout(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.verticalLayout_2)
+        self.tableWidget_apparate = QtWidgets.QTableWidget(self.horizontalLayoutWidget_2)
+        self.tableWidget_apparate.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.tableWidget_apparate.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents)
+        self.tableWidget_apparate.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.SelectedClicked)
+        self.tableWidget_apparate.setAlternatingRowColors(True)
+        self.tableWidget_apparate.setTextElideMode(QtCore.Qt.TextElideMode.ElideMiddle)
+        self.tableWidget_apparate.setObjectName("tableWidget_apparate")
+        self.tableWidget_apparate.setColumnCount(6)
+        self.tableWidget_apparate.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparate.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparate.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparate.setHorizontalHeaderItem(2, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparate.setHorizontalHeaderItem(3, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparate.setHorizontalHeaderItem(4, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparate.setHorizontalHeaderItem(5, item)
+        self.tableWidget_apparate.horizontalHeader().setCascadingSectionResizes(True)
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.tableWidget_apparate)
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        self.formLayout.setLayout(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.horizontalLayout_4)
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.formLayout.setLayout(3, QtWidgets.QFormLayout.ItemRole.LabelRole, self.horizontalLayout_3)
+        self.horizontalLayout_2.addLayout(self.formLayout)
+        self.line = QtWidgets.QFrame(self.tab)
+        self.line.setGeometry(QtCore.QRect(0, 160, 1261, 21))
+        self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line.setObjectName("line")
+        self.gridLayoutWidget_2 = QtWidgets.QWidget(self.tab)
+        self.gridLayoutWidget_2.setEnabled(True)
+        self.gridLayoutWidget_2.setGeometry(QtCore.QRect(0, 180, 1261, 511))
+        self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2")
+        self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2)
+        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.app_group_box = QtWidgets.QGroupBox(self.gridLayoutWidget_2)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.app_group_box.sizePolicy().hasHeightForWidth())
+        self.app_group_box.setSizePolicy(sizePolicy)
+        self.app_group_box.setMinimumSize(QtCore.QSize(0, 210))
+        font = QtGui.QFont()
+        font.setPointSize(12)
+        font.setBold(True)
+        font.setWeight(75)
+        self.app_group_box.setFont(font)
+        self.app_group_box.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.app_group_box.setCheckable(False)
+        self.app_group_box.setObjectName("app_group_box")
+        self.dokument_list = QtWidgets.QTableWidget(self.app_group_box)
+        self.dokument_list.setGeometry(QtCore.QRect(765, 20, 321, 181))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        font.setKerning(False)
+        self.dokument_list.setFont(font)
+        self.dokument_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.dokument_list.setAcceptDrops(True)
+        self.dokument_list.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents)
+        self.dokument_list.setDragEnabled(True)
+        self.dokument_list.setDragDropMode(QtWidgets.QAbstractItemView.DragDropMode.DropOnly)
+        self.dokument_list.setDefaultDropAction(QtCore.Qt.DropAction.LinkAction)
+        self.dokument_list.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection)
+        self.dokument_list.setObjectName("dokument_list")
+        self.dokument_list.setColumnCount(4)
+        self.dokument_list.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(8)
+        item.setFont(font)
+        self.dokument_list.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(8)
+        item.setFont(font)
+        self.dokument_list.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(8)
+        item.setFont(font)
+        self.dokument_list.setHorizontalHeaderItem(2, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.dokument_list.setHorizontalHeaderItem(3, item)
+        self.frame = QtWidgets.QFrame(self.app_group_box)
+        self.frame.setEnabled(True)
+        self.frame.setGeometry(QtCore.QRect(10, 30, 1241, 151))
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
+        self.frame.setSizePolicy(sizePolicy)
+        self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.frame.setObjectName("frame")
+        self.drpdwn_prof_title = QtWidgets.QComboBox(self.frame)
+        self.drpdwn_prof_title.setGeometry(QtCore.QRect(110, 50, 69, 22))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.drpdwn_prof_title.setFont(font)
+        self.drpdwn_prof_title.setEditable(True)
+        self.drpdwn_prof_title.setObjectName("drpdwn_prof_title")
+        self.label_5 = QtWidgets.QLabel(self.frame)
+        self.label_5.setGeometry(QtCore.QRect(250, 20, 91, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_5.setFont(font)
+        self.label_5.setObjectName("label_5")
+        self.sem_winter = QtWidgets.QRadioButton(self.frame)
+        self.sem_winter.setGeometry(QtCore.QRect(340, 50, 82, 17))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.sem_winter.setFont(font)
+        self.sem_winter.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.sem_winter.setObjectName("sem_winter")
+        self.label_4 = QtWidgets.QLabel(self.frame)
+        self.label_4.setGeometry(QtCore.QRect(10, 80, 71, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_4.setFont(font)
+        self.label_4.setObjectName("label_4")
+        self.drpdwn_app_nr = QtWidgets.QComboBox(self.frame)
+        self.drpdwn_app_nr.setGeometry(QtCore.QRect(110, 20, 69, 22))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.drpdwn_app_nr.setFont(font)
+        self.drpdwn_app_nr.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhDigitsOnly)
+        self.drpdwn_app_nr.setEditable(True)
+        self.drpdwn_app_nr.setObjectName("drpdwn_app_nr")
+        self.app_name = QtWidgets.QLineEdit(self.frame)
+        self.app_name.setGeometry(QtCore.QRect(340, 20, 113, 20))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.app_name.setFont(font)
+        self.app_name.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.app_name.setObjectName("app_name")
+        self.sem_sommer = QtWidgets.QRadioButton(self.frame)
+        self.sem_sommer.setGeometry(QtCore.QRect(340, 70, 82, 17))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.sem_sommer.setFont(font)
+        self.sem_sommer.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.sem_sommer.setObjectName("sem_sommer")
+        self.label_3 = QtWidgets.QLabel(self.frame)
+        self.label_3.setGeometry(QtCore.QRect(10, 50, 61, 20))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_3.setFont(font)
+        self.label_3.setObjectName("label_3")
+        self.label_6 = QtWidgets.QLabel(self.frame)
+        self.label_6.setGeometry(QtCore.QRect(270, 60, 61, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_6.setFont(font)
+        self.label_6.setObjectName("label_6")
+        self.sem_year = QtWidgets.QLineEdit(self.frame)
+        self.sem_year.setGeometry(QtCore.QRect(410, 60, 113, 20))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.sem_year.setFont(font)
+        self.sem_year.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.sem_year.setMaxLength(4)
+        self.sem_year.setObjectName("sem_year")
+        self.label_2 = QtWidgets.QLabel(self.frame)
+        self.label_2.setGeometry(QtCore.QRect(10, 20, 101, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_2.setFont(font)
+        self.label_2.setObjectName("label_2")
+        self.btn_apparat_save = QtWidgets.QPushButton(self.frame)
+        self.btn_apparat_save.setGeometry(QtCore.QRect(260, 120, 75, 23))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.btn_apparat_save.setFont(font)
+        self.btn_apparat_save.setObjectName("btn_apparat_save")
+        self.btn_apparat_apply = QtWidgets.QPushButton(self.frame)
+        self.btn_apparat_apply.setGeometry(QtCore.QRect(350, 120, 75, 23))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.btn_apparat_apply.setFont(font)
+        self.btn_apparat_apply.setObjectName("btn_apparat_apply")
+        self.check_eternal_app = QtWidgets.QCheckBox(self.frame)
+        self.check_eternal_app.setGeometry(QtCore.QRect(340, 90, 101, 17))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.check_eternal_app.setFont(font)
+        self.check_eternal_app.setObjectName("check_eternal_app")
+        self.label_8 = QtWidgets.QLabel(self.frame)
+        self.label_8.setGeometry(QtCore.QRect(10, 110, 71, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_8.setFont(font)
+        self.label_8.setObjectName("label_8")
+        self.prof_mail = QtWidgets.QLineEdit(self.frame)
+        self.prof_mail.setGeometry(QtCore.QRect(110, 110, 121, 20))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.prof_mail.setFont(font)
+        self.prof_mail.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhEmailCharactersOnly)
+        self.prof_mail.setMaxLength(200)
+        self.prof_mail.setPlaceholderText("")
+        self.prof_mail.setObjectName("prof_mail")
+        self.label_9 = QtWidgets.QLabel(self.frame)
+        self.label_9.setGeometry(QtCore.QRect(10, 130, 71, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_9.setFont(font)
+        self.label_9.setObjectName("label_9")
+        self.prof_tel_nr = QtWidgets.QLineEdit(self.frame)
+        self.prof_tel_nr.setGeometry(QtCore.QRect(110, 130, 121, 20))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.prof_tel_nr.setFont(font)
+        self.prof_tel_nr.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhDigitsOnly)
+        self.prof_tel_nr.setPlaceholderText("")
+        self.prof_tel_nr.setObjectName("prof_tel_nr")
+        self.label_10 = QtWidgets.QLabel(self.frame)
+        self.label_10.setGeometry(QtCore.QRect(470, 20, 51, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_10.setFont(font)
+        self.label_10.setObjectName("label_10")
+        self.drpdwn_prof_name = QtWidgets.QComboBox(self.frame)
+        self.drpdwn_prof_name.setGeometry(QtCore.QRect(110, 80, 121, 22))
+        font = QtGui.QFont()
+        font.setPointSize(8)
+        font.setBold(False)
+        font.setWeight(50)
+        self.drpdwn_prof_name.setFont(font)
+        self.drpdwn_prof_name.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.drpdwn_prof_name.setEditable(True)
+        self.drpdwn_prof_name.setCurrentText("")
+        self.drpdwn_prof_name.setInsertPolicy(QtWidgets.QComboBox.InsertPolicy.InsertAlphabetically)
+        self.drpdwn_prof_name.setFrame(True)
+        self.drpdwn_prof_name.setObjectName("drpdwn_prof_name")
+        self.mail_mand = QtWidgets.QLabel(self.frame)
+        self.mail_mand.setGeometry(QtCore.QRect(100, 110, 47, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.mail_mand.setFont(font)
+        self.mail_mand.setObjectName("mail_mand")
+        self.telnr_mand = QtWidgets.QLabel(self.frame)
+        self.telnr_mand.setGeometry(QtCore.QRect(100, 130, 47, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.telnr_mand.setFont(font)
+        self.telnr_mand.setObjectName("telnr_mand")
+        self.profname_mand = QtWidgets.QLabel(self.frame)
+        self.profname_mand.setGeometry(QtCore.QRect(100, 80, 47, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.profname_mand.setFont(font)
+        self.profname_mand.setObjectName("profname_mand")
+        self.appname_mand = QtWidgets.QLabel(self.frame)
+        self.appname_mand.setGeometry(QtCore.QRect(330, 20, 16, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.appname_mand.setFont(font)
+        self.appname_mand.setObjectName("appname_mand")
+        self.fach_mand = QtWidgets.QLabel(self.frame)
+        self.fach_mand.setGeometry(QtCore.QRect(500, 20, 47, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.fach_mand.setFont(font)
+        self.fach_mand.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.fach_mand.setObjectName("fach_mand")
+        self._mand = QtWidgets.QLabel(self.frame)
+        self._mand.setGeometry(QtCore.QRect(330, 60, 16, 21))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self._mand.setFont(font)
+        self._mand.setObjectName("_mand")
+        self.btn_add_document = QtWidgets.QPushButton(self.frame)
+        self.btn_add_document.setGeometry(QtCore.QRect(1090, 20, 131, 25))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.btn_add_document.setFont(font)
+        self.btn_add_document.setObjectName("btn_add_document")
+        self.btn_open_document = QtWidgets.QPushButton(self.frame)
+        self.btn_open_document.setGeometry(QtCore.QRect(1090, 60, 131, 25))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.btn_open_document.setFont(font)
+        self.btn_open_document.setObjectName("btn_open_document")
+        self.check_file = QtWidgets.QPushButton(self.frame)
+        self.check_file.setGeometry(QtCore.QRect(1090, 100, 131, 51))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.check_file.setFont(font)
+        self.check_file.setObjectName("check_file")
+        self.formLayoutWidget_2 = QtWidgets.QWidget(self.frame)
+        self.formLayoutWidget_2.setGeometry(QtCore.QRect(550, 70, 202, 80))
+        self.formLayoutWidget_2.setObjectName("formLayoutWidget_2")
+        self.formLayout_3 = QtWidgets.QFormLayout(self.formLayoutWidget_2)
+        self.formLayout_3.setContentsMargins(0, 0, 0, 0)
+        self.formLayout_3.setObjectName("formLayout_3")
+        self.label_12 = QtWidgets.QLabel(self.formLayoutWidget_2)
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_12.setFont(font)
+        self.label_12.setObjectName("label_12")
+        self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_12)
+        self.prof_id_adis = QtWidgets.QLineEdit(self.formLayoutWidget_2)
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.prof_id_adis.setFont(font)
+        self.prof_id_adis.setObjectName("prof_id_adis")
+        self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.prof_id_adis)
+        self.label_13 = QtWidgets.QLabel(self.formLayoutWidget_2)
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.label_13.setFont(font)
+        self.label_13.setObjectName("label_13")
+        self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_13)
+        self.apparat_id_adis = QtWidgets.QLineEdit(self.formLayoutWidget_2)
+        self.apparat_id_adis.setObjectName("apparat_id_adis")
+        self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.apparat_id_adis)
+        self.check_send_mail = QtWidgets.QCheckBox(self.frame)
+        self.check_send_mail.setGeometry(QtCore.QRect(450, 120, 91, 17))
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        font.setBold(False)
+        font.setWeight(50)
+        self.check_send_mail.setFont(font)
+        self.check_send_mail.setObjectName("check_send_mail")
+        self.frame_3 = QtWidgets.QFrame(self.frame)
+        self.frame_3.setGeometry(QtCore.QRect(510, 0, 241, 61))
+        self.frame_3.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.frame_3.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.frame_3.setObjectName("frame_3")
+        self.gridLayoutWidget_5 = QtWidgets.QWidget(self.frame_3)
+        self.gridLayoutWidget_5.setGeometry(QtCore.QRect(0, 0, 241, 61))
+        self.gridLayoutWidget_5.setObjectName("gridLayoutWidget_5")
+        self.gridLayout_6 = QtWidgets.QGridLayout(self.gridLayoutWidget_5)
+        self.gridLayout_6.setContentsMargins(0, 0, 0, 0)
+        self.gridLayout_6.setObjectName("gridLayout_6")
+        self.app_fach = QtWidgets.QComboBox(self.gridLayoutWidget_5)
+        self.app_fach.setObjectName("app_fach")
+        self.gridLayout_6.addWidget(self.app_fach, 0, 0, 1, 1)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.gridLayout_6.addItem(spacerItem2, 0, 1, 1, 1)
+        self._mand.raise_()
+        self.drpdwn_prof_title.raise_()
+        self.label_5.raise_()
+        self.sem_winter.raise_()
+        self.label_4.raise_()
+        self.drpdwn_app_nr.raise_()
+        self.sem_sommer.raise_()
+        self.label_3.raise_()
+        self.label_6.raise_()
+        self.sem_year.raise_()
+        self.label_2.raise_()
+        self.btn_apparat_save.raise_()
+        self.btn_apparat_apply.raise_()
+        self.check_eternal_app.raise_()
+        self.label_8.raise_()
+        self.label_9.raise_()
+        self.label_10.raise_()
+        self.mail_mand.raise_()
+        self.telnr_mand.raise_()
+        self.profname_mand.raise_()
+        self.appname_mand.raise_()
+        self.fach_mand.raise_()
+        self.btn_add_document.raise_()
+        self.btn_open_document.raise_()
+        self.app_name.raise_()
+        self.prof_tel_nr.raise_()
+        self.drpdwn_prof_name.raise_()
+        self.prof_mail.raise_()
+        self.check_file.raise_()
+        self.formLayoutWidget_2.raise_()
+        self.check_send_mail.raise_()
+        self.frame_3.raise_()
+        self.frame.raise_()
+        self.dokument_list.raise_()
+        self.gridLayout_2.addWidget(self.app_group_box, 1, 0, 1, 1)
+        self.tableWidget_apparat_media = QtWidgets.QTableWidget(self.gridLayoutWidget_2)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tableWidget_apparat_media.sizePolicy().hasHeightForWidth())
+        self.tableWidget_apparat_media.setSizePolicy(sizePolicy)
+        self.tableWidget_apparat_media.setMinimumSize(QtCore.QSize(1259, 0))
+        self.tableWidget_apparat_media.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.tableWidget_apparat_media.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
+        self.tableWidget_apparat_media.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents)
+        self.tableWidget_apparat_media.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
+        self.tableWidget_apparat_media.setAlternatingRowColors(True)
+        self.tableWidget_apparat_media.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows)
+        self.tableWidget_apparat_media.setObjectName("tableWidget_apparat_media")
+        self.tableWidget_apparat_media.setColumnCount(7)
+        self.tableWidget_apparat_media.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparat_media.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparat_media.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparat_media.setHorizontalHeaderItem(2, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparat_media.setHorizontalHeaderItem(3, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparat_media.setHorizontalHeaderItem(4, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparat_media.setHorizontalHeaderItem(5, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget_apparat_media.setHorizontalHeaderItem(6, item)
+        self.tableWidget_apparat_media.horizontalHeader().setCascadingSectionResizes(True)
+        self.gridLayout_2.addWidget(self.tableWidget_apparat_media, 9, 0, 1, 1)
+        self.label = QtWidgets.QLabel(self.gridLayoutWidget_2)
+        font = QtGui.QFont()
+        font.setPointSize(11)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label.setFont(font)
+        self.label.setObjectName("label")
+        self.gridLayout_2.addWidget(self.label, 2, 0, 1, 1)
+        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
+        spacerItem3 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_5.addItem(spacerItem3)
+        self.chkbx_show_del_media = QtWidgets.QCheckBox(self.gridLayoutWidget_2)
+        self.chkbx_show_del_media.setObjectName("chkbx_show_del_media")
+        self.horizontalLayout_5.addWidget(self.chkbx_show_del_media)
+        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_5.addItem(spacerItem4)
+        self.btn_reserve = QtWidgets.QPushButton(self.gridLayoutWidget_2)
+        self.btn_reserve.setObjectName("btn_reserve")
+        self.horizontalLayout_5.addWidget(self.btn_reserve)
+        self.add_layout = QtWidgets.QHBoxLayout()
+        self.add_layout.setObjectName("add_layout")
+        self.label_info = QtWidgets.QLabel(self.gridLayoutWidget_2)
+        self.label_info.setObjectName("label_info")
+        self.add_layout.addWidget(self.label_info)
+        self.line_2 = QtWidgets.QFrame(self.gridLayoutWidget_2)
+        self.line_2.setFrameShape(QtWidgets.QFrame.Shape.VLine)
+        self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line_2.setObjectName("line_2")
+        self.add_layout.addWidget(self.line_2)
+        self.progress_label = QtWidgets.QLabel(self.gridLayoutWidget_2)
+        self.progress_label.setObjectName("progress_label")
+        self.add_layout.addWidget(self.progress_label)
+        self.horizontalLayout_5.addLayout(self.add_layout)
+        spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_5.addItem(spacerItem5)
+        self.avail_layout = QtWidgets.QHBoxLayout()
+        self.avail_layout.setObjectName("avail_layout")
+        self.horizontalLayout_5.addLayout(self.avail_layout)
+        self.label_20 = QtWidgets.QLabel(self.gridLayoutWidget_2)
+        self.label_20.setObjectName("label_20")
+        self.horizontalLayout_5.addWidget(self.label_20)
+        self.line_3 = QtWidgets.QFrame(self.gridLayoutWidget_2)
+        self.line_3.setFrameShape(QtWidgets.QFrame.Shape.VLine)
+        self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line_3.setObjectName("line_3")
+        self.horizontalLayout_5.addWidget(self.line_3)
+        self.avail_status = QtWidgets.QLabel(self.gridLayoutWidget_2)
+        self.avail_status.setObjectName("avail_status")
+        self.horizontalLayout_5.addWidget(self.avail_status)
+        spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_5.addItem(spacerItem6)
+        self.gridLayout_2.addLayout(self.horizontalLayout_5, 4, 0, 1, 1)
+        self.add_medium = QtWidgets.QPushButton(self.tab)
+        self.add_medium.setGeometry(QtCore.QRect(0, 700, 121, 20))
+        self.add_medium.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.add_medium.setObjectName("add_medium")
+        self.tabWidget.addTab(self.tab, "")
+        self.tab_2 = QtWidgets.QWidget()
+        self.tab_2.setObjectName("tab_2")
+        self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.tab_2)
+        self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 1251, 721))
+        self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
+        self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.tabWidget_2 = QtWidgets.QTabWidget(self.verticalLayoutWidget_2)
+        self.tabWidget_2.setMaximumSize(QtCore.QSize(16777215, 250))
+        self.tabWidget_2.setObjectName("tabWidget_2")
+        self.tab_3 = QtWidgets.QWidget()
+        self.tab_3.setObjectName("tab_3")
+        self.btn_search = QtWidgets.QPushButton(self.tab_3)
+        self.btn_search.setGeometry(QtCore.QRect(10, 180, 75, 23))
+        self.btn_search.setObjectName("btn_search")
+        self.gridLayoutWidget = QtWidgets.QWidget(self.tab_3)
+        self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 491, 161))
+        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
+        self.gridLayout_3 = QtWidgets.QGridLayout(self.gridLayoutWidget)
+        self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
+        self.gridLayout_3.setObjectName("gridLayout_3")
+        self.label_7 = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.label_7.setObjectName("label_7")
+        self.gridLayout_3.addWidget(self.label_7, 0, 0, 1, 1)
+        self.box_erstellsemester = QtWidgets.QComboBox(self.gridLayoutWidget)
+        self.box_erstellsemester.setEditable(True)
+        self.box_erstellsemester.setObjectName("box_erstellsemester")
+        self.gridLayout_3.addWidget(self.box_erstellsemester, 1, 3, 1, 1)
+        self.label_18 = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.label_18.setObjectName("label_18")
+        self.gridLayout_3.addWidget(self.label_18, 2, 2, 1, 1)
+        self.label_17 = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.label_17.setObjectName("label_17")
+        self.gridLayout_3.addWidget(self.label_17, 0, 2, 1, 1)
+        self.label_19 = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.label_19.setObjectName("label_19")
+        self.gridLayout_3.addWidget(self.label_19, 1, 2, 1, 1)
+        self.box_dauerapp = QtWidgets.QComboBox(self.gridLayoutWidget)
+        self.box_dauerapp.setObjectName("box_dauerapp")
+        self.gridLayout_3.addWidget(self.box_dauerapp, 2, 3, 1, 1)
+        self.label_11 = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.label_11.setObjectName("label_11")
+        self.gridLayout_3.addWidget(self.label_11, 1, 0, 1, 1)
+        self.label_16 = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.label_16.setObjectName("label_16")
+        self.gridLayout_3.addWidget(self.label_16, 2, 0, 1, 1)
+        self.box_semester = QtWidgets.QComboBox(self.gridLayoutWidget)
+        self.box_semester.setEditable(True)
+        self.box_semester.setObjectName("box_semester")
+        self.gridLayout_3.addWidget(self.box_semester, 0, 3, 1, 1)
+        self.box_appnrs = QtWidgets.QComboBox(self.gridLayoutWidget)
+        self.box_appnrs.setEditable(True)
+        self.box_appnrs.setObjectName("box_appnrs")
+        self.gridLayout_3.addWidget(self.box_appnrs, 0, 1, 1, 1)
+        self.box_fach = QtWidgets.QComboBox(self.gridLayoutWidget)
+        self.box_fach.setEditable(True)
+        self.box_fach.setObjectName("box_fach")
+        self.gridLayout_3.addWidget(self.box_fach, 2, 1, 1, 1)
+        self.box_person = QtWidgets.QComboBox(self.gridLayoutWidget)
+        self.box_person.setEditable(True)
+        self.box_person.setObjectName("box_person")
+        self.gridLayout_3.addWidget(self.box_person, 1, 1, 1, 1)
+        spacerItem7 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.gridLayout_3.addItem(spacerItem7, 4, 0, 1, 1)
+        self.label_15 = QtWidgets.QLabel(self.gridLayoutWidget)
+        self.label_15.setObjectName("label_15")
+        self.gridLayout_3.addWidget(self.label_15, 3, 0, 1, 1)
+        self.check_deletable = QtWidgets.QCheckBox(self.gridLayoutWidget)
+        self.check_deletable.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.check_deletable.setText("")
+        self.check_deletable.setObjectName("check_deletable")
+        self.gridLayout_3.addWidget(self.check_deletable, 3, 1, 1, 1)
+        self.db_err_message = QtWidgets.QLabel(self.tab_3)
+        self.db_err_message.setGeometry(QtCore.QRect(100, 180, 401, 23))
+        self.db_err_message.setText("")
+        self.db_err_message.setObjectName("db_err_message")
+        self.tabWidget_2.addTab(self.tab_3, "")
+        self.tab_4 = QtWidgets.QWidget()
+        self.tab_4.setObjectName("tab_4")
+        self.formLayoutWidget = QtWidgets.QWidget(self.tab_4)
+        self.formLayoutWidget.setGeometry(QtCore.QRect(10, 10, 451, 151))
+        self.formLayoutWidget.setObjectName("formLayoutWidget")
+        self.formLayout_6 = QtWidgets.QFormLayout(self.formLayoutWidget)
+        self.formLayout_6.setContentsMargins(0, 0, 0, 0)
+        self.formLayout_6.setObjectName("formLayout_6")
+        self.label_25 = QtWidgets.QLabel(self.formLayoutWidget)
+        self.label_25.setObjectName("label_25")
+        self.formLayout_6.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_25)
+        self.book_search = QtWidgets.QPushButton(self.formLayoutWidget)
+        self.book_search.setObjectName("book_search")
+        self.formLayout_6.setWidget(3, QtWidgets.QFormLayout.ItemRole.LabelRole, self.book_search)
+        self.seach_by_signature = QtWidgets.QLineEdit(self.formLayoutWidget)
+        self.seach_by_signature.setClearButtonEnabled(True)
+        self.seach_by_signature.setObjectName("seach_by_signature")
+        self.formLayout_6.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.seach_by_signature)
+        self.label_26 = QtWidgets.QLabel(self.formLayoutWidget)
+        self.label_26.setObjectName("label_26")
+        self.formLayout_6.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_26)
+        self.search_by_title = QtWidgets.QLineEdit(self.formLayoutWidget)
+        self.search_by_title.setClearButtonEnabled(True)
+        self.search_by_title.setObjectName("search_by_title")
+        self.formLayout_6.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.search_by_title)
+        spacerItem8 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.formLayout_6.setItem(2, QtWidgets.QFormLayout.ItemRole.LabelRole, spacerItem8)
+        self.tabWidget_2.addTab(self.tab_4, "")
+        self.verticalLayout_3.addWidget(self.tabWidget_2)
+        self.stackedWidget_4 = QtWidgets.QStackedWidget(self.verticalLayoutWidget_2)
+        self.stackedWidget_4.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.stackedWidget_4.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.stackedWidget_4.setObjectName("stackedWidget_4")
+        self.stackedWidget_4Page1 = QtWidgets.QWidget()
+        self.stackedWidget_4Page1.setObjectName("stackedWidget_4Page1")
+        #set focus to page 1
+        self.stackedWidget_4.setCurrentIndex(0)
+        self.tabWidget_3 = QtWidgets.QTabWidget(self.stackedWidget_4Page1)
+        self.tabWidget_3.setGeometry(QtCore.QRect(780, 10, 441, 441))
+        self.tabWidget_3.setObjectName("tabWidget_3")
+        self.tab_6 = QtWidgets.QWidget()
+        self.tab_6.setObjectName("tab_6")
+        self.gridLayoutWidget_3 = QtWidgets.QWidget(self.tab_6)
+        self.gridLayoutWidget_3.setGeometry(QtCore.QRect(0, 0, 431, 411))
+        self.gridLayoutWidget_3.setObjectName("gridLayoutWidget_3")
+        self.gridLayout_4 = QtWidgets.QGridLayout(self.gridLayoutWidget_3)
+        self.gridLayout_4.setContentsMargins(0, 0, 0, 0)
+        self.gridLayout_4.setObjectName("gridLayout_4")
+        self.statistics_table = QtWidgets.QTableWidget(self.gridLayoutWidget_3)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.statistics_table.sizePolicy().hasHeightForWidth())
+        self.statistics_table.setSizePolicy(sizePolicy)
+        self.statistics_table.setMaximumSize(QtCore.QSize(16777215, 16777215))
+        self.statistics_table.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.statistics_table.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
+        self.statistics_table.setAlternatingRowColors(True)
+        self.statistics_table.setObjectName("statistics_table")
+        self.statistics_table.setColumnCount(3)
+        self.statistics_table.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.statistics_table.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.statistics_table.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.statistics_table.setHorizontalHeaderItem(2, item)
+        self.statistics_table.horizontalHeader().setCascadingSectionResizes(True)
+        self.statistics_table.horizontalHeader().setDefaultSectionSize(59)
+        self.statistics_table.horizontalHeader().setMinimumSectionSize(24)
+        self.statistics_table.horizontalHeader().setSortIndicatorShown(True)
+        self.statistics_table.horizontalHeader().setStretchLastSection(False)
+        self.gridLayout_4.addWidget(self.statistics_table, 0, 0, 1, 1)
+        self.tabWidget_3.addTab(self.tab_6, "")
+        self.tab_7 = QtWidgets.QWidget()
+        self.tab_7.setObjectName("tab_7")
+        self.tabWidget_3.addTab(self.tab_7, "")
+        self.widget = QtWidgets.QWidget(self.stackedWidget_4Page1)
+        self.widget.setGeometry(QtCore.QRect(10, 10, 761, 441))
+        self.widget.setObjectName("widget")
+        self.horizontalLayoutWidget_3 = QtWidgets.QWidget(self.widget)
+        self.horizontalLayoutWidget_3.setGeometry(QtCore.QRect(0, 0, 761, 51))
+        self.horizontalLayoutWidget_3.setObjectName("horizontalLayoutWidget_3")
+        self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_3)
+        self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
+        self.btn_del_select_apparats = QtWidgets.QPushButton(self.horizontalLayoutWidget_3)
+        self.btn_del_select_apparats.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.btn_del_select_apparats.setObjectName("btn_del_select_apparats")
+        self.horizontalLayout_7.addWidget(self.btn_del_select_apparats)
+        spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_7.addItem(spacerItem9)
+        self.table = QtWidgets.QWidget(self.widget)
+        self.table.setGeometry(QtCore.QRect(0, 50, 761, 391))
+        self.table.setObjectName("table")
+        self.tableWidget = QtWidgets.QTableWidget(self.table)
+        self.tableWidget.setGeometry(QtCore.QRect(0, 0, 761, 391))
+        self.tableWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
+        self.tableWidget.setObjectName("tableWidget")
+        self.tableWidget.setColumnCount(5)
+        self.tableWidget.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget.setHorizontalHeaderItem(2, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget.setHorizontalHeaderItem(3, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.tableWidget.setHorizontalHeaderItem(4, item)
+        self.stackedWidget_4.addWidget(self.stackedWidget_4Page1)
+        self.page = QtWidgets.QWidget()
+        self.page.setObjectName("page")
+        self.book_search_result = QtWidgets.QTableWidget(self.page)
+        self.book_search_result.setGeometry(QtCore.QRect(10, 20, 1081, 421))
+        self.book_search_result.setFrameShadow(QtWidgets.QFrame.Shadow.Plain)
+        self.book_search_result.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
+        self.book_search_result.setAlternatingRowColors(True)
+        self.book_search_result.setObjectName("book_search_result")
+        self.book_search_result.setColumnCount(3)
+        self.book_search_result.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.book_search_result.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.book_search_result.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.book_search_result.setHorizontalHeaderItem(2, item)
+        self.book_search_result.horizontalHeader().setCascadingSectionResizes(True)
+        self.book_search_result.horizontalHeader().setStretchLastSection(True)
+        self.stackedWidget_4.addWidget(self.page)
+        self.verticalLayout_3.addWidget(self.stackedWidget_4)
+        self.tabWidget.addTab(self.tab_2, "")
+        self.tab_5 = QtWidgets.QWidget()
+        self.tab_5.setObjectName("tab_5")
+        self.label_21 = QtWidgets.QLabel(self.tab_5)
+        self.label_21.setGeometry(QtCore.QRect(10, 30, 47, 22))
+        self.label_21.setObjectName("label_21")
+        self.select_action_box = QtWidgets.QComboBox(self.tab_5)
+        self.select_action_box.setGeometry(QtCore.QRect(70, 30, 181, 22))
+        self.select_action_box.setObjectName("select_action_box")
+        self.select_action_box.addItem("")
+        self.select_action_box.addItem("")
+        self.select_action_box.addItem("")
+        self.select_action_box.addItem("")
+        self.user_create_frame = QtWidgets.QFrame(self.tab_5)
+        self.user_create_frame.setGeometry(QtCore.QRect(10, 60, 591, 141))
+        self.user_create_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.user_create_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.user_create_frame.setObjectName("user_create_frame")
+        self.gridLayoutWidget_4 = QtWidgets.QWidget(self.user_create_frame)
+        self.gridLayoutWidget_4.setGeometry(QtCore.QRect(0, 0, 581, 141))
+        self.gridLayoutWidget_4.setObjectName("gridLayoutWidget_4")
+        self.gridLayout_5 = QtWidgets.QGridLayout(self.gridLayoutWidget_4)
+        self.gridLayout_5.setContentsMargins(0, 0, 0, 0)
+        self.gridLayout_5.setObjectName("gridLayout_5")
+        self.label_22 = QtWidgets.QLabel(self.gridLayoutWidget_4)
+        self.label_22.setObjectName("label_22")
+        self.gridLayout_5.addWidget(self.label_22, 0, 0, 1, 1)
+        self.user_create_frame_username = QtWidgets.QLineEdit(self.gridLayoutWidget_4)
+        self.user_create_frame_username.setMaximumSize(QtCore.QSize(150, 16777215))
+        self.user_create_frame_username.setObjectName("user_create_frame_username")
+        self.gridLayout_5.addWidget(self.user_create_frame_username, 0, 1, 1, 1)
+        self.label_24 = QtWidgets.QLabel(self.gridLayoutWidget_4)
+        self.label_24.setObjectName("label_24")
+        self.gridLayout_5.addWidget(self.label_24, 0, 2, 1, 1)
+        self.label_23 = QtWidgets.QLabel(self.gridLayoutWidget_4)
+        self.label_23.setObjectName("label_23")
+        self.gridLayout_5.addWidget(self.label_23, 1, 0, 1, 1)
+        spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.gridLayout_5.addItem(spacerItem10, 0, 4, 1, 1)
+        self.user_frame_userrole = QtWidgets.QComboBox(self.gridLayoutWidget_4)
+        self.user_frame_userrole.setObjectName("user_frame_userrole")
+        self.gridLayout_5.addWidget(self.user_frame_userrole, 0, 3, 1, 1)
+        self.user_create_frame_password = QtWidgets.QLineEdit(self.gridLayoutWidget_4)
+        self.user_create_frame_password.setMaximumSize(QtCore.QSize(150, 16777215))
+        self.user_create_frame_password.setObjectName("user_create_frame_password")
+        self.gridLayout_5.addWidget(self.user_create_frame_password, 1, 1, 1, 1)
+        self.user_frame_addUser = QtWidgets.QPushButton(self.gridLayoutWidget_4)
+        self.user_frame_addUser.setObjectName("user_frame_addUser")
+        self.gridLayout_5.addWidget(self.user_frame_addUser, 1, 3, 1, 1)
+        self.user_frame_err_message = QtWidgets.QLabel(self.gridLayoutWidget_4)
+        self.user_frame_err_message.setText("")
+        self.user_frame_err_message.setObjectName("user_frame_err_message")
+        self.gridLayout_5.addWidget(self.user_frame_err_message, 1, 4, 1, 1)
+        self.user_delete_frame = QtWidgets.QFrame(self.tab_5)
+        self.user_delete_frame.setGeometry(QtCore.QRect(10, 60, 591, 141))
+        self.user_delete_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.user_delete_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.user_delete_frame.setObjectName("user_delete_frame")
+        self.gridLayoutWidget_7 = QtWidgets.QWidget(self.user_delete_frame)
+        self.gridLayoutWidget_7.setGeometry(QtCore.QRect(0, 0, 581, 141))
+        self.gridLayoutWidget_7.setObjectName("gridLayoutWidget_7")
+        self.gridLayout_8 = QtWidgets.QGridLayout(self.gridLayoutWidget_7)
+        self.gridLayout_8.setContentsMargins(0, 0, 0, 0)
+        self.gridLayout_8.setObjectName("gridLayout_8")
+        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
+        spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_8.addItem(spacerItem11)
+        self.pushButton = QtWidgets.QPushButton(self.gridLayoutWidget_7)
+        self.pushButton.setObjectName("pushButton")
+        self.horizontalLayout_8.addWidget(self.pushButton)
+        spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_8.addItem(spacerItem12)
+        self.gridLayout_8.addLayout(self.horizontalLayout_8, 1, 1, 1, 1)
+        self.label_34 = QtWidgets.QLabel(self.gridLayoutWidget_7)
+        self.label_34.setObjectName("label_34")
+        self.gridLayout_8.addWidget(self.label_34, 0, 0, 1, 1)
+        self.user_delete_frame_user_select = QtWidgets.QComboBox(self.gridLayoutWidget_7)
+        self.user_delete_frame_user_select.setObjectName("user_delete_frame_user_select")
+        self.gridLayout_8.addWidget(self.user_delete_frame_user_select, 0, 1, 1, 1)
+        self.user_delete_confirm = QtWidgets.QRadioButton(self.gridLayoutWidget_7)
+        self.user_delete_confirm.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft)
+        self.user_delete_confirm.setObjectName("user_delete_confirm")
+        self.gridLayout_8.addWidget(self.user_delete_confirm, 1, 0, 1, 1)
+        spacerItem13 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.gridLayout_8.addItem(spacerItem13, 0, 2, 1, 1)
+        self.user_delete_err_message = QtWidgets.QLabel(self.gridLayoutWidget_7)
+        self.user_delete_err_message.setText("")
+        self.user_delete_err_message.setObjectName("user_delete_err_message")
+        self.gridLayout_8.addWidget(self.user_delete_err_message, 1, 2, 1, 1)
+        self.user_edit_frame = QtWidgets.QFrame(self.tab_5)
+        self.user_edit_frame.setGeometry(QtCore.QRect(10, 60, 591, 141))
+        self.user_edit_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.user_edit_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.user_edit_frame.setObjectName("user_edit_frame")
+        self.gridLayoutWidget_10 = QtWidgets.QWidget(self.user_edit_frame)
+        self.gridLayoutWidget_10.setGeometry(QtCore.QRect(0, 0, 581, 141))
+        self.gridLayoutWidget_10.setObjectName("gridLayoutWidget_10")
+        self.gridLayout_11 = QtWidgets.QGridLayout(self.gridLayoutWidget_10)
+        self.gridLayout_11.setContentsMargins(0, 0, 0, 0)
+        self.gridLayout_11.setObjectName("gridLayout_11")
+        self.user_edit_frame_role_select = QtWidgets.QComboBox(self.gridLayoutWidget_10)
+        self.user_edit_frame_role_select.setObjectName("user_edit_frame_role_select")
+        self.gridLayout_11.addWidget(self.user_edit_frame_role_select, 0, 3, 1, 1)
+        self.label_38 = QtWidgets.QLabel(self.gridLayoutWidget_10)
+        self.label_38.setObjectName("label_38")
+        self.gridLayout_11.addWidget(self.label_38, 0, 0, 1, 1)
+        self.user_edit_frame_user_select = QtWidgets.QComboBox(self.gridLayoutWidget_10)
+        self.user_edit_frame_user_select.setMaximumSize(QtCore.QSize(150, 16777215))
+        self.user_edit_frame_user_select.setObjectName("user_edit_frame_user_select")
+        self.gridLayout_11.addWidget(self.user_edit_frame_user_select, 0, 1, 1, 1)
+        self.update_user = QtWidgets.QPushButton(self.gridLayoutWidget_10)
+        self.update_user.setObjectName("update_user")
+        self.gridLayout_11.addWidget(self.update_user, 1, 3, 1, 1)
+        self.label_40 = QtWidgets.QLabel(self.gridLayoutWidget_10)
+        self.label_40.setObjectName("label_40")
+        self.gridLayout_11.addWidget(self.label_40, 0, 2, 1, 1)
+        self.label_39 = QtWidgets.QLabel(self.gridLayoutWidget_10)
+        self.label_39.setObjectName("label_39")
+        self.gridLayout_11.addWidget(self.label_39, 1, 0, 1, 1)
+        self.user_edit_frame_new_password = QtWidgets.QLineEdit(self.gridLayoutWidget_10)
+        self.user_edit_frame_new_password.setMaximumSize(QtCore.QSize(150, 16777215))
+        self.user_edit_frame_new_password.setObjectName("user_edit_frame_new_password")
+        self.gridLayout_11.addWidget(self.user_edit_frame_new_password, 1, 1, 1, 1)
+        spacerItem14 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.gridLayout_11.addItem(spacerItem14, 0, 4, 1, 1)
+        self.edit_faculty_member = QtWidgets.QFrame(self.tab_5)
+        self.edit_faculty_member.setGeometry(QtCore.QRect(10, 60, 1051, 191))
+        self.edit_faculty_member.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.edit_faculty_member.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.edit_faculty_member.setObjectName("edit_faculty_member")
+        self.gridLayoutWidget_11 = QtWidgets.QWidget(self.edit_faculty_member)
+        self.gridLayoutWidget_11.setGeometry(QtCore.QRect(0, 0, 751, 223))
+        self.gridLayoutWidget_11.setObjectName("gridLayoutWidget_11")
+        self.gridLayout_12 = QtWidgets.QGridLayout(self.gridLayoutWidget_11)
+        self.gridLayout_12.setContentsMargins(0, 0, 0, 0)
+        self.gridLayout_12.setObjectName("gridLayout_12")
+        self.formLayout_2 = QtWidgets.QFormLayout()
+        self.formLayout_2.setObjectName("formLayout_2")
+        self.label_43 = QtWidgets.QLabel(self.gridLayoutWidget_11)
+        self.label_43.setObjectName("label_43")
+        self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_43)
+        self.edit_faculty_member_new_title = QtWidgets.QComboBox(self.gridLayoutWidget_11)
+        self.edit_faculty_member_new_title.setObjectName("edit_faculty_member_new_title")
+        self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.edit_faculty_member_new_title)
+        self.label_44 = QtWidgets.QLabel(self.gridLayoutWidget_11)
+        self.label_44.setObjectName("label_44")
+        self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_44)
+        self.edit_faculty_member_new_surname = QtWidgets.QLineEdit(self.gridLayoutWidget_11)
+        self.edit_faculty_member_new_surname.setObjectName("edit_faculty_member_new_surname")
+        self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.edit_faculty_member_new_surname)
+        self.label_45 = QtWidgets.QLabel(self.gridLayoutWidget_11)
+        self.label_45.setObjectName("label_45")
+        self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_45)
+        self.user_faculty_member_new_name = QtWidgets.QLineEdit(self.gridLayoutWidget_11)
+        self.user_faculty_member_new_name.setObjectName("user_faculty_member_new_name")
+        self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.user_faculty_member_new_name)
+        self.gridLayout_12.addLayout(self.formLayout_2, 2, 2, 1, 1)
+        self.formLayout_4 = QtWidgets.QFormLayout()
+        self.formLayout_4.setObjectName("formLayout_4")
+        self.edit_faculty_member_title = QtWidgets.QLineEdit(self.gridLayoutWidget_11)
+        self.edit_faculty_member_title.setFocusPolicy(QtCore.Qt.FocusPolicy.TabFocus)
+        self.edit_faculty_member_title.setReadOnly(True)
+        self.edit_faculty_member_title.setObjectName("edit_faculty_member_title")
+        self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.edit_faculty_member_title)
+        self.edit_faculty_member_select_member = QtWidgets.QComboBox(self.gridLayoutWidget_11)
+        self.edit_faculty_member_select_member.setObjectName("edit_faculty_member_select_member")
+        self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.edit_faculty_member_select_member)
+        self.label_46 = QtWidgets.QLabel(self.gridLayoutWidget_11)
+        self.label_46.setObjectName("label_46")
+        self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_46)
+        self.faculty_member_old_telnr = QtWidgets.QLineEdit(self.gridLayoutWidget_11)
+        self.faculty_member_old_telnr.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus)
+        self.faculty_member_old_telnr.setReadOnly(True)
+        self.faculty_member_old_telnr.setObjectName("faculty_member_old_telnr")
+        self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.faculty_member_old_telnr)
+        self.label_49 = QtWidgets.QLabel(self.gridLayoutWidget_11)
+        self.label_49.setObjectName("label_49")
+        self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_49)
+        self.faculty_member_oldmail = QtWidgets.QLineEdit(self.gridLayoutWidget_11)
+        self.faculty_member_oldmail.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.faculty_member_oldmail.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone)
+        self.faculty_member_oldmail.setReadOnly(True)
+        self.faculty_member_oldmail.setObjectName("faculty_member_oldmail")
+        self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.faculty_member_oldmail)
+        self.gridLayout_12.addLayout(self.formLayout_4, 0, 2, 1, 1)
+        self.formLayout_5 = QtWidgets.QFormLayout()
+        self.formLayout_5.setObjectName("formLayout_5")
+        self.label_47 = QtWidgets.QLabel(self.gridLayoutWidget_11)
+        self.label_47.setObjectName("label_47")
+        self.formLayout_5.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_47)
+        self.label_48 = QtWidgets.QLabel(self.gridLayoutWidget_11)
+        self.label_48.setObjectName("label_48")
+        self.formLayout_5.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_48)
+        self.lineEdit = QtWidgets.QLineEdit(self.gridLayoutWidget_11)
+        self.lineEdit.setObjectName("lineEdit")
+        self.formLayout_5.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.lineEdit)
+        self.lineEdit_5 = QtWidgets.QLineEdit(self.gridLayoutWidget_11)
+        self.lineEdit_5.setObjectName("lineEdit_5")
+        self.formLayout_5.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.lineEdit_5)
+        self.gridLayout_12.addLayout(self.formLayout_5, 2, 4, 1, 1)
+        self.label_41 = QtWidgets.QLabel(self.gridLayoutWidget_11)
+        self.label_41.setObjectName("label_41")
+        self.gridLayout_12.addWidget(self.label_41, 0, 0, 1, 1)
+        self.update_faculty_member = QtWidgets.QPushButton(self.gridLayoutWidget_11)
+        self.update_faculty_member.setObjectName("update_faculty_member")
+        self.gridLayout_12.addWidget(self.update_faculty_member, 3, 4, 1, 1)
+        self.label_42 = QtWidgets.QLabel(self.gridLayoutWidget_11)
+        self.label_42.setObjectName("label_42")
+        self.gridLayout_12.addWidget(self.label_42, 2, 0, 1, 1)
+        self.tabWidget.addTab(self.tab_5, "")
+        self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
+        self.horizontalLayout.addLayout(self.gridLayout)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
+        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(1280, 360, 311, 391))
+        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
+        self.horizontalLayout_6 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
+        self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
+        self.frame_creation_progress = QtWidgets.QFrame(self.horizontalLayoutWidget)
+        self.frame_creation_progress.setObjectName("frame_creation_progress")
+        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frame_creation_progress)
+        self.verticalLayout_4.setSpacing(6)
+        self.verticalLayout_4.setObjectName("verticalLayout_4")
+        self.groupBox_2 = QtWidgets.QGroupBox(self.frame_creation_progress)
+        self.groupBox_2.setEnabled(True)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth())
+        self.groupBox_2.setSizePolicy(sizePolicy)
+        self.groupBox_2.setObjectName("groupBox_2")
+        self.appdata_check = QtWidgets.QCheckBox(self.groupBox_2)
+        self.appdata_check.setGeometry(QtCore.QRect(20, 30, 241, 41))
+        font = QtGui.QFont()
+        font.setPointSize(8)
+        font.setBold(False)
+        font.setWeight(50)
+        self.appdata_check.setFont(font)
+        self.appdata_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.appdata_check.setObjectName("appdata_check")
+        self.media_check = QtWidgets.QCheckBox(self.groupBox_2)
+        self.media_check.setGeometry(QtCore.QRect(20, 70, 241, 41))
+        font = QtGui.QFont()
+        font.setPointSize(8)
+        font.setBold(False)
+        font.setWeight(50)
+        self.media_check.setFont(font)
+        self.media_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.media_check.setObjectName("media_check")
+        self.ids_check = QtWidgets.QCheckBox(self.groupBox_2)
+        self.ids_check.setGeometry(QtCore.QRect(20, 140, 241, 41))
+        font = QtGui.QFont()
+        font.setPointSize(8)
+        font.setBold(False)
+        font.setWeight(50)
+        self.ids_check.setFont(font)
+        self.ids_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.ids_check.setObjectName("ids_check")
+        self.verticalLayout_4.addWidget(self.groupBox_2)
+        self.groupBox = QtWidgets.QGroupBox(self.frame_creation_progress)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
+        self.groupBox.setSizePolicy(sizePolicy)
+        self.groupBox.setObjectName("groupBox")
+        self.media_checked = QtWidgets.QCheckBox(self.groupBox)
+        self.media_checked.setGeometry(QtCore.QRect(20, 30, 241, 41))
+        font = QtGui.QFont()
+        font.setPointSize(8)
+        font.setBold(False)
+        font.setItalic(False)
+        font.setUnderline(False)
+        font.setWeight(50)
+        font.setKerning(True)
+        font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault)
+        self.media_checked.setFont(font)
+        self.media_checked.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.media_checked.setObjectName("media_checked")
+        self.media_edited_check = QtWidgets.QCheckBox(self.groupBox)
+        self.media_edited_check.setGeometry(QtCore.QRect(20, 70, 241, 41))
+        font = QtGui.QFont()
+        font.setPointSize(8)
+        font.setBold(False)
+        font.setItalic(False)
+        font.setUnderline(False)
+        font.setWeight(50)
+        font.setKerning(True)
+        font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault)
+        self.media_edited_check.setFont(font)
+        self.media_edited_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.media_edited_check.setObjectName("media_edited_check")
+        self.app_created = QtWidgets.QCheckBox(self.groupBox)
+        self.app_created.setGeometry(QtCore.QRect(20, 110, 161, 41))
+        font = QtGui.QFont()
+        font.setPointSize(8)
+        font.setBold(False)
+        font.setItalic(False)
+        font.setUnderline(False)
+        font.setWeight(50)
+        font.setKerning(True)
+        font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault)
+        self.app_created.setFont(font)
+        self.app_created.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.app_created.setObjectName("app_created")
+        self.btn_copy_adis_command = QtWidgets.QPushButton(self.groupBox)
+        self.btn_copy_adis_command.setGeometry(QtCore.QRect(170, 120, 101, 23))
+        font = QtGui.QFont()
+        font.setPointSize(8)
+        font.setBold(False)
+        font.setItalic(False)
+        font.setUnderline(False)
+        font.setWeight(50)
+        font.setKerning(True)
+        font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault)
+        self.btn_copy_adis_command.setFont(font)
+        self.btn_copy_adis_command.setStatusTip("")
+        self.btn_copy_adis_command.setWhatsThis("")
+        self.btn_copy_adis_command.setAccessibleDescription("")
+        self.btn_copy_adis_command.setAutoFillBackground(False)
+        icon = QtGui.QIcon()
+        icon.addPixmap(QtGui.QPixmap("c:\\Users\\aky547\\GitHub\\Semesterapparate-refactor\\src\\ui\\../../../.designer/backup/icons/information.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
+        self.btn_copy_adis_command.setIcon(icon)
+        self.btn_copy_adis_command.setCheckable(False)
+        self.btn_copy_adis_command.setChecked(False)
+        self.btn_copy_adis_command.setAutoDefault(False)
+        self.btn_copy_adis_command.setObjectName("btn_copy_adis_command")
+        self.verticalLayout_4.addWidget(self.groupBox)
+        self.horizontalLayout_6.addWidget(self.frame_creation_progress)
+        self.frame_2 = QtWidgets.QFrame(self.centralwidget)
+        self.frame_2.setGeometry(QtCore.QRect(1280, 10, 301, 341))
+        self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.frame_2.setObjectName("frame_2")
+        self.calendarWidget = QtWidgets.QCalendarWidget(self.frame_2)
+        self.calendarWidget.setGeometry(QtCore.QRect(0, 0, 291, 191))
+        self.calendarWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.calendarWidget.setGridVisible(True)
+        self.calendarWidget.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.VerticalHeaderFormat.NoVerticalHeader)
+        self.calendarWidget.setObjectName("calendarWidget")
+        self.message_frame = QtWidgets.QFrame(self.frame_2)
+        self.message_frame.setGeometry(QtCore.QRect(0, 210, 301, 121))
+        self.message_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.message_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.message_frame.setObjectName("message_frame")
+        self.label_14 = QtWidgets.QLabel(self.message_frame)
+        self.label_14.setGeometry(QtCore.QRect(10, 10, 47, 20))
+        self.label_14.setObjectName("label_14")
+        self.line_app_info = QtWidgets.QLineEdit(self.message_frame)
+        self.line_app_info.setEnabled(True)
+        self.line_app_info.setGeometry(QtCore.QRect(60, 10, 31, 20))
+        self.line_app_info.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.line_app_info.setObjectName("line_app_info")
+        self.message_box = QtWidgets.QTextEdit(self.message_frame)
+        self.message_box.setGeometry(QtCore.QRect(10, 40, 281, 71))
+        self.message_box.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.message_box.setObjectName("message_box")
+        self.btn_delete_message = QtWidgets.QPushButton(self.message_frame)
+        self.btn_delete_message.setGeometry(QtCore.QRect(130, 10, 75, 23))
+        self.btn_delete_message.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+        self.btn_delete_message.setObjectName("btn_delete_message")
+        self.spin_select_message = QtWidgets.QSpinBox(self.message_frame)
+        self.spin_select_message.setGeometry(QtCore.QRect(210, 10, 74, 22))
+        self.spin_select_message.setMinimum(1)
+        self.spin_select_message.setObjectName("spin_select_message")
+        self.label_total_day_messages = QtWidgets.QLabel(self.message_frame)
+        self.label_total_day_messages.setGeometry(QtCore.QRect(260, 10, 21, 22))
+        self.label_total_day_messages.setObjectName("label_total_day_messages")
+        MainWindow.setCentralWidget(self.centralwidget)
+        self.menubar = QtWidgets.QMenuBar(MainWindow)
+        self.menubar.setGeometry(QtCore.QRect(0, 0, 1593, 21))
+        self.menubar.setObjectName("menubar")
+        self.menuDatei = QtWidgets.QMenu(self.menubar)
+        self.menuDatei.setObjectName("menuDatei")
+        self.menuEinstellungen = QtWidgets.QMenu(self.menubar)
+        self.menuEinstellungen.setObjectName("menuEinstellungen")
+        MainWindow.setMenuBar(self.menubar)
+        self.statusbar = QtWidgets.QStatusBar(MainWindow)
+        self.statusbar.setObjectName("statusbar")
+        MainWindow.setStatusBar(self.statusbar)
+        self.actionBeenden = QtGui.QAction(MainWindow)
+        self.actionBeenden.setShortcutVisibleInContextMenu(True)
+        self.actionBeenden.setObjectName("actionBeenden")
+        self.actionEinstellungen = QtGui.QAction(MainWindow)
+        self.actionEinstellungen.setShortcutVisibleInContextMenu(True)
+        self.actionEinstellungen.setObjectName("actionEinstellungen")
+        self.menuDatei.addAction(self.actionBeenden)
+        self.menuEinstellungen.addAction(self.actionEinstellungen)
+        self.menubar.addAction(self.menuDatei.menuAction())
+        self.menubar.addAction(self.menuEinstellungen.menuAction())
+
+        self.retranslateUi(MainWindow)
+        self.tabWidget.setCurrentIndex(0)
+        self.tabWidget_2.setCurrentIndex(0)
+        self.stackedWidget_4.setCurrentIndex(1)
+        self.tabWidget_3.setCurrentIndex(1)
+        QtCore.QMetaObject.connectSlotsByName(MainWindow)
+        MainWindow.setTabOrder(self.drpdwn_app_nr, self.drpdwn_prof_title)
+        MainWindow.setTabOrder(self.drpdwn_prof_title, self.drpdwn_prof_name)
+        MainWindow.setTabOrder(self.drpdwn_prof_name, self.prof_mail)
+        MainWindow.setTabOrder(self.prof_mail, self.prof_tel_nr)
+        MainWindow.setTabOrder(self.prof_tel_nr, self.app_name)
+        MainWindow.setTabOrder(self.app_name, self.sem_year)
+        MainWindow.setTabOrder(self.sem_year, self.check_eternal_app)
+        MainWindow.setTabOrder(self.check_eternal_app, self.btn_add_document)
+        MainWindow.setTabOrder(self.btn_add_document, self.btn_open_document)
+        MainWindow.setTabOrder(self.btn_open_document, self.check_file)
+        MainWindow.setTabOrder(self.check_file, self.btn_apparat_save)
+        MainWindow.setTabOrder(self.btn_apparat_save, self.btn_apparat_apply)
+        MainWindow.setTabOrder(self.btn_apparat_apply, self.check_send_mail)
+        MainWindow.setTabOrder(self.check_send_mail, self.chkbx_show_del_media)
+        MainWindow.setTabOrder(self.chkbx_show_del_media, self.btn_reserve)
+        MainWindow.setTabOrder(self.btn_reserve, self.prof_id_adis)
+        MainWindow.setTabOrder(self.prof_id_adis, self.apparat_id_adis)
+        MainWindow.setTabOrder(self.apparat_id_adis, self.tabWidget_2)
+        MainWindow.setTabOrder(self.tabWidget_2, self.btn_del_select_apparats)
+        MainWindow.setTabOrder(self.btn_del_select_apparats, self.tabWidget_3)
+        MainWindow.setTabOrder(self.tabWidget_3, self.select_action_box)
+        MainWindow.setTabOrder(self.select_action_box, self.user_create_frame_username)
+        MainWindow.setTabOrder(self.user_create_frame_username, self.user_frame_userrole)
+        MainWindow.setTabOrder(self.user_frame_userrole, self.user_create_frame_password)
+        MainWindow.setTabOrder(self.user_create_frame_password, self.user_frame_addUser)
+        MainWindow.setTabOrder(self.user_frame_addUser, self.user_delete_frame_user_select)
+        MainWindow.setTabOrder(self.user_delete_frame_user_select, self.user_delete_confirm)
+        MainWindow.setTabOrder(self.user_delete_confirm, self.pushButton)
+        MainWindow.setTabOrder(self.pushButton, self.user_edit_frame_user_select)
+        MainWindow.setTabOrder(self.user_edit_frame_user_select, self.user_edit_frame_role_select)
+        MainWindow.setTabOrder(self.user_edit_frame_role_select, self.user_edit_frame_new_password)
+        MainWindow.setTabOrder(self.user_edit_frame_new_password, self.update_user)
+        MainWindow.setTabOrder(self.update_user, self.edit_faculty_member_title)
+        MainWindow.setTabOrder(self.edit_faculty_member_title, self.edit_faculty_member_select_member)
+        MainWindow.setTabOrder(self.edit_faculty_member_select_member, self.faculty_member_old_telnr)
+        MainWindow.setTabOrder(self.faculty_member_old_telnr, self.faculty_member_oldmail)
+        MainWindow.setTabOrder(self.faculty_member_oldmail, self.edit_faculty_member_new_title)
+        MainWindow.setTabOrder(self.edit_faculty_member_new_title, self.edit_faculty_member_new_surname)
+        MainWindow.setTabOrder(self.edit_faculty_member_new_surname, self.user_faculty_member_new_name)
+        MainWindow.setTabOrder(self.user_faculty_member_new_name, self.lineEdit)
+        MainWindow.setTabOrder(self.lineEdit, self.lineEdit_5)
+        MainWindow.setTabOrder(self.lineEdit_5, self.update_faculty_member)
+        MainWindow.setTabOrder(self.update_faculty_member, self.box_fach)
+        MainWindow.setTabOrder(self.box_fach, self.box_person)
+        MainWindow.setTabOrder(self.box_person, self.btn_search)
+        MainWindow.setTabOrder(self.btn_search, self.check_deletable)
+        MainWindow.setTabOrder(self.check_deletable, self.box_erstellsemester)
+        MainWindow.setTabOrder(self.box_erstellsemester, self.box_semester)
+        MainWindow.setTabOrder(self.box_semester, self.box_dauerapp)
+        MainWindow.setTabOrder(self.box_dauerapp, self.box_appnrs)
+        MainWindow.setTabOrder(self.box_appnrs, self.btn_copy_adis_command)
+        MainWindow.setTabOrder(self.btn_copy_adis_command, self.spin_select_message)
+
+    def retranslateUi(self, MainWindow):
+        _translate = QtCore.QCoreApplication.translate
+        MainWindow.setWindowTitle(_translate("MainWindow", "Semesterapparatsmanagement"))
+        self.load_app.setToolTip(_translate("MainWindow", "Load the Semesterapparate from the database"))
+        self.load_app.setText(_translate("MainWindow", "App. aufrufen"))
+        self.create_new_app.setText(_translate("MainWindow", "neu. App anlegen"))
+        self.cancel_active_selection.setText(_translate("MainWindow", "Auswahl abbrechen"))
+        self.tableWidget_apparate.setSortingEnabled(True)
+        item = self.tableWidget_apparate.horizontalHeaderItem(0)
+        item.setText(_translate("MainWindow", "AppNr"))
+        item = self.tableWidget_apparate.horizontalHeaderItem(1)
+        item.setText(_translate("MainWindow", "App Name"))
+        item = self.tableWidget_apparate.horizontalHeaderItem(2)
+        item.setText(_translate("MainWindow", "Professor"))
+        item = self.tableWidget_apparate.horizontalHeaderItem(3)
+        item.setText(_translate("MainWindow", "gültig bis"))
+        item = self.tableWidget_apparate.horizontalHeaderItem(4)
+        item.setText(_translate("MainWindow", "Dauerapparat"))
+        item = self.tableWidget_apparate.horizontalHeaderItem(5)
+        item.setText(_translate("MainWindow", "KontoNr"))
+        self.app_group_box.setTitle(_translate("MainWindow", "Apparatsdetails"))
+        item = self.dokument_list.horizontalHeaderItem(0)
+        item.setText(_translate("MainWindow", "Dokumentname"))
+        item = self.dokument_list.horizontalHeaderItem(1)
+        item.setText(_translate("MainWindow", "Dateityp"))
+        item = self.dokument_list.horizontalHeaderItem(2)
+        item.setText(_translate("MainWindow", "Neu?"))
+        item = self.dokument_list.horizontalHeaderItem(3)
+        item.setText(_translate("MainWindow", "path"))
+        self.label_5.setText(_translate("MainWindow", "Apparatsname"))
+        self.sem_winter.setText(_translate("MainWindow", "Winter"))
+        self.label_4.setText(_translate("MainWindow", "Prof. Name"))
+        self.sem_sommer.setText(_translate("MainWindow", "Sommer"))
+        self.label_3.setText(_translate("MainWindow", "Prof. Titel"))
+        self.label_6.setText(_translate("MainWindow", "Semester"))
+        self.sem_year.setPlaceholderText(_translate("MainWindow", "2023"))
+        self.label_2.setText(_translate("MainWindow", "Apparatsnummer"))
+        self.btn_apparat_save.setText(_translate("MainWindow", "Speichern"))
+        self.btn_apparat_apply.setText(_translate("MainWindow", "Aktualisieren"))
+        self.check_eternal_app.setText(_translate("MainWindow", "Dauerapparat"))
+        self.label_8.setText(_translate("MainWindow", "Mail"))
+        self.label_9.setText(_translate("MainWindow", "Tel"))
+        self.label_10.setText(_translate("MainWindow", "Fach"))
+        self.mail_mand.setText(_translate("MainWindow", "*"))
+        self.telnr_mand.setText(_translate("MainWindow", "*"))
+        self.profname_mand.setText(_translate("MainWindow", "*"))
+        self.appname_mand.setText(_translate("MainWindow", "*"))
+        self.fach_mand.setText(_translate("MainWindow", "*"))
+        self._mand.setText(_translate("MainWindow", "*"))
+        self.btn_add_document.setText(_translate("MainWindow", "Dokument hinzufügen"))
+        self.btn_open_document.setText(_translate("MainWindow", "Dokument öffnen"))
+        self.check_file.setToolTip(_translate("MainWindow", "Abhängig von der Anzahl der Medien kann die Suche sehr lange dauern"))
+        self.check_file.setText(_translate("MainWindow", "Medien aus Dokument\n"
+" hinzufügen"))
+        self.label_12.setText(_translate("MainWindow", "Prof-ID-aDIS"))
+        self.label_13.setText(_translate("MainWindow", "Apparat-ID-aDIS"))
+        self.check_send_mail.setText(_translate("MainWindow", "Mail senden"))
+        self.tableWidget_apparat_media.setSortingEnabled(True)
+        item = self.tableWidget_apparat_media.horizontalHeaderItem(0)
+        item.setText(_translate("MainWindow", "Buchtitel"))
+        item = self.tableWidget_apparat_media.horizontalHeaderItem(1)
+        item.setText(_translate("MainWindow", "Signatur"))
+        item = self.tableWidget_apparat_media.horizontalHeaderItem(2)
+        item.setText(_translate("MainWindow", "Auflage"))
+        item = self.tableWidget_apparat_media.horizontalHeaderItem(3)
+        item.setText(_translate("MainWindow", "Autor"))
+        item = self.tableWidget_apparat_media.horizontalHeaderItem(4)
+        item.setText(_translate("MainWindow", "verfügbar?"))
+        item = self.tableWidget_apparat_media.horizontalHeaderItem(5)
+        item.setText(_translate("MainWindow", "Vorgemerkt"))
+        item = self.tableWidget_apparat_media.horizontalHeaderItem(6)
+        item.setText(_translate("MainWindow", "Link"))
+        self.label.setText(_translate("MainWindow", "  Medienliste"))
+        self.chkbx_show_del_media.setText(_translate("MainWindow", "gel. Medien anzeigen"))
+        self.btn_reserve.setText(_translate("MainWindow", "im Apparat?"))
+        self.label_info.setText(_translate("MainWindow", "Medien werden hinzugefügt"))
+        self.progress_label.setText(_translate("MainWindow", "Medium x/y"))
+        self.label_20.setText(_translate("MainWindow", "Medien werden geprüft"))
+        self.avail_status.setText(_translate("MainWindow", "TextLabel"))
+        self.add_medium.setText(_translate("MainWindow", "Medien hinzufügen"))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Anlegen"))
+        self.btn_search.setText(_translate("MainWindow", "Suchen"))
+        self.label_7.setText(_translate("MainWindow", "Appnr.:"))
+        self.label_18.setText(_translate("MainWindow", "Dauerapp:"))
+        self.label_17.setText(_translate("MainWindow", "Endsemester:"))
+        self.label_19.setText(_translate("MainWindow", "Erstellsemester:"))
+        self.label_11.setText(_translate("MainWindow", "Person:"))
+        self.label_16.setText(_translate("MainWindow", "Fach:"))
+        self.label_15.setText(_translate("MainWindow", "Löschbar"))
+        self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_3), _translate("MainWindow", "Statistik"))
+        self.label_25.setText(_translate("MainWindow", "Signatur"))
+        self.book_search.setText(_translate("MainWindow", "Suche"))
+        self.label_26.setText(_translate("MainWindow", "Titel"))
+        self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_4), _translate("MainWindow", "Suchen"))
+        item = self.statistics_table.horizontalHeaderItem(0)
+        item.setText(_translate("MainWindow", "Semester"))
+        item = self.statistics_table.horizontalHeaderItem(1)
+        item.setText(_translate("MainWindow", "Zugang"))
+        item = self.statistics_table.horizontalHeaderItem(2)
+        item.setText(_translate("MainWindow", "Abgang"))
+        self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.tab_6), _translate("MainWindow", "Tabelle"))
+        self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.tab_7), _translate("MainWindow", "Erstellte und gelöschte Semesterapparate"))
+        self.btn_del_select_apparats.setText(_translate("MainWindow", "Ausgewählte Löschen"))
+        item = self.tableWidget.horizontalHeaderItem(1)
+        item.setText(_translate("MainWindow", "Apparatsname"))
+        item = self.tableWidget.horizontalHeaderItem(2)
+        item.setText(_translate("MainWindow", "Apparatsnummer"))
+        item = self.tableWidget.horizontalHeaderItem(3)
+        item.setText(_translate("MainWindow", "Person"))
+        item = self.tableWidget.horizontalHeaderItem(4)
+        item.setText(_translate("MainWindow", "Fach"))
+        item = self.book_search_result.horizontalHeaderItem(0)
+        item.setText(_translate("MainWindow", "Titel"))
+        item = self.book_search_result.horizontalHeaderItem(1)
+        item.setText(_translate("MainWindow", "Signatur"))
+        item = self.book_search_result.horizontalHeaderItem(2)
+        item.setText(_translate("MainWindow", "Apparat"))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Suchen / Statistik"))
+        self.label_21.setText(_translate("MainWindow", "Aktion:"))
+        self.select_action_box.setItemText(0, _translate("MainWindow", "Nutzer anlegen"))
+        self.select_action_box.setItemText(1, _translate("MainWindow", "Nutzer löschen"))
+        self.select_action_box.setItemText(2, _translate("MainWindow", "Nutzer aktualisieren"))
+        self.select_action_box.setItemText(3, _translate("MainWindow", "Lehrperson bearbeiten"))
+        self.label_22.setText(_translate("MainWindow", "Nutzername"))
+        self.label_24.setText(_translate("MainWindow", "Rolle"))
+        self.label_23.setText(_translate("MainWindow", "Passwort"))
+        self.user_frame_addUser.setText(_translate("MainWindow", "Anlegen"))
+        self.pushButton.setText(_translate("MainWindow", "Nutzer löschen"))
+        self.label_34.setText(_translate("MainWindow", "Nutzername"))
+        self.user_delete_confirm.setText(_translate("MainWindow", "Wirklich löschen?"))
+        self.label_38.setText(_translate("MainWindow", "Nutzername"))
+        self.update_user.setText(_translate("MainWindow", "Aktualisieren"))
+        self.label_40.setText(_translate("MainWindow", "Rolle"))
+        self.label_39.setText(_translate("MainWindow", "Neues Passwort"))
+        self.label_43.setText(_translate("MainWindow", "Titel"))
+        self.label_44.setText(_translate("MainWindow", "Vorname"))
+        self.label_45.setText(_translate("MainWindow", "Nachname"))
+        self.label_46.setText(_translate("MainWindow", "Telefonnummer"))
+        self.label_49.setText(_translate("MainWindow", "Mail"))
+        self.label_47.setText(_translate("MainWindow", "Mail"))
+        self.label_48.setText(_translate("MainWindow", "Telefon"))
+        self.label_41.setText(_translate("MainWindow", "Alte Angaben"))
+        self.update_faculty_member.setText(_translate("MainWindow", "Aktualisieren"))
+        self.label_42.setText(_translate("MainWindow", "Neue Angaben"))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_5), _translate("MainWindow", "Admin"))
+        self.groupBox_2.setTitle(_translate("MainWindow", "Software"))
+        self.appdata_check.setText(_translate("MainWindow", "Apparatsdaten eingegeben"))
+        self.media_check.setText(_translate("MainWindow", "Medien hinzugefügt / importiert"))
+        self.ids_check.setText(_translate("MainWindow", "Prof-ID und Apparat-ID eingetragen"))
+        self.groupBox.setTitle(_translate("MainWindow", "aDIS"))
+        self.media_checked.setText(_translate("MainWindow", "Medien geprüft"))
+        self.media_edited_check.setText(_translate("MainWindow", "Medien bearbeitet"))
+        self.app_created.setText(_translate("MainWindow", "Apparat angelegt"))
+        self.btn_copy_adis_command.setToolTip(_translate("MainWindow", "Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren"))
+        self.btn_copy_adis_command.setText(_translate("MainWindow", " aDIS Abfrage"))
+        self.label_14.setText(_translate("MainWindow", "Apparat"))
+        self.btn_delete_message.setText(_translate("MainWindow", "Löschen"))
+        self.label_total_day_messages.setText(_translate("MainWindow", "TextLabel"))
+        self.menuDatei.setTitle(_translate("MainWindow", "Datei"))
+        self.menuEinstellungen.setTitle(_translate("MainWindow", "Bearbeiten"))
+        self.actionBeenden.setText(_translate("MainWindow", "Beenden"))
+        self.actionBeenden.setShortcut(_translate("MainWindow", "Ctrl+Q"))
+        self.actionEinstellungen.setText(_translate("MainWindow", "Einstellungen"))
+        self.actionEinstellungen.setShortcut(_translate("MainWindow", "Alt+S"))
diff --git a/src/ui/Ui_semesterapparat_ui.ts b/src/ui/Ui_semesterapparat_ui.ts
new file mode 100644
index 0000000..69b16be
--- /dev/null
+++ b/src/ui/Ui_semesterapparat_ui.ts
@@ -0,0 +1,232 @@
+
+
+
+
+    MainWindow
+    
+        
+        MainWindow
+        
+    
+    
+        
+        Load the Semesterapparate from the database
+        
+    
+    
+        
+        App. aufrufen
+        
+    
+    
+        
+        neu. App anlegen
+        
+    
+    
+        
+        Auswahl abbrechen
+        
+    
+    
+        
+        AppNr
+        
+    
+    
+        
+        App Name
+        
+    
+    
+        
+        Professor
+        
+    
+    
+        
+        gültig bis
+        
+    
+    
+        
+        Dauerapparat
+        
+    
+    
+        
+        KontoNr
+        
+    
+    
+        
+        Apparatsdetails
+        
+    
+    
+        
+        Dokumentname
+        
+    
+    
+        
+        Dateityp
+        
+    
+    
+        
+        Neu?
+        
+    
+    
+        
+        path
+        
+    
+    
+        
+        Apparatsname
+        
+    
+    
+        
+        Winter
+        
+    
+    
+        
+        Prof. Name
+        
+    
+    
+        
+        Sommer
+        
+    
+    
+        
+        Prof. Titel
+        
+    
+    
+        
+        Semester
+        
+    
+    
+        
+        2023
+        
+    
+    
+        
+        Apparatsnummer
+        
+    
+    
+        
+        Speichern
+        
+    
+    
+        
+        Aktualisieren
+        
+    
+    
+        
+        Mail
+        
+    
+    
+        
+        Tel
+        
+    
+    
+        
+        Fach
+        
+    
+    
+        
+        *
+        
+    
+    
+        
+        Dokument hinzufügen
+        
+    
+    
+        
+        Dokument öffnen
+        
+    
+    
+        
+        Buchtitel
+        
+    
+    
+        
+        Signatur
+        
+    
+    
+        
+        Auflage
+        
+    
+    
+        
+        Autor
+        
+    
+    
+        
+        Link
+        
+    
+    
+        
+          Medienliste
+        
+    
+    
+        
+        gel. Medien anzeigen
+        
+    
+    
+        
+        Medien hinzufügen
+        
+    
+    
+        
+        Tab 1
+        
+    
+    
+        
+        Tab 2
+        
+    
+    
+        
+        Datei
+        
+    
+    
+        
+        Einstellungen
+        
+    
+    
+        
+        Beenden
+        
+    
+
+
diff --git a/src/ui/Ui_setupwizard.py b/src/ui/Ui_setupwizard.py
new file mode 100644
index 0000000..c12fc49
--- /dev/null
+++ b/src/ui/Ui_setupwizard.py
@@ -0,0 +1,71 @@
+# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\setupwizard.ui'
+#
+# Created by: PyQt6 UI code generator 6.3.1
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic6 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt6 import QtCore, QtGui, QtWidgets
+
+
+class Ui_Wizard(object):
+    def setupUi(self, Wizard):
+        Wizard.setObjectName("Wizard")
+        Wizard.resize(640, 480)
+        Wizard.setMaximumSize(QtCore.QSize(640, 480))
+        self.wizardPage1 = QtWidgets.QWizardPage()
+        self.wizardPage1.setObjectName("wizardPage1")
+        self.textBrowser = QtWidgets.QTextBrowser(self.wizardPage1)
+        self.textBrowser.setGeometry(QtCore.QRect(200, 10, 256, 192))
+        self.textBrowser.setObjectName("textBrowser")
+        Wizard.addPage(self.wizardPage1)
+        self.wizardPage2 = QtWidgets.QWizardPage()
+        self.wizardPage2.setObjectName("wizardPage2")
+        self.label = QtWidgets.QLabel(self.wizardPage2)
+        self.label.setGeometry(QtCore.QRect(10, 0, 131, 16))
+        self.label.setObjectName("label")
+        self.label_2 = QtWidgets.QLabel(self.wizardPage2)
+        self.label_2.setGeometry(QtCore.QRect(10, 40, 71, 16))
+        self.label_2.setObjectName("label_2")
+        self.default_apps = QtWidgets.QCheckBox(self.wizardPage2)
+        self.default_apps.setGeometry(QtCore.QRect(100, 40, 70, 17))
+        self.default_apps.setText("")
+        self.default_apps.setObjectName("default_apps")
+        self.label_3 = QtWidgets.QLabel(self.wizardPage2)
+        self.label_3.setGeometry(QtCore.QRect(10, 70, 61, 16))
+        self.label_3.setObjectName("label_3")
+        self.custom_applications = QtWidgets.QFrame(self.wizardPage2)
+        self.custom_applications.setGeometry(QtCore.QRect(280, 10, 331, 361))
+        self.custom_applications.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.custom_applications.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.custom_applications.setObjectName("custom_applications")
+        self.save_path = QtWidgets.QLineEdit(self.wizardPage2)
+        self.save_path.setGeometry(QtCore.QRect(80, 70, 113, 20))
+        self.save_path.setObjectName("save_path")
+        self.btn_save_path_select = QtWidgets.QToolButton(self.wizardPage2)
+        self.btn_save_path_select.setGeometry(QtCore.QRect(200, 70, 25, 19))
+        self.btn_save_path_select.setObjectName("btn_save_path_select")
+        Wizard.addPage(self.wizardPage2)
+
+        self.retranslateUi(Wizard)
+        QtCore.QMetaObject.connectSlotsByName(Wizard)
+
+    def retranslateUi(self, Wizard):
+        _translate = QtCore.QCoreApplication.translate
+        Wizard.setWindowTitle(_translate("Wizard", "Wizard"))
+        self.textBrowser.setHtml(_translate("Wizard", "\n"
+"\n"
+"

Setup für das Semesterapparatsprogram.

\n" +"


\n" +"

Im Anschluss werden wichtige Einstellungen gesetzt, welche auch im späteren Verlauf verändert werden können.

\n" +"


")) + self.label.setText(_translate("Wizard", "Grundeinstellungen")) + self.label_2.setToolTip(_translate("Wizard", "Opens the downloaded files with the default applications set in the OS")) + self.label_2.setText(_translate("Wizard", "Default Apps")) + self.label_3.setToolTip(_translate("Wizard", "Path where the downloaded files are stored. Defaults to ~/Desktop/SemapFiles")) + self.label_3.setText(_translate("Wizard", "Save Path")) + self.save_path.setPlaceholderText(_translate("Wizard", "~/Desktop/SemapFiles")) + self.btn_save_path_select.setText(_translate("Wizard", "...")) diff --git a/src/ui/__init__.py b/src/ui/__init__.py new file mode 100644 index 0000000..93f0297 --- /dev/null +++ b/src/ui/__init__.py @@ -0,0 +1,29 @@ +import pathlib + +from .dialogs import ( + App_Ext_Dialog, + Mail_Dialog, + Settings, + edit_bookdata_ui, + fileparser_ui, + login_ui, + medienadder_ui, + parsed_titles_ui, + popus_confirm, + reminder_ui, + settings_ui, + new_subject_ui, +) +from .Ui_semesterapparat_ui import Ui_MainWindow as Ui_Semesterapparat +from .Ui_setupwizard import Ui_Wizard as SetupWizard +from .widgets import ( + FilePicker, + GraphWidget, + Message_Widget, + StatusWidget, +) + +path = pathlib.Path(__file__).parent.absolute() +# from .mainwindow import Ui_MainWindow as Ui_MainWindow +# from .sap import Ui_MainWindow as MainWindow_SAP +__all__ = ["mainwindow", "sap", "dialogs", "widgets"] diff --git a/src/ui/dialogs/Ui_edit_bookdata.py b/src/ui/dialogs/Ui_edit_bookdata.py new file mode 100644 index 0000000..728cd17 --- /dev/null +++ b/src/ui/dialogs/Ui_edit_bookdata.py @@ -0,0 +1,157 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\edit_bookdata.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + +from src.logic.dataclass import BookData + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Metadaten") + Dialog.resize(448, 572) + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) + self.buttonBox.setGeometry(QtCore.QRect(260, 530, 161, 32)) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons( + QtWidgets.QDialogButtonBox.StandardButton.Cancel + | QtWidgets.QDialogButtonBox.StandardButton.Ok + ) + self.buttonBox.setObjectName("buttonBox") + self.gridLayoutWidget = QtWidgets.QWidget(Dialog) + self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 441, 531)) + self.gridLayoutWidget.setObjectName("gridLayoutWidget") + self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) + self.gridLayout.setSizeConstraint( + QtWidgets.QLayout.SizeConstraint.SetDefaultConstraint + ) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.label_10 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_10.setObjectName("label_10") + self.gridLayout.addWidget(self.label_10, 10, 1, 1, 1) + self.label = QtWidgets.QLabel(self.gridLayoutWidget) + self.label.setObjectName("label") + self.gridLayout.addWidget(self.label, 0, 1, 1, 1) + self.label_9 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_9.setObjectName("label_9") + self.gridLayout.addWidget(self.label_9, 9, 1, 1, 1) + self.label_8 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_8.setObjectName("label_8") + self.gridLayout.addWidget(self.label_8, 8, 1, 1, 1) + self.label_12 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_12.setObjectName("label_12") + self.gridLayout.addWidget(self.label_12, 6, 1, 1, 1) + self.line_edition = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_edition.setObjectName("line_edition") + self.gridLayout.addWidget(self.line_edition, 2, 2, 1, 1) + self.label_3 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_3.setObjectName("label_3") + self.gridLayout.addWidget(self.label_3, 2, 1, 1, 1) + self.label_4 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_4.setObjectName("label_4") + self.gridLayout.addWidget(self.label_4, 3, 1, 1, 1) + self.line_link = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_link.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.ArrowCursor)) + self.line_link.setReadOnly(True) + self.line_link.setObjectName("line_link") + self.gridLayout.addWidget(self.line_link, 6, 2, 1, 1) + self.label_5 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_5.setObjectName("label_5") + self.gridLayout.addWidget(self.label_5, 4, 1, 1, 1) + self.label_7 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_7.setObjectName("label_7") + self.gridLayout.addWidget(self.label_7, 7, 1, 1, 1) + self.label_6 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_6.setObjectName("label_6") + self.gridLayout.addWidget(self.label_6, 5, 1, 1, 1) + self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_2.setObjectName("label_2") + self.gridLayout.addWidget(self.label_2, 1, 1, 1, 1) + spacerItem = QtWidgets.QSpacerItem( + 5, + 20, + QtWidgets.QSizePolicy.Policy.Fixed, + QtWidgets.QSizePolicy.Policy.Minimum, + ) + self.gridLayout.addItem(spacerItem, 8, 0, 1, 1) + self.line_title = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_title.setObjectName("line_title") + self.gridLayout.addWidget(self.line_title, 0, 2, 1, 1) + self.line_signature = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_signature.setObjectName("line_signature") + self.gridLayout.addWidget(self.line_signature, 1, 2, 1, 1) + self.line_author = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_author.setObjectName("line_author") + self.gridLayout.addWidget(self.line_author, 3, 2, 1, 1) + self.line_lang = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_lang.setObjectName("line_lang") + self.gridLayout.addWidget(self.line_lang, 8, 2, 1, 1) + self.line_ppn = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_ppn.setObjectName("line_ppn") + self.gridLayout.addWidget(self.line_ppn, 5, 2, 1, 1) + self.line_isbn = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_isbn.setObjectName("line_isbn") + self.gridLayout.addWidget(self.line_isbn, 7, 2, 1, 1) + self.line_year = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_year.setObjectName("line_year") + self.gridLayout.addWidget(self.line_year, 9, 2, 1, 1) + self.line_pages = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_pages.setObjectName("line_pages") + self.gridLayout.addWidget(self.line_pages, 10, 2, 1, 1) + self.line_publisher = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.line_publisher.setObjectName("line_publisher") + self.gridLayout.addWidget(self.line_publisher, 4, 2, 1, 1) + + self.retranslateUi(Dialog) + self.buttonBox.accepted.connect(Dialog.accept) # type: ignore + self.buttonBox.rejected.connect(Dialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label_10.setText(_translate("Dialog", "Seiten")) + self.label.setText(_translate("Dialog", "Titel")) + self.label_9.setText(_translate("Dialog", "Jahr")) + self.label_8.setText(_translate("Dialog", "Sprache")) + self.label_12.setText(_translate("Dialog", "Link")) + self.label_3.setText(_translate("Dialog", "Auflage")) + self.label_4.setText(_translate("Dialog", "Autor")) + self.label_5.setText(_translate("Dialog", "Herausgeber")) + self.label_7.setText(_translate("Dialog", "ISBN(s)")) + self.label_6.setText(_translate("Dialog", "PPN")) + self.label_2.setText(_translate("Dialog", "Signatur")) + + def populate_fields(self, data: BookData): + self.line_author.setText(data.author) + self.line_edition.setText(data.edition) + self.line_isbn.setText(", ".join(data.isbn)) + self.line_lang.setText(data.language) + self.line_link.setText(data.link) + self.line_pages.setText(data.pages) + self.line_ppn.setText(data.ppn) + self.line_publisher.setText(data.publisher) + self.line_signature.setText(data.signature) + self.line_title.setText(data.title) + self.line_year.setText(data.year) + + def get_data(self) -> BookData: + return BookData( + ppn=self.line_ppn.text().strip(), + title=self.line_title.text().strip(), + signature=self.line_signature.text().strip(), + edition=self.line_edition.text().strip(), + link=self.line_link.text().strip(), + isbn=self.line_isbn.text().split(","), + author=self.line_author.text().strip(), + language=self.line_lang.text().strip(), + publisher=self.line_publisher.text().strip(), + year=self.line_year.text().strip(), + pages=self.line_pages.text().strip(), + ) diff --git a/src/ui/dialogs/Ui_fileparser.py b/src/ui/dialogs/Ui_fileparser.py new file mode 100644 index 0000000..05459bd --- /dev/null +++ b/src/ui/dialogs/Ui_fileparser.py @@ -0,0 +1,109 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\fileparser.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + +from src.logic.webrequest import BibTextTransformer, WebRequest + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(402, 301) + self.progressBar = QtWidgets.QProgressBar(Dialog) + self.progressBar.setGeometry(QtCore.QRect(10, 60, 381, 23)) + self.progressBar.setProperty("value", 24) + self.progressBar.setObjectName("progressBar") + self.frame = QtWidgets.QFrame(Dialog) + self.frame.setGeometry(QtCore.QRect(10, 10, 381, 41)) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.horizontalLayoutWidget = QtWidgets.QWidget(self.frame) + self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 381, 41)) + self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout.setObjectName("horizontalLayout") + self.label = QtWidgets.QLabel(self.horizontalLayoutWidget) + self.label.setObjectName("label") + self.horizontalLayout.addWidget(self.label) + self.count = QtWidgets.QLabel(self.horizontalLayoutWidget) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.count.setFont(font) + self.count.setTextFormat(QtCore.Qt.TextFormat.PlainText) + self.count.setObjectName("count") + self.horizontalLayout.addWidget(self.count) + self.label_2 = QtWidgets.QLabel(self.horizontalLayoutWidget) + self.label_2.setObjectName("label_2") + self.horizontalLayout.addWidget(self.label_2) + spacerItem = QtWidgets.QSpacerItem( + 40, + 20, + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Minimum, + ) + self.horizontalLayout.addItem(spacerItem) + self.frame_2 = QtWidgets.QFrame(Dialog) + self.frame_2.setGeometry(QtCore.QRect(10, 100, 381, 201)) + self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame_2.setObjectName("frame_2") + self.listWidget = QtWidgets.QListWidget(self.frame_2) + self.listWidget.setGeometry(QtCore.QRect(0, 0, 381, 191)) + self.listWidget.setObjectName("listWidget") + self.signatures = [] + self.returned = [] + # self.data_gathering_complete = QtCore.pyqtSignal() + self.retranslateUi(Dialog) + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label.setText(_translate("Dialog", "Es wurden")) + self.count.setText(_translate("Dialog", "0")) + self.label_2.setText(_translate("Dialog", "Signaturen gefunden.")) + + def moveToThread(self, thread): + self.progressBar.moveToThread(thread) + self.frame.moveToThread(thread) + self.horizontalLayoutWidget.moveToThread(thread) + self.horizontalLayout.moveToThread(thread) + self.label.moveToThread(thread) + self.count.moveToThread(thread) + self.label_2.moveToThread(thread) + self.frame_2.moveToThread(thread) + self.listWidget.moveToThread(thread) + + def run(self): + for signature in self.signatures: + self.count.setText(str(self.signatures.index(signature) + 1)) + self.listWidget.addItem(signature) + webdata = WebRequest().get_ppn(signature).get_data() + bookdata = BibTextTransformer("ARRAY").get_data(webdata).return_data() + self.returned.append(bookdata) + self.progressBar.setValue(self.signatures.index(signature) + 1) + # self.data_gathering_complete.emit() + + def deleteLater(self): + self.progressBar.deleteLater() + self.frame.deleteLater() + self.horizontalLayoutWidget.deleteLater() + self.horizontalLayout.deleteLater() + self.label.deleteLater() + self.count.deleteLater() + self.label_2.deleteLater() + self.frame_2.deleteLater() + self.listWidget.deleteLater() + self.signatures = [] + self.returned = [] + self.retranslateUi.deleteLater() + super().deleteLater() diff --git a/src/ui/dialogs/Ui_login.py b/src/ui/dialogs/Ui_login.py new file mode 100644 index 0000000..1c1190d --- /dev/null +++ b/src/ui/dialogs/Ui_login.py @@ -0,0 +1,113 @@ +# Form implementation generated from reading ui file '/home/alexander/GitHub/Semesterapparate/ui/dialogs/login.ui' +# +# Created by: PyQt6 UI code generator 6.5.3 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +import hashlib + +from PyQt6 import QtCore, QtWidgets + +from src.backend.database import Database +from src.backend.admin_console import AdminCommands + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(218, 190) + self.dialog = Dialog + self.login_button = QtWidgets.QPushButton(parent=Dialog) + self.login_button.setGeometry(QtCore.QRect(30, 140, 76, 32)) + self.login_button.setObjectName("login_button") + self.login_button.setText("Login") + self.login_button.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus) + self.cancel_button = QtWidgets.QPushButton(parent=Dialog) + self.cancel_button.setGeometry(QtCore.QRect(120, 140, 76, 32)) + self.cancel_button.setObjectName("cancel_button") + self.cancel_button.setText("Cancel") + self.cancel_button.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus) + self.cancel_button.clicked.connect(self.cancel_buttonfn) + self.label = QtWidgets.QLabel(parent=Dialog) + self.label.setGeometry(QtCore.QRect(20, 40, 71, 21)) + self.label.setObjectName("label") + self.lineEdit = QtWidgets.QLineEdit(parent=Dialog) + self.lineEdit.setGeometry(QtCore.QRect(80, 40, 113, 21)) + self.lineEdit.setObjectName("lineEdit") + # set strong focus to lineEdit + self.lineEdit.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.label_2 = QtWidgets.QLabel(parent=Dialog) + self.label_2.setGeometry(QtCore.QRect(20, 80, 71, 21)) + self.label_2.setObjectName("label_2") + self.lineEdit_2 = QtWidgets.QLineEdit(parent=Dialog) + self.lineEdit_2.setGeometry(QtCore.QRect(80, 80, 113, 21)) + self.lineEdit_2.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhSensitiveData) + # set echo mode to password + self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + self.lineEdit_2.setClearButtonEnabled(True) + self.lineEdit_2.setObjectName("lineEdit_2") + + self.retranslateUi(Dialog) + # if buttonbox accepted is clicked, launch login test + self.login_button.clicked.connect(self.login) + self.lresult = -1 + self.lusername = "" + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label.setText(_translate("Dialog", "Username")) + self.label_2.setText(_translate("Dialog", "Password")) + + def login(self): + username = self.lineEdit.text() + password = self.lineEdit_2.text() + print(type(username), password) + # Assuming 'Database' is a class to interact with your database + db = Database() + + hashed_password = hashlib.sha256( + password.encode() + ).hexdigest() + if len(db.get_users()) == 0: + AdminCommands().create_admin() + self.lresult = 1 # Indicate successful login + self.lusername = username + self.dialog.accept() + if db.login(username, hashed_password): + self.lresult = 1 # Indicate successful login + self.lusername = username + self.dialog.accept() + db.close() + else: + # Credentials are invalid, display a warning + if username == "" or password == "": + warning_dialog = QtWidgets.QMessageBox() + warning_dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) + warning_dialog.setText("Please enter a username and password.") + warning_dialog.setWindowTitle("Login Failed") + warning_dialog.exec() + else: + warning_dialog = QtWidgets.QMessageBox() + warning_dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) + warning_dialog.setText( + "Invalid username or password. Please try again." + ) + warning_dialog.setWindowTitle("Login Failed") + warning_dialog.exec() + + def cancel_buttonfn(self): + self.dialog.reject() + + +if __name__ == "__main__": + import sys + + app = QtWidgets.QApplication(sys.argv) + Dialog = QtWidgets.QDialog() + ui = Ui_Dialog() + ui.setupUi(Dialog) + Dialog.show() + sys.exit(app.exec()) diff --git a/src/ui/dialogs/Ui_medianadder.py b/src/ui/dialogs/Ui_medianadder.py new file mode 100644 index 0000000..3578bab --- /dev/null +++ b/src/ui/dialogs/Ui_medianadder.py @@ -0,0 +1,240 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\medianadder.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(637, 491) + self.label = QtWidgets.QLabel(Dialog) + self.label.setGeometry(QtCore.QRect(20, 10, 47, 21)) + self.label.setObjectName("label") + self.label_2 = QtWidgets.QLabel(Dialog) + self.label_2.setGeometry(QtCore.QRect(20, 40, 47, 21)) + self.label_2.setObjectName("label_2") + self.comboBox = QtWidgets.QComboBox(Dialog) + self.comboBox.setGeometry(QtCore.QRect(70, 40, 69, 22)) + self.comboBox.setObjectName("comboBox") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.lineEdit = QtWidgets.QLineEdit(Dialog) + self.lineEdit.setGeometry(QtCore.QRect(70, 10, 113, 20)) + self.lineEdit.setObjectName("lineEdit") + self.label_3 = QtWidgets.QLabel(Dialog) + self.label_3.setGeometry(QtCore.QRect(20, 70, 47, 21)) + self.label_3.setObjectName("label_3") + self.widget = QtWidgets.QWidget(Dialog) + self.widget.setGeometry(QtCore.QRect(330, 90, 301, 341)) + self.widget.setObjectName("widget") + self.treeWidget = QtWidgets.QTreeWidget(self.widget) + self.treeWidget.setEnabled(True) + self.treeWidget.setGeometry(QtCore.QRect(0, 0, 301, 341)) + self.treeWidget.setAutoFillBackground(False) + self.treeWidget.setLineWidth(0) + self.treeWidget.setMidLineWidth(0) + self.treeWidget.setVerticalScrollBarPolicy( + QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff + ) + self.treeWidget.setHorizontalScrollBarPolicy( + QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff + ) + self.treeWidget.setSizeAdjustPolicy( + QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents + ) + self.treeWidget.setEditTriggers( + QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers + ) + self.treeWidget.setAlternatingRowColors(True) + self.treeWidget.setSelectionMode( + QtWidgets.QAbstractItemView.SelectionMode.NoSelection + ) + self.treeWidget.setTextElideMode(QtCore.Qt.TextElideMode.ElideMiddle) + self.treeWidget.setUniformRowHeights(True) + self.treeWidget.setItemsExpandable(False) + self.treeWidget.setExpandsOnDoubleClick(False) + self.treeWidget.setObjectName("treeWidget") + font = QtGui.QFont() + font.setPointSize(7) + self.treeWidget.headerItem().setFont(0, font) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + brush = QtGui.QBrush(QtGui.QColor(255, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + item_0.setBackground(2, brush) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + brush = QtGui.QBrush(QtGui.QColor(0, 255, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + item_0.setBackground(2, brush) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + self.treeWidget.header().setCascadingSectionResizes(False) + self.treeWidget.header().setDefaultSectionSize(60) + self.treeWidget.header().setHighlightSections(False) + self.treeWidget.header().setMinimumSectionSize(20) + self.listWidget = QtWidgets.QListWidget(Dialog) + self.listWidget.setGeometry(QtCore.QRect(10, 90, 281, 341)) + self.listWidget.setContextMenuPolicy( + QtCore.Qt.ContextMenuPolicy.CustomContextMenu + ) + self.listWidget.setObjectName("listWidget") + self.label_4 = QtWidgets.QLabel(Dialog) + self.label_4.setGeometry(QtCore.QRect(330, 50, 181, 21)) + self.label_4.setObjectName("label_4") + self.label_5 = QtWidgets.QLabel(Dialog) + self.label_5.setGeometry(QtCore.QRect(200, 70, 41, 21)) + self.label_5.setObjectName("label_5") + self.list_amount = QtWidgets.QLabel(Dialog) + self.list_amount.setGeometry(QtCore.QRect(240, 70, 47, 21)) + self.list_amount.setObjectName("list_amount") + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) + self.buttonBox.setGeometry(QtCore.QRect(10, 450, 156, 23)) + self.buttonBox.setStandardButtons( + QtWidgets.QDialogButtonBox.StandardButton.Cancel + | QtWidgets.QDialogButtonBox.StandardButton.Ok + ) + self.buttonBox.setCenterButtons(False) + self.buttonBox.setObjectName("buttonBox") + self.buttonBox.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus) + # self.buttonBox.accepted.disconnect() + # set the activation action for the buttonBox to be shift enter + self.buttonBox.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.buttonBox.accepted.connect(Dialog.accept) # type: ignore + self.buttonBox.rejected.connect(Dialog.reject) # type: ignore + + self.lineEdit.returnPressed.connect(self.add_to_list) + self.retranslateUi(Dialog) + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label.setText(_translate("Dialog", "Signatur")) + self.label_2.setText(_translate("Dialog", "Modus")) + self.comboBox.setItemText(0, _translate("Dialog", "ARRAY")) + self.comboBox.setItemText(1, _translate("Dialog", "BibTeX")) + self.comboBox.setItemText(2, _translate("Dialog", "COinS")) + self.comboBox.setItemText(3, _translate("Dialog", "RIS")) + self.lineEdit.setPlaceholderText(_translate("Dialog", "Signatur / ISBN")) + self.label_3.setText(_translate("Dialog", "Queue")) + self.treeWidget.headerItem().setText( + 0, _translate("Dialog", "Datensatz\\Metadata") + ) + self.treeWidget.headerItem().setText(1, _translate("Dialog", "Array")) + self.treeWidget.headerItem().setText(2, _translate("Dialog", "BibTeX")) + self.treeWidget.headerItem().setText(3, _translate("Dialog", "COinS")) + self.treeWidget.headerItem().setText(4, _translate("Dialog", "RIS")) + __sortingEnabled = self.treeWidget.isSortingEnabled() + self.treeWidget.setSortingEnabled(False) + self.treeWidget.topLevelItem(0).setText(0, _translate("Dialog", "PPN")) + self.treeWidget.topLevelItem(0).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(0).setText(2, _translate("Dialog", "0")) + self.treeWidget.topLevelItem(0).setText(3, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(0).setText(4, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(1).setText(0, _translate("Dialog", "Signatur")) + self.treeWidget.topLevelItem(1).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(1).setText(2, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(1).setText(3, _translate("Dialog", "0")) + self.treeWidget.topLevelItem(1).setText(4, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(2).setText(0, _translate("Dialog", "Autor")) + self.treeWidget.topLevelItem(2).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(2).setText(2, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(2).setText(3, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(2).setText(4, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(3).setText(0, _translate("Dialog", "ISBN")) + self.treeWidget.topLevelItem(3).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(3).setText(2, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(3).setText(3, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(3).setText(4, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(4).setText(0, _translate("Dialog", "Jahr")) + self.treeWidget.topLevelItem(4).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(4).setText(2, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(4).setText(3, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(4).setText(4, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(5).setText(0, _translate("Dialog", "Auflage")) + self.treeWidget.topLevelItem(5).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(5).setText(2, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(5).setText(3, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(5).setText(4, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(6).setText(0, _translate("Dialog", "Sprache")) + self.treeWidget.topLevelItem(6).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(6).setText(2, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(6).setText(3, _translate("Dialog", "0")) + self.treeWidget.topLevelItem(6).setText(4, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(7).setText(0, _translate("Dialog", "Herausgeber")) + self.treeWidget.topLevelItem(7).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(7).setText(2, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(7).setText(3, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(7).setText(4, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(8).setText(0, _translate("Dialog", "Seiten")) + self.treeWidget.topLevelItem(8).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(8).setText(2, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(8).setText(3, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(8).setText(4, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(9).setText(0, _translate("Dialog", "Titel")) + self.treeWidget.topLevelItem(9).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(9).setText(2, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(9).setText(3, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(9).setText(4, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(10).setText(0, _translate("Dialog", "Link")) + self.treeWidget.topLevelItem(10).setText(1, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(10).setText(2, _translate("Dialog", "0")) + self.treeWidget.topLevelItem(10).setText(3, _translate("Dialog", "1")) + self.treeWidget.topLevelItem(10).setText(4, _translate("Dialog", "1")) + self.treeWidget.setSortingEnabled(__sortingEnabled) + self.label_4.setText(_translate("Dialog", "Belegbare Felder per Anbieter")) + self.label_5.setText(_translate("Dialog", "Anzahl:")) + self.list_amount.setText(_translate("Dialog", "0")) + self.recolorize() + self.listWidget.customContextMenuRequested.connect(self.custom_context_menu) + + def add_to_list(self): + text = self.lineEdit.text().strip() + if text == "": + return + else: + self.listWidget.addItem(text) + self.list_amount.setText(str(self.listWidget.count())) + self.lineEdit.clear() + + def recolorize(self): + # set the color of the cells of the treeWidget to red if the field is not supported by the provider + # else set it to green + for i in range(self.treeWidget.topLevelItemCount()): + for j in range(1, self.treeWidget.columnCount()): + if self.treeWidget.topLevelItem(i).text(j) == "0": + self.treeWidget.topLevelItem(i).setBackground( + j, QtGui.QColor(255, 0, 0) + ) + else: + self.treeWidget.topLevelItem(i).setBackground( + j, QtGui.QColor(0, 255, 0) + ) + # remove the text from the cells + self.treeWidget.topLevelItem(i).setText(j, "") + + def custom_context_menu(self): + menu = QtWidgets.QMenu() + menu.addAction("Remove") + + action = menu.exec(QtGui.QCursor.pos()) + if action.text() == "Remove": + self.remove_from_list() + + def remove_from_list(self): + self.listWidget.takeItem(self.listWidget.currentRow()) + self.list_amount.setText(str(self.listWidget.count())) diff --git a/src/ui/dialogs/Ui_medianadder.ts b/src/ui/dialogs/Ui_medianadder.ts new file mode 100644 index 0000000..6401616 --- /dev/null +++ b/src/ui/dialogs/Ui_medianadder.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/dialogs/Ui_new_subject.py b/src/ui/dialogs/Ui_new_subject.py new file mode 100644 index 0000000..213eb1c --- /dev/null +++ b/src/ui/dialogs/Ui_new_subject.py @@ -0,0 +1,63 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\new_subject.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtWidgets + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(448, 165) + self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.label = QtWidgets.QLabel(Dialog) + self.label.setObjectName("label") + self.verticalLayout.addWidget(self.label) + self.gridLayout = QtWidgets.QGridLayout() + self.gridLayout.setObjectName("gridLayout") + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout.addItem(spacerItem, 0, 1, 1, 1) + self.checkBox = QtWidgets.QCheckBox(Dialog) + self.checkBox.setObjectName("checkBox") + self.gridLayout.addWidget(self.checkBox, 0, 0, 1, 1) + self.verticalLayout.addLayout(self.gridLayout) + self.verticalLayout_2.addLayout(self.verticalLayout) + self.frame = QtWidgets.QFrame(Dialog) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.label_2 = QtWidgets.QLabel(self.frame) + self.label_2.setGeometry(QtCore.QRect(0, 10, 141, 16)) + self.label_2.setObjectName("label_2") + self.lineEdit = QtWidgets.QLineEdit(self.frame) + self.lineEdit.setGeometry(QtCore.QRect(0, 30, 141, 20)) + self.lineEdit.setObjectName("lineEdit") + self.verticalLayout_2.addWidget(self.frame) + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.verticalLayout_2.addWidget(self.buttonBox) + self.frame.setVisible(False) + self.checkBox.stateChanged.connect(lambda: self.frame.setVisible(self.checkBox.isChecked())) + + self.retranslateUi(Dialog) + self.buttonBox.accepted.connect(Dialog.accept) # type: ignore + self.buttonBox.rejected.connect(Dialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label.setText(_translate("Dialog", "Das eingegebene Fach wurde nicht in der Datenbank gefunden. Soll es angelegt werden?")) + self.checkBox.setText(_translate("Dialog", "Ja")) + self.label_2.setText(_translate("Dialog", "Name des Neuen Faches:")) + def return_state(self): + return self.lineEdit.text() \ No newline at end of file diff --git a/src/ui/dialogs/Ui_parsed_titles.py b/src/ui/dialogs/Ui_parsed_titles.py new file mode 100644 index 0000000..8492d90 --- /dev/null +++ b/src/ui/dialogs/Ui_parsed_titles.py @@ -0,0 +1,158 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\parsed_titles.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + +from log import MyLogger +from src.logic.threads import AutoAdder + +logger = MyLogger("AutoTitleAdder") + + +class Ui_Form(object): + def setupUi(self, Form): + Form.setObjectName("Form") + Form.resize(402, 316) + self.frame = QtWidgets.QFrame(Form) + self.frame.setGeometry(QtCore.QRect(10, 10, 381, 41)) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.horizontalLayoutWidget = QtWidgets.QWidget(self.frame) + self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 381, 41)) + self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout.setObjectName("horizontalLayout") + self.label = QtWidgets.QLabel(self.horizontalLayoutWidget) + self.label.setObjectName("label") + self.horizontalLayout.addWidget(self.label) + self.count = QtWidgets.QLabel(self.horizontalLayoutWidget) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.count.setFont(font) + self.count.setTextFormat(QtCore.Qt.TextFormat.PlainText) + self.count.setObjectName("count") + self.horizontalLayout.addWidget(self.count) + self.label_2 = QtWidgets.QLabel(self.horizontalLayoutWidget) + self.label_2.setObjectName("label_2") + self.horizontalLayout.addWidget(self.label_2) + spacerItem = QtWidgets.QSpacerItem( + 40, + 20, + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Minimum, + ) + self.horizontalLayout.addItem(spacerItem) + self.frame_2 = QtWidgets.QFrame(Form) + self.frame_2.setGeometry(QtCore.QRect(10, 80, 381, 201)) + self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame_2.setObjectName("frame_2") + self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.frame_2) + self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 10, 381, 191)) + self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2) + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.listWidget = QtWidgets.QListWidget(self.horizontalLayoutWidget_2) + self.listWidget.setObjectName("listWidget") + self.horizontalLayout_2.addWidget(self.listWidget) + self.listWidget_done = QtWidgets.QListWidget(self.horizontalLayoutWidget_2) + self.listWidget_done.setObjectName("listWidget_done") + self.horizontalLayout_2.addWidget(self.listWidget_done) + self.progressBar = QtWidgets.QProgressBar(Form) + self.progressBar.setGeometry(QtCore.QRect(10, 60, 381, 23)) + self.progressBar.setProperty("value", 24) + self.progressBar.setObjectName("progressBar") + self.buttonBox = QtWidgets.QDialogButtonBox(Form) + self.buttonBox.setGeometry(QtCore.QRect(230, 290, 156, 23)) + self.buttonBox.setStandardButtons( + QtWidgets.QDialogButtonBox.StandardButton.Cancel + | QtWidgets.QDialogButtonBox.StandardButton.Ok + ) + self.buttonBox.setObjectName("buttonBox") + self.toolButton = QtWidgets.QToolButton(Form) + self.toolButton.setGeometry(QtCore.QRect(20, 290, 25, 19)) + self.toolButton.setObjectName("toolButton") + self.signatures = [] + self.prof_id = None + self.app_id = None + self.thread = QtCore.QThread() + self.toolButton.hide() + self.retranslateUi(Form) + QtCore.QMetaObject.connectSlotsByName(Form) + self.toolButton.clicked.connect(self.start) + # if cancel is clicked, terminate the thread + self.buttonBox.rejected.connect(self.thread_quit) + + def retranslateUi(self, Form): + _translate = QtCore.QCoreApplication.translate + Form.setWindowTitle(_translate("Form", "Form")) + self.label.setText(_translate("Form", "Es wurden")) + self.count.setText(_translate("Form", "0")) + self.label_2.setText(_translate("Form", "Signaturen gefunden.")) + self.toolButton.setText(_translate("Form", "...")) + + def populate_table(self): + for i in range(len(self.signatures)): + self.listWidget.addItem(QtWidgets.QListWidgetItem()) + self.listWidget.item(i).setText(self.signatures[i]) + self.listWidget.item(i).setToolTip("Daten werden gesammelt") + + def update_progress_bar(self, value: int): + self.progressBar.setValue(value) + + def thread_quit(self): + print("Terminating thread") + self.thread.terminate() + self.thread.quit() + self.thread.deleteLater() + self.thread = None + + def start(self): + logger.log_info("Starting AutoAdder") + + self.thread = AutoAdder( + data=self.signatures, + app_id=self.app_id, + prof_id=self.prof_id, + ) + self.thread.finished.connect(self.on_completion) + self.thread.updateSignal.connect(self.update_progress_bar) + self.thread.setTextSignal.connect(self.update_lists) + self.thread.progress.connect(self.determine_progress) + self.thread.finished.connect(self.thread.quit) + self.thread.finished.connect(self.thread.deleteLater) + # self.thread.updateSignal.connect(self.update_progress_label) + # worker.finished.connect(worker.deleteLater) + + self.thread.start() + + def on_completion(self): + logger.log_info("AutoAdder finished") + logger.log_info("Returning data") + + # create a function that closes the dialog + + def determine_progress(self, signal): + # check length of listWidget + length = self.listWidget.count() + print(f"Length of listWidget: {length}") + if length == 0: + logger.log_info("AutoAdder finished") + self.buttonBox.accepted.emit() + + def update_lists(self, signal): + # get text of first entry in listWidget + text = self.listWidget.item(0).text() + # remove first entry + self.listWidget.takeItem(0) + # add first entry to listWidget_done + self.listWidget_done.addItem(text) diff --git a/src/ui/dialogs/Ui_reminder.py b/src/ui/dialogs/Ui_reminder.py new file mode 100644 index 0000000..b1c805f --- /dev/null +++ b/src/ui/dialogs/Ui_reminder.py @@ -0,0 +1,52 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\reminder.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtWidgets + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(369, 308) + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) + self.buttonBox.setGeometry(QtCore.QRect(190, 270, 161, 32)) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons( + QtWidgets.QDialogButtonBox.StandardButton.Cancel + | QtWidgets.QDialogButtonBox.StandardButton.Ok + ) + self.buttonBox.setObjectName("buttonBox") + self.message_box = QtWidgets.QTextEdit(Dialog) + self.message_box.setGeometry(QtCore.QRect(10, 60, 341, 201)) + self.message_box.setObjectName("message_box") + self.label = QtWidgets.QLabel(Dialog) + self.label.setGeometry(QtCore.QRect(10, 30, 61, 21)) + self.label.setObjectName("label") + self.label_2 = QtWidgets.QLabel(Dialog) + self.label_2.setGeometry(QtCore.QRect(150, 30, 81, 21)) + self.label_2.setObjectName("label_2") + self.dateEdit = QtWidgets.QDateEdit(Dialog) + self.dateEdit.setGeometry(QtCore.QRect(240, 30, 110, 22)) + self.dateEdit.setObjectName("dateEdit") + self.dateEdit.setDateTime(QtCore.QDateTime.currentDateTime()) + self.retranslateUi(Dialog) + self.buttonBox.accepted.connect(Dialog.accept) # type: ignore + self.buttonBox.rejected.connect(Dialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label.setText(_translate("Dialog", "Nachricht:")) + self.label_2.setText(_translate("Dialog", "Erinnerung am:")) + + def return_message(self) -> dict: + return { + "message": self.message_box.toPlainText(), + "remind_at": self.dateEdit.date().toString("yyyy-MM-dd"), + } diff --git a/src/ui/dialogs/Ui_settings.py b/src/ui/dialogs/Ui_settings.py new file mode 100644 index 0000000..bc50dfe --- /dev/null +++ b/src/ui/dialogs/Ui_settings.py @@ -0,0 +1,202 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\settings.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from omegaconf import OmegaConf +from PyQt6 import QtCore, QtWidgets + +config = OmegaConf.load("config.yaml") + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(743, 576) + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) + self.buttonBox.setGeometry(QtCore.QRect(120, 540, 621, 32)) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons( + QtWidgets.QDialogButtonBox.StandardButton.Cancel + | QtWidgets.QDialogButtonBox.StandardButton.Ok + ) + self.buttonBox.setObjectName("buttonBox") + self.frame = QtWidgets.QFrame(Dialog) + self.frame.setGeometry(QtCore.QRect(0, 0, 741, 541)) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.label = QtWidgets.QLabel(self.frame) + self.label.setGeometry(QtCore.QRect(400, 30, 161, 21)) + self.label.setObjectName("label") + self.line = QtWidgets.QFrame(self.frame) + self.line.setGeometry(QtCore.QRect(370, 0, 20, 541)) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) + self.line.setLineWidth(1) + self.line.setMidLineWidth(0) + self.line.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line.setObjectName("line") + self.textBrowser = QtWidgets.QTextBrowser(self.frame) + self.textBrowser.setGeometry(QtCore.QRect(400, 50, 311, 51)) + self.textBrowser.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.textBrowser.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone) + self.textBrowser.setObjectName("textBrowser") + self.label_2 = QtWidgets.QLabel(self.frame) + self.label_2.setGeometry(QtCore.QRect(10, 20, 161, 21)) + self.label_2.setObjectName("label_2") + self.os_apps = QtWidgets.QCheckBox(self.frame) + self.os_apps.setGeometry(QtCore.QRect(410, 110, 161, 17)) + self.os_apps.setObjectName("os_apps") + self.formLayoutWidget = QtWidgets.QWidget(self.frame) + self.formLayoutWidget.setGeometry(QtCore.QRect(10, 50, 361, 491)) + self.formLayoutWidget.setObjectName("formLayoutWidget") + self.gridLayout = QtWidgets.QGridLayout(self.formLayoutWidget) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.label_3 = QtWidgets.QLabel(self.formLayoutWidget) + self.label_3.setObjectName("label_3") + self.gridLayout.addWidget(self.label_3, 0, 0, 1, 1) + self.label_5 = QtWidgets.QLabel(self.formLayoutWidget) + self.label_5.setObjectName("label_5") + self.gridLayout.addWidget(self.label_5, 2, 0, 1, 1) + self.db_path = QtWidgets.QLineEdit(self.formLayoutWidget) + self.db_path.setEnabled(False) + self.db_path.setObjectName("db_path") + self.gridLayout.addWidget(self.db_path, 1, 1, 1, 1) + self.save_path = QtWidgets.QLineEdit(self.formLayoutWidget) + self.save_path.setObjectName("save_path") + self.gridLayout.addWidget(self.save_path, 2, 1, 1, 1) + self.label_4 = QtWidgets.QLabel(self.formLayoutWidget) + self.label_4.setObjectName("label_4") + self.gridLayout.addWidget(self.label_4, 1, 0, 1, 1) + self.db_name = QtWidgets.QLineEdit(self.formLayoutWidget) + self.db_name.setObjectName("db_name") + self.gridLayout.addWidget(self.db_name, 0, 1, 1, 1) + self.tb_set_save_path = QtWidgets.QToolButton(self.formLayoutWidget) + self.tb_set_save_path.setObjectName("tb_set_save_path") + self.gridLayout.addWidget(self.tb_set_save_path, 2, 2, 1, 1) + spacerItem = QtWidgets.QSpacerItem( + 20, + 40, + QtWidgets.QSizePolicy.Policy.Minimum, + QtWidgets.QSizePolicy.Policy.Expanding, + ) + self.gridLayout.addItem(spacerItem, 3, 1, 1, 1) + self.tb_select_db = QtWidgets.QToolButton(self.formLayoutWidget) + self.tb_select_db.setObjectName("tb_select_db") + self.gridLayout.addWidget(self.tb_select_db, 0, 2, 1, 1) + self.scrollArea = QtWidgets.QScrollArea(self.frame) + self.scrollArea.setGeometry(QtCore.QRect(400, 130, 331, 411)) + self.scrollArea.setWidgetResizable(True) + self.scrollArea.setObjectName("scrollArea") + self.scrollAreaWidgetContents = QtWidgets.QWidget() + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 329, 409)) + self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") + self.treeWidget = QtWidgets.QTreeWidget(self.scrollAreaWidgetContents) + self.treeWidget.setGeometry(QtCore.QRect(0, 0, 331, 411)) + self.treeWidget.setObjectName("treeWidget") + self.treeWidget.setContextMenuPolicy( + QtCore.Qt.ContextMenuPolicy.ActionsContextMenu + ) + self.scrollArea.setWidget(self.scrollAreaWidgetContents) + self.label_3.setBuddy(self.db_name) + self.label_5.setBuddy(self.save_path) + self.label_4.setBuddy(self.db_path) + self.tb_select_db.clicked.connect(self.select_db) + self.tb_set_save_path.clicked.connect(self.set_save_path) + self.retranslateUi(Dialog) + self.buttonBox.accepted.connect(Dialog.accept) # type: ignore + self.buttonBox.rejected.connect(Dialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(Dialog) + Dialog.setTabOrder(self.db_name, self.db_path) + Dialog.setTabOrder(self.db_path, self.save_path) + Dialog.setTabOrder(self.save_path, self.os_apps) + Dialog.setTabOrder(self.os_apps, self.textBrowser) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label.setText(_translate("Dialog", "Dateispezifische Einstellungen")) + self.textBrowser.setHtml( + _translate( + "Dialog", + '\n' + '\n" + '

Hier können Einstellungen f�r bestehende Dateiformate geändert, oder neue Dateiformate eingefügt werden

\n' + '


', + ) + ) + self.label_2.setText(_translate("Dialog", "Allgemeine Einstellungen")) + self.os_apps.setToolTip( + _translate( + "Dialog", + "Verwendet im Betriebssystem festgelegte Anwendungen um Dateien zu öffnen", + ) + ) + self.os_apps.setText(_translate("Dialog", "Standard-Apps verwenden")) + self.label_3.setToolTip( + _translate( + "Dialog", + '

Name der Datenbank, welche verwendet werden soll. Muss auf .db enden

', + ) + ) + self.label_3.setText(_translate("Dialog", "Datenbankname")) + self.label_5.setToolTip( + _translate( + "Dialog", + "Pfad, an dem heruntergeladene Dateien gespeichert werden sollen", + ) + ) + self.label_5.setText(_translate("Dialog", "Speicherpfad")) + self.label_4.setText(_translate("Dialog", "Datenbankpfad")) + self.db_name.setText(_translate("Dialog", "sap.db")) + self.tb_set_save_path.setText(_translate("Dialog", "...")) + self.tb_select_db.setText(_translate("Dialog", "...")) + self.load_config() + + def load_config(self): + self.db_name.setText(config.database.name) + self.db_path.setText(config.database.path) + self.save_path.setText(config.save_path) + self.os_apps.setChecked(config.default_apps) + applications = config.custom_applications + for application in applications: + name = application.application + file_type = application.extensions + display_name = application.name + print(name, file_type, display_name) # + # create new item + item = QtWidgets.QTreeWidgetItem(self.treeWidget) + item.setText(0, display_name) + + def select_db(self): + # open file dialog, limit to .db files + file_dialog = QtWidgets.QFileDialog() + file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.AnyFile) + file_dialog.setNameFilter("Datenbank (*.db)") + file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.Detail) + if file_dialog.exec(): + self.db_name.setText(file_dialog.selectedFiles()[0].split("/")[-1]) + self.db_path.setText( + file_dialog.selectedFiles()[0].split(self.db_name.text())[0] + ) + + def set_save_path(self): + # open file dialog, limit to .db files + file_dialog = QtWidgets.QFileDialog() + file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.Directory) + file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.Detail) + if file_dialog.exec(): + self.save_path.setText(file_dialog.selectedFiles()[0]) + + def return_data(self): + config.database.name = self.db_name.text() + config.database.path = self.db_path.text() + config.save_path = self.save_path.text() + config.default_apps = self.os_apps.isChecked() + return config diff --git a/src/ui/dialogs/Ui_settings.ts b/src/ui/dialogs/Ui_settings.ts new file mode 100644 index 0000000..6401616 --- /dev/null +++ b/src/ui/dialogs/Ui_settings.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/dialogs/__init__.py b/src/ui/dialogs/__init__.py new file mode 100644 index 0000000..72ca62f --- /dev/null +++ b/src/ui/dialogs/__init__.py @@ -0,0 +1,24 @@ +from .app_ext import Ui_Dialog as App_Ext_Dialog +from .ext_app import Ui_Frame as App_Ext_Window +from .mail import Mail_Dialog +from .popup_confirm import Ui_extend_confirm as popus_confirm +from .settings import Settings +from .Ui_edit_bookdata import Ui_Dialog as edit_bookdata_ui +from .Ui_fileparser import Ui_Dialog as fileparser_ui +from .Ui_login import Ui_Dialog as login_ui +from .Ui_medianadder import Ui_Dialog as medienadder_ui +from .Ui_parsed_titles import Ui_Form as parsed_titles_ui +from .Ui_reminder import Ui_Dialog as reminder_ui +from .Ui_settings import Ui_Dialog as settings_ui +from .Ui_new_subject import Ui_Dialog as new_subject_ui + +__all__ = [ + "ext_app", + "app_ext", + "Mail_Dialog", + "medianadder_ui", + "popup_confirm", + "edit_bookdata_ui", + "settings_ui", + "parsed_titles_ui", +] diff --git a/src/ui/dialogs/add_media.ui b/src/ui/dialogs/add_media.ui new file mode 100644 index 0000000..8e941ef --- /dev/null +++ b/src/ui/dialogs/add_media.ui @@ -0,0 +1,90 @@ + + + Dialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 30 + 260 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 10 + 10 + 381 + 241 + + + + + + + Signatur + + + + + + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/dialogs/app_ext.py b/src/ui/dialogs/app_ext.py new file mode 100644 index 0000000..af9c0e3 --- /dev/null +++ b/src/ui/dialogs/app_ext.py @@ -0,0 +1,114 @@ +# Form implementation generated from reading ui file 'ui\dialogs\apparat_extend.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(388, 103) + sizePolicy = QtWidgets.QSizePolicy( + QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed + ) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth()) + Dialog.setSizePolicy(sizePolicy) + Dialog.setMinimumSize(QtCore.QSize(388, 103)) + Dialog.setMaximumSize(QtCore.QSize(388, 103)) + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) + self.buttonBox.setGeometry(QtCore.QRect(290, 30, 81, 241)) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Vertical) + self.buttonBox.setStandardButtons( + QtWidgets.QDialogButtonBox.StandardButton.Abort + | QtWidgets.QDialogButtonBox.StandardButton.Save + ) + self.buttonBox.setObjectName("buttonBox") + self.label = QtWidgets.QLabel(Dialog) + self.label.setGeometry(QtCore.QRect(10, 0, 281, 31)) + sizePolicy = QtWidgets.QSizePolicy( + QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed + ) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) + self.label.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(10) + self.label.setFont(font) + self.label.setObjectName("label") + self.frame = QtWidgets.QFrame(Dialog) + self.frame.setGeometry(QtCore.QRect(10, 30, 241, 41)) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.line = QtWidgets.QFrame(self.frame) + self.line.setGeometry(QtCore.QRect(120, 0, 3, 61)) + self.line.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line.setObjectName("line") + self.rad_sommer = QtWidgets.QRadioButton(self.frame) + self.rad_sommer.setGeometry(QtCore.QRect(10, 10, 82, 21)) + self.rad_sommer.setObjectName("rad_sommer") + self.rad_winter = QtWidgets.QRadioButton(self.frame) + self.rad_winter.setGeometry(QtCore.QRect(140, 10, 82, 21)) + self.rad_winter.setObjectName("rad_winter") + self.sem_year = QtWidgets.QLineEdit(Dialog) + self.sem_year.setGeometry(QtCore.QRect(10, 70, 121, 20)) + self.sem_year.setObjectName("sem_year") + self.dauerapp = QtWidgets.QCheckBox(Dialog) + self.dauerapp.setGeometry(QtCore.QRect(150, 70, 91, 21)) + self.dauerapp.setObjectName("dauerapp") + + self.retranslateUi(Dialog) + self.buttonBox.accepted.connect(Dialog.accept) # type: ignore + self.buttonBox.rejected.connect(Dialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label.setText( + _translate("Dialog", "Bis wann soll der Apparat verlängert werden?") + ) + self.rad_sommer.setText(_translate("Dialog", "Sommer")) + self.rad_winter.setText(_translate("Dialog", "Winter")) + self.sem_year.setPlaceholderText(_translate("Dialog", "2023")) + self.dauerapp.setText(_translate("Dialog", "Dauerapparat")) + + def get_data(self): + # def __select_sem_state(): + # curr_month=QtCore.QDate.currentDate().month() + # if curr_month>=4 and curr_month<=9: + # return "SoSe" + # else: + # return "WiSe" + # if __select_sem_state()=="SoSe": + # self.rad_sommer.setChecked(True) + # else: + # self.rad_winter.setChecked(True) + return { + "semester": f"SoSe {int(self.sem_year.text()[-2:])}" + if self.rad_sommer.isChecked() + else f"WiSe {int(self.sem_year.text()[-2:])}/{int(self.sem_year.text()[-2:])+1}", + "dauerapp": self.dauerapp.isChecked() + if self.dauerapp.isChecked() + else False, + } + + +if __name__ == "__main__": + import sys + + app = QtWidgets.QApplication(sys.argv) + Dialog = QtWidgets.QDialog() + ui = Ui_Dialog() + ui.setupUi(Dialog) + Dialog.show() + sys.exit(app.exec()) diff --git a/src/ui/dialogs/app_status.ui b/src/ui/dialogs/app_status.ui new file mode 100644 index 0000000..bc4fc7b --- /dev/null +++ b/src/ui/dialogs/app_status.ui @@ -0,0 +1,19 @@ + + + Form + + + + 0 + 0 + 300 + 500 + + + + Form + + + + + diff --git a/src/ui/dialogs/apparat_extend.ui b/src/ui/dialogs/apparat_extend.ui new file mode 100644 index 0000000..f8b513e --- /dev/null +++ b/src/ui/dialogs/apparat_extend.ui @@ -0,0 +1,191 @@ + + + Dialog + + + + 0 + 0 + 388 + 103 + + + + + 0 + 0 + + + + + 388 + 103 + + + + + 388 + 103 + + + + Dialog + + + + + 290 + 30 + 81 + 241 + + + + Qt::Vertical + + + QDialogButtonBox::Abort|QDialogButtonBox::Save + + + + + + 10 + 0 + 281 + 31 + + + + + 0 + 0 + + + + + 10 + + + + Bis wann soll der Apparat verlängert werden? + + + + + + 10 + 30 + 241 + 41 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 120 + 0 + 3 + 61 + + + + Qt::Vertical + + + + + + 10 + 10 + 82 + 21 + + + + Sommer + + + + + + 140 + 10 + 82 + 21 + + + + Winter + + + + + + + 10 + 70 + 121 + 20 + + + + 2023 + + + + + + 150 + 70 + 91 + 21 + + + + Dauerapparat + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/dialogs/apparat_extend_ui.py b/src/ui/dialogs/apparat_extend_ui.py new file mode 100644 index 0000000..edeaf52 --- /dev/null +++ b/src/ui/dialogs/apparat_extend_ui.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'apparat_extend.ui' +## +## Created by: Qt User Interface Compiler version 6.4.0 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QAbstractButton, QApplication, QCheckBox, QDialog, + QDialogButtonBox, QFrame, QLabel, QLineEdit, + QRadioButton, QSizePolicy, QWidget) + +class Ui_Dialog(object): + def setupUi(self, Dialog): + if not Dialog.objectName(): + Dialog.setObjectName(u"Dialog") + Dialog.resize(388, 103) + sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth()) + Dialog.setSizePolicy(sizePolicy) + Dialog.setMinimumSize(QSize(388, 103)) + Dialog.setMaximumSize(QSize(388, 103)) + self.buttonBox = QDialogButtonBox(Dialog) + self.buttonBox.setObjectName(u"buttonBox") + self.buttonBox.setGeometry(QRect(290, 30, 81, 241)) + self.buttonBox.setOrientation(Qt.Vertical) + self.buttonBox.setStandardButtons(QDialogButtonBox.Abort|QDialogButtonBox.Save) + self.label = QLabel(Dialog) + self.label.setObjectName(u"label") + self.label.setGeometry(QRect(10, 0, 281, 31)) + font = QFont() + font.setPointSize(10) + self.label.setFont(font) + self.frame = QFrame(Dialog) + self.frame.setObjectName(u"frame") + self.frame.setGeometry(QRect(10, 30, 241, 41)) + self.frame.setFrameShape(QFrame.StyledPanel) + self.frame.setFrameShadow(QFrame.Raised) + self.line = QFrame(self.frame) + self.line.setObjectName(u"line") + self.line.setGeometry(QRect(120, 0, 3, 61)) + self.line.setFrameShape(QFrame.VLine) + self.line.setFrameShadow(QFrame.Sunken) + self.rad_sommer = QRadioButton(self.frame) + self.rad_sommer.setObjectName(u"rad_sommer") + self.rad_sommer.setGeometry(QRect(10, 10, 82, 21)) + self.rad_winter = QRadioButton(self.frame) + self.rad_winter.setObjectName(u"rad_winter") + self.rad_winter.setGeometry(QRect(140, 10, 82, 21)) + self.sem_year = QLineEdit(Dialog) + self.sem_year.setObjectName(u"sem_year") + self.sem_year.setGeometry(QRect(10, 70, 121, 20)) + self.checkBox = QCheckBox(Dialog) + self.checkBox.setObjectName(u"checkBox") + self.checkBox.setGeometry(QRect(150, 70, 91, 21)) + + self.retranslateUi(Dialog) + self.buttonBox.accepted.connect(Dialog.accept) + self.buttonBox.rejected.connect(Dialog.reject) + + QMetaObject.connectSlotsByName(Dialog) + # setupUi + + def retranslateUi(self, Dialog): + Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None)) + self.label.setText(QCoreApplication.translate("Dialog", u"Bis wann soll der Apparat verl\u00e4ngert werden?", None)) + self.rad_sommer.setText(QCoreApplication.translate("Dialog", u"Sommer", None)) + self.rad_winter.setText(QCoreApplication.translate("Dialog", u"Winter", None)) + self.sem_year.setPlaceholderText(QCoreApplication.translate("Dialog", u"2023", None)) + self.checkBox.setText(QCoreApplication.translate("Dialog", u"Dauerapparat", None)) + # retranslateUi + diff --git a/src/ui/dialogs/confirm_extend.ui b/src/ui/dialogs/confirm_extend.ui new file mode 100644 index 0000000..7b2cde2 --- /dev/null +++ b/src/ui/dialogs/confirm_extend.ui @@ -0,0 +1,78 @@ + + + extend_confirm + + + + 0 + 0 + 380 + 97 + + + + Dialog + + + + + 290 + 20 + 81 + 241 + + + + Qt::Vertical + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 10 + 10 + 271 + 81 + + + + + + + + buttonBox + accepted() + extend_confirm + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + extend_confirm + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/dialogs/confirm_extend_ui.py b/src/ui/dialogs/confirm_extend_ui.py new file mode 100644 index 0000000..8d087f6 --- /dev/null +++ b/src/ui/dialogs/confirm_extend_ui.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'confirm_extend.ui' +## +## Created by: Qt User Interface Compiler version 6.4.0 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QAbstractButton, QApplication, QDialog, QDialogButtonBox, + QSizePolicy, QTextEdit, QWidget) + +class Ui_extend_confirm(object): + def setupUi(self, extend_confirm): + if not extend_confirm.objectName(): + extend_confirm.setObjectName(u"extend_confirm") + extend_confirm.resize(380, 97) + self.buttonBox = QDialogButtonBox(extend_confirm) + self.buttonBox.setObjectName(u"buttonBox") + self.buttonBox.setGeometry(QRect(290, 20, 81, 241)) + self.buttonBox.setOrientation(Qt.Vertical) + self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) + self.textEdit = QTextEdit(extend_confirm) + self.textEdit.setObjectName(u"textEdit") + self.textEdit.setGeometry(QRect(10, 10, 271, 81)) + + self.retranslateUi(extend_confirm) + self.buttonBox.accepted.connect(extend_confirm.accept) + self.buttonBox.rejected.connect(extend_confirm.reject) + + QMetaObject.connectSlotsByName(extend_confirm) + # setupUi + + def retranslateUi(self, extend_confirm): + extend_confirm.setWindowTitle(QCoreApplication.translate("extend_confirm", u"Dialog", None)) + # retranslateUi + diff --git a/src/ui/dialogs/edit_bookdata.ui b/src/ui/dialogs/edit_bookdata.ui new file mode 100644 index 0000000..0ad922d --- /dev/null +++ b/src/ui/dialogs/edit_bookdata.ui @@ -0,0 +1,216 @@ + + + Dialog + + + + 0 + 0 + 448 + 572 + + + + Dialog + + + + + 260 + 530 + 161 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 0 + 0 + 441 + 531 + + + + + QLayout::SetDefaultConstraint + + + + + Seiten + + + + + + + Titel + + + + + + + Jahr + + + + + + + Sprache + + + + + + + Link + + + + + + + + + + Auflage + + + + + + + Autor + + + + + + + ArrowCursor + + + true + + + + + + + Herausgeber + + + + + + + ISBN(s) + + + + + + + PPN + + + + + + + Signatur + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/dialogs/ext_app.py b/src/ui/dialogs/ext_app.py new file mode 100644 index 0000000..5ff330d --- /dev/null +++ b/src/ui/dialogs/ext_app.py @@ -0,0 +1,51 @@ +# Form implementation generated from reading ui file 'ui/dialogs/extend_apparat.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_Frame(object): + def setupUi(self, Frame): + Frame.setObjectName("Frame") + Frame.resize(317, 126) + self.label = QtWidgets.QLabel(Frame) + self.label.setGeometry(QtCore.QRect(60, 20, 231, 16)) + self.label.setObjectName("label") + self.buttonBox = QtWidgets.QDialogButtonBox(Frame) + self.buttonBox.setGeometry(QtCore.QRect(90, 90, 156, 23)) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.sem_winter = QtWidgets.QRadioButton(Frame) + self.sem_winter.setGeometry(QtCore.QRect(60, 40, 82, 17)) + self.sem_winter.setObjectName("sem_winter") + self.sem_sommer = QtWidgets.QRadioButton(Frame) + self.sem_sommer.setGeometry(QtCore.QRect(60, 60, 82, 17)) + self.sem_sommer.setObjectName("sem_sommer") + self.sem_year = QtWidgets.QLineEdit(Frame) + self.sem_year.setGeometry(QtCore.QRect(160, 50, 113, 20)) + self.sem_year.setObjectName("sem_year") + + self.retranslateUi(Frame) + QtCore.QMetaObject.connectSlotsByName(Frame) + + def retranslateUi(self, Frame): + _translate = QtCore.QCoreApplication.translate + Frame.setWindowTitle(_translate("Frame", "Frame")) + self.label.setText(_translate("Frame", "Bis wann soll der Apparat verlängert werden?")) + self.sem_winter.setText(_translate("Frame", "Winter")) + self.sem_sommer.setText(_translate("Frame", "Sommer")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + Frame = QtWidgets.QFrame() + ui = Ui_Frame() + ui.setupUi(Frame) + Frame.show() + sys.exit(app.exec()) diff --git a/src/ui/dialogs/extend_apparat.ui b/src/ui/dialogs/extend_apparat.ui new file mode 100644 index 0000000..ade388f --- /dev/null +++ b/src/ui/dialogs/extend_apparat.ui @@ -0,0 +1,81 @@ + + + Frame + + + + 0 + 0 + 317 + 126 + + + + Frame + + + + + 60 + 20 + 231 + 16 + + + + Bis wann soll der Apparat verlängert werden? + + + + + + 90 + 90 + 156 + 23 + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 60 + 40 + 82 + 17 + + + + Winter + + + + + + 60 + 60 + 82 + 17 + + + + Sommer + + + + + + 160 + 50 + 113 + 20 + + + + + + + diff --git a/src/ui/dialogs/fileparser.ui b/src/ui/dialogs/fileparser.ui new file mode 100644 index 0000000..86e7bdf --- /dev/null +++ b/src/ui/dialogs/fileparser.ui @@ -0,0 +1,129 @@ + + + Dialog + + + + 0 + 0 + 402 + 301 + + + + Dialog + + + + + 10 + 60 + 381 + 23 + + + + 24 + + + + + + 10 + 10 + 381 + 41 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 381 + 41 + + + + + + + Es wurden + + + + + + + + 75 + true + + + + 0 + + + Qt::PlainText + + + + + + + Signaturen gefunden. + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 10 + 100 + 381 + 201 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 381 + 191 + + + + + + + + diff --git a/src/ui/dialogs/login.ui b/src/ui/dialogs/login.ui new file mode 100644 index 0000000..5b3239b --- /dev/null +++ b/src/ui/dialogs/login.ui @@ -0,0 +1,120 @@ + + + Dialog + + + + 0 + 0 + 218 + 190 + + + + Dialog + + + + + 30 + 140 + 161 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 20 + 40 + 71 + 21 + + + + Username + + + + + + 80 + 40 + 113 + 21 + + + + + + + 20 + 80 + 71 + 21 + + + + Password + + + + + + 80 + 80 + 113 + 21 + + + + Qt::ImhSensitiveData + + + true + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/dialogs/mail.py b/src/ui/dialogs/mail.py new file mode 100644 index 0000000..cd57712 --- /dev/null +++ b/src/ui/dialogs/mail.py @@ -0,0 +1,69 @@ +import subprocess +import tempfile + +from PyQt6 import QtCore, QtGui, QtWidgets + +from src.ui.dialogs.mail_preview import Ui_Dialog + + +class Mail_Dialog(QtWidgets.QDialog, Ui_Dialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setupUi(self) + self.appid = "" + self.mail_data = "" + self.data = None + self.buttonBox.accepted.connect(self.save_mail) + + def set_data(self, data: dict): + self.prof_name.setText(data["prof_name"]) + self.mail_name.setText(data["mail_name"]) + # assign data["general"] to self.data + self.data = data["general"] + + def set_mail(self): + email_template = self.comboBox.currentText() + with open(f"mail_vorlagen/{email_template}", "r", encoding="utf-8") as f: + mail_template = f.read() + email_header = email_template.split(".eml")[0] + if "{AppNr}" in email_template: + email_header = email_template.split(".eml")[0].format(AppNr=self.appid) + self.mail_header.setText(email_header) + self.mail_data = mail_template.split("")[0] + mail_html = mail_template.split("")[1] + mail_html = "" + mail_html + print(self.data) + Appname = self.data["Appname"] + mail_html = mail_html.format( + Profname=self.prof_name.text().split(" ")[-1], Appname=Appname + ) + + self.mail_body.setHtml(mail_html) + + def save_mail(self): + # create a temporary file + mail_header = self.mail_header.text() + mail_body = self.mail_body.toHtml() + mail = self.mail_data + mail_body + mail = mail.replace("Subject:", f"Subject: {mail_header}") + with tempfile.NamedTemporaryFile( + mode="w", delete=False, suffix=".eml", encoding="utf-8", dir="mails" + ) as f: + f.write(mail) + self.mail_path = f.name + print(self.mail_path) + # open the file using thunderbird + subprocess.Popen(["thunderbird", f"{self.mail_path}"]) + # delete the file + # os.remove(self.mail_path) + + +if __name__ == "__main__": + import sys + + app = QtWidgets.QApplication(sys.argv) + Dialog = QtWidgets.QDialog() + ui = Mail_Dialog() + ui.setupUi(Dialog) + Dialog.show() + sys.exit(app.exec()) diff --git a/src/ui/dialogs/mail_preview.py b/src/ui/dialogs/mail_preview.py new file mode 100644 index 0000000..c258514 --- /dev/null +++ b/src/ui/dialogs/mail_preview.py @@ -0,0 +1,81 @@ +# Form implementation generated from reading ui file 'ui\dialogs\mail_preview.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(676, 676) + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) + self.buttonBox.setGeometry(QtCore.QRect(310, 630, 341, 32)) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons( + QtWidgets.QDialogButtonBox.StandardButton.Cancel + | QtWidgets.QDialogButtonBox.StandardButton.Ok + ) + self.buttonBox.setObjectName("buttonBox") + self.gridLayoutWidget = QtWidgets.QWidget(Dialog) + self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 661, 621)) + self.gridLayoutWidget.setObjectName("gridLayoutWidget") + self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.prof_name = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.prof_name.setObjectName("prof_name") + self.gridLayout.addWidget(self.prof_name, 2, 2, 1, 1) + self.label_3 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_3.setAlignment( + QtCore.Qt.AlignmentFlag.AlignLeading + | QtCore.Qt.AlignmentFlag.AlignLeft + | QtCore.Qt.AlignmentFlag.AlignTop + ) + self.label_3.setObjectName("label_3") + self.gridLayout.addWidget(self.label_3, 4, 0, 1, 1) + self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_2.setObjectName("label_2") + self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) + self.label_4 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_4.setObjectName("label_4") + self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1) + self.mail_header = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.mail_header.setObjectName("mail_header") + self.gridLayout.addWidget(self.mail_header, 3, 2, 1, 1) + self.mail_name = QtWidgets.QLineEdit(self.gridLayoutWidget) + self.mail_name.setObjectName("mail_name") + self.gridLayout.addWidget(self.mail_name, 1, 2, 1, 1) + self.mail_body = QtWidgets.QTextEdit(self.gridLayoutWidget) + self.mail_body.setObjectName("mail_body") + self.gridLayout.addWidget(self.mail_body, 4, 2, 1, 1) + self.label = QtWidgets.QLabel(self.gridLayoutWidget) + self.label.setObjectName("label") + self.gridLayout.addWidget(self.label, 1, 0, 1, 1) + self.comboBox = QtWidgets.QComboBox(self.gridLayoutWidget) + self.comboBox.setObjectName("comboBox") + self.gridLayout.addWidget(self.comboBox, 0, 2, 1, 1) + self.label_5 = QtWidgets.QLabel(self.gridLayoutWidget) + self.label_5.setObjectName("label_5") + self.gridLayout.addWidget(self.label_5, 0, 0, 1, 1) + # at selection change, load mail text + + self.comboBox.currentIndexChanged.connect(self.set_mail) + self.retranslateUi(Dialog) + self.buttonBox.accepted.connect(Dialog.accept) # type: ignore + self.buttonBox.rejected.connect(Dialog.reject) # type: ignore + # if the dialog is accepted, save the mail and send it + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label_3.setText(_translate("Dialog", "Mail")) + self.label_2.setText(_translate("Dialog", "Prof")) + self.label_4.setText(_translate("Dialog", "Betreff")) + self.label.setText(_translate("Dialog", "eMail")) + self.label_5.setText(_translate("Dialog", "Art")) diff --git a/src/ui/dialogs/mail_preview.ui b/src/ui/dialogs/mail_preview.ui new file mode 100644 index 0000000..847ea39 --- /dev/null +++ b/src/ui/dialogs/mail_preview.ui @@ -0,0 +1,133 @@ + + + Dialog + + + + 0 + 0 + 676 + 676 + + + + Dialog + + + + + 310 + 630 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 10 + 10 + 661 + 621 + + + + + + + + + + Mail + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + Prof + + + + + + + Betreff + + + + + + + + + + + + + + + + eMail + + + + + + + + + + Art + + + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/dialogs/medianadder.ui b/src/ui/dialogs/medianadder.ui new file mode 100644 index 0000000..9a5b6ac --- /dev/null +++ b/src/ui/dialogs/medianadder.ui @@ -0,0 +1,557 @@ + + + Dialog + + + + 0 + 0 + 637 + 491 + + + + Dialog + + + + + 20 + 10 + 47 + 21 + + + + Signatur + + + + + + 20 + 40 + 47 + 21 + + + + Modus + + + + + + 70 + 40 + 69 + 22 + + + + + ARRAY + + + + + BibTeX + + + + + COinS + + + + + RIS + + + + + + + 70 + 10 + 113 + 20 + + + + Signatur / ISBN + + + + + + 20 + 70 + 47 + 21 + + + + Queue + + + + + + 330 + 90 + 301 + 341 + + + + + true + + + + 0 + 0 + 301 + 341 + + + + Qt::NoFocus + + + false + + + 0 + + + 0 + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + QAbstractScrollArea::AdjustToContents + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::NoSelection + + + Qt::ElideMiddle + + + true + + + false + + + false + + + false + + + 96 + + + false + + + 20 + + + false + + + + Datensatz\Metadata + + + + 7 + + + + + + Array + + + + + BibTeX + + + + + COinS + + + + + RIS + + + + + PPN + + + 1 + + + 0 + + + + + 255 + 0 + 0 + + + + + 1 + + + 1 + + + + + Signatur + + + 1 + + + 1 + + + + + 0 + 255 + 0 + + + + + 0 + + + 1 + + + + + Autor + + + 1 + + + 1 + + + 1 + + + 1 + + + + + ISBN + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Jahr + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Auflage + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Sprache + + + 1 + + + 1 + + + 0 + + + 1 + + + + + Herausgeber + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Seiten + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Titel + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Link + + + 1 + + + 0 + + + 1 + + + 1 + + + + + + + + 10 + 90 + 281 + 341 + + + + Qt::CustomContextMenu + + + + + + 330 + 50 + 181 + 21 + + + + Belegbare Felder per Anbieter + + + + + + 200 + 70 + 41 + 21 + + + + Anzahl: + + + + + + 240 + 70 + 47 + 21 + + + + 0 + + + + + + 10 + 450 + 156 + 23 + + + + Qt::NoFocus + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + false + + + + + + 190 + 10 + 21 + 23 + + + + Qt::ClickFocus + + + Clicken oder Shift Enter drücken um den Eintrag hinzuzufügen + + + + + + + :/information/icons/information.png:/information/icons/information.png + + + Shift+Return + + + false + + + + + lineEdit + comboBox + listWidget + treeWidget + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 87 + 461 + + + 318 + 245 + + + + + buttonBox + rejected() + Dialog + reject() + + + 87 + 461 + + + 318 + 245 + + + + + diff --git a/src/ui/dialogs/medianadder_ui.ts b/src/ui/dialogs/medianadder_ui.ts new file mode 100644 index 0000000..978f01e --- /dev/null +++ b/src/ui/dialogs/medianadder_ui.ts @@ -0,0 +1,47 @@ + + + + + Dialog + + + Dialog + + + + + Signatur + + + + + Modus + + + + + ARRAY + + + + + BibTeX + + + + + COinS + + + + + RIS + + + + + Queue + + + + diff --git a/src/ui/dialogs/medienadder.py b/src/ui/dialogs/medienadder.py new file mode 100644 index 0000000..31f26cc --- /dev/null +++ b/src/ui/dialogs/medienadder.py @@ -0,0 +1,82 @@ +from PyQt6 import QtCore, QtGui, QtWidgets + +from .Ui_medianadder import Ui_Dialog + + +class MedienAdder(QtWidgets.QDialog): + def __init__(self): + super().__init__() + self.ui = Ui_Dialog() + self.ui.setupUi(self) + + # Connect signals and slots for your custom functionality + self.ui.buttonBox.accepted.connect(self.accept) + self.ui.buttonBox.rejected.connect(self.reject) + self.ui.l_add.clicked.connect(self.add_to_list) + self.ui.l_add.setShortcut("Shift+Return") + # Initialize data variables to store the results + self.result_data = [] + + self.recolorize() + + def add_to_list(self): + text = self.ui.lineEdit.text().strip() + if text == "": + return + else: + self.ui.listWidget.addItem(text) + self.ui.list_amount.setText(str(self.ui.listWidget.count())) + self.ui.lineEdit.clear() + + def recolorize(self): + # set the color of the cells of the treeWidget to red if the field is not supported by the provider + # else set it to green + for i in range(self.ui.treeWidget.topLevelItemCount()): + for j in range(1, self.ui.treeWidget.columnCount()): + if self.ui.treeWidget.topLevelItem(i).text(j) == "0": + self.ui.treeWidget.topLevelItem(i).setBackground( + j, QtGui.QColor(255, 0, 0) + ) + else: + self.ui.treeWidget.topLevelItem(i).setBackground( + j, QtGui.QColor(0, 255, 0) + ) + # remove the text from the cells + self.ui.treeWidget.topLevelItem(i).setText(j, "") + + def custom_context_menu(self): + menu = QtWidgets.QMenu() + menu.addAction("Remove") + + action = menu.exec(QtGui.QCursor.pos()) + if action.text() == "Remove": + self.remove_from_list() + + def remove_from_list(self): + self.ui.listWidget.takeItem(self.ui.listWidget.currentRow()) + self.ui.list_amount.setText(str(self.ui.listWidget.count())) + + def add_to_list(self): + text = self.ui.lineEdit.text().strip() + if text: + self.ui.listWidget.addItem(text) + self.ui.list_amount.setText(str(self.ui.listWidget.count())) + self.ui.lineEdit.clear() + + def accept(self): + # Gather and store the data you want to return + self.result_data = [ + self.ui.listWidget.item(i).text() for i in range(self.ui.listWidget.count()) + ] + super().accept() + + def keyPressEvent(self, event): + if ( + event.key() == QtCore.Qt.Key.Key_Return + or event.key() == QtCore.Qt.Key.Key_Enter + ): + # Handle the Return key press as needed (e.g., add to list) + self.add_to_list() + event.accept() + else: + super().keyPressEvent(event) diff --git a/src/ui/dialogs/new_subject.ui b/src/ui/dialogs/new_subject.ui new file mode 100644 index 0000000..3eca687 --- /dev/null +++ b/src/ui/dialogs/new_subject.ui @@ -0,0 +1,132 @@ + + + Dialog + + + + 0 + 0 + 448 + 165 + + + + Dialog + + + + + + + + Das eingegebene Fach wurde nicht in der Datenbank gefunden. Soll es angelegt werden? + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Ja + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 10 + 141 + 16 + + + + Name des Neuen Faches: + + + + + + 0 + 30 + 141 + 20 + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/dialogs/new_subject_ui.py b/src/ui/dialogs/new_subject_ui.py new file mode 100644 index 0000000..bbcc9dd --- /dev/null +++ b/src/ui/dialogs/new_subject_ui.py @@ -0,0 +1,59 @@ +# Form implementation generated from reading ui file '/home/alexander/GitHub/Semesterapparate/ui/dialogs/new_subject.ui' +# +# Created by: PyQt6 UI code generator 6.5.3 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(448, 165) + self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.label = QtWidgets.QLabel(parent=Dialog) + self.label.setObjectName("label") + self.verticalLayout.addWidget(self.label) + self.gridLayout = QtWidgets.QGridLayout() + self.gridLayout.setObjectName("gridLayout") + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout.addItem(spacerItem, 0, 1, 1, 1) + self.checkBox = QtWidgets.QCheckBox(parent=Dialog) + self.checkBox.setObjectName("checkBox") + self.gridLayout.addWidget(self.checkBox, 0, 0, 1, 1) + self.verticalLayout.addLayout(self.gridLayout) + self.verticalLayout_2.addLayout(self.verticalLayout) + self.frame = QtWidgets.QFrame(parent=Dialog) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.label_2 = QtWidgets.QLabel(parent=self.frame) + self.label_2.setGeometry(QtCore.QRect(0, 10, 141, 16)) + self.label_2.setObjectName("label_2") + self.lineEdit = QtWidgets.QLineEdit(parent=self.frame) + self.lineEdit.setGeometry(QtCore.QRect(0, 30, 141, 20)) + self.lineEdit.setObjectName("lineEdit") + self.verticalLayout_2.addWidget(self.frame) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.verticalLayout_2.addWidget(self.buttonBox) + + self.retranslateUi(Dialog) + self.buttonBox.accepted.connect(Dialog.accept) # type: ignore + self.buttonBox.rejected.connect(Dialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label.setText(_translate("Dialog", "Das eingegebene Fach wurde nicht in der Datenbank gefunden. Soll es angelegt werden?")) + self.checkBox.setText(_translate("Dialog", "Ja")) + self.label_2.setText(_translate("Dialog", "Name des Neuen Faches:")) diff --git a/src/ui/dialogs/parsed_titles.ui b/src/ui/dialogs/parsed_titles.ui new file mode 100644 index 0000000..1789f2f --- /dev/null +++ b/src/ui/dialogs/parsed_titles.ui @@ -0,0 +1,163 @@ + + + Form + + + + 0 + 0 + 402 + 316 + + + + Form + + + + + 10 + 10 + 381 + 41 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 381 + 41 + + + + + + + Es wurden + + + + + + + + 75 + true + + + + 0 + + + Qt::PlainText + + + + + + + Signaturen gefunden. + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 10 + 80 + 381 + 201 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 10 + 381 + 191 + + + + + + + + + + + + + + + + 10 + 60 + 381 + 23 + + + + 24 + + + + + + 230 + 290 + 156 + 23 + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 20 + 290 + 25 + 19 + + + + ... + + + + + + diff --git a/src/ui/dialogs/parsed_titles_ui.py b/src/ui/dialogs/parsed_titles_ui.py new file mode 100644 index 0000000..746f908 --- /dev/null +++ b/src/ui/dialogs/parsed_titles_ui.py @@ -0,0 +1,81 @@ +# Form implementation generated from reading ui file '/home/alexander/GitHub/Semesterapparate/ui/dialogs/parsed_titles.ui' +# +# Created by: PyQt6 UI code generator 6.5.3 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_Form(object): + def setupUi(self, Form): + Form.setObjectName("Form") + Form.resize(402, 316) + self.frame = QtWidgets.QFrame(parent=Form) + self.frame.setGeometry(QtCore.QRect(10, 10, 381, 41)) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.horizontalLayoutWidget = QtWidgets.QWidget(parent=self.frame) + self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 381, 41)) + self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout.setObjectName("horizontalLayout") + self.label = QtWidgets.QLabel(parent=self.horizontalLayoutWidget) + self.label.setObjectName("label") + self.horizontalLayout.addWidget(self.label) + self.count = QtWidgets.QLabel(parent=self.horizontalLayoutWidget) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.count.setFont(font) + self.count.setTextFormat(QtCore.Qt.TextFormat.PlainText) + self.count.setObjectName("count") + self.horizontalLayout.addWidget(self.count) + self.label_2 = QtWidgets.QLabel(parent=self.horizontalLayoutWidget) + self.label_2.setObjectName("label_2") + self.horizontalLayout.addWidget(self.label_2) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout.addItem(spacerItem) + self.frame_2 = QtWidgets.QFrame(parent=Form) + self.frame_2.setGeometry(QtCore.QRect(10, 80, 381, 201)) + self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame_2.setObjectName("frame_2") + self.horizontalLayoutWidget_2 = QtWidgets.QWidget(parent=self.frame_2) + self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 10, 381, 191)) + self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2) + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.listWidget = QtWidgets.QListWidget(parent=self.horizontalLayoutWidget_2) + self.listWidget.setObjectName("listWidget") + self.horizontalLayout_2.addWidget(self.listWidget) + self.listWidget_done = QtWidgets.QListWidget(parent=self.horizontalLayoutWidget_2) + self.listWidget_done.setObjectName("listWidget_done") + self.horizontalLayout_2.addWidget(self.listWidget_done) + self.progressBar = QtWidgets.QProgressBar(parent=Form) + self.progressBar.setGeometry(QtCore.QRect(10, 60, 381, 23)) + self.progressBar.setProperty("value", 24) + self.progressBar.setObjectName("progressBar") + self.buttonBox = QtWidgets.QDialogButtonBox(parent=Form) + self.buttonBox.setGeometry(QtCore.QRect(230, 290, 156, 23)) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.toolButton = QtWidgets.QToolButton(parent=Form) + self.toolButton.setGeometry(QtCore.QRect(20, 290, 25, 19)) + self.toolButton.setObjectName("toolButton") + + self.retranslateUi(Form) + QtCore.QMetaObject.connectSlotsByName(Form) + + def retranslateUi(self, Form): + _translate = QtCore.QCoreApplication.translate + Form.setWindowTitle(_translate("Form", "Form")) + self.label.setText(_translate("Form", "Es wurden")) + self.count.setText(_translate("Form", "0")) + self.label_2.setText(_translate("Form", "Signaturen gefunden.")) + self.toolButton.setText(_translate("Form", "...")) diff --git a/src/ui/dialogs/popup_confirm.py b/src/ui/dialogs/popup_confirm.py new file mode 100644 index 0000000..a27c0bc --- /dev/null +++ b/src/ui/dialogs/popup_confirm.py @@ -0,0 +1,48 @@ +# Form implementation generated from reading ui file 'ui\dialogs\confirm_extend.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_extend_confirm(object): + def setupUi(self, extend_confirm): + extend_confirm.setObjectName("extend_confirm") + extend_confirm.resize(380, 97) + # icon=QtGui.QIcon(f"ui/icons/{icon}.png") + # extend_confirm.setWindowIcon(icon) + self.buttonBox = QtWidgets.QDialogButtonBox(extend_confirm) + self.buttonBox.setGeometry(QtCore.QRect(290, 20, 81, 241)) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Vertical) + self.buttonBox.setStandardButtons( + QtWidgets.QDialogButtonBox.StandardButton.Cancel + | QtWidgets.QDialogButtonBox.StandardButton.Ok + ) + self.buttonBox.setObjectName("buttonBox") + self.textEdit = QtWidgets.QTextEdit(extend_confirm) + self.textEdit.setGeometry(QtCore.QRect(10, 10, 271, 81)) + self.textEdit.setObjectName("textEdit") + + self.retranslateUi(extend_confirm) + self.buttonBox.accepted.connect(extend_confirm.accept) # type: ignore + self.buttonBox.rejected.connect(extend_confirm.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(extend_confirm) + + def retranslateUi(self, extend_confirm): + _translate = QtCore.QCoreApplication.translate + extend_confirm.setWindowTitle(_translate("extend_confirm", "Dialog")) + + +if __name__ == "__main__": + import sys + + app = QtWidgets.QApplication(sys.argv) + extend_confirm = QtWidgets.QDialog() + ui = Ui_extend_confirm() + ui.setupUi(extend_confirm) + extend_confirm.show() + sys.exit(app.exec()) diff --git a/src/ui/dialogs/reminder.ui b/src/ui/dialogs/reminder.ui new file mode 100644 index 0000000..a461a74 --- /dev/null +++ b/src/ui/dialogs/reminder.ui @@ -0,0 +1,114 @@ + + + Dialog + + + + 0 + 0 + 369 + 308 + + + + Dialog + + + + + 190 + 270 + 161 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 10 + 60 + 341 + 201 + + + + + + + 10 + 30 + 61 + 21 + + + + Nachricht: + + + + + + 150 + 30 + 81 + 21 + + + + Erinnerung am: + + + + + + 240 + 30 + 110 + 22 + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/dialogs/resources.qrc b/src/ui/dialogs/resources.qrc new file mode 100644 index 0000000..e69de29 diff --git a/src/ui/dialogs/settings.py b/src/ui/dialogs/settings.py new file mode 100644 index 0000000..63d7b62 --- /dev/null +++ b/src/ui/dialogs/settings.py @@ -0,0 +1,48 @@ +from omegaconf import OmegaConf +from PyQt6 import QtWidgets + +from src.ui.dialogs.Ui_settings import Ui_Dialog as _settings + +config = OmegaConf.load("config.yaml") + + +class Settings(_settings): + def __init__(self): + super().__init__() + self.setupUi(self) + self.retranslateUi(self) + self.load_config() + + def load_config(self): + self.db_name.setText(config.database.name) + self.db_path.setText(config.database.path) + self.save_path.setText(config.save_path) + self.os_apps.setChecked(config.default_apps) + + def select_db(self): + # open file dialog, limit to .db files + file_dialog = QtWidgets.QFileDialog() + file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.AnyFile) + file_dialog.setNameFilter("Datenbank (*.db)") + file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.Detail) + if file_dialog.exec(): + self.db_name.setText(file_dialog.selectedFiles()[0].split("/")[-1]) + self.db_path.setText( + file_dialog.selectedFiles()[0].split(self.db_name.text())[0] + ) + + def set_save_path(self): + # open file dialog, limit to .db files + file_dialog = QtWidgets.QFileDialog() + file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.Directory) + file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.Detail) + if file_dialog.exec(): + self.save_path.setText(file_dialog.selectedFiles()[0]) + + def return_data(self): + config.database.name = self.db_name.text() + config.database.path = self.db_path.text() + config.save_path = self.save_path.text() + config.default_apps = self.os_apps.isChecked() + + return config diff --git a/src/ui/dialogs/settings.ui b/src/ui/dialogs/settings.ui new file mode 100644 index 0000000..a3da916 --- /dev/null +++ b/src/ui/dialogs/settings.ui @@ -0,0 +1,308 @@ + + + Dialog + + + + 0 + 0 + 743 + 576 + + + + Dialog + + + + + 120 + 540 + 621 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 0 + 0 + 741 + 541 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 400 + 30 + 161 + 21 + + + + Dateispezifische Einstellungen + + + + + + 370 + 0 + 20 + 541 + + + + QFrame::Plain + + + 1 + + + 0 + + + Qt::Vertical + + + + + + 400 + 50 + 311 + 51 + + + + Qt::NoFocus + + + Qt::ImhNone + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hier können Einstellungen für bestehende Dateiformate geändert, oder neue Dateiformate eingefügt werden.</p></body></html> + + + + + + 10 + 20 + 161 + 21 + + + + Allgemeine Einstellungen + + + + + + 410 + 110 + 161 + 17 + + + + Verwendet im Betriebssystem festgelegte Anwendungen um Dateien zu öffnen + + + Standard-Apps verwenden + + + + + + 10 + 50 + 361 + 491 + + + + + + + <html><head/><body><p>Name der Datenbank, welche verwendet werden soll. <span style=" font-weight:600;">Muss</span> auf .db enden</p></body></html> + + + Datenbankname + + + db_name + + + + + + + Pfad, an dem heruntergeladene Dateien gespeichert werden sollen + + + Speicherpfad + + + save_path + + + + + + + false + + + + + + + + + + Datenbankpfad + + + db_path + + + + + + + sap.db + + + + + + + ... + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + ... + + + + + + + + + 400 + 130 + 331 + 381 + + + + true + + + + + 0 + 0 + 329 + 379 + + + + + + 0 + 0 + 331 + 381 + + + + Qt::ActionsContextMenu + + + + + + + + db_name + db_path + save_path + os_apps + textBrowser + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 358 + 540 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 426 + 540 + + + 286 + 274 + + + + + diff --git a/src/ui/extensions/__init__.py b/src/ui/extensions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ui/icons/critical.png b/src/ui/icons/critical.png new file mode 100644 index 0000000..cc65ce9 Binary files /dev/null and b/src/ui/icons/critical.png differ diff --git a/src/ui/icons/information.png b/src/ui/icons/information.png new file mode 100644 index 0000000..622dc87 Binary files /dev/null and b/src/ui/icons/information.png differ diff --git a/src/ui/icons/logo_SAP.ico b/src/ui/icons/logo_SAP.ico new file mode 100644 index 0000000..d62f0cb Binary files /dev/null and b/src/ui/icons/logo_SAP.ico differ diff --git a/src/ui/icons/logo_SAP.png b/src/ui/icons/logo_SAP.png new file mode 100644 index 0000000..8d4e350 Binary files /dev/null and b/src/ui/icons/logo_SAP.png differ diff --git a/src/ui/icons/question.png b/src/ui/icons/question.png new file mode 100644 index 0000000..35d103b Binary files /dev/null and b/src/ui/icons/question.png differ diff --git a/src/ui/icons/warning.png b/src/ui/icons/warning.png new file mode 100644 index 0000000..ae04ee4 Binary files /dev/null and b/src/ui/icons/warning.png differ diff --git a/src/ui/mainwindow.py b/src/ui/mainwindow.py new file mode 100644 index 0000000..fb8f979 --- /dev/null +++ b/src/ui/mainwindow.py @@ -0,0 +1,360 @@ +# Form implementation generated from reading ui file 'untitled.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(1280, 720) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) + MainWindow.setSizePolicy(sizePolicy) + self.centralwidget = QtWidgets.QWidget(MainWindow) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) + self.centralwidget.setSizePolicy(sizePolicy) + self.centralwidget.setObjectName("centralwidget") + self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget) + self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 1271, 671)) + self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") + self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.gridLayout = QtWidgets.QGridLayout() + self.gridLayout.setObjectName("gridLayout") + self.tabWidget = QtWidgets.QTabWidget(self.verticalLayoutWidget) + self.tabWidget.setObjectName("tabWidget") + self.tab = QtWidgets.QWidget() + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.tab.sizePolicy().hasHeightForWidth()) + self.tab.setSizePolicy(sizePolicy) + self.tab.setObjectName("tab") + self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.tab) + self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 1261, 161)) + self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2) + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.formLayout = QtWidgets.QFormLayout() + self.formLayout.setObjectName("formLayout") + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout_2.addItem(spacerItem) + self.load_app = QtWidgets.QPushButton(self.horizontalLayoutWidget_2) + self.load_app.setObjectName("load_app") + self.verticalLayout_2.addWidget(self.load_app) + self.create_new_app = QtWidgets.QPushButton(self.horizontalLayoutWidget_2) + self.create_new_app.setObjectName("create_new_app") + self.verticalLayout_2.addWidget(self.create_new_app) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout_2.addItem(spacerItem1) + self.formLayout.setLayout(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.verticalLayout_2) + self.tableWidget_apparate = QtWidgets.QTableWidget(self.horizontalLayoutWidget_2) + self.tableWidget_apparate.setObjectName("tableWidget_apparate") + self.tableWidget_apparate.setColumnCount(4) + self.tableWidget_apparate.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(3, item) + self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.tableWidget_apparate) + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.formLayout.setLayout(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.horizontalLayout_3) + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.formLayout.setLayout(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.horizontalLayout_4) + self.horizontalLayout_2.addLayout(self.formLayout) + self.line = QtWidgets.QFrame(self.tab) + self.line.setGeometry(QtCore.QRect(0, 160, 1261, 21)) + self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line.setObjectName("line") + self.gridLayoutWidget_2 = QtWidgets.QWidget(self.tab) + self.gridLayoutWidget_2.setGeometry(QtCore.QRect(0, 180, 1261, 461)) + self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2") + self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2) + self.gridLayout_2.setContentsMargins(0, 0, 0, 0) + self.gridLayout_2.setObjectName("gridLayout_2") + self.tableWidget_apparat_media = QtWidgets.QTableWidget(self.gridLayoutWidget_2) + self.tableWidget_apparat_media.setObjectName("tableWidget_apparat_media") + self.tableWidget_apparat_media.setColumnCount(4) + self.tableWidget_apparat_media.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(3, item) + self.gridLayout_2.addWidget(self.tableWidget_apparat_media, 3, 0, 1, 1) + self.label = QtWidgets.QLabel(self.gridLayoutWidget_2) + font = QtGui.QFont() + font.setPointSize(11) + font.setBold(True) + font.setWeight(75) + self.label.setFont(font) + self.label.setObjectName("label") + self.gridLayout_2.addWidget(self.label, 1, 0, 1, 1) + self.app_group_box = QtWidgets.QGroupBox(self.gridLayoutWidget_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.app_group_box.sizePolicy().hasHeightForWidth()) + self.app_group_box.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(12) + font.setBold(True) + font.setWeight(75) + self.app_group_box.setFont(font) + self.app_group_box.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignVCenter) + self.app_group_box.setCheckable(False) + self.app_group_box.setObjectName("app_group_box") + self.tableWidget = QtWidgets.QTableWidget(self.app_group_box) + self.tableWidget.setGeometry(QtCore.QRect(820, 20, 256, 192)) + self.tableWidget.setObjectName("tableWidget") + self.tableWidget.setColumnCount(2) + self.tableWidget.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(1, item) + self.frame = QtWidgets.QFrame(self.app_group_box) + self.frame.setGeometry(QtCore.QRect(10, 30, 731, 151)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) + self.frame.setSizePolicy(sizePolicy) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.drpdwn_prof_title = QtWidgets.QComboBox(self.frame) + self.drpdwn_prof_title.setGeometry(QtCore.QRect(110, 50, 69, 22)) + self.drpdwn_prof_title.setObjectName("drpdwn_prof_title") + self.label_5 = QtWidgets.QLabel(self.frame) + self.label_5.setGeometry(QtCore.QRect(250, 20, 91, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_5.setFont(font) + self.label_5.setObjectName("label_5") + self.lineEdit = QtWidgets.QLineEdit(self.frame) + self.lineEdit.setGeometry(QtCore.QRect(110, 80, 121, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.lineEdit.setFont(font) + self.lineEdit.setObjectName("lineEdit") + self.sem_winter = QtWidgets.QRadioButton(self.frame) + self.sem_winter.setGeometry(QtCore.QRect(340, 50, 82, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_winter.setFont(font) + self.sem_winter.setObjectName("sem_winter") + self.label_4 = QtWidgets.QLabel(self.frame) + self.label_4.setGeometry(QtCore.QRect(10, 80, 71, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_4.setFont(font) + self.label_4.setObjectName("label_4") + self.drpdwn_app_nr = QtWidgets.QComboBox(self.frame) + self.drpdwn_app_nr.setGeometry(QtCore.QRect(110, 20, 69, 22)) + self.drpdwn_app_nr.setObjectName("drpdwn_app_nr") + self.app_name = QtWidgets.QLineEdit(self.frame) + self.app_name.setGeometry(QtCore.QRect(340, 20, 113, 20)) + self.app_name.setObjectName("app_name") + self.sem_sommer = QtWidgets.QRadioButton(self.frame) + self.sem_sommer.setGeometry(QtCore.QRect(340, 70, 82, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_sommer.setFont(font) + self.sem_sommer.setObjectName("sem_sommer") + self.label_3 = QtWidgets.QLabel(self.frame) + self.label_3.setGeometry(QtCore.QRect(10, 50, 61, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_3.setFont(font) + self.label_3.setObjectName("label_3") + self.label_6 = QtWidgets.QLabel(self.frame) + self.label_6.setGeometry(QtCore.QRect(270, 60, 51, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_6.setFont(font) + self.label_6.setObjectName("label_6") + self.sem_year = QtWidgets.QLineEdit(self.frame) + self.sem_year.setGeometry(QtCore.QRect(410, 60, 113, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_year.setFont(font) + self.sem_year.setObjectName("sem_year") + self.label_2 = QtWidgets.QLabel(self.frame) + self.label_2.setGeometry(QtCore.QRect(10, 20, 101, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_2.setFont(font) + self.label_2.setObjectName("label_2") + self.btn_apparat_save = QtWidgets.QPushButton(self.frame) + self.btn_apparat_save.setGeometry(QtCore.QRect(260, 120, 75, 23)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_apparat_save.setFont(font) + self.btn_apparat_save.setObjectName("btn_apparat_save") + self.btn_apparat_apply = QtWidgets.QPushButton(self.frame) + self.btn_apparat_apply.setGeometry(QtCore.QRect(350, 120, 75, 23)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_apparat_apply.setFont(font) + self.btn_apparat_apply.setObjectName("btn_apparat_apply") + self.checkBox = QtWidgets.QCheckBox(self.frame) + self.checkBox.setGeometry(QtCore.QRect(340, 90, 101, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.checkBox.setFont(font) + self.checkBox.setObjectName("checkBox") + self.btn_add_document = QtWidgets.QPushButton(self.app_group_box) + self.btn_add_document.setGeometry(QtCore.QRect(1100, 40, 131, 25)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_add_document.setFont(font) + self.btn_add_document.setObjectName("btn_add_document") + self.btn_open_document = QtWidgets.QPushButton(self.app_group_box) + self.btn_open_document.setGeometry(QtCore.QRect(1100, 80, 131, 25)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_open_document.setFont(font) + self.btn_open_document.setObjectName("btn_open_document") + self.toolButton = QtWidgets.QToolButton(self.app_group_box) + self.toolButton.setGeometry(QtCore.QRect(1110, 110, 25, 19)) + self.toolButton.setObjectName("toolButton") + self.gridLayout_2.addWidget(self.app_group_box, 2, 0, 1, 1) + self.tabWidget.addTab(self.tab, "") + self.tab_2 = QtWidgets.QWidget() + self.tab_2.setObjectName("tab_2") + self.tabWidget.addTab(self.tab_2, "") + self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) + self.horizontalLayout.addLayout(self.gridLayout) + self.verticalLayout.addLayout(self.horizontalLayout) + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QtWidgets.QMenuBar(MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1280, 21)) + self.menubar.setObjectName("menubar") + self.menuDatei = QtWidgets.QMenu(self.menubar) + self.menuDatei.setObjectName("menuDatei") + self.menuEinstellungen = QtWidgets.QMenu(self.menubar) + self.menuEinstellungen.setObjectName("menuEinstellungen") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QtWidgets.QStatusBar(MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + self.menubar.addAction(self.menuDatei.menuAction()) + self.menubar.addAction(self.menuEinstellungen.menuAction()) + + self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(0) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) + self.load_app.setToolTip(_translate("MainWindow", "Load the Semesterapparate from the database")) + self.load_app.setText(_translate("MainWindow", "App. Laden")) + self.create_new_app.setText(_translate("MainWindow", "neu. App anlegen")) + item = self.tableWidget_apparate.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "AppNr")) + item = self.tableWidget_apparate.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "App Name")) + item = self.tableWidget_apparate.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Professor")) + item = self.tableWidget_apparate.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Dauerapparat")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Buchtitel")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Autor")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Auflage")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Signatur")) + self.label.setText(_translate("MainWindow", "Medienliste")) + self.app_group_box.setTitle(_translate("MainWindow", "Apparatsdetails")) + item = self.tableWidget.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Dokumentname")) + item = self.tableWidget.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Typ")) + self.label_5.setText(_translate("MainWindow", "Apparatsname")) + self.lineEdit.setPlaceholderText(_translate("MainWindow", "Nachname, Vorname")) + self.sem_winter.setText(_translate("MainWindow", "Winter")) + self.label_4.setText(_translate("MainWindow", "Prof. Name")) + self.sem_sommer.setText(_translate("MainWindow", "Sommer")) + self.label_3.setText(_translate("MainWindow", "Prof. Titel")) + self.label_6.setText(_translate("MainWindow", "Semester")) + self.sem_year.setPlaceholderText(_translate("MainWindow", "2023")) + self.label_2.setText(_translate("MainWindow", "Apparatsnummer")) + self.btn_apparat_save.setText(_translate("MainWindow", "Speichern")) + self.btn_apparat_apply.setText(_translate("MainWindow", "Aktualisieren")) + self.checkBox.setText(_translate("MainWindow", "Dauerapparat")) + self.btn_add_document.setText(_translate("MainWindow", "Dokument hinzufügen")) + self.btn_open_document.setText(_translate("MainWindow", "Dokument öffnen")) + self.toolButton.setText(_translate("MainWindow", "...")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2")) + self.menuDatei.setTitle(_translate("MainWindow", "Datei")) + self.menuEinstellungen.setTitle(_translate("MainWindow", "Einstellungen")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec()) diff --git a/src/ui/plotdata.ui b/src/ui/plotdata.ui new file mode 100644 index 0000000..9ec94dc --- /dev/null +++ b/src/ui/plotdata.ui @@ -0,0 +1,64 @@ + + + MainWindow + + + + 0 + 0 + 640 + 480 + + + + MainWindow + + + + + + 330 + 10 + 256 + 192 + + + + + + + 10 + 0 + 251 + 271 + + + + + + + 300 + 220 + 291 + 201 + + + + + + + + + + 0 + 0 + 640 + 21 + + + + + + + + diff --git a/src/ui/plotdata_ui.py b/src/ui/plotdata_ui.py new file mode 100644 index 0000000..f0738dc --- /dev/null +++ b/src/ui/plotdata_ui.py @@ -0,0 +1,47 @@ +# Form implementation generated from reading ui file '/home/alexander/GitHub/Semesterapparate/ui/plotdata.ui' +# +# Created by: PyQt6 UI code generator 6.5.3 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(640, 480) + self.centralwidget = QtWidgets.QWidget(parent=MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.graphicsView = QtWidgets.QGraphicsView(parent=self.centralwidget) + self.graphicsView.setGeometry(QtCore.QRect(330, 10, 256, 192)) + self.graphicsView.setObjectName("graphicsView") + self.widget = QtWidgets.QWidget(parent=self.centralwidget) + self.widget.setGeometry(QtCore.QRect(10, 0, 251, 271)) + self.widget.setObjectName("widget") + self.stackedWidget = QtWidgets.QStackedWidget(parent=self.centralwidget) + self.stackedWidget.setGeometry(QtCore.QRect(300, 220, 291, 201)) + self.stackedWidget.setObjectName("stackedWidget") + self.page = QtWidgets.QWidget() + self.page.setObjectName("page") + self.stackedWidget.addWidget(self.page) + self.page_2 = QtWidgets.QWidget() + self.page_2.setObjectName("page_2") + self.stackedWidget.addWidget(self.page_2) + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QtWidgets.QMenuBar(parent=MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 21)) + self.menubar.setObjectName("menubar") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) diff --git a/src/ui/resources.qrc b/src/ui/resources.qrc new file mode 100644 index 0000000..aa2997d --- /dev/null +++ b/src/ui/resources.qrc @@ -0,0 +1,14 @@ + + + icons/warning.png + + + icons/critical.png + + + icons/information.png + + + icons/question.png + + diff --git a/src/ui/sap.py b/src/ui/sap.py new file mode 100644 index 0000000..8d65970 --- /dev/null +++ b/src/ui/sap.py @@ -0,0 +1,512 @@ +# Form implementation generated from reading ui file 'ui/semesterapparat_ui.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(1280, 747) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) + MainWindow.setSizePolicy(sizePolicy) + self.centralwidget = QtWidgets.QWidget(MainWindow) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) + self.centralwidget.setSizePolicy(sizePolicy) + self.centralwidget.setObjectName("centralwidget") + self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget) + self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 1271, 691)) + self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") + self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.gridLayout = QtWidgets.QGridLayout() + self.gridLayout.setObjectName("gridLayout") + self.tabWidget = QtWidgets.QTabWidget(self.verticalLayoutWidget) + self.tabWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tabWidget.setObjectName("tabWidget") + self.tab = QtWidgets.QWidget() + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.tab.sizePolicy().hasHeightForWidth()) + self.tab.setSizePolicy(sizePolicy) + self.tab.setObjectName("tab") + self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.tab) + self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 1261, 161)) + self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2) + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.formLayout = QtWidgets.QFormLayout() + self.formLayout.setObjectName("formLayout") + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout_2.addItem(spacerItem) + self.load_app = QtWidgets.QPushButton(self.horizontalLayoutWidget_2) + self.load_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.load_app.setObjectName("load_app") + self.verticalLayout_2.addWidget(self.load_app) + self.create_new_app = QtWidgets.QPushButton(self.horizontalLayoutWidget_2) + self.create_new_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.create_new_app.setObjectName("create_new_app") + self.verticalLayout_2.addWidget(self.create_new_app) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout_2.addItem(spacerItem1) + self.formLayout.setLayout(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.verticalLayout_2) + self.tableWidget_apparate = QtWidgets.QTableWidget(self.horizontalLayoutWidget_2) + self.tableWidget_apparate.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tableWidget_apparate.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.tableWidget_apparate.setObjectName("tableWidget_apparate") + self.tableWidget_apparate.setColumnCount(4) + self.tableWidget_apparate.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(3, item) + self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.tableWidget_apparate) + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.formLayout.setLayout(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.horizontalLayout_3) + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.formLayout.setLayout(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.horizontalLayout_4) + self.horizontalLayout_2.addLayout(self.formLayout) + self.line = QtWidgets.QFrame(self.tab) + self.line.setGeometry(QtCore.QRect(0, 160, 1261, 21)) + self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line.setObjectName("line") + self.gridLayoutWidget_2 = QtWidgets.QWidget(self.tab) + self.gridLayoutWidget_2.setGeometry(QtCore.QRect(0, 180, 1261, 461)) + self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2") + self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2) + self.gridLayout_2.setContentsMargins(0, 0, 0, 0) + self.gridLayout_2.setObjectName("gridLayout_2") + self.app_group_box = QtWidgets.QGroupBox(self.gridLayoutWidget_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.app_group_box.sizePolicy().hasHeightForWidth()) + self.app_group_box.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(12) + font.setBold(True) + font.setWeight(75) + self.app_group_box.setFont(font) + self.app_group_box.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignVCenter) + self.app_group_box.setCheckable(False) + self.app_group_box.setObjectName("app_group_box") + self.dokument_list = QtWidgets.QTableWidget(self.app_group_box) + self.dokument_list.setGeometry(QtCore.QRect(830, 20, 256, 192)) + font = QtGui.QFont() + font.setKerning(False) + self.dokument_list.setFont(font) + self.dokument_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.dokument_list.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) + self.dokument_list.setObjectName("dokument_list") + self.dokument_list.setColumnCount(4) + self.dokument_list.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(8) + item.setFont(font) + self.dokument_list.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(8) + item.setFont(font) + self.dokument_list.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(8) + item.setFont(font) + self.dokument_list.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.dokument_list.setHorizontalHeaderItem(3, item) + self.frame = QtWidgets.QFrame(self.app_group_box) + self.frame.setEnabled(True) + self.frame.setGeometry(QtCore.QRect(10, 30, 731, 151)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) + self.frame.setSizePolicy(sizePolicy) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.drpdwn_prof_title = QtWidgets.QComboBox(self.frame) + self.drpdwn_prof_title.setGeometry(QtCore.QRect(110, 50, 69, 22)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.drpdwn_prof_title.setFont(font) + self.drpdwn_prof_title.setEditable(True) + self.drpdwn_prof_title.setObjectName("drpdwn_prof_title") + self.label_5 = QtWidgets.QLabel(self.frame) + self.label_5.setGeometry(QtCore.QRect(250, 20, 91, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_5.setFont(font) + self.label_5.setObjectName("label_5") + self.sem_winter = QtWidgets.QRadioButton(self.frame) + self.sem_winter.setGeometry(QtCore.QRect(340, 50, 82, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_winter.setFont(font) + self.sem_winter.setObjectName("sem_winter") + self.label_4 = QtWidgets.QLabel(self.frame) + self.label_4.setGeometry(QtCore.QRect(10, 80, 71, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_4.setFont(font) + self.label_4.setObjectName("label_4") + self.drpdwn_app_nr = QtWidgets.QComboBox(self.frame) + self.drpdwn_app_nr.setGeometry(QtCore.QRect(110, 20, 69, 22)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.drpdwn_app_nr.setFont(font) + self.drpdwn_app_nr.setEditable(True) + self.drpdwn_app_nr.setObjectName("drpdwn_app_nr") + self.app_name = QtWidgets.QLineEdit(self.frame) + self.app_name.setGeometry(QtCore.QRect(340, 20, 113, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.app_name.setFont(font) + self.app_name.setObjectName("app_name") + self.sem_sommer = QtWidgets.QRadioButton(self.frame) + self.sem_sommer.setGeometry(QtCore.QRect(340, 70, 82, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_sommer.setFont(font) + self.sem_sommer.setObjectName("sem_sommer") + self.label_3 = QtWidgets.QLabel(self.frame) + self.label_3.setGeometry(QtCore.QRect(10, 50, 61, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_3.setFont(font) + self.label_3.setObjectName("label_3") + self.label_6 = QtWidgets.QLabel(self.frame) + self.label_6.setGeometry(QtCore.QRect(270, 60, 51, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_6.setFont(font) + self.label_6.setObjectName("label_6") + self.sem_year = QtWidgets.QLineEdit(self.frame) + self.sem_year.setGeometry(QtCore.QRect(410, 60, 113, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_year.setFont(font) + self.sem_year.setMaxLength(4) + self.sem_year.setObjectName("sem_year") + self.label_2 = QtWidgets.QLabel(self.frame) + self.label_2.setGeometry(QtCore.QRect(10, 20, 101, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_2.setFont(font) + self.label_2.setObjectName("label_2") + self.btn_apparat_save = QtWidgets.QPushButton(self.frame) + self.btn_apparat_save.setGeometry(QtCore.QRect(260, 120, 75, 23)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_apparat_save.setFont(font) + self.btn_apparat_save.setObjectName("btn_apparat_save") + self.btn_apparat_apply = QtWidgets.QPushButton(self.frame) + self.btn_apparat_apply.setGeometry(QtCore.QRect(350, 120, 75, 23)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_apparat_apply.setFont(font) + self.btn_apparat_apply.setObjectName("btn_apparat_apply") + self.check_eternal_app = QtWidgets.QCheckBox(self.frame) + self.check_eternal_app.setGeometry(QtCore.QRect(340, 90, 101, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.check_eternal_app.setFont(font) + self.check_eternal_app.setObjectName("check_eternal_app") + self.label_8 = QtWidgets.QLabel(self.frame) + self.label_8.setGeometry(QtCore.QRect(10, 110, 71, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_8.setFont(font) + self.label_8.setObjectName("label_8") + self.prof_mail = QtWidgets.QLineEdit(self.frame) + self.prof_mail.setGeometry(QtCore.QRect(110, 110, 121, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.prof_mail.setFont(font) + self.prof_mail.setPlaceholderText("") + self.prof_mail.setObjectName("prof_mail") + self.label_9 = QtWidgets.QLabel(self.frame) + self.label_9.setGeometry(QtCore.QRect(10, 130, 71, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_9.setFont(font) + self.label_9.setObjectName("label_9") + self.prof_tel_nr = QtWidgets.QLineEdit(self.frame) + self.prof_tel_nr.setGeometry(QtCore.QRect(110, 130, 121, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.prof_tel_nr.setFont(font) + self.prof_tel_nr.setPlaceholderText("") + self.prof_tel_nr.setObjectName("prof_tel_nr") + self.label_10 = QtWidgets.QLabel(self.frame) + self.label_10.setGeometry(QtCore.QRect(470, 20, 51, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_10.setFont(font) + self.label_10.setObjectName("label_10") + self.app_fach = QtWidgets.QLineEdit(self.frame) + self.app_fach.setGeometry(QtCore.QRect(510, 20, 113, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.app_fach.setFont(font) + self.app_fach.setObjectName("app_fach") + self.drpdwn_prof_name = QtWidgets.QComboBox(self.frame) + self.drpdwn_prof_name.setGeometry(QtCore.QRect(110, 80, 121, 22)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.drpdwn_prof_name.setFont(font) + self.drpdwn_prof_name.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.drpdwn_prof_name.setEditable(True) + self.drpdwn_prof_name.setCurrentText("") + self.drpdwn_prof_name.setInsertPolicy(QtWidgets.QComboBox.InsertPolicy.InsertAlphabetically) + self.drpdwn_prof_name.setFrame(True) + self.drpdwn_prof_name.setObjectName("drpdwn_prof_name") + self.btn_add_document = QtWidgets.QPushButton(self.app_group_box) + self.btn_add_document.setGeometry(QtCore.QRect(1100, 40, 131, 25)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_add_document.setFont(font) + self.btn_add_document.setObjectName("btn_add_document") + self.btn_open_document = QtWidgets.QPushButton(self.app_group_box) + self.btn_open_document.setGeometry(QtCore.QRect(1100, 80, 131, 25)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_open_document.setFont(font) + self.btn_open_document.setObjectName("btn_open_document") + self.toolButton = QtWidgets.QToolButton(self.app_group_box) + self.toolButton.setGeometry(QtCore.QRect(1110, 110, 25, 19)) + self.toolButton.setObjectName("toolButton") + self.label_7 = QtWidgets.QLabel(self.app_group_box) + self.label_7.setGeometry(QtCore.QRect(20, 200, 47, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_7.setFont(font) + self.label_7.setObjectName("label_7") + self.search_media = QtWidgets.QLineEdit(self.app_group_box) + self.search_media.setGeometry(QtCore.QRect(80, 200, 211, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.search_media.setFont(font) + self.search_media.setObjectName("search_media") + self.label = QtWidgets.QLabel(self.app_group_box) + self.label.setGeometry(QtCore.QRect(10, 180, 1259, 18)) + font = QtGui.QFont() + font.setPointSize(11) + font.setBold(True) + font.setWeight(75) + self.label.setFont(font) + self.label.setObjectName("label") + self.gridLayout_2.addWidget(self.app_group_box, 1, 0, 1, 1) + self.tableWidget_apparat_media = QtWidgets.QTableWidget(self.gridLayoutWidget_2) + self.tableWidget_apparat_media.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tableWidget_apparat_media.setObjectName("tableWidget_apparat_media") + self.tableWidget_apparat_media.setColumnCount(4) + self.tableWidget_apparat_media.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(3, item) + self.gridLayout_2.addWidget(self.tableWidget_apparat_media, 2, 0, 1, 1) + self.search = QtWidgets.QPushButton(self.tab) + self.search.setGeometry(QtCore.QRect(130, 640, 75, 20)) + self.search.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.search.setObjectName("search") + self.add_medium = QtWidgets.QPushButton(self.tab) + self.add_medium.setGeometry(QtCore.QRect(10, 640, 111, 20)) + self.add_medium.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.add_medium.setObjectName("add_medium") + self.tabWidget.addTab(self.tab, "") + self.tab_2 = QtWidgets.QWidget() + self.tab_2.setObjectName("tab_2") + self.tabWidget.addTab(self.tab_2, "") + self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) + self.horizontalLayout.addLayout(self.gridLayout) + self.verticalLayout.addLayout(self.horizontalLayout) + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QtWidgets.QMenuBar(MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1280, 21)) + self.menubar.setObjectName("menubar") + self.menuDatei = QtWidgets.QMenu(self.menubar) + self.menuDatei.setObjectName("menuDatei") + self.menuEinstellungen = QtWidgets.QMenu(self.menubar) + self.menuEinstellungen.setObjectName("menuEinstellungen") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QtWidgets.QStatusBar(MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + self.menubar.addAction(self.menuDatei.menuAction()) + self.menubar.addAction(self.menuEinstellungen.menuAction()) + + self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(0) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + MainWindow.setTabOrder(self.drpdwn_app_nr, self.drpdwn_prof_title) + MainWindow.setTabOrder(self.drpdwn_prof_title, self.drpdwn_prof_name) + MainWindow.setTabOrder(self.drpdwn_prof_name, self.prof_mail) + MainWindow.setTabOrder(self.prof_mail, self.prof_tel_nr) + MainWindow.setTabOrder(self.prof_tel_nr, self.app_name) + MainWindow.setTabOrder(self.app_name, self.app_fach) + MainWindow.setTabOrder(self.app_fach, self.sem_winter) + MainWindow.setTabOrder(self.sem_winter, self.sem_sommer) + MainWindow.setTabOrder(self.sem_sommer, self.sem_year) + MainWindow.setTabOrder(self.sem_year, self.check_eternal_app) + MainWindow.setTabOrder(self.check_eternal_app, self.btn_add_document) + MainWindow.setTabOrder(self.btn_add_document, self.btn_open_document) + MainWindow.setTabOrder(self.btn_open_document, self.toolButton) + MainWindow.setTabOrder(self.toolButton, self.btn_apparat_save) + MainWindow.setTabOrder(self.btn_apparat_save, self.btn_apparat_apply) + MainWindow.setTabOrder(self.btn_apparat_apply, self.search_media) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) + self.load_app.setToolTip(_translate("MainWindow", "Load the Semesterapparate from the database")) + self.load_app.setText(_translate("MainWindow", "App. aufrufen")) + self.create_new_app.setText(_translate("MainWindow", "neu. App anlegen")) + item = self.tableWidget_apparate.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "AppNr")) + item = self.tableWidget_apparate.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "App Name")) + item = self.tableWidget_apparate.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Professor")) + item = self.tableWidget_apparate.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Dauerapparat")) + self.app_group_box.setTitle(_translate("MainWindow", "Apparatsdetails")) + item = self.dokument_list.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Dokumentname")) + item = self.dokument_list.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Dateityp")) + item = self.dokument_list.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Neu?")) + item = self.dokument_list.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "path")) + self.label_5.setText(_translate("MainWindow", "Apparatsname")) + self.sem_winter.setText(_translate("MainWindow", "Winter")) + self.label_4.setText(_translate("MainWindow", "Prof. Name")) + self.sem_sommer.setText(_translate("MainWindow", "Sommer")) + self.label_3.setText(_translate("MainWindow", "Prof. Titel")) + self.label_6.setText(_translate("MainWindow", "Semester")) + self.sem_year.setPlaceholderText(_translate("MainWindow", "2023")) + self.label_2.setText(_translate("MainWindow", "Apparatsnummer")) + self.btn_apparat_save.setText(_translate("MainWindow", "Speichern")) + self.btn_apparat_apply.setText(_translate("MainWindow", "Aktualisieren")) + self.check_eternal_app.setText(_translate("MainWindow", "Dauerapparat")) + self.label_8.setText(_translate("MainWindow", "Mail")) + self.label_9.setText(_translate("MainWindow", "Tel")) + self.label_10.setText(_translate("MainWindow", "Fach")) + self.btn_add_document.setText(_translate("MainWindow", "Dokument hinzufügen")) + self.btn_open_document.setText(_translate("MainWindow", "Dokument öffnen")) + self.toolButton.setText(_translate("MainWindow", "...")) + self.label_7.setText(_translate("MainWindow", "Suche")) + self.search_media.setPlaceholderText(_translate("MainWindow", "Buch oder Signatur")) + self.label.setText(_translate("MainWindow", "Medienliste")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Buchtitel")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Autor")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Auflage")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Signatur")) + self.search.setToolTip(_translate("MainWindow", "Sucht im Katalog nach allen Medien, die die Apparatsnummer enthalten")) + self.search.setText(_translate("MainWindow", "Suche")) + self.add_medium.setText(_translate("MainWindow", "Medium hinzufügen")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2")) + self.menuDatei.setTitle(_translate("MainWindow", "Datei")) + self.menuEinstellungen.setTitle(_translate("MainWindow", "Einstellungen")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec()) diff --git a/src/ui/semesterapparat_ui.ts b/src/ui/semesterapparat_ui.ts new file mode 100644 index 0000000..6a28a55 --- /dev/null +++ b/src/ui/semesterapparat_ui.ts @@ -0,0 +1,234 @@ + + + + + MainWindow + + + MainWindow + + + + + Tab 1 + + + + + Load the Semesterapparate from the database + + + + + App. aufrufen + + + + + neu. App anlegen + + + + + AppNr + + + + + App Name + + + + + Professor + + + + + + Dauerapparat + + + + + KontoNr + + + + + Dateityp + + + + + Neu? + + + + + path + + + + + Mail + + + + + Tel + + + + + Fach + + + + + + + + + + * + + + + + Buchtitel + + + + + Autor + + + + + Auflage + + + + + Signatur + + + + + Beenden + + + + + Apparatsdetails + + + + + Dokumentname + + + + + Apparatsname + + + + + Winter + + + + + Prof. Name + + + + + Sommer + + + + + Prof. Titel + + + + + Semester + + + + + 2023 + + + + + Apparatsnummer + + + + + Speichern + + + + + Aktualisieren + + + + + Dokument hinzufügen + + + + + Dokument öffnen + + + + + + Suche + + + + + Buch oder Signatur + + + + + Medienliste + + + + + Sucht im Katalog nach allen Medien, die die Apparatsnummer enthalten + + + + + Medium hinzufügen + + + + + Tab 2 + + + + + Datei + + + + + Einstellungen + + + + diff --git a/src/ui/semesterapparat_ui.ui b/src/ui/semesterapparat_ui.ui new file mode 100644 index 0000000..1cf7452 --- /dev/null +++ b/src/ui/semesterapparat_ui.ui @@ -0,0 +1,2890 @@ + + + MainWindow + + + Qt::WindowModal + + + true + + + + 0 + 0 + 1593 + 800 + + + + + 0 + 0 + + + + + 1278 + 800 + + + + + 1920 + 800 + + + + Qt::NoContextMenu + + + Semesterapparatsmanagement + + + + + 0 + 0 + + + + + + 0 + 0 + 1271 + 761 + + + + + + + + + + + Qt::NoFocus + + + 0 + + + + + 0 + 0 + + + + Anlegen + + + + + 0 + 0 + 1261 + 163 + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::NoFocus + + + Load the Semesterapparate from the database + + + App. aufrufen + + + + + + + Qt::NoFocus + + + neu. App anlegen + + + + + + + Qt::NoFocus + + + Auswahl abbrechen + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::NoFocus + + + QAbstractScrollArea::AdjustToContents + + + QAbstractItemView::SelectedClicked + + + true + + + Qt::ElideMiddle + + + true + + + true + + + + AppNr + + + + + App Name + + + + + Professor + + + + + gültig bis + + + + + Dauerapparat + + + + + KontoNr + + + + + + + + + + + + + + + + + + 0 + 160 + 1261 + 21 + + + + Qt::Horizontal + + + + + true + + + + 0 + 180 + 1261 + 511 + + + + + + + + 0 + 0 + + + + + 0 + 210 + + + + + 12 + 75 + true + + + + Apparatsdetails + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + 765 + 20 + 321 + 181 + + + + + 10 + 50 + false + false + + + + Qt::NoFocus + + + true + + + QAbstractScrollArea::AdjustToContents + + + true + + + QAbstractItemView::DropOnly + + + Qt::LinkAction + + + QAbstractItemView::SingleSelection + + + + Dokumentname + + + + Arial + 8 + + + + + + Dateityp + + + + Arial + 8 + + + + + + Neu? + + + + Arial + 8 + + + + + + path + + + + + + true + + + + 10 + 30 + 1241 + 151 + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 110 + 50 + 69 + 22 + + + + + 9 + 50 + false + + + + true + + + + + + 250 + 20 + 91 + 21 + + + + + 9 + 50 + false + + + + Apparatsname + + + + + + 340 + 50 + 82 + 17 + + + + + 9 + 50 + false + + + + Qt::NoFocus + + + Winter + + + + + + 10 + 80 + 71 + 21 + + + + + 9 + 50 + false + + + + Prof. Name + + + + + + 110 + 20 + 69 + 22 + + + + + 9 + 50 + false + + + + Qt::ImhDigitsOnly + + + true + + + + + + 340 + 20 + 113 + 20 + + + + + 9 + 50 + false + + + + Qt::StrongFocus + + + + + + 340 + 70 + 82 + 17 + + + + + 9 + 50 + false + + + + Qt::NoFocus + + + Sommer + + + + + + 10 + 50 + 61 + 20 + + + + + 9 + 50 + false + + + + Prof. Titel + + + + + + 270 + 60 + 61 + 21 + + + + + 9 + 50 + false + + + + Semester + + + + + + 410 + 60 + 113 + 20 + + + + + 9 + 50 + false + + + + Qt::StrongFocus + + + 4 + + + 2023 + + + + + + 10 + 20 + 101 + 21 + + + + + 9 + 50 + false + + + + Apparatsnummer + + + + + + 260 + 120 + 75 + 23 + + + + + 9 + 50 + false + + + + Speichern + + + + + + 350 + 120 + 75 + 23 + + + + + 9 + 50 + false + + + + Aktualisieren + + + + + + 340 + 90 + 101 + 17 + + + + + 9 + 50 + false + + + + Dauerapparat + + + + + + 10 + 110 + 71 + 21 + + + + + 9 + 50 + false + + + + Mail + + + + + + 110 + 110 + 121 + 20 + + + + + 9 + 50 + false + + + + Qt::ImhEmailCharactersOnly + + + 200 + + + + + + + + + 10 + 130 + 71 + 21 + + + + + 9 + 50 + false + + + + Tel + + + + + + 110 + 130 + 121 + 20 + + + + + 9 + 50 + false + + + + Qt::ImhDigitsOnly + + + + + + + + + 470 + 20 + 51 + 21 + + + + + 9 + 50 + false + + + + Fach + + + + + + 110 + 80 + 121 + 22 + + + + + 8 + 50 + false + + + + Qt::StrongFocus + + + true + + + + + + QComboBox::InsertAlphabetically + + + true + + + + + + 100 + 110 + 47 + 21 + + + + + 9 + 50 + false + + + + * + + + + + + 100 + 130 + 47 + 21 + + + + + 9 + 50 + false + + + + * + + + + + + 100 + 80 + 47 + 21 + + + + + 9 + 50 + false + + + + * + + + + + + 330 + 20 + 16 + 21 + + + + + 9 + 50 + false + + + + * + + + + + + 500 + 20 + 47 + 21 + + + + + 9 + 50 + false + + + + Qt::NoFocus + + + * + + + + + + 330 + 60 + 16 + 21 + + + + + 9 + 50 + false + + + + * + + + + + + 1090 + 20 + 131 + 25 + + + + + 9 + 50 + false + + + + Dokument hinzufügen + + + + + + 1090 + 60 + 131 + 25 + + + + + 9 + 50 + false + + + + Dokument öffnen + + + + + + 1090 + 100 + 131 + 51 + + + + + 9 + 50 + false + + + + Abhängig von der Anzahl der Medien kann die Suche sehr lange dauern + + + Medien aus Dokument + hinzufügen + + + + + + 550 + 70 + 202 + 80 + + + + + + + + 9 + 50 + false + + + + Prof-ID-aDIS + + + + + + + + 9 + 50 + false + + + + + + + + + 9 + 50 + false + + + + Apparat-ID-aDIS + + + + + + + + + + + + 450 + 120 + 91 + 17 + + + + + 9 + 50 + false + + + + Mail senden + + + + + + 510 + 0 + 241 + 61 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 241 + 61 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + _mand + drpdwn_prof_title + label_5 + sem_winter + label_4 + drpdwn_app_nr + sem_sommer + label_3 + label_6 + sem_year + label_2 + btn_apparat_save + btn_apparat_apply + check_eternal_app + label_8 + label_9 + label_10 + mail_mand + telnr_mand + profname_mand + appname_mand + fach_mand + btn_add_document + btn_open_document + app_name + prof_tel_nr + drpdwn_prof_name + prof_mail + check_file + formLayoutWidget_2 + check_send_mail + frame_3 + + frame + dokument_list + + + + + + + 0 + 0 + + + + + 1259 + 0 + + + + Qt::NoFocus + + + Qt::CustomContextMenu + + + QAbstractScrollArea::AdjustToContents + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::SelectRows + + + true + + + true + + + + Buchtitel + + + + + Signatur + + + + + Auflage + + + + + Autor + + + + + verfügbar? + + + + + Vorgemerkt + + + + + Link + + + + + + + + + 11 + 75 + true + + + + Medienliste + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + gel. Medien anzeigen + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + im Apparat? + + + + + + + + + Medien werden hinzugefügt + + + + + + + Qt::Vertical + + + + + + + Medium x/y + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + + + + Medien werden geprüft + + + + + + + Qt::Vertical + + + + + + + TextLabel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 0 + 700 + 121 + 20 + + + + Qt::NoFocus + + + Medien hinzufügen + + + + + + Suchen / Statistik + + + + + 0 + 0 + 1251 + 721 + + + + + + + + 16777215 + 250 + + + + 0 + + + + Statistik + + + + + 10 + 180 + 75 + 23 + + + + Suchen + + + + + + 10 + 10 + 491 + 161 + + + + + + + Appnr.: + + + + + + + true + + + + + + + Dauerapp: + + + + + + + Endsemester: + + + + + + + Erstellsemester: + + + + + + + + + + Person: + + + + + + + Fach: + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Löschbar + + + + + + + Qt::StrongFocus + + + + + + + + + + + + 100 + 180 + 401 + 23 + + + + + + + + + + Suchen + + + + + 10 + 10 + 451 + 151 + + + + + + + Signatur + + + + + + + Suche + + + + + + + true + + + + + + + Titel + + + + + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + 1 + + + + + + 780 + 10 + 441 + 441 + + + + 1 + + + + Tabelle + + + + + 0 + 0 + 431 + 411 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + QAbstractItemView::NoEditTriggers + + + true + + + true + + + 59 + + + 24 + + + true + + + false + + + + Semester + + + + + Zugang + + + + + Abgang + + + + + + + + + + Erstellte und gelöschte Semesterapparate + + + + + + + 10 + 10 + 761 + 441 + + + + + + 0 + 0 + 761 + 51 + + + + + + + Qt::StrongFocus + + + Ausgewählte Löschen + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + 50 + 761 + 391 + + + + + + 0 + 0 + 761 + 391 + + + + Qt::NoFocus + + + QAbstractItemView::NoEditTriggers + + + + + + + + + Apparatsname + + + + + Apparatsnummer + + + + + Person + + + + + Fach + + + + + + + + + + + 10 + 20 + 1081 + 421 + + + + QFrame::Plain + + + QAbstractItemView::NoEditTriggers + + + true + + + true + + + true + + + + Titel + + + + + Signatur + + + + + Apparat + + + + + + + + + + + + Admin + + + + + 10 + 30 + 47 + 22 + + + + Aktion: + + + + + + 70 + 30 + 181 + 22 + + + + + Nutzer anlegen + + + + + Nutzer löschen + + + + + Nutzer aktualisieren + + + + + Lehrperson bearbeiten + + + + + + + 10 + 60 + 591 + 141 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 581 + 141 + + + + + + + Nutzername + + + + + + + + 150 + 16777215 + + + + + + + + Rolle + + + + + + + Passwort + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 150 + 16777215 + + + + + + + + Anlegen + + + + + + + + + + + + + + + + + 10 + 60 + 591 + 141 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 581 + 141 + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Nutzer löschen + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Nutzername + + + + + + + + + + Qt::RightToLeft + + + Wirklich löschen? + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + + 10 + 60 + 591 + 141 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 581 + 141 + + + + + + + + + + Nutzername + + + + + + + + 150 + 16777215 + + + + + + + + Aktualisieren + + + + + + + Rolle + + + + + + + Neues Passwort + + + + + + + + 150 + 16777215 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 10 + 60 + 1051 + 191 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 751 + 223 + + + + + + + + + Titel + + + + + + + + + + Vorname + + + + + + + + + + Nachname + + + + + + + + + + + + + + Qt::TabFocus + + + true + + + + + + + + + + Telefonnummer + + + + + + + Qt::ClickFocus + + + true + + + + + + + Mail + + + + + + + Qt::NoFocus + + + Qt::ImhNone + + + true + + + + + + + + + + + Mail + + + + + + + Telefon + + + + + + + + + + + + + + + Alte Angaben + + + + + + + Aktualisieren + + + + + + + Neue Angaben + + + + + + + + + + + + + + + + + + + 1280 + 360 + 311 + 391 + + + + + + + + 6 + + + + + true + + + + 0 + 0 + + + + Software + + + + + 20 + 30 + 241 + 41 + + + + + 8 + 50 + false + + + + Qt::NoFocus + + + Apparatsdaten eingegeben + + + + + + 20 + 70 + 241 + 41 + + + + + 8 + 50 + false + + + + Qt::NoFocus + + + Medien hinzugefügt / importiert + + + + + + 20 + 140 + 241 + 41 + + + + + 8 + 50 + false + + + + Qt::NoFocus + + + Prof-ID und Apparat-ID eingetragen + + + + + + + + + 0 + 0 + + + + aDIS + + + + + 20 + 30 + 241 + 41 + + + + + 8 + 50 + false + false + false + PreferDefault + true + + + + Qt::NoFocus + + + Medien geprüft + + + + + + 20 + 70 + 241 + 41 + + + + + 8 + 50 + false + false + false + PreferDefault + true + + + + Qt::NoFocus + + + Medien bearbeitet + + + + + + 20 + 110 + 161 + 41 + + + + + 8 + 50 + false + false + false + PreferDefault + true + + + + Qt::NoFocus + + + Apparat angelegt + + + + + + 170 + 120 + 101 + 23 + + + + + 8 + 50 + false + false + false + PreferDefault + true + + + + Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren + + + + + + + + + + + + false + + + aDIS Abfrage + + + + ../../../.designer/backup/icons/information.png../../../.designer/backup/icons/information.png + + + false + + + false + + + false + + + + + + + + + + + + + 1280 + 10 + 301 + 341 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 291 + 191 + + + + Qt::NoFocus + + + true + + + QCalendarWidget::NoVerticalHeader + + + + + + 0 + 210 + 301 + 121 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 47 + 20 + + + + Apparat + + + + + true + + + + 60 + 10 + 31 + 20 + + + + Qt::NoFocus + + + + + + 10 + 40 + 281 + 71 + + + + Qt::NoFocus + + + + + + 130 + 10 + 75 + 23 + + + + Qt::NoFocus + + + Löschen + + + + + + 210 + 10 + 74 + 22 + + + + 1 + + + + + + 260 + 10 + 21 + 22 + + + + TextLabel + + + + + + + + + 0 + 0 + 1593 + 21 + + + + + Datei + + + + + + Bearbeiten + + + + + + + + + + Beenden + + + Ctrl+Q + + + true + + + + + Einstellungen + + + Alt+S + + + true + + + + + drpdwn_app_nr + drpdwn_prof_title + drpdwn_prof_name + prof_mail + prof_tel_nr + app_name + sem_year + check_eternal_app + btn_add_document + btn_open_document + check_file + btn_apparat_save + btn_apparat_apply + check_send_mail + chkbx_show_del_media + btn_reserve + prof_id_adis + apparat_id_adis + tabWidget_2 + btn_del_select_apparats + tabWidget_3 + select_action_box + user_create_frame_username + user_frame_userrole + user_create_frame_password + user_frame_addUser + user_delete_frame_user_select + user_delete_confirm + pushButton + user_edit_frame_user_select + user_edit_frame_role_select + user_edit_frame_new_password + update_user + edit_faculty_member_title + edit_faculty_member_select_member + faculty_member_old_telnr + faculty_member_oldmail + edit_faculty_member_new_title + edit_faculty_member_new_surname + user_faculty_member_new_name + lineEdit + lineEdit_5 + update_faculty_member + box_fach + box_person + btn_search + check_deletable + box_erstellsemester + box_semester + box_dauerapp + box_appnrs + btn_copy_adis_command + spin_select_message + + + + diff --git a/src/ui/semesterapparat_ui_ui.py b/src/ui/semesterapparat_ui_ui.py new file mode 100644 index 0000000..582742a --- /dev/null +++ b/src/ui/semesterapparat_ui_ui.py @@ -0,0 +1,1437 @@ +# Form implementation generated from reading ui file '/home/alexander/GitHub/Semesterapparate/ui/semesterapparat_ui.ui' +# +# Created by: PyQt6 UI code generator 6.5.3 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.setWindowModality(QtCore.Qt.WindowModality.WindowModal) + MainWindow.setEnabled(True) + MainWindow.resize(1593, 800) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) + MainWindow.setSizePolicy(sizePolicy) + MainWindow.setMinimumSize(QtCore.QSize(1278, 800)) + MainWindow.setMaximumSize(QtCore.QSize(1920, 800)) + MainWindow.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + self.centralwidget = QtWidgets.QWidget(parent=MainWindow) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) + self.centralwidget.setSizePolicy(sizePolicy) + self.centralwidget.setObjectName("centralwidget") + self.verticalLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget) + self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 1271, 761)) + self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") + self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.gridLayout = QtWidgets.QGridLayout() + self.gridLayout.setObjectName("gridLayout") + self.tabWidget = QtWidgets.QTabWidget(parent=self.verticalLayoutWidget) + self.tabWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tabWidget.setObjectName("tabWidget") + self.tab = QtWidgets.QWidget() + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.tab.sizePolicy().hasHeightForWidth()) + self.tab.setSizePolicy(sizePolicy) + self.tab.setObjectName("tab") + self.horizontalLayoutWidget_2 = QtWidgets.QWidget(parent=self.tab) + self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 1261, 163)) + self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2) + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.formLayout = QtWidgets.QFormLayout() + self.formLayout.setObjectName("formLayout") + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout_2.addItem(spacerItem) + self.load_app = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) + self.load_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.load_app.setObjectName("load_app") + self.verticalLayout_2.addWidget(self.load_app) + self.create_new_app = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) + self.create_new_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.create_new_app.setObjectName("create_new_app") + self.verticalLayout_2.addWidget(self.create_new_app) + self.cancel_active_selection = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) + self.cancel_active_selection.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.cancel_active_selection.setObjectName("cancel_active_selection") + self.verticalLayout_2.addWidget(self.cancel_active_selection) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout_2.addItem(spacerItem1) + self.formLayout.setLayout(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.verticalLayout_2) + self.tableWidget_apparate = QtWidgets.QTableWidget(parent=self.horizontalLayoutWidget_2) + self.tableWidget_apparate.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tableWidget_apparate.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) + self.tableWidget_apparate.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.SelectedClicked) + self.tableWidget_apparate.setAlternatingRowColors(True) + self.tableWidget_apparate.setTextElideMode(QtCore.Qt.TextElideMode.ElideMiddle) + self.tableWidget_apparate.setObjectName("tableWidget_apparate") + self.tableWidget_apparate.setColumnCount(6) + self.tableWidget_apparate.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(4, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(5, item) + self.tableWidget_apparate.horizontalHeader().setCascadingSectionResizes(True) + self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.tableWidget_apparate) + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.formLayout.setLayout(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.horizontalLayout_4) + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.formLayout.setLayout(3, QtWidgets.QFormLayout.ItemRole.LabelRole, self.horizontalLayout_3) + self.horizontalLayout_2.addLayout(self.formLayout) + self.line = QtWidgets.QFrame(parent=self.tab) + self.line.setGeometry(QtCore.QRect(0, 160, 1261, 21)) + self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line.setObjectName("line") + self.gridLayoutWidget_2 = QtWidgets.QWidget(parent=self.tab) + self.gridLayoutWidget_2.setEnabled(True) + self.gridLayoutWidget_2.setGeometry(QtCore.QRect(0, 180, 1261, 511)) + self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2") + self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2) + self.gridLayout_2.setContentsMargins(0, 0, 0, 0) + self.gridLayout_2.setObjectName("gridLayout_2") + self.app_group_box = QtWidgets.QGroupBox(parent=self.gridLayoutWidget_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.app_group_box.sizePolicy().hasHeightForWidth()) + self.app_group_box.setSizePolicy(sizePolicy) + self.app_group_box.setMinimumSize(QtCore.QSize(0, 210)) + font = QtGui.QFont() + font.setPointSize(12) + font.setBold(True) + font.setWeight(75) + self.app_group_box.setFont(font) + self.app_group_box.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignVCenter) + self.app_group_box.setCheckable(False) + self.app_group_box.setObjectName("app_group_box") + self.dokument_list = QtWidgets.QTableWidget(parent=self.app_group_box) + self.dokument_list.setGeometry(QtCore.QRect(765, 20, 321, 181)) + font = QtGui.QFont() + font.setPointSize(10) + font.setBold(False) + font.setWeight(50) + font.setKerning(False) + self.dokument_list.setFont(font) + self.dokument_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.dokument_list.setAcceptDrops(True) + self.dokument_list.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) + self.dokument_list.setDragEnabled(True) + self.dokument_list.setDragDropMode(QtWidgets.QAbstractItemView.DragDropMode.DropOnly) + self.dokument_list.setDefaultDropAction(QtCore.Qt.DropAction.LinkAction) + self.dokument_list.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) + self.dokument_list.setObjectName("dokument_list") + self.dokument_list.setColumnCount(4) + self.dokument_list.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(8) + item.setFont(font) + self.dokument_list.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(8) + item.setFont(font) + self.dokument_list.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(8) + item.setFont(font) + self.dokument_list.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.dokument_list.setHorizontalHeaderItem(3, item) + self.frame = QtWidgets.QFrame(parent=self.app_group_box) + self.frame.setEnabled(True) + self.frame.setGeometry(QtCore.QRect(10, 30, 1241, 151)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) + self.frame.setSizePolicy(sizePolicy) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.drpdwn_prof_title = QtWidgets.QComboBox(parent=self.frame) + self.drpdwn_prof_title.setGeometry(QtCore.QRect(110, 50, 69, 22)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.drpdwn_prof_title.setFont(font) + self.drpdwn_prof_title.setEditable(True) + self.drpdwn_prof_title.setObjectName("drpdwn_prof_title") + self.label_5 = QtWidgets.QLabel(parent=self.frame) + self.label_5.setGeometry(QtCore.QRect(250, 20, 91, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_5.setFont(font) + self.label_5.setObjectName("label_5") + self.sem_winter = QtWidgets.QRadioButton(parent=self.frame) + self.sem_winter.setGeometry(QtCore.QRect(340, 50, 82, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_winter.setFont(font) + self.sem_winter.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.sem_winter.setObjectName("sem_winter") + self.label_4 = QtWidgets.QLabel(parent=self.frame) + self.label_4.setGeometry(QtCore.QRect(10, 80, 71, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_4.setFont(font) + self.label_4.setObjectName("label_4") + self.drpdwn_app_nr = QtWidgets.QComboBox(parent=self.frame) + self.drpdwn_app_nr.setGeometry(QtCore.QRect(110, 20, 69, 22)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.drpdwn_app_nr.setFont(font) + self.drpdwn_app_nr.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhDigitsOnly) + self.drpdwn_app_nr.setEditable(True) + self.drpdwn_app_nr.setObjectName("drpdwn_app_nr") + self.app_name = QtWidgets.QLineEdit(parent=self.frame) + self.app_name.setGeometry(QtCore.QRect(340, 20, 113, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.app_name.setFont(font) + self.app_name.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.app_name.setObjectName("app_name") + self.sem_sommer = QtWidgets.QRadioButton(parent=self.frame) + self.sem_sommer.setGeometry(QtCore.QRect(340, 70, 82, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_sommer.setFont(font) + self.sem_sommer.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.sem_sommer.setObjectName("sem_sommer") + self.label_3 = QtWidgets.QLabel(parent=self.frame) + self.label_3.setGeometry(QtCore.QRect(10, 50, 61, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_3.setFont(font) + self.label_3.setObjectName("label_3") + self.label_6 = QtWidgets.QLabel(parent=self.frame) + self.label_6.setGeometry(QtCore.QRect(270, 60, 61, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_6.setFont(font) + self.label_6.setObjectName("label_6") + self.sem_year = QtWidgets.QLineEdit(parent=self.frame) + self.sem_year.setGeometry(QtCore.QRect(410, 60, 113, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_year.setFont(font) + self.sem_year.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.sem_year.setMaxLength(4) + self.sem_year.setObjectName("sem_year") + self.label_2 = QtWidgets.QLabel(parent=self.frame) + self.label_2.setGeometry(QtCore.QRect(10, 20, 101, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_2.setFont(font) + self.label_2.setObjectName("label_2") + self.btn_apparat_save = QtWidgets.QPushButton(parent=self.frame) + self.btn_apparat_save.setGeometry(QtCore.QRect(260, 120, 75, 23)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_apparat_save.setFont(font) + self.btn_apparat_save.setObjectName("btn_apparat_save") + self.btn_apparat_apply = QtWidgets.QPushButton(parent=self.frame) + self.btn_apparat_apply.setGeometry(QtCore.QRect(350, 120, 75, 23)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_apparat_apply.setFont(font) + self.btn_apparat_apply.setObjectName("btn_apparat_apply") + self.check_eternal_app = QtWidgets.QCheckBox(parent=self.frame) + self.check_eternal_app.setGeometry(QtCore.QRect(340, 90, 101, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.check_eternal_app.setFont(font) + self.check_eternal_app.setObjectName("check_eternal_app") + self.label_8 = QtWidgets.QLabel(parent=self.frame) + self.label_8.setGeometry(QtCore.QRect(10, 110, 71, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_8.setFont(font) + self.label_8.setObjectName("label_8") + self.prof_mail = QtWidgets.QLineEdit(parent=self.frame) + self.prof_mail.setGeometry(QtCore.QRect(110, 110, 121, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.prof_mail.setFont(font) + self.prof_mail.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhEmailCharactersOnly) + self.prof_mail.setMaxLength(200) + self.prof_mail.setPlaceholderText("") + self.prof_mail.setObjectName("prof_mail") + self.label_9 = QtWidgets.QLabel(parent=self.frame) + self.label_9.setGeometry(QtCore.QRect(10, 130, 71, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_9.setFont(font) + self.label_9.setObjectName("label_9") + self.prof_tel_nr = QtWidgets.QLineEdit(parent=self.frame) + self.prof_tel_nr.setGeometry(QtCore.QRect(110, 130, 121, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.prof_tel_nr.setFont(font) + self.prof_tel_nr.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhDigitsOnly) + self.prof_tel_nr.setPlaceholderText("") + self.prof_tel_nr.setObjectName("prof_tel_nr") + self.label_10 = QtWidgets.QLabel(parent=self.frame) + self.label_10.setGeometry(QtCore.QRect(470, 20, 51, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_10.setFont(font) + self.label_10.setObjectName("label_10") + self.app_fach = QtWidgets.QLineEdit(parent=self.frame) + self.app_fach.setGeometry(QtCore.QRect(510, 20, 113, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.app_fach.setFont(font) + self.app_fach.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.app_fach.setObjectName("app_fach") + self.drpdwn_prof_name = QtWidgets.QComboBox(parent=self.frame) + self.drpdwn_prof_name.setGeometry(QtCore.QRect(110, 80, 121, 22)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.drpdwn_prof_name.setFont(font) + self.drpdwn_prof_name.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.drpdwn_prof_name.setEditable(True) + self.drpdwn_prof_name.setCurrentText("") + self.drpdwn_prof_name.setInsertPolicy(QtWidgets.QComboBox.InsertPolicy.InsertAlphabetically) + self.drpdwn_prof_name.setFrame(True) + self.drpdwn_prof_name.setObjectName("drpdwn_prof_name") + self.mail_mand = QtWidgets.QLabel(parent=self.frame) + self.mail_mand.setGeometry(QtCore.QRect(100, 110, 47, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.mail_mand.setFont(font) + self.mail_mand.setObjectName("mail_mand") + self.telnr_mand = QtWidgets.QLabel(parent=self.frame) + self.telnr_mand.setGeometry(QtCore.QRect(100, 130, 47, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.telnr_mand.setFont(font) + self.telnr_mand.setObjectName("telnr_mand") + self.profname_mand = QtWidgets.QLabel(parent=self.frame) + self.profname_mand.setGeometry(QtCore.QRect(100, 80, 47, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.profname_mand.setFont(font) + self.profname_mand.setObjectName("profname_mand") + self.appname_mand = QtWidgets.QLabel(parent=self.frame) + self.appname_mand.setGeometry(QtCore.QRect(330, 20, 16, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.appname_mand.setFont(font) + self.appname_mand.setObjectName("appname_mand") + self.fach_mand = QtWidgets.QLabel(parent=self.frame) + self.fach_mand.setGeometry(QtCore.QRect(500, 20, 47, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.fach_mand.setFont(font) + self.fach_mand.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.fach_mand.setObjectName("fach_mand") + self._mand = QtWidgets.QLabel(parent=self.frame) + self._mand.setGeometry(QtCore.QRect(330, 60, 16, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self._mand.setFont(font) + self._mand.setObjectName("_mand") + self.btn_add_document = QtWidgets.QPushButton(parent=self.frame) + self.btn_add_document.setGeometry(QtCore.QRect(1090, 20, 131, 25)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_add_document.setFont(font) + self.btn_add_document.setObjectName("btn_add_document") + self.btn_open_document = QtWidgets.QPushButton(parent=self.frame) + self.btn_open_document.setGeometry(QtCore.QRect(1090, 60, 131, 25)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_open_document.setFont(font) + self.btn_open_document.setObjectName("btn_open_document") + self.check_file = QtWidgets.QPushButton(parent=self.frame) + self.check_file.setGeometry(QtCore.QRect(1090, 100, 131, 51)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.check_file.setFont(font) + self.check_file.setObjectName("check_file") + self.formLayoutWidget_2 = QtWidgets.QWidget(parent=self.frame) + self.formLayoutWidget_2.setGeometry(QtCore.QRect(550, 70, 202, 80)) + self.formLayoutWidget_2.setObjectName("formLayoutWidget_2") + self.formLayout_3 = QtWidgets.QFormLayout(self.formLayoutWidget_2) + self.formLayout_3.setContentsMargins(0, 0, 0, 0) + self.formLayout_3.setObjectName("formLayout_3") + self.label_12 = QtWidgets.QLabel(parent=self.formLayoutWidget_2) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_12.setFont(font) + self.label_12.setObjectName("label_12") + self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_12) + self.prof_id_adis = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.prof_id_adis.setFont(font) + self.prof_id_adis.setObjectName("prof_id_adis") + self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.prof_id_adis) + self.label_13 = QtWidgets.QLabel(parent=self.formLayoutWidget_2) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_13.setFont(font) + self.label_13.setObjectName("label_13") + self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_13) + self.apparat_id_adis = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2) + self.apparat_id_adis.setObjectName("apparat_id_adis") + self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.apparat_id_adis) + self.check_send_mail = QtWidgets.QCheckBox(parent=self.frame) + self.check_send_mail.setGeometry(QtCore.QRect(450, 120, 91, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.check_send_mail.setFont(font) + self.check_send_mail.setObjectName("check_send_mail") + self._mand.raise_() + self.drpdwn_prof_title.raise_() + self.label_5.raise_() + self.sem_winter.raise_() + self.label_4.raise_() + self.drpdwn_app_nr.raise_() + self.sem_sommer.raise_() + self.label_3.raise_() + self.label_6.raise_() + self.sem_year.raise_() + self.label_2.raise_() + self.btn_apparat_save.raise_() + self.btn_apparat_apply.raise_() + self.check_eternal_app.raise_() + self.label_8.raise_() + self.label_9.raise_() + self.label_10.raise_() + self.mail_mand.raise_() + self.telnr_mand.raise_() + self.profname_mand.raise_() + self.appname_mand.raise_() + self.fach_mand.raise_() + self.btn_add_document.raise_() + self.btn_open_document.raise_() + self.app_fach.raise_() + self.app_name.raise_() + self.prof_tel_nr.raise_() + self.drpdwn_prof_name.raise_() + self.prof_mail.raise_() + self.check_file.raise_() + self.formLayoutWidget_2.raise_() + self.check_send_mail.raise_() + self.frame.raise_() + self.dokument_list.raise_() + self.gridLayout_2.addWidget(self.app_group_box, 1, 0, 1, 1) + self.tableWidget_apparat_media = QtWidgets.QTableWidget(parent=self.gridLayoutWidget_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.tableWidget_apparat_media.sizePolicy().hasHeightForWidth()) + self.tableWidget_apparat_media.setSizePolicy(sizePolicy) + self.tableWidget_apparat_media.setMinimumSize(QtCore.QSize(1259, 0)) + self.tableWidget_apparat_media.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tableWidget_apparat_media.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu) + self.tableWidget_apparat_media.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) + self.tableWidget_apparat_media.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.tableWidget_apparat_media.setAlternatingRowColors(True) + self.tableWidget_apparat_media.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidget_apparat_media.setObjectName("tableWidget_apparat_media") + self.tableWidget_apparat_media.setColumnCount(7) + self.tableWidget_apparat_media.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(4, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(5, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(6, item) + self.tableWidget_apparat_media.horizontalHeader().setCascadingSectionResizes(True) + self.gridLayout_2.addWidget(self.tableWidget_apparat_media, 9, 0, 1, 1) + self.label = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) + font = QtGui.QFont() + font.setPointSize(11) + font.setBold(True) + font.setWeight(75) + self.label.setFont(font) + self.label.setObjectName("label") + self.gridLayout_2.addWidget(self.label, 2, 0, 1, 1) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") + spacerItem2 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_5.addItem(spacerItem2) + self.chkbx_show_del_media = QtWidgets.QCheckBox(parent=self.gridLayoutWidget_2) + self.chkbx_show_del_media.setObjectName("chkbx_show_del_media") + self.horizontalLayout_5.addWidget(self.chkbx_show_del_media) + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_5.addItem(spacerItem3) + self.btn_reserve = QtWidgets.QPushButton(parent=self.gridLayoutWidget_2) + self.btn_reserve.setObjectName("btn_reserve") + self.horizontalLayout_5.addWidget(self.btn_reserve) + self.add_layout = QtWidgets.QHBoxLayout() + self.add_layout.setObjectName("add_layout") + self.label_info = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) + self.label_info.setObjectName("label_info") + self.add_layout.addWidget(self.label_info) + self.line_2 = QtWidgets.QFrame(parent=self.gridLayoutWidget_2) + self.line_2.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_2.setObjectName("line_2") + self.add_layout.addWidget(self.line_2) + self.progress_label = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) + self.progress_label.setObjectName("progress_label") + self.add_layout.addWidget(self.progress_label) + self.horizontalLayout_5.addLayout(self.add_layout) + spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_5.addItem(spacerItem4) + self.avail_layout = QtWidgets.QHBoxLayout() + self.avail_layout.setObjectName("avail_layout") + self.horizontalLayout_5.addLayout(self.avail_layout) + self.label_20 = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) + self.label_20.setObjectName("label_20") + self.horizontalLayout_5.addWidget(self.label_20) + self.line_3 = QtWidgets.QFrame(parent=self.gridLayoutWidget_2) + self.line_3.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_3.setObjectName("line_3") + self.horizontalLayout_5.addWidget(self.line_3) + self.avail_status = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) + self.avail_status.setObjectName("avail_status") + self.horizontalLayout_5.addWidget(self.avail_status) + spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_5.addItem(spacerItem5) + self.gridLayout_2.addLayout(self.horizontalLayout_5, 4, 0, 1, 1) + self.add_medium = QtWidgets.QPushButton(parent=self.tab) + self.add_medium.setGeometry(QtCore.QRect(0, 700, 121, 20)) + self.add_medium.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.add_medium.setObjectName("add_medium") + self.tabWidget.addTab(self.tab, "") + self.tab_2 = QtWidgets.QWidget() + self.tab_2.setObjectName("tab_2") + self.verticalLayoutWidget_2 = QtWidgets.QWidget(parent=self.tab_2) + self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 1251, 721)) + self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2") + self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2) + self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.tabWidget_2 = QtWidgets.QTabWidget(parent=self.verticalLayoutWidget_2) + self.tabWidget_2.setMaximumSize(QtCore.QSize(16777215, 250)) + self.tabWidget_2.setObjectName("tabWidget_2") + self.tab_3 = QtWidgets.QWidget() + self.tab_3.setObjectName("tab_3") + self.btn_search = QtWidgets.QPushButton(parent=self.tab_3) + self.btn_search.setGeometry(QtCore.QRect(10, 180, 75, 23)) + self.btn_search.setObjectName("btn_search") + self.gridLayoutWidget = QtWidgets.QWidget(parent=self.tab_3) + self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 491, 161)) + self.gridLayoutWidget.setObjectName("gridLayoutWidget") + self.gridLayout_3 = QtWidgets.QGridLayout(self.gridLayoutWidget) + self.gridLayout_3.setContentsMargins(0, 0, 0, 0) + self.gridLayout_3.setObjectName("gridLayout_3") + self.label_7 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_7.setObjectName("label_7") + self.gridLayout_3.addWidget(self.label_7, 0, 0, 1, 1) + self.box_erstellsemester = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_erstellsemester.setEditable(True) + self.box_erstellsemester.setObjectName("box_erstellsemester") + self.gridLayout_3.addWidget(self.box_erstellsemester, 1, 3, 1, 1) + self.label_18 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_18.setObjectName("label_18") + self.gridLayout_3.addWidget(self.label_18, 2, 2, 1, 1) + self.label_17 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_17.setObjectName("label_17") + self.gridLayout_3.addWidget(self.label_17, 0, 2, 1, 1) + self.label_19 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_19.setObjectName("label_19") + self.gridLayout_3.addWidget(self.label_19, 1, 2, 1, 1) + self.box_dauerapp = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_dauerapp.setObjectName("box_dauerapp") + self.gridLayout_3.addWidget(self.box_dauerapp, 2, 3, 1, 1) + self.label_11 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_11.setObjectName("label_11") + self.gridLayout_3.addWidget(self.label_11, 1, 0, 1, 1) + self.label_16 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_16.setObjectName("label_16") + self.gridLayout_3.addWidget(self.label_16, 2, 0, 1, 1) + self.box_semester = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_semester.setEditable(True) + self.box_semester.setObjectName("box_semester") + self.gridLayout_3.addWidget(self.box_semester, 0, 3, 1, 1) + self.box_appnrs = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_appnrs.setEditable(True) + self.box_appnrs.setObjectName("box_appnrs") + self.gridLayout_3.addWidget(self.box_appnrs, 0, 1, 1, 1) + self.box_fach = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_fach.setEditable(True) + self.box_fach.setObjectName("box_fach") + self.gridLayout_3.addWidget(self.box_fach, 2, 1, 1, 1) + self.box_person = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_person.setEditable(True) + self.box_person.setObjectName("box_person") + self.gridLayout_3.addWidget(self.box_person, 1, 1, 1, 1) + spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.gridLayout_3.addItem(spacerItem6, 4, 0, 1, 1) + self.label_15 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_15.setObjectName("label_15") + self.gridLayout_3.addWidget(self.label_15, 3, 0, 1, 1) + self.check_deletable = QtWidgets.QCheckBox(parent=self.gridLayoutWidget) + self.check_deletable.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.check_deletable.setText("") + self.check_deletable.setObjectName("check_deletable") + self.gridLayout_3.addWidget(self.check_deletable, 3, 1, 1, 1) + self.db_err_message = QtWidgets.QLabel(parent=self.tab_3) + self.db_err_message.setGeometry(QtCore.QRect(100, 180, 401, 23)) + self.db_err_message.setText("") + self.db_err_message.setObjectName("db_err_message") + self.tabWidget_2.addTab(self.tab_3, "") + self.tab_4 = QtWidgets.QWidget() + self.tab_4.setObjectName("tab_4") + self.formLayoutWidget = QtWidgets.QWidget(parent=self.tab_4) + self.formLayoutWidget.setGeometry(QtCore.QRect(10, 10, 451, 151)) + self.formLayoutWidget.setObjectName("formLayoutWidget") + self.formLayout_6 = QtWidgets.QFormLayout(self.formLayoutWidget) + self.formLayout_6.setContentsMargins(0, 0, 0, 0) + self.formLayout_6.setObjectName("formLayout_6") + self.label_25 = QtWidgets.QLabel(parent=self.formLayoutWidget) + self.label_25.setObjectName("label_25") + self.formLayout_6.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_25) + self.book_search = QtWidgets.QPushButton(parent=self.formLayoutWidget) + self.book_search.setObjectName("book_search") + self.formLayout_6.setWidget(3, QtWidgets.QFormLayout.ItemRole.LabelRole, self.book_search) + self.seach_by_signature = QtWidgets.QLineEdit(parent=self.formLayoutWidget) + self.seach_by_signature.setClearButtonEnabled(True) + self.seach_by_signature.setObjectName("seach_by_signature") + self.formLayout_6.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.seach_by_signature) + self.label_26 = QtWidgets.QLabel(parent=self.formLayoutWidget) + self.label_26.setObjectName("label_26") + self.formLayout_6.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_26) + self.search_by_title = QtWidgets.QLineEdit(parent=self.formLayoutWidget) + self.search_by_title.setClearButtonEnabled(True) + self.search_by_title.setObjectName("search_by_title") + self.formLayout_6.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.search_by_title) + spacerItem7 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.formLayout_6.setItem(2, QtWidgets.QFormLayout.ItemRole.LabelRole, spacerItem7) + self.tabWidget_2.addTab(self.tab_4, "") + self.verticalLayout_3.addWidget(self.tabWidget_2) + self.stackedWidget_4 = QtWidgets.QStackedWidget(parent=self.verticalLayoutWidget_2) + self.stackedWidget_4.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.stackedWidget_4.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.stackedWidget_4.setObjectName("stackedWidget_4") + self.stackedWidget_4Page1 = QtWidgets.QWidget() + self.stackedWidget_4Page1.setObjectName("stackedWidget_4Page1") + self.tabWidget_3 = QtWidgets.QTabWidget(parent=self.stackedWidget_4Page1) + self.tabWidget_3.setGeometry(QtCore.QRect(780, 10, 441, 441)) + self.tabWidget_3.setObjectName("tabWidget_3") + self.tab_6 = QtWidgets.QWidget() + self.tab_6.setObjectName("tab_6") + self.gridLayoutWidget_3 = QtWidgets.QWidget(parent=self.tab_6) + self.gridLayoutWidget_3.setGeometry(QtCore.QRect(0, 0, 431, 411)) + self.gridLayoutWidget_3.setObjectName("gridLayoutWidget_3") + self.gridLayout_4 = QtWidgets.QGridLayout(self.gridLayoutWidget_3) + self.gridLayout_4.setContentsMargins(0, 0, 0, 0) + self.gridLayout_4.setObjectName("gridLayout_4") + self.statistics_table = QtWidgets.QTableWidget(parent=self.gridLayoutWidget_3) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.statistics_table.sizePolicy().hasHeightForWidth()) + self.statistics_table.setSizePolicy(sizePolicy) + self.statistics_table.setMaximumSize(QtCore.QSize(16777215, 16777215)) + self.statistics_table.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.statistics_table.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.statistics_table.setAlternatingRowColors(True) + self.statistics_table.setObjectName("statistics_table") + self.statistics_table.setColumnCount(3) + self.statistics_table.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(2, item) + self.statistics_table.horizontalHeader().setCascadingSectionResizes(True) + self.statistics_table.horizontalHeader().setDefaultSectionSize(59) + self.statistics_table.horizontalHeader().setMinimumSectionSize(24) + self.statistics_table.horizontalHeader().setSortIndicatorShown(True) + self.statistics_table.horizontalHeader().setStretchLastSection(False) + self.gridLayout_4.addWidget(self.statistics_table, 0, 0, 1, 1) + self.tabWidget_3.addTab(self.tab_6, "") + self.tab_7 = QtWidgets.QWidget() + self.tab_7.setObjectName("tab_7") + self.tabWidget_3.addTab(self.tab_7, "") + self.widget = QtWidgets.QWidget(parent=self.stackedWidget_4Page1) + self.widget.setGeometry(QtCore.QRect(10, 10, 761, 441)) + self.widget.setObjectName("widget") + self.horizontalLayoutWidget_3 = QtWidgets.QWidget(parent=self.widget) + self.horizontalLayoutWidget_3.setGeometry(QtCore.QRect(0, 0, 761, 51)) + self.horizontalLayoutWidget_3.setObjectName("horizontalLayoutWidget_3") + self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_3) + self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_7.setObjectName("horizontalLayout_7") + self.btn_del_select_apparats = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_3) + self.btn_del_select_apparats.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.btn_del_select_apparats.setObjectName("btn_del_select_apparats") + self.horizontalLayout_7.addWidget(self.btn_del_select_apparats) + spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_7.addItem(spacerItem8) + self.table = QtWidgets.QWidget(parent=self.widget) + self.table.setGeometry(QtCore.QRect(0, 50, 761, 391)) + self.table.setObjectName("table") + self.tableWidget = QtWidgets.QTableWidget(parent=self.table) + self.tableWidget.setGeometry(QtCore.QRect(0, 0, 761, 391)) + self.tableWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.tableWidget.setObjectName("tableWidget") + self.tableWidget.setColumnCount(5) + self.tableWidget.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(4, item) + self.stackedWidget_4.addWidget(self.stackedWidget_4Page1) + self.page = QtWidgets.QWidget() + self.page.setObjectName("page") + self.book_search_result = QtWidgets.QTableWidget(parent=self.page) + self.book_search_result.setGeometry(QtCore.QRect(10, 20, 1081, 421)) + self.book_search_result.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) + self.book_search_result.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.book_search_result.setAlternatingRowColors(True) + self.book_search_result.setObjectName("book_search_result") + self.book_search_result.setColumnCount(3) + self.book_search_result.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.book_search_result.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.book_search_result.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.book_search_result.setHorizontalHeaderItem(2, item) + self.book_search_result.horizontalHeader().setCascadingSectionResizes(True) + self.book_search_result.horizontalHeader().setStretchLastSection(True) + self.stackedWidget_4.addWidget(self.page) + self.verticalLayout_3.addWidget(self.stackedWidget_4) + self.tabWidget.addTab(self.tab_2, "") + self.tab_5 = QtWidgets.QWidget() + self.tab_5.setObjectName("tab_5") + self.label_21 = QtWidgets.QLabel(parent=self.tab_5) + self.label_21.setGeometry(QtCore.QRect(10, 30, 47, 22)) + self.label_21.setObjectName("label_21") + self.select_action_box = QtWidgets.QComboBox(parent=self.tab_5) + self.select_action_box.setGeometry(QtCore.QRect(70, 30, 181, 22)) + self.select_action_box.setObjectName("select_action_box") + self.select_action_box.addItem("") + self.select_action_box.addItem("") + self.select_action_box.addItem("") + self.select_action_box.addItem("") + self.user_create_frame = QtWidgets.QFrame(parent=self.tab_5) + self.user_create_frame.setGeometry(QtCore.QRect(10, 60, 591, 141)) + self.user_create_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.user_create_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.user_create_frame.setObjectName("user_create_frame") + self.gridLayoutWidget_4 = QtWidgets.QWidget(parent=self.user_create_frame) + self.gridLayoutWidget_4.setGeometry(QtCore.QRect(0, 0, 581, 141)) + self.gridLayoutWidget_4.setObjectName("gridLayoutWidget_4") + self.gridLayout_5 = QtWidgets.QGridLayout(self.gridLayoutWidget_4) + self.gridLayout_5.setContentsMargins(0, 0, 0, 0) + self.gridLayout_5.setObjectName("gridLayout_5") + self.label_22 = QtWidgets.QLabel(parent=self.gridLayoutWidget_4) + self.label_22.setObjectName("label_22") + self.gridLayout_5.addWidget(self.label_22, 0, 0, 1, 1) + self.user_create_frame_username = QtWidgets.QLineEdit(parent=self.gridLayoutWidget_4) + self.user_create_frame_username.setMaximumSize(QtCore.QSize(150, 16777215)) + self.user_create_frame_username.setObjectName("user_create_frame_username") + self.gridLayout_5.addWidget(self.user_create_frame_username, 0, 1, 1, 1) + self.label_24 = QtWidgets.QLabel(parent=self.gridLayoutWidget_4) + self.label_24.setObjectName("label_24") + self.gridLayout_5.addWidget(self.label_24, 0, 2, 1, 1) + self.label_23 = QtWidgets.QLabel(parent=self.gridLayoutWidget_4) + self.label_23.setObjectName("label_23") + self.gridLayout_5.addWidget(self.label_23, 1, 0, 1, 1) + spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout_5.addItem(spacerItem9, 0, 4, 1, 1) + self.user_frame_userrole = QtWidgets.QComboBox(parent=self.gridLayoutWidget_4) + self.user_frame_userrole.setObjectName("user_frame_userrole") + self.gridLayout_5.addWidget(self.user_frame_userrole, 0, 3, 1, 1) + self.user_create_frame_password = QtWidgets.QLineEdit(parent=self.gridLayoutWidget_4) + self.user_create_frame_password.setMaximumSize(QtCore.QSize(150, 16777215)) + self.user_create_frame_password.setObjectName("user_create_frame_password") + self.gridLayout_5.addWidget(self.user_create_frame_password, 1, 1, 1, 1) + self.user_frame_addUser = QtWidgets.QPushButton(parent=self.gridLayoutWidget_4) + self.user_frame_addUser.setObjectName("user_frame_addUser") + self.gridLayout_5.addWidget(self.user_frame_addUser, 1, 3, 1, 1) + self.user_frame_err_message = QtWidgets.QLabel(parent=self.gridLayoutWidget_4) + self.user_frame_err_message.setText("") + self.user_frame_err_message.setObjectName("user_frame_err_message") + self.gridLayout_5.addWidget(self.user_frame_err_message, 1, 4, 1, 1) + self.user_delete_frame = QtWidgets.QFrame(parent=self.tab_5) + self.user_delete_frame.setGeometry(QtCore.QRect(10, 60, 591, 141)) + self.user_delete_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.user_delete_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.user_delete_frame.setObjectName("user_delete_frame") + self.gridLayoutWidget_7 = QtWidgets.QWidget(parent=self.user_delete_frame) + self.gridLayoutWidget_7.setGeometry(QtCore.QRect(0, 0, 581, 141)) + self.gridLayoutWidget_7.setObjectName("gridLayoutWidget_7") + self.gridLayout_8 = QtWidgets.QGridLayout(self.gridLayoutWidget_7) + self.gridLayout_8.setContentsMargins(0, 0, 0, 0) + self.gridLayout_8.setObjectName("gridLayout_8") + self.horizontalLayout_8 = QtWidgets.QHBoxLayout() + self.horizontalLayout_8.setObjectName("horizontalLayout_8") + spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_8.addItem(spacerItem10) + self.pushButton = QtWidgets.QPushButton(parent=self.gridLayoutWidget_7) + self.pushButton.setObjectName("pushButton") + self.horizontalLayout_8.addWidget(self.pushButton) + spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_8.addItem(spacerItem11) + self.gridLayout_8.addLayout(self.horizontalLayout_8, 1, 1, 1, 1) + self.label_34 = QtWidgets.QLabel(parent=self.gridLayoutWidget_7) + self.label_34.setObjectName("label_34") + self.gridLayout_8.addWidget(self.label_34, 0, 0, 1, 1) + self.user_delete_frame_user_select = QtWidgets.QComboBox(parent=self.gridLayoutWidget_7) + self.user_delete_frame_user_select.setObjectName("user_delete_frame_user_select") + self.gridLayout_8.addWidget(self.user_delete_frame_user_select, 0, 1, 1, 1) + self.user_delete_confirm = QtWidgets.QRadioButton(parent=self.gridLayoutWidget_7) + self.user_delete_confirm.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft) + self.user_delete_confirm.setObjectName("user_delete_confirm") + self.gridLayout_8.addWidget(self.user_delete_confirm, 1, 0, 1, 1) + spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout_8.addItem(spacerItem12, 0, 2, 1, 1) + self.user_delete_err_message = QtWidgets.QLabel(parent=self.gridLayoutWidget_7) + self.user_delete_err_message.setText("") + self.user_delete_err_message.setObjectName("user_delete_err_message") + self.gridLayout_8.addWidget(self.user_delete_err_message, 1, 2, 1, 1) + self.user_edit_frame = QtWidgets.QFrame(parent=self.tab_5) + self.user_edit_frame.setGeometry(QtCore.QRect(10, 60, 591, 141)) + self.user_edit_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.user_edit_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.user_edit_frame.setObjectName("user_edit_frame") + self.gridLayoutWidget_10 = QtWidgets.QWidget(parent=self.user_edit_frame) + self.gridLayoutWidget_10.setGeometry(QtCore.QRect(0, 0, 581, 141)) + self.gridLayoutWidget_10.setObjectName("gridLayoutWidget_10") + self.gridLayout_11 = QtWidgets.QGridLayout(self.gridLayoutWidget_10) + self.gridLayout_11.setContentsMargins(0, 0, 0, 0) + self.gridLayout_11.setObjectName("gridLayout_11") + self.user_edit_frame_role_select = QtWidgets.QComboBox(parent=self.gridLayoutWidget_10) + self.user_edit_frame_role_select.setObjectName("user_edit_frame_role_select") + self.gridLayout_11.addWidget(self.user_edit_frame_role_select, 0, 3, 1, 1) + self.label_38 = QtWidgets.QLabel(parent=self.gridLayoutWidget_10) + self.label_38.setObjectName("label_38") + self.gridLayout_11.addWidget(self.label_38, 0, 0, 1, 1) + self.user_edit_frame_user_select = QtWidgets.QComboBox(parent=self.gridLayoutWidget_10) + self.user_edit_frame_user_select.setMaximumSize(QtCore.QSize(150, 16777215)) + self.user_edit_frame_user_select.setObjectName("user_edit_frame_user_select") + self.gridLayout_11.addWidget(self.user_edit_frame_user_select, 0, 1, 1, 1) + self.update_user = QtWidgets.QPushButton(parent=self.gridLayoutWidget_10) + self.update_user.setObjectName("update_user") + self.gridLayout_11.addWidget(self.update_user, 1, 3, 1, 1) + self.label_40 = QtWidgets.QLabel(parent=self.gridLayoutWidget_10) + self.label_40.setObjectName("label_40") + self.gridLayout_11.addWidget(self.label_40, 0, 2, 1, 1) + self.label_39 = QtWidgets.QLabel(parent=self.gridLayoutWidget_10) + self.label_39.setObjectName("label_39") + self.gridLayout_11.addWidget(self.label_39, 1, 0, 1, 1) + self.user_edit_frame_new_password = QtWidgets.QLineEdit(parent=self.gridLayoutWidget_10) + self.user_edit_frame_new_password.setMaximumSize(QtCore.QSize(150, 16777215)) + self.user_edit_frame_new_password.setObjectName("user_edit_frame_new_password") + self.gridLayout_11.addWidget(self.user_edit_frame_new_password, 1, 1, 1, 1) + spacerItem13 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout_11.addItem(spacerItem13, 0, 4, 1, 1) + self.edit_faculty_member = QtWidgets.QFrame(parent=self.tab_5) + self.edit_faculty_member.setGeometry(QtCore.QRect(10, 60, 1051, 191)) + self.edit_faculty_member.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.edit_faculty_member.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.edit_faculty_member.setObjectName("edit_faculty_member") + self.gridLayoutWidget_11 = QtWidgets.QWidget(parent=self.edit_faculty_member) + self.gridLayoutWidget_11.setGeometry(QtCore.QRect(0, 0, 751, 223)) + self.gridLayoutWidget_11.setObjectName("gridLayoutWidget_11") + self.gridLayout_12 = QtWidgets.QGridLayout(self.gridLayoutWidget_11) + self.gridLayout_12.setContentsMargins(0, 0, 0, 0) + self.gridLayout_12.setObjectName("gridLayout_12") + self.formLayout_2 = QtWidgets.QFormLayout() + self.formLayout_2.setObjectName("formLayout_2") + self.label_43 = QtWidgets.QLabel(parent=self.gridLayoutWidget_11) + self.label_43.setObjectName("label_43") + self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_43) + self.edit_faculty_member_new_title = QtWidgets.QComboBox(parent=self.gridLayoutWidget_11) + self.edit_faculty_member_new_title.setObjectName("edit_faculty_member_new_title") + self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.edit_faculty_member_new_title) + self.label_44 = QtWidgets.QLabel(parent=self.gridLayoutWidget_11) + self.label_44.setObjectName("label_44") + self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_44) + self.edit_faculty_member_new_surname = QtWidgets.QLineEdit(parent=self.gridLayoutWidget_11) + self.edit_faculty_member_new_surname.setObjectName("edit_faculty_member_new_surname") + self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.edit_faculty_member_new_surname) + self.label_45 = QtWidgets.QLabel(parent=self.gridLayoutWidget_11) + self.label_45.setObjectName("label_45") + self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_45) + self.user_faculty_member_new_name = QtWidgets.QLineEdit(parent=self.gridLayoutWidget_11) + self.user_faculty_member_new_name.setObjectName("user_faculty_member_new_name") + self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.user_faculty_member_new_name) + self.gridLayout_12.addLayout(self.formLayout_2, 2, 2, 1, 1) + self.formLayout_4 = QtWidgets.QFormLayout() + self.formLayout_4.setObjectName("formLayout_4") + self.edit_faculty_member_title = QtWidgets.QLineEdit(parent=self.gridLayoutWidget_11) + self.edit_faculty_member_title.setFocusPolicy(QtCore.Qt.FocusPolicy.TabFocus) + self.edit_faculty_member_title.setReadOnly(True) + self.edit_faculty_member_title.setObjectName("edit_faculty_member_title") + self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.edit_faculty_member_title) + self.edit_faculty_member_select_member = QtWidgets.QComboBox(parent=self.gridLayoutWidget_11) + self.edit_faculty_member_select_member.setObjectName("edit_faculty_member_select_member") + self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.edit_faculty_member_select_member) + self.label_46 = QtWidgets.QLabel(parent=self.gridLayoutWidget_11) + self.label_46.setObjectName("label_46") + self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_46) + self.faculty_member_old_telnr = QtWidgets.QLineEdit(parent=self.gridLayoutWidget_11) + self.faculty_member_old_telnr.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus) + self.faculty_member_old_telnr.setReadOnly(True) + self.faculty_member_old_telnr.setObjectName("faculty_member_old_telnr") + self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.faculty_member_old_telnr) + self.label_49 = QtWidgets.QLabel(parent=self.gridLayoutWidget_11) + self.label_49.setObjectName("label_49") + self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_49) + self.faculty_member_oldmail = QtWidgets.QLineEdit(parent=self.gridLayoutWidget_11) + self.faculty_member_oldmail.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.faculty_member_oldmail.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone) + self.faculty_member_oldmail.setReadOnly(True) + self.faculty_member_oldmail.setObjectName("faculty_member_oldmail") + self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.faculty_member_oldmail) + self.gridLayout_12.addLayout(self.formLayout_4, 0, 2, 1, 1) + self.formLayout_5 = QtWidgets.QFormLayout() + self.formLayout_5.setObjectName("formLayout_5") + self.label_47 = QtWidgets.QLabel(parent=self.gridLayoutWidget_11) + self.label_47.setObjectName("label_47") + self.formLayout_5.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_47) + self.label_48 = QtWidgets.QLabel(parent=self.gridLayoutWidget_11) + self.label_48.setObjectName("label_48") + self.formLayout_5.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_48) + self.lineEdit = QtWidgets.QLineEdit(parent=self.gridLayoutWidget_11) + self.lineEdit.setObjectName("lineEdit") + self.formLayout_5.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.lineEdit) + self.lineEdit_5 = QtWidgets.QLineEdit(parent=self.gridLayoutWidget_11) + self.lineEdit_5.setObjectName("lineEdit_5") + self.formLayout_5.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.lineEdit_5) + self.gridLayout_12.addLayout(self.formLayout_5, 2, 4, 1, 1) + self.label_41 = QtWidgets.QLabel(parent=self.gridLayoutWidget_11) + self.label_41.setObjectName("label_41") + self.gridLayout_12.addWidget(self.label_41, 0, 0, 1, 1) + self.update_faculty_member = QtWidgets.QPushButton(parent=self.gridLayoutWidget_11) + self.update_faculty_member.setObjectName("update_faculty_member") + self.gridLayout_12.addWidget(self.update_faculty_member, 3, 4, 1, 1) + self.label_42 = QtWidgets.QLabel(parent=self.gridLayoutWidget_11) + self.label_42.setObjectName("label_42") + self.gridLayout_12.addWidget(self.label_42, 2, 0, 1, 1) + self.tabWidget.addTab(self.tab_5, "") + self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) + self.horizontalLayout.addLayout(self.gridLayout) + self.verticalLayout.addLayout(self.horizontalLayout) + self.horizontalLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget) + self.horizontalLayoutWidget.setGeometry(QtCore.QRect(1280, 360, 311, 391)) + self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") + self.horizontalLayout_6 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) + self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_6.setObjectName("horizontalLayout_6") + self.frame_creation_progress = QtWidgets.QFrame(parent=self.horizontalLayoutWidget) + self.frame_creation_progress.setObjectName("frame_creation_progress") + self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frame_creation_progress) + self.verticalLayout_4.setSpacing(6) + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.groupBox_2 = QtWidgets.QGroupBox(parent=self.frame_creation_progress) + self.groupBox_2.setEnabled(True) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth()) + self.groupBox_2.setSizePolicy(sizePolicy) + self.groupBox_2.setObjectName("groupBox_2") + self.appdata_check = QtWidgets.QCheckBox(parent=self.groupBox_2) + self.appdata_check.setGeometry(QtCore.QRect(20, 30, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.appdata_check.setFont(font) + self.appdata_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.appdata_check.setObjectName("appdata_check") + self.media_check = QtWidgets.QCheckBox(parent=self.groupBox_2) + self.media_check.setGeometry(QtCore.QRect(20, 70, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.media_check.setFont(font) + self.media_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.media_check.setObjectName("media_check") + self.ids_check = QtWidgets.QCheckBox(parent=self.groupBox_2) + self.ids_check.setGeometry(QtCore.QRect(20, 140, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.ids_check.setFont(font) + self.ids_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.ids_check.setObjectName("ids_check") + self.verticalLayout_4.addWidget(self.groupBox_2) + self.groupBox = QtWidgets.QGroupBox(parent=self.frame_creation_progress) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) + self.groupBox.setSizePolicy(sizePolicy) + self.groupBox.setObjectName("groupBox") + self.media_checked = QtWidgets.QCheckBox(parent=self.groupBox) + self.media_checked.setGeometry(QtCore.QRect(20, 30, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setItalic(False) + font.setUnderline(False) + font.setWeight(50) + font.setKerning(True) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) + self.media_checked.setFont(font) + self.media_checked.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.media_checked.setObjectName("media_checked") + self.media_edited_check = QtWidgets.QCheckBox(parent=self.groupBox) + self.media_edited_check.setGeometry(QtCore.QRect(20, 70, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setItalic(False) + font.setUnderline(False) + font.setWeight(50) + font.setKerning(True) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) + self.media_edited_check.setFont(font) + self.media_edited_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.media_edited_check.setObjectName("media_edited_check") + self.app_created = QtWidgets.QCheckBox(parent=self.groupBox) + self.app_created.setGeometry(QtCore.QRect(20, 110, 161, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setItalic(False) + font.setUnderline(False) + font.setWeight(50) + font.setKerning(True) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) + self.app_created.setFont(font) + self.app_created.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.app_created.setObjectName("app_created") + self.btn_copy_adis_command = QtWidgets.QPushButton(parent=self.groupBox) + self.btn_copy_adis_command.setGeometry(QtCore.QRect(170, 120, 101, 23)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setItalic(False) + font.setUnderline(False) + font.setWeight(50) + font.setKerning(True) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) + self.btn_copy_adis_command.setFont(font) + self.btn_copy_adis_command.setStatusTip("") + self.btn_copy_adis_command.setWhatsThis("") + self.btn_copy_adis_command.setAccessibleDescription("") + self.btn_copy_adis_command.setAutoFillBackground(False) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap("/home/alexander/GitHub/Semesterapparate/ui/../../../.designer/backup/icons/information.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.btn_copy_adis_command.setIcon(icon) + self.btn_copy_adis_command.setCheckable(False) + self.btn_copy_adis_command.setChecked(False) + self.btn_copy_adis_command.setAutoDefault(False) + self.btn_copy_adis_command.setObjectName("btn_copy_adis_command") + self.verticalLayout_4.addWidget(self.groupBox) + self.horizontalLayout_6.addWidget(self.frame_creation_progress) + self.frame_2 = QtWidgets.QFrame(parent=self.centralwidget) + self.frame_2.setGeometry(QtCore.QRect(1280, 10, 301, 341)) + self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame_2.setObjectName("frame_2") + self.calendarWidget = QtWidgets.QCalendarWidget(parent=self.frame_2) + self.calendarWidget.setGeometry(QtCore.QRect(0, 0, 291, 191)) + self.calendarWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.calendarWidget.setGridVisible(True) + self.calendarWidget.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.VerticalHeaderFormat.NoVerticalHeader) + self.calendarWidget.setObjectName("calendarWidget") + self.message_frame = QtWidgets.QFrame(parent=self.frame_2) + self.message_frame.setGeometry(QtCore.QRect(0, 210, 301, 121)) + self.message_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.message_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.message_frame.setObjectName("message_frame") + self.label_14 = QtWidgets.QLabel(parent=self.message_frame) + self.label_14.setGeometry(QtCore.QRect(10, 10, 47, 20)) + self.label_14.setObjectName("label_14") + self.line_app_info = QtWidgets.QLineEdit(parent=self.message_frame) + self.line_app_info.setEnabled(True) + self.line_app_info.setGeometry(QtCore.QRect(60, 10, 31, 20)) + self.line_app_info.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.line_app_info.setObjectName("line_app_info") + self.message_box = QtWidgets.QTextEdit(parent=self.message_frame) + self.message_box.setGeometry(QtCore.QRect(10, 40, 281, 71)) + self.message_box.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.message_box.setObjectName("message_box") + self.btn_delete_message = QtWidgets.QPushButton(parent=self.message_frame) + self.btn_delete_message.setGeometry(QtCore.QRect(130, 10, 75, 23)) + self.btn_delete_message.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.btn_delete_message.setObjectName("btn_delete_message") + self.spin_select_message = QtWidgets.QSpinBox(parent=self.message_frame) + self.spin_select_message.setGeometry(QtCore.QRect(210, 10, 74, 22)) + self.spin_select_message.setMinimum(1) + self.spin_select_message.setObjectName("spin_select_message") + self.label_total_day_messages = QtWidgets.QLabel(parent=self.message_frame) + self.label_total_day_messages.setGeometry(QtCore.QRect(260, 10, 21, 22)) + self.label_total_day_messages.setObjectName("label_total_day_messages") + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QtWidgets.QMenuBar(parent=MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1593, 30)) + self.menubar.setObjectName("menubar") + self.menuDatei = QtWidgets.QMenu(parent=self.menubar) + self.menuDatei.setObjectName("menuDatei") + self.menuEinstellungen = QtWidgets.QMenu(parent=self.menubar) + self.menuEinstellungen.setObjectName("menuEinstellungen") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + self.actionBeenden = QtGui.QAction(parent=MainWindow) + self.actionBeenden.setShortcutVisibleInContextMenu(True) + self.actionBeenden.setObjectName("actionBeenden") + self.actionEinstellungen = QtGui.QAction(parent=MainWindow) + self.actionEinstellungen.setShortcutVisibleInContextMenu(True) + self.actionEinstellungen.setObjectName("actionEinstellungen") + self.menuDatei.addAction(self.actionBeenden) + self.menuEinstellungen.addAction(self.actionEinstellungen) + self.menubar.addAction(self.menuDatei.menuAction()) + self.menubar.addAction(self.menuEinstellungen.menuAction()) + + self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(0) + self.tabWidget_2.setCurrentIndex(0) + self.stackedWidget_4.setCurrentIndex(1) + self.tabWidget_3.setCurrentIndex(1) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + MainWindow.setTabOrder(self.drpdwn_app_nr, self.drpdwn_prof_title) + MainWindow.setTabOrder(self.drpdwn_prof_title, self.drpdwn_prof_name) + MainWindow.setTabOrder(self.drpdwn_prof_name, self.prof_mail) + MainWindow.setTabOrder(self.prof_mail, self.prof_tel_nr) + MainWindow.setTabOrder(self.prof_tel_nr, self.app_name) + MainWindow.setTabOrder(self.app_name, self.app_fach) + MainWindow.setTabOrder(self.app_fach, self.sem_year) + MainWindow.setTabOrder(self.sem_year, self.check_eternal_app) + MainWindow.setTabOrder(self.check_eternal_app, self.btn_add_document) + MainWindow.setTabOrder(self.btn_add_document, self.btn_open_document) + MainWindow.setTabOrder(self.btn_open_document, self.check_file) + MainWindow.setTabOrder(self.check_file, self.btn_apparat_save) + MainWindow.setTabOrder(self.btn_apparat_save, self.btn_apparat_apply) + MainWindow.setTabOrder(self.btn_apparat_apply, self.check_send_mail) + MainWindow.setTabOrder(self.check_send_mail, self.chkbx_show_del_media) + MainWindow.setTabOrder(self.chkbx_show_del_media, self.btn_reserve) + MainWindow.setTabOrder(self.btn_reserve, self.prof_id_adis) + MainWindow.setTabOrder(self.prof_id_adis, self.apparat_id_adis) + MainWindow.setTabOrder(self.apparat_id_adis, self.tabWidget_2) + MainWindow.setTabOrder(self.tabWidget_2, self.btn_del_select_apparats) + MainWindow.setTabOrder(self.btn_del_select_apparats, self.tabWidget_3) + MainWindow.setTabOrder(self.tabWidget_3, self.select_action_box) + MainWindow.setTabOrder(self.select_action_box, self.user_create_frame_username) + MainWindow.setTabOrder(self.user_create_frame_username, self.user_frame_userrole) + MainWindow.setTabOrder(self.user_frame_userrole, self.user_create_frame_password) + MainWindow.setTabOrder(self.user_create_frame_password, self.user_frame_addUser) + MainWindow.setTabOrder(self.user_frame_addUser, self.user_delete_frame_user_select) + MainWindow.setTabOrder(self.user_delete_frame_user_select, self.user_delete_confirm) + MainWindow.setTabOrder(self.user_delete_confirm, self.pushButton) + MainWindow.setTabOrder(self.pushButton, self.user_edit_frame_user_select) + MainWindow.setTabOrder(self.user_edit_frame_user_select, self.user_edit_frame_role_select) + MainWindow.setTabOrder(self.user_edit_frame_role_select, self.user_edit_frame_new_password) + MainWindow.setTabOrder(self.user_edit_frame_new_password, self.update_user) + MainWindow.setTabOrder(self.update_user, self.edit_faculty_member_title) + MainWindow.setTabOrder(self.edit_faculty_member_title, self.edit_faculty_member_select_member) + MainWindow.setTabOrder(self.edit_faculty_member_select_member, self.faculty_member_old_telnr) + MainWindow.setTabOrder(self.faculty_member_old_telnr, self.faculty_member_oldmail) + MainWindow.setTabOrder(self.faculty_member_oldmail, self.edit_faculty_member_new_title) + MainWindow.setTabOrder(self.edit_faculty_member_new_title, self.edit_faculty_member_new_surname) + MainWindow.setTabOrder(self.edit_faculty_member_new_surname, self.user_faculty_member_new_name) + MainWindow.setTabOrder(self.user_faculty_member_new_name, self.lineEdit) + MainWindow.setTabOrder(self.lineEdit, self.lineEdit_5) + MainWindow.setTabOrder(self.lineEdit_5, self.update_faculty_member) + MainWindow.setTabOrder(self.update_faculty_member, self.box_fach) + MainWindow.setTabOrder(self.box_fach, self.box_person) + MainWindow.setTabOrder(self.box_person, self.btn_search) + MainWindow.setTabOrder(self.btn_search, self.check_deletable) + MainWindow.setTabOrder(self.check_deletable, self.box_erstellsemester) + MainWindow.setTabOrder(self.box_erstellsemester, self.box_semester) + MainWindow.setTabOrder(self.box_semester, self.box_dauerapp) + MainWindow.setTabOrder(self.box_dauerapp, self.box_appnrs) + MainWindow.setTabOrder(self.box_appnrs, self.btn_copy_adis_command) + MainWindow.setTabOrder(self.btn_copy_adis_command, self.spin_select_message) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "Semesterapparatsmanagement")) + self.load_app.setToolTip(_translate("MainWindow", "Load the Semesterapparate from the database")) + self.load_app.setText(_translate("MainWindow", "App. aufrufen")) + self.create_new_app.setText(_translate("MainWindow", "neu. App anlegen")) + self.cancel_active_selection.setText(_translate("MainWindow", "Auswahl abbrechen")) + self.tableWidget_apparate.setSortingEnabled(True) + item = self.tableWidget_apparate.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "AppNr")) + item = self.tableWidget_apparate.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "App Name")) + item = self.tableWidget_apparate.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Professor")) + item = self.tableWidget_apparate.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "gültig bis")) + item = self.tableWidget_apparate.horizontalHeaderItem(4) + item.setText(_translate("MainWindow", "Dauerapparat")) + item = self.tableWidget_apparate.horizontalHeaderItem(5) + item.setText(_translate("MainWindow", "KontoNr")) + self.app_group_box.setTitle(_translate("MainWindow", "Apparatsdetails")) + item = self.dokument_list.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Dokumentname")) + item = self.dokument_list.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Dateityp")) + item = self.dokument_list.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Neu?")) + item = self.dokument_list.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "path")) + self.label_5.setText(_translate("MainWindow", "Apparatsname")) + self.sem_winter.setText(_translate("MainWindow", "Winter")) + self.label_4.setText(_translate("MainWindow", "Prof. Name")) + self.sem_sommer.setText(_translate("MainWindow", "Sommer")) + self.label_3.setText(_translate("MainWindow", "Prof. Titel")) + self.label_6.setText(_translate("MainWindow", "Semester")) + self.sem_year.setPlaceholderText(_translate("MainWindow", "2023")) + self.label_2.setText(_translate("MainWindow", "Apparatsnummer")) + self.btn_apparat_save.setText(_translate("MainWindow", "Speichern")) + self.btn_apparat_apply.setText(_translate("MainWindow", "Aktualisieren")) + self.check_eternal_app.setText(_translate("MainWindow", "Dauerapparat")) + self.label_8.setText(_translate("MainWindow", "Mail")) + self.label_9.setText(_translate("MainWindow", "Tel")) + self.label_10.setText(_translate("MainWindow", "Fach")) + self.mail_mand.setText(_translate("MainWindow", "*")) + self.telnr_mand.setText(_translate("MainWindow", "*")) + self.profname_mand.setText(_translate("MainWindow", "*")) + self.appname_mand.setText(_translate("MainWindow", "*")) + self.fach_mand.setText(_translate("MainWindow", "*")) + self._mand.setText(_translate("MainWindow", "*")) + self.btn_add_document.setText(_translate("MainWindow", "Dokument hinzufügen")) + self.btn_open_document.setText(_translate("MainWindow", "Dokument öffnen")) + self.check_file.setToolTip(_translate("MainWindow", "Abhängig von der Anzahl der Medien kann die Suche sehr lange dauern")) + self.check_file.setText(_translate("MainWindow", "Medien aus Dokument\n" +" hinzufügen")) + self.label_12.setText(_translate("MainWindow", "Prof-ID-aDIS")) + self.label_13.setText(_translate("MainWindow", "Apparat-ID-aDIS")) + self.check_send_mail.setText(_translate("MainWindow", "Mail senden")) + self.tableWidget_apparat_media.setSortingEnabled(True) + item = self.tableWidget_apparat_media.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Buchtitel")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Signatur")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Auflage")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Autor")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(4) + item.setText(_translate("MainWindow", "verfügbar?")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(5) + item.setText(_translate("MainWindow", "Vorgemerkt")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(6) + item.setText(_translate("MainWindow", "Link")) + self.label.setText(_translate("MainWindow", " Medienliste")) + self.chkbx_show_del_media.setText(_translate("MainWindow", "gel. Medien anzeigen")) + self.btn_reserve.setText(_translate("MainWindow", "im Apparat?")) + self.label_info.setText(_translate("MainWindow", "Medien werden hinzugefügt")) + self.progress_label.setText(_translate("MainWindow", "Medium x/y")) + self.label_20.setText(_translate("MainWindow", "Medien werden geprüft")) + self.avail_status.setText(_translate("MainWindow", "TextLabel")) + self.add_medium.setText(_translate("MainWindow", "Medien hinzufügen")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Anlegen")) + self.btn_search.setText(_translate("MainWindow", "Suchen")) + self.label_7.setText(_translate("MainWindow", "Appnr.:")) + self.label_18.setText(_translate("MainWindow", "Dauerapp:")) + self.label_17.setText(_translate("MainWindow", "Endsemester:")) + self.label_19.setText(_translate("MainWindow", "Erstellsemester:")) + self.label_11.setText(_translate("MainWindow", "Person:")) + self.label_16.setText(_translate("MainWindow", "Fach:")) + self.label_15.setText(_translate("MainWindow", "Löschbar")) + self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_3), _translate("MainWindow", "Statistik")) + self.label_25.setText(_translate("MainWindow", "Signatur")) + self.book_search.setText(_translate("MainWindow", "Suche")) + self.label_26.setText(_translate("MainWindow", "Titel")) + self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_4), _translate("MainWindow", "Suchen")) + item = self.statistics_table.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Semester")) + item = self.statistics_table.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Zugang")) + item = self.statistics_table.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Abgang")) + self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.tab_6), _translate("MainWindow", "Tabelle")) + self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.tab_7), _translate("MainWindow", "Erstellte und gelöschte Semesterapparate")) + self.btn_del_select_apparats.setText(_translate("MainWindow", "Ausgewählte Löschen")) + item = self.tableWidget.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Apparatsname")) + item = self.tableWidget.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Apparatsnummer")) + item = self.tableWidget.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Person")) + item = self.tableWidget.horizontalHeaderItem(4) + item.setText(_translate("MainWindow", "Fach")) + item = self.book_search_result.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Titel")) + item = self.book_search_result.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Signatur")) + item = self.book_search_result.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Apparat")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Suchen / Statistik")) + self.label_21.setText(_translate("MainWindow", "Aktion:")) + self.select_action_box.setItemText(0, _translate("MainWindow", "Nutzer anlegen")) + self.select_action_box.setItemText(1, _translate("MainWindow", "Nutzer löschen")) + self.select_action_box.setItemText(2, _translate("MainWindow", "Nutzer aktualisieren")) + self.select_action_box.setItemText(3, _translate("MainWindow", "Lehrperson bearbeiten")) + self.label_22.setText(_translate("MainWindow", "Nutzername")) + self.label_24.setText(_translate("MainWindow", "Rolle")) + self.label_23.setText(_translate("MainWindow", "Passwort")) + self.user_frame_addUser.setText(_translate("MainWindow", "Anlegen")) + self.pushButton.setText(_translate("MainWindow", "Nutzer löschen")) + self.label_34.setText(_translate("MainWindow", "Nutzername")) + self.user_delete_confirm.setText(_translate("MainWindow", "Wirklich löschen?")) + self.label_38.setText(_translate("MainWindow", "Nutzername")) + self.update_user.setText(_translate("MainWindow", "Aktualisieren")) + self.label_40.setText(_translate("MainWindow", "Rolle")) + self.label_39.setText(_translate("MainWindow", "Neues Passwort")) + self.label_43.setText(_translate("MainWindow", "Titel")) + self.label_44.setText(_translate("MainWindow", "Vorname")) + self.label_45.setText(_translate("MainWindow", "Nachname")) + self.label_46.setText(_translate("MainWindow", "Telefonnummer")) + self.label_49.setText(_translate("MainWindow", "Mail")) + self.label_47.setText(_translate("MainWindow", "Mail")) + self.label_48.setText(_translate("MainWindow", "Telefon")) + self.label_41.setText(_translate("MainWindow", "Alte Angaben")) + self.update_faculty_member.setText(_translate("MainWindow", "Aktualisieren")) + self.label_42.setText(_translate("MainWindow", "Neue Angaben")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_5), _translate("MainWindow", "Admin")) + self.groupBox_2.setTitle(_translate("MainWindow", "Software")) + self.appdata_check.setText(_translate("MainWindow", "Apparatsdaten eingegeben")) + self.media_check.setText(_translate("MainWindow", "Medien hinzugefügt / importiert")) + self.ids_check.setText(_translate("MainWindow", "Prof-ID und Apparat-ID eingetragen")) + self.groupBox.setTitle(_translate("MainWindow", "aDIS")) + self.media_checked.setText(_translate("MainWindow", "Medien geprüft")) + self.media_edited_check.setText(_translate("MainWindow", "Medien bearbeitet")) + self.app_created.setText(_translate("MainWindow", "Apparat angelegt")) + self.btn_copy_adis_command.setToolTip(_translate("MainWindow", "Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren")) + self.btn_copy_adis_command.setText(_translate("MainWindow", " aDIS Abfrage")) + self.label_14.setText(_translate("MainWindow", "Apparat")) + self.btn_delete_message.setText(_translate("MainWindow", "Löschen")) + self.label_total_day_messages.setText(_translate("MainWindow", "TextLabel")) + self.menuDatei.setTitle(_translate("MainWindow", "Datei")) + self.menuEinstellungen.setTitle(_translate("MainWindow", "Bearbeiten")) + self.actionBeenden.setText(_translate("MainWindow", "Beenden")) + self.actionBeenden.setShortcut(_translate("MainWindow", "Ctrl+Q")) + self.actionEinstellungen.setText(_translate("MainWindow", "Einstellungen")) + self.actionEinstellungen.setShortcut(_translate("MainWindow", "Alt+S")) diff --git a/src/ui/setupwizard.ui b/src/ui/setupwizard.ui new file mode 100644 index 0000000..3875a94 --- /dev/null +++ b/src/ui/setupwizard.ui @@ -0,0 +1,149 @@ + + + Wizard + + + + 0 + 0 + 640 + 480 + + + + + 640 + 480 + + + + Wizard + + + + + + 200 + 10 + 256 + 192 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Setup für das Semesterapparatsprogram.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Im Anschluss werden wichtige Einstellungen gesetzt, welche auch im späteren Verlauf verändert werden können.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + + + + + 10 + 0 + 131 + 16 + + + + Grundeinstellungen + + + + + + 10 + 40 + 71 + 16 + + + + Opens the downloaded files with the default applications set in the OS + + + Default Apps + + + + + + 100 + 40 + 70 + 17 + + + + + + + + + + 10 + 70 + 61 + 16 + + + + Path where the downloaded files are stored. Defaults to ~/Desktop/SemapFiles + + + Save Path + + + + + + 280 + 10 + 331 + 361 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 80 + 70 + 113 + 20 + + + + ~/Desktop/SemapFiles + + + + + + 200 + 70 + 25 + 19 + + + + ... + + + + + + + diff --git a/src/ui/setupwizard_ui.py b/src/ui/setupwizard_ui.py new file mode 100644 index 0000000..f99cad1 --- /dev/null +++ b/src/ui/setupwizard_ui.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'setupwizard.ui' +## +## Created by: Qt User Interface Compiler version 6.5.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QCheckBox, QFrame, QLabel, + QLineEdit, QSizePolicy, QTextBrowser, QToolButton, + QWidget, QWizard, QWizardPage) + +class Ui_Wizard(object): + def setupUi(self, Wizard): + if not Wizard.objectName(): + Wizard.setObjectName(u"Wizard") + Wizard.resize(640, 480) + Wizard.setMaximumSize(QSize(640, 480)) + self.wizardPage1 = QWizardPage() + self.wizardPage1.setObjectName(u"wizardPage1") + self.textBrowser = QTextBrowser(self.wizardPage1) + self.textBrowser.setObjectName(u"textBrowser") + self.textBrowser.setGeometry(QRect(200, 10, 256, 192)) + Wizard.addPage(self.wizardPage1) + self.wizardPage2 = QWizardPage() + self.wizardPage2.setObjectName(u"wizardPage2") + self.label = QLabel(self.wizardPage2) + self.label.setObjectName(u"label") + self.label.setGeometry(QRect(10, 0, 131, 16)) + self.label_2 = QLabel(self.wizardPage2) + self.label_2.setObjectName(u"label_2") + self.label_2.setGeometry(QRect(10, 40, 71, 16)) + self.default_apps = QCheckBox(self.wizardPage2) + self.default_apps.setObjectName(u"default_apps") + self.default_apps.setGeometry(QRect(100, 40, 70, 17)) + self.label_3 = QLabel(self.wizardPage2) + self.label_3.setObjectName(u"label_3") + self.label_3.setGeometry(QRect(10, 70, 61, 16)) + self.custom_applications = QFrame(self.wizardPage2) + self.custom_applications.setObjectName(u"custom_applications") + self.custom_applications.setGeometry(QRect(280, 10, 331, 361)) + self.custom_applications.setFrameShape(QFrame.StyledPanel) + self.custom_applications.setFrameShadow(QFrame.Raised) + self.save_path = QLineEdit(self.wizardPage2) + self.save_path.setObjectName(u"save_path") + self.save_path.setGeometry(QRect(80, 70, 113, 20)) + self.btn_save_path_select = QToolButton(self.wizardPage2) + self.btn_save_path_select.setObjectName(u"btn_save_path_select") + self.btn_save_path_select.setGeometry(QRect(200, 70, 25, 19)) + Wizard.addPage(self.wizardPage2) + + self.retranslateUi(Wizard) + + QMetaObject.connectSlotsByName(Wizard) + # setupUi + + def retranslateUi(self, Wizard): + Wizard.setWindowTitle(QCoreApplication.translate("Wizard", u"Wizard", None)) + self.textBrowser.setHtml(QCoreApplication.translate("Wizard", u"\n" +"\n" +"

Setup f\u00fcr das Semesterapparatsprogram.

\n" +"


\n" +"

Im Anschluss werden wichtige Einstellungen gesetzt, welche auch im sp\u00e4teren Verlauf ver\u00e4ndert werden k\u00f6nnen.

\n" +"


", None)) + self.label.setText(QCoreApplication.translate("Wizard", u"Grundeinstellungen", None)) +#if QT_CONFIG(tooltip) + self.label_2.setToolTip(QCoreApplication.translate("Wizard", u"Opens the downloaded files with the default applications set in the OS", None)) +#endif // QT_CONFIG(tooltip) + self.label_2.setText(QCoreApplication.translate("Wizard", u"Default Apps", None)) + self.default_apps.setText("") +#if QT_CONFIG(tooltip) + self.label_3.setToolTip(QCoreApplication.translate("Wizard", u"Path where the downloaded files are stored. Defaults to ~/Desktop/SemapFiles", None)) +#endif // QT_CONFIG(tooltip) + self.label_3.setText(QCoreApplication.translate("Wizard", u"Save Path", None)) + self.save_path.setPlaceholderText(QCoreApplication.translate("Wizard", u"~/Desktop/SemapFiles", None)) + self.btn_save_path_select.setText(QCoreApplication.translate("Wizard", u"...", None)) + # retranslateUi + diff --git a/src/ui/sounds/semesterapparat_ui.ui b/src/ui/sounds/semesterapparat_ui.ui new file mode 100644 index 0000000..529011b --- /dev/null +++ b/src/ui/sounds/semesterapparat_ui.ui @@ -0,0 +1,2146 @@ + + + MainWindow + + + Qt::WindowModal + + + true + + + + 0 + 0 + 1593 + 800 + + + + + 0 + 0 + + + + + 1278 + 800 + + + + + 1920 + 800 + + + + Qt::NoContextMenu + + + Semesterapparatsmanagement + + + + + 0 + 0 + + + + + + 0 + 0 + 1271 + 761 + + + + + + + + + + + Qt::NoFocus + + + 1 + + + + + 0 + 0 + + + + Anlegen + + + + + 0 + 0 + 1261 + 163 + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::NoFocus + + + Load the Semesterapparate from the database + + + App. aufrufen + + + + + + + Qt::NoFocus + + + neu. App anlegen + + + + + + + Auswahl abbrechen + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::NoFocus + + + QAbstractScrollArea::AdjustToContents + + + QAbstractItemView::SelectedClicked + + + true + + + Qt::ElideMiddle + + + true + + + true + + + + AppNr + + + + + App Name + + + + + Professor + + + + + gültig bis + + + + + Dauerapparat + + + + + KontoNr + + + + + + + + + + + + + + + + + + 0 + 160 + 1261 + 21 + + + + Qt::Horizontal + + + + + true + + + + 0 + 180 + 1261 + 511 + + + + + + + + 0 + 0 + + + + + 0 + 210 + + + + + 12 + 75 + true + + + + Apparatsdetails + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + 765 + 20 + 321 + 181 + + + + + 10 + 50 + false + false + + + + Qt::NoFocus + + + true + + + QAbstractScrollArea::AdjustToContents + + + true + + + QAbstractItemView::DropOnly + + + Qt::LinkAction + + + QAbstractItemView::SingleSelection + + + + Dokumentname + + + + Arial + 8 + + + + + + Dateityp + + + + Arial + 8 + + + + + + Neu? + + + + Arial + 8 + + + + + + path + + + + + + true + + + + 10 + 30 + 1241 + 151 + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 110 + 50 + 69 + 22 + + + + + 9 + 50 + false + + + + true + + + + + + 250 + 20 + 91 + 21 + + + + + 9 + 50 + false + + + + Apparatsname + + + + + + 340 + 50 + 82 + 17 + + + + + 9 + 50 + false + + + + Qt::NoFocus + + + Winter + + + + + + 10 + 80 + 71 + 21 + + + + + 9 + 50 + false + + + + Prof. Name + + + + + + 110 + 20 + 69 + 22 + + + + + 9 + 50 + false + + + + Qt::ImhDigitsOnly + + + true + + + + + + 340 + 20 + 113 + 20 + + + + + 9 + 50 + false + + + + Qt::StrongFocus + + + + + + 340 + 70 + 82 + 17 + + + + + 9 + 50 + false + + + + Qt::NoFocus + + + Sommer + + + + + + 10 + 50 + 61 + 20 + + + + + 9 + 50 + false + + + + Prof. Titel + + + + + + 270 + 60 + 61 + 21 + + + + + 9 + 50 + false + + + + Semester + + + + + + 410 + 60 + 113 + 20 + + + + + 9 + 50 + false + + + + Qt::StrongFocus + + + 4 + + + 2023 + + + + + + 10 + 20 + 101 + 21 + + + + + 9 + 50 + false + + + + Apparatsnummer + + + + + + 260 + 120 + 75 + 23 + + + + + 9 + 50 + false + + + + Speichern + + + + + + 350 + 120 + 75 + 23 + + + + + 9 + 50 + false + + + + Aktualisieren + + + + + + 340 + 90 + 101 + 17 + + + + + 9 + 50 + false + + + + Dauerapparat + + + + + + 10 + 110 + 71 + 21 + + + + + 9 + 50 + false + + + + Mail + + + + + + 110 + 110 + 121 + 20 + + + + + 9 + 50 + false + + + + Qt::ImhEmailCharactersOnly + + + 200 + + + + + + + + + 10 + 130 + 71 + 21 + + + + + 9 + 50 + false + + + + Tel + + + + + + 110 + 130 + 121 + 20 + + + + + 9 + 50 + false + + + + Qt::ImhDigitsOnly + + + + + + + + + 470 + 20 + 51 + 21 + + + + + 9 + 50 + false + + + + Fach + + + + + + 510 + 20 + 113 + 20 + + + + + 9 + 50 + false + + + + Qt::StrongFocus + + + + + + 110 + 80 + 121 + 22 + + + + + 8 + 50 + false + + + + Qt::StrongFocus + + + true + + + + + + QComboBox::InsertAlphabetically + + + true + + + + + + 100 + 110 + 47 + 21 + + + + + 9 + 50 + false + + + + * + + + + + + 100 + 130 + 47 + 21 + + + + + 9 + 50 + false + + + + * + + + + + + 100 + 80 + 47 + 21 + + + + + 9 + 50 + false + + + + * + + + + + + 330 + 20 + 16 + 21 + + + + + 9 + 50 + false + + + + * + + + + + + 500 + 20 + 47 + 21 + + + + + 9 + 50 + false + + + + Qt::NoFocus + + + * + + + + + + 330 + 60 + 16 + 21 + + + + + 9 + 50 + false + + + + * + + + + + + 1090 + 20 + 131 + 25 + + + + + 9 + 50 + false + + + + Dokument hinzufügen + + + + + + 1090 + 60 + 131 + 25 + + + + + 9 + 50 + false + + + + Dokument öffnen + + + + + + 1090 + 100 + 131 + 51 + + + + + 9 + 50 + false + + + + Abhängig von der Anzahl der Medien kann die Suche sehr lange dauern + + + Medien aus Dokument + hinzufügen + + + + + + 550 + 70 + 202 + 80 + + + + + + + + 9 + 50 + false + + + + Prof-ID-aDIS + + + + + + + + 9 + 50 + false + + + + + + + + + 9 + 50 + false + + + + Apparat-ID-aDIS + + + + + + + + + + + + 450 + 120 + 91 + 17 + + + + + 9 + 50 + false + + + + Mail senden + + + _mand + drpdwn_prof_title + label_5 + sem_winter + label_4 + drpdwn_app_nr + sem_sommer + label_3 + label_6 + sem_year + label_2 + btn_apparat_save + btn_apparat_apply + check_eternal_app + label_8 + label_9 + label_10 + mail_mand + telnr_mand + profname_mand + appname_mand + fach_mand + btn_add_document + btn_open_document + app_fach + app_name + prof_tel_nr + drpdwn_prof_name + prof_mail + check_file + formLayoutWidget_2 + check_send_mail + + frame + dokument_list + + + + + + + 0 + 0 + + + + + 1259 + 0 + + + + Qt::NoFocus + + + Qt::CustomContextMenu + + + QAbstractScrollArea::AdjustToContents + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::SelectRows + + + true + + + true + + + + Buchtitel + + + + + Signatur + + + + + Auflage + + + + + Autor + + + + + verfügbar? + + + + + Vorgemerkt + + + + + Link + + + + + + + + + 11 + 75 + true + + + + Medienliste + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + gel. Medien anzeigen + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + + + Medien werden hinzugefügt + + + + + + + Qt::Vertical + + + + + + + Medium x/y + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + Vorgemertk? + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 0 + 700 + 121 + 20 + + + + Qt::NoFocus + + + Medien hinzufügen + + + + + + Suchen / Statistik + + + + + 0 + 0 + 1251 + 721 + + + + + + + + 16777215 + 250 + + + + 0 + + + + Statistik + + + + + 10 + 180 + 75 + 23 + + + + Suchen + + + + + + 10 + 10 + 491 + 161 + + + + + + + Appnr.: + + + + + + + true + + + + + + + Dauerapp: + + + + + + + Endsemester: + + + + + + + Erstellsemester: + + + + + + + + + + Person: + + + + + + + Fach: + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Löschbar + + + + + + + + + + + + + + + + 100 + 180 + 401 + 23 + + + + + + + + + + Suchen + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 780 + 10 + 441 + 441 + + + + 0 + + + + Tabelle + + + + + 0 + 0 + 435 + 191 + + + + + 0 + 0 + + + + + 16777215 + 191 + + + + QAbstractItemView::NoEditTriggers + + + true + + + false + + + + Semester + + + + + Zugang + + + + + Abgang + + + + + + + 0 + 210 + 431 + 211 + + + + + + + Erstellte und gelöschte Semesterapparate + + + + + + + 10 + 10 + 761 + 441 + + + + + + 0 + 0 + 761 + 51 + + + + + + + Ausgewählte Löschen + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + 50 + 761 + 391 + + + + + + 0 + 0 + 761 + 391 + + + + QAbstractItemView::NoEditTriggers + + + + + + + + + Apparatsname + + + + + Apparatsnummer + + + + + Person + + + + + Fach + + + + + + + + + + + + + + Admin + + + + + + + + + + + + + + 1280 + 360 + 311 + 391 + + + + + + + + 6 + + + + + true + + + + 0 + 0 + + + + Software + + + + + 20 + 30 + 241 + 41 + + + + + 8 + 50 + false + + + + Apparatsdaten eingegeben + + + + + + 20 + 70 + 241 + 41 + + + + + 8 + 50 + false + + + + Medien hinzugefügt / importiert + + + + + + 20 + 140 + 241 + 41 + + + + + 8 + 50 + false + + + + Prof-ID und Apparat-ID eingetragen + + + + + + + + + 0 + 0 + + + + aDIS + + + + + 20 + 30 + 241 + 41 + + + + + 8 + 50 + false + false + false + PreferDefault + true + + + + Medien geprüft + + + + + + 20 + 70 + 241 + 41 + + + + + 8 + 50 + false + false + false + PreferDefault + true + + + + Medien bearbeitet + + + + + + 20 + 110 + 161 + 41 + + + + + 8 + 50 + false + false + false + PreferDefault + true + + + + Apparat angelegt + + + + + + 170 + 120 + 101 + 23 + + + + + 8 + 50 + false + false + false + PreferDefault + true + + + + Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren + + + + + + + + + + + + false + + + aDIS Abfrage + + + + ../../../.designer/backup/icons/information.png../../../.designer/backup/icons/information.png + + + false + + + false + + + false + + + + + + + + + + + + + 1280 + 10 + 301 + 341 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 291 + 191 + + + + true + + + QCalendarWidget::NoVerticalHeader + + + + + + 0 + 210 + 291 + 121 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 47 + 20 + + + + Apparat + + + + + true + + + + 60 + 10 + 31 + 20 + + + + + + + 10 + 40 + 271 + 71 + + + + + + + 130 + 10 + 75 + 23 + + + + Löschen + + + + + + 210 + 10 + 42 + 22 + + + + 1 + + + + + + 260 + 10 + 21 + 22 + + + + TextLabel + + + + + + + + + 0 + 0 + 1593 + 21 + + + + + Datei + + + + + + Bearbeiten + + + + + + + + + + Beenden + + + Ctrl+Q + + + true + + + + + Einstellungen + + + Alt+S + + + true + + + + + drpdwn_app_nr + drpdwn_prof_title + drpdwn_prof_name + prof_mail + prof_tel_nr + app_name + app_fach + sem_winter + sem_sommer + sem_year + check_eternal_app + btn_add_document + btn_open_document + btn_apparat_save + btn_apparat_apply + + + + diff --git a/src/ui/sounds/semesterapparat_ui_ui.py b/src/ui/sounds/semesterapparat_ui_ui.py new file mode 100644 index 0000000..6b0fafd --- /dev/null +++ b/src/ui/sounds/semesterapparat_ui_ui.py @@ -0,0 +1,1075 @@ +# Form implementation generated from reading ui file '/home/alexander/GitHub/Semesterapparate/ui/sounds/semesterapparat_ui.ui' +# +# Created by: PyQt6 UI code generator 6.5.3 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.setWindowModality(QtCore.Qt.WindowModality.WindowModal) + MainWindow.setEnabled(True) + MainWindow.resize(1593, 800) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) + MainWindow.setSizePolicy(sizePolicy) + MainWindow.setMinimumSize(QtCore.QSize(1278, 800)) + MainWindow.setMaximumSize(QtCore.QSize(1920, 800)) + MainWindow.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + self.centralwidget = QtWidgets.QWidget(parent=MainWindow) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) + self.centralwidget.setSizePolicy(sizePolicy) + self.centralwidget.setObjectName("centralwidget") + self.verticalLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget) + self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 1271, 761)) + self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") + self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.gridLayout = QtWidgets.QGridLayout() + self.gridLayout.setObjectName("gridLayout") + self.tabWidget = QtWidgets.QTabWidget(parent=self.verticalLayoutWidget) + self.tabWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tabWidget.setObjectName("tabWidget") + self.tab = QtWidgets.QWidget() + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.tab.sizePolicy().hasHeightForWidth()) + self.tab.setSizePolicy(sizePolicy) + self.tab.setObjectName("tab") + self.horizontalLayoutWidget_2 = QtWidgets.QWidget(parent=self.tab) + self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 1261, 163)) + self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2) + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.formLayout = QtWidgets.QFormLayout() + self.formLayout.setObjectName("formLayout") + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout_2.addItem(spacerItem) + self.load_app = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) + self.load_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.load_app.setObjectName("load_app") + self.verticalLayout_2.addWidget(self.load_app) + self.create_new_app = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) + self.create_new_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.create_new_app.setObjectName("create_new_app") + self.verticalLayout_2.addWidget(self.create_new_app) + self.cancel_active_selection = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) + self.cancel_active_selection.setObjectName("cancel_active_selection") + self.verticalLayout_2.addWidget(self.cancel_active_selection) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout_2.addItem(spacerItem1) + self.formLayout.setLayout(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.verticalLayout_2) + self.tableWidget_apparate = QtWidgets.QTableWidget(parent=self.horizontalLayoutWidget_2) + self.tableWidget_apparate.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tableWidget_apparate.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) + self.tableWidget_apparate.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.SelectedClicked) + self.tableWidget_apparate.setAlternatingRowColors(True) + self.tableWidget_apparate.setTextElideMode(QtCore.Qt.TextElideMode.ElideMiddle) + self.tableWidget_apparate.setObjectName("tableWidget_apparate") + self.tableWidget_apparate.setColumnCount(6) + self.tableWidget_apparate.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(4, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(5, item) + self.tableWidget_apparate.horizontalHeader().setCascadingSectionResizes(True) + self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.tableWidget_apparate) + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.formLayout.setLayout(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.horizontalLayout_4) + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.formLayout.setLayout(3, QtWidgets.QFormLayout.ItemRole.LabelRole, self.horizontalLayout_3) + self.horizontalLayout_2.addLayout(self.formLayout) + self.line = QtWidgets.QFrame(parent=self.tab) + self.line.setGeometry(QtCore.QRect(0, 160, 1261, 21)) + self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line.setObjectName("line") + self.gridLayoutWidget_2 = QtWidgets.QWidget(parent=self.tab) + self.gridLayoutWidget_2.setEnabled(True) + self.gridLayoutWidget_2.setGeometry(QtCore.QRect(0, 180, 1261, 511)) + self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2") + self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2) + self.gridLayout_2.setContentsMargins(0, 0, 0, 0) + self.gridLayout_2.setObjectName("gridLayout_2") + self.app_group_box = QtWidgets.QGroupBox(parent=self.gridLayoutWidget_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.app_group_box.sizePolicy().hasHeightForWidth()) + self.app_group_box.setSizePolicy(sizePolicy) + self.app_group_box.setMinimumSize(QtCore.QSize(0, 210)) + font = QtGui.QFont() + font.setPointSize(12) + font.setBold(True) + font.setWeight(75) + self.app_group_box.setFont(font) + self.app_group_box.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignVCenter) + self.app_group_box.setCheckable(False) + self.app_group_box.setObjectName("app_group_box") + self.dokument_list = QtWidgets.QTableWidget(parent=self.app_group_box) + self.dokument_list.setGeometry(QtCore.QRect(765, 20, 321, 181)) + font = QtGui.QFont() + font.setPointSize(10) + font.setBold(False) + font.setWeight(50) + font.setKerning(False) + self.dokument_list.setFont(font) + self.dokument_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.dokument_list.setAcceptDrops(True) + self.dokument_list.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) + self.dokument_list.setDragEnabled(True) + self.dokument_list.setDragDropMode(QtWidgets.QAbstractItemView.DragDropMode.DropOnly) + self.dokument_list.setDefaultDropAction(QtCore.Qt.DropAction.LinkAction) + self.dokument_list.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) + self.dokument_list.setObjectName("dokument_list") + self.dokument_list.setColumnCount(4) + self.dokument_list.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(8) + item.setFont(font) + self.dokument_list.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(8) + item.setFont(font) + self.dokument_list.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(8) + item.setFont(font) + self.dokument_list.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.dokument_list.setHorizontalHeaderItem(3, item) + self.frame = QtWidgets.QFrame(parent=self.app_group_box) + self.frame.setEnabled(True) + self.frame.setGeometry(QtCore.QRect(10, 30, 1241, 151)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) + self.frame.setSizePolicy(sizePolicy) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.drpdwn_prof_title = QtWidgets.QComboBox(parent=self.frame) + self.drpdwn_prof_title.setGeometry(QtCore.QRect(110, 50, 69, 22)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.drpdwn_prof_title.setFont(font) + self.drpdwn_prof_title.setEditable(True) + self.drpdwn_prof_title.setObjectName("drpdwn_prof_title") + self.label_5 = QtWidgets.QLabel(parent=self.frame) + self.label_5.setGeometry(QtCore.QRect(250, 20, 91, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_5.setFont(font) + self.label_5.setObjectName("label_5") + self.sem_winter = QtWidgets.QRadioButton(parent=self.frame) + self.sem_winter.setGeometry(QtCore.QRect(340, 50, 82, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_winter.setFont(font) + self.sem_winter.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.sem_winter.setObjectName("sem_winter") + self.label_4 = QtWidgets.QLabel(parent=self.frame) + self.label_4.setGeometry(QtCore.QRect(10, 80, 71, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_4.setFont(font) + self.label_4.setObjectName("label_4") + self.drpdwn_app_nr = QtWidgets.QComboBox(parent=self.frame) + self.drpdwn_app_nr.setGeometry(QtCore.QRect(110, 20, 69, 22)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.drpdwn_app_nr.setFont(font) + self.drpdwn_app_nr.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhDigitsOnly) + self.drpdwn_app_nr.setEditable(True) + self.drpdwn_app_nr.setObjectName("drpdwn_app_nr") + self.app_name = QtWidgets.QLineEdit(parent=self.frame) + self.app_name.setGeometry(QtCore.QRect(340, 20, 113, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.app_name.setFont(font) + self.app_name.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.app_name.setObjectName("app_name") + self.sem_sommer = QtWidgets.QRadioButton(parent=self.frame) + self.sem_sommer.setGeometry(QtCore.QRect(340, 70, 82, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_sommer.setFont(font) + self.sem_sommer.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.sem_sommer.setObjectName("sem_sommer") + self.label_3 = QtWidgets.QLabel(parent=self.frame) + self.label_3.setGeometry(QtCore.QRect(10, 50, 61, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_3.setFont(font) + self.label_3.setObjectName("label_3") + self.label_6 = QtWidgets.QLabel(parent=self.frame) + self.label_6.setGeometry(QtCore.QRect(270, 60, 61, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_6.setFont(font) + self.label_6.setObjectName("label_6") + self.sem_year = QtWidgets.QLineEdit(parent=self.frame) + self.sem_year.setGeometry(QtCore.QRect(410, 60, 113, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.sem_year.setFont(font) + self.sem_year.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.sem_year.setMaxLength(4) + self.sem_year.setObjectName("sem_year") + self.label_2 = QtWidgets.QLabel(parent=self.frame) + self.label_2.setGeometry(QtCore.QRect(10, 20, 101, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_2.setFont(font) + self.label_2.setObjectName("label_2") + self.btn_apparat_save = QtWidgets.QPushButton(parent=self.frame) + self.btn_apparat_save.setGeometry(QtCore.QRect(260, 120, 75, 23)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_apparat_save.setFont(font) + self.btn_apparat_save.setObjectName("btn_apparat_save") + self.btn_apparat_apply = QtWidgets.QPushButton(parent=self.frame) + self.btn_apparat_apply.setGeometry(QtCore.QRect(350, 120, 75, 23)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_apparat_apply.setFont(font) + self.btn_apparat_apply.setObjectName("btn_apparat_apply") + self.check_eternal_app = QtWidgets.QCheckBox(parent=self.frame) + self.check_eternal_app.setGeometry(QtCore.QRect(340, 90, 101, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.check_eternal_app.setFont(font) + self.check_eternal_app.setObjectName("check_eternal_app") + self.label_8 = QtWidgets.QLabel(parent=self.frame) + self.label_8.setGeometry(QtCore.QRect(10, 110, 71, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_8.setFont(font) + self.label_8.setObjectName("label_8") + self.prof_mail = QtWidgets.QLineEdit(parent=self.frame) + self.prof_mail.setGeometry(QtCore.QRect(110, 110, 121, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.prof_mail.setFont(font) + self.prof_mail.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhEmailCharactersOnly) + self.prof_mail.setMaxLength(200) + self.prof_mail.setPlaceholderText("") + self.prof_mail.setObjectName("prof_mail") + self.label_9 = QtWidgets.QLabel(parent=self.frame) + self.label_9.setGeometry(QtCore.QRect(10, 130, 71, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_9.setFont(font) + self.label_9.setObjectName("label_9") + self.prof_tel_nr = QtWidgets.QLineEdit(parent=self.frame) + self.prof_tel_nr.setGeometry(QtCore.QRect(110, 130, 121, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.prof_tel_nr.setFont(font) + self.prof_tel_nr.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhDigitsOnly) + self.prof_tel_nr.setPlaceholderText("") + self.prof_tel_nr.setObjectName("prof_tel_nr") + self.label_10 = QtWidgets.QLabel(parent=self.frame) + self.label_10.setGeometry(QtCore.QRect(470, 20, 51, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_10.setFont(font) + self.label_10.setObjectName("label_10") + self.app_fach = QtWidgets.QLineEdit(parent=self.frame) + self.app_fach.setGeometry(QtCore.QRect(510, 20, 113, 20)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.app_fach.setFont(font) + self.app_fach.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.app_fach.setObjectName("app_fach") + self.drpdwn_prof_name = QtWidgets.QComboBox(parent=self.frame) + self.drpdwn_prof_name.setGeometry(QtCore.QRect(110, 80, 121, 22)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.drpdwn_prof_name.setFont(font) + self.drpdwn_prof_name.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.drpdwn_prof_name.setEditable(True) + self.drpdwn_prof_name.setCurrentText("") + self.drpdwn_prof_name.setInsertPolicy(QtWidgets.QComboBox.InsertPolicy.InsertAlphabetically) + self.drpdwn_prof_name.setFrame(True) + self.drpdwn_prof_name.setObjectName("drpdwn_prof_name") + self.mail_mand = QtWidgets.QLabel(parent=self.frame) + self.mail_mand.setGeometry(QtCore.QRect(100, 110, 47, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.mail_mand.setFont(font) + self.mail_mand.setObjectName("mail_mand") + self.telnr_mand = QtWidgets.QLabel(parent=self.frame) + self.telnr_mand.setGeometry(QtCore.QRect(100, 130, 47, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.telnr_mand.setFont(font) + self.telnr_mand.setObjectName("telnr_mand") + self.profname_mand = QtWidgets.QLabel(parent=self.frame) + self.profname_mand.setGeometry(QtCore.QRect(100, 80, 47, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.profname_mand.setFont(font) + self.profname_mand.setObjectName("profname_mand") + self.appname_mand = QtWidgets.QLabel(parent=self.frame) + self.appname_mand.setGeometry(QtCore.QRect(330, 20, 16, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.appname_mand.setFont(font) + self.appname_mand.setObjectName("appname_mand") + self.fach_mand = QtWidgets.QLabel(parent=self.frame) + self.fach_mand.setGeometry(QtCore.QRect(500, 20, 47, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.fach_mand.setFont(font) + self.fach_mand.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.fach_mand.setObjectName("fach_mand") + self._mand = QtWidgets.QLabel(parent=self.frame) + self._mand.setGeometry(QtCore.QRect(330, 60, 16, 21)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self._mand.setFont(font) + self._mand.setObjectName("_mand") + self.btn_add_document = QtWidgets.QPushButton(parent=self.frame) + self.btn_add_document.setGeometry(QtCore.QRect(1090, 20, 131, 25)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_add_document.setFont(font) + self.btn_add_document.setObjectName("btn_add_document") + self.btn_open_document = QtWidgets.QPushButton(parent=self.frame) + self.btn_open_document.setGeometry(QtCore.QRect(1090, 60, 131, 25)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.btn_open_document.setFont(font) + self.btn_open_document.setObjectName("btn_open_document") + self.check_file = QtWidgets.QPushButton(parent=self.frame) + self.check_file.setGeometry(QtCore.QRect(1090, 100, 131, 51)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.check_file.setFont(font) + self.check_file.setObjectName("check_file") + self.formLayoutWidget_2 = QtWidgets.QWidget(parent=self.frame) + self.formLayoutWidget_2.setGeometry(QtCore.QRect(550, 70, 202, 80)) + self.formLayoutWidget_2.setObjectName("formLayoutWidget_2") + self.formLayout_3 = QtWidgets.QFormLayout(self.formLayoutWidget_2) + self.formLayout_3.setContentsMargins(0, 0, 0, 0) + self.formLayout_3.setObjectName("formLayout_3") + self.label_12 = QtWidgets.QLabel(parent=self.formLayoutWidget_2) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_12.setFont(font) + self.label_12.setObjectName("label_12") + self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_12) + self.prof_id_adis = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.prof_id_adis.setFont(font) + self.prof_id_adis.setObjectName("prof_id_adis") + self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.prof_id_adis) + self.label_13 = QtWidgets.QLabel(parent=self.formLayoutWidget_2) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_13.setFont(font) + self.label_13.setObjectName("label_13") + self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_13) + self.apparat_id_adis = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2) + self.apparat_id_adis.setObjectName("apparat_id_adis") + self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.apparat_id_adis) + self.check_send_mail = QtWidgets.QCheckBox(parent=self.frame) + self.check_send_mail.setGeometry(QtCore.QRect(450, 120, 91, 17)) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.check_send_mail.setFont(font) + self.check_send_mail.setObjectName("check_send_mail") + self._mand.raise_() + self.drpdwn_prof_title.raise_() + self.label_5.raise_() + self.sem_winter.raise_() + self.label_4.raise_() + self.drpdwn_app_nr.raise_() + self.sem_sommer.raise_() + self.label_3.raise_() + self.label_6.raise_() + self.sem_year.raise_() + self.label_2.raise_() + self.btn_apparat_save.raise_() + self.btn_apparat_apply.raise_() + self.check_eternal_app.raise_() + self.label_8.raise_() + self.label_9.raise_() + self.label_10.raise_() + self.mail_mand.raise_() + self.telnr_mand.raise_() + self.profname_mand.raise_() + self.appname_mand.raise_() + self.fach_mand.raise_() + self.btn_add_document.raise_() + self.btn_open_document.raise_() + self.app_fach.raise_() + self.app_name.raise_() + self.prof_tel_nr.raise_() + self.drpdwn_prof_name.raise_() + self.prof_mail.raise_() + self.check_file.raise_() + self.formLayoutWidget_2.raise_() + self.check_send_mail.raise_() + self.frame.raise_() + self.dokument_list.raise_() + self.gridLayout_2.addWidget(self.app_group_box, 1, 0, 1, 1) + self.tableWidget_apparat_media = QtWidgets.QTableWidget(parent=self.gridLayoutWidget_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.tableWidget_apparat_media.sizePolicy().hasHeightForWidth()) + self.tableWidget_apparat_media.setSizePolicy(sizePolicy) + self.tableWidget_apparat_media.setMinimumSize(QtCore.QSize(1259, 0)) + self.tableWidget_apparat_media.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tableWidget_apparat_media.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu) + self.tableWidget_apparat_media.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) + self.tableWidget_apparat_media.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.tableWidget_apparat_media.setAlternatingRowColors(True) + self.tableWidget_apparat_media.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidget_apparat_media.setObjectName("tableWidget_apparat_media") + self.tableWidget_apparat_media.setColumnCount(7) + self.tableWidget_apparat_media.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(4, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(5, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(6, item) + self.tableWidget_apparat_media.horizontalHeader().setCascadingSectionResizes(True) + self.gridLayout_2.addWidget(self.tableWidget_apparat_media, 9, 0, 1, 1) + self.label = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) + font = QtGui.QFont() + font.setPointSize(11) + font.setBold(True) + font.setWeight(75) + self.label.setFont(font) + self.label.setObjectName("label") + self.gridLayout_2.addWidget(self.label, 2, 0, 1, 1) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") + spacerItem2 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_5.addItem(spacerItem2) + self.chkbx_show_del_media = QtWidgets.QCheckBox(parent=self.gridLayoutWidget_2) + self.chkbx_show_del_media.setObjectName("chkbx_show_del_media") + self.horizontalLayout_5.addWidget(self.chkbx_show_del_media) + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_5.addItem(spacerItem3) + self.add_layout = QtWidgets.QHBoxLayout() + self.add_layout.setObjectName("add_layout") + self.label_info = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) + self.label_info.setObjectName("label_info") + self.add_layout.addWidget(self.label_info) + self.line_2 = QtWidgets.QFrame(parent=self.gridLayoutWidget_2) + self.line_2.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_2.setObjectName("line_2") + self.add_layout.addWidget(self.line_2) + self.progress_label = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) + self.progress_label.setObjectName("progress_label") + self.add_layout.addWidget(self.progress_label) + self.horizontalLayout_5.addLayout(self.add_layout) + spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_5.addItem(spacerItem4) + self.btn_reserve = QtWidgets.QPushButton(parent=self.gridLayoutWidget_2) + self.btn_reserve.setObjectName("btn_reserve") + self.horizontalLayout_5.addWidget(self.btn_reserve) + spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_5.addItem(spacerItem5) + self.gridLayout_2.addLayout(self.horizontalLayout_5, 4, 0, 1, 1) + self.add_medium = QtWidgets.QPushButton(parent=self.tab) + self.add_medium.setGeometry(QtCore.QRect(0, 700, 121, 20)) + self.add_medium.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.add_medium.setObjectName("add_medium") + self.tabWidget.addTab(self.tab, "") + self.tab_2 = QtWidgets.QWidget() + self.tab_2.setObjectName("tab_2") + self.verticalLayoutWidget_2 = QtWidgets.QWidget(parent=self.tab_2) + self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 1251, 721)) + self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2") + self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2) + self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.tabWidget_2 = QtWidgets.QTabWidget(parent=self.verticalLayoutWidget_2) + self.tabWidget_2.setMaximumSize(QtCore.QSize(16777215, 250)) + self.tabWidget_2.setObjectName("tabWidget_2") + self.tab_3 = QtWidgets.QWidget() + self.tab_3.setObjectName("tab_3") + self.btn_search = QtWidgets.QPushButton(parent=self.tab_3) + self.btn_search.setGeometry(QtCore.QRect(10, 180, 75, 23)) + self.btn_search.setObjectName("btn_search") + self.gridLayoutWidget = QtWidgets.QWidget(parent=self.tab_3) + self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 491, 161)) + self.gridLayoutWidget.setObjectName("gridLayoutWidget") + self.gridLayout_3 = QtWidgets.QGridLayout(self.gridLayoutWidget) + self.gridLayout_3.setContentsMargins(0, 0, 0, 0) + self.gridLayout_3.setObjectName("gridLayout_3") + self.label_7 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_7.setObjectName("label_7") + self.gridLayout_3.addWidget(self.label_7, 0, 0, 1, 1) + self.box_erstellsemester = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_erstellsemester.setEditable(True) + self.box_erstellsemester.setObjectName("box_erstellsemester") + self.gridLayout_3.addWidget(self.box_erstellsemester, 1, 3, 1, 1) + self.label_18 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_18.setObjectName("label_18") + self.gridLayout_3.addWidget(self.label_18, 2, 2, 1, 1) + self.label_17 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_17.setObjectName("label_17") + self.gridLayout_3.addWidget(self.label_17, 0, 2, 1, 1) + self.label_19 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_19.setObjectName("label_19") + self.gridLayout_3.addWidget(self.label_19, 1, 2, 1, 1) + self.box_dauerapp = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_dauerapp.setObjectName("box_dauerapp") + self.gridLayout_3.addWidget(self.box_dauerapp, 2, 3, 1, 1) + self.label_11 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_11.setObjectName("label_11") + self.gridLayout_3.addWidget(self.label_11, 1, 0, 1, 1) + self.label_16 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_16.setObjectName("label_16") + self.gridLayout_3.addWidget(self.label_16, 2, 0, 1, 1) + self.box_semester = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_semester.setEditable(True) + self.box_semester.setObjectName("box_semester") + self.gridLayout_3.addWidget(self.box_semester, 0, 3, 1, 1) + self.box_appnrs = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_appnrs.setEditable(True) + self.box_appnrs.setObjectName("box_appnrs") + self.gridLayout_3.addWidget(self.box_appnrs, 0, 1, 1, 1) + self.box_fach = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_fach.setEditable(True) + self.box_fach.setObjectName("box_fach") + self.gridLayout_3.addWidget(self.box_fach, 2, 1, 1, 1) + self.box_person = QtWidgets.QComboBox(parent=self.gridLayoutWidget) + self.box_person.setEditable(True) + self.box_person.setObjectName("box_person") + self.gridLayout_3.addWidget(self.box_person, 1, 1, 1, 1) + spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.gridLayout_3.addItem(spacerItem6, 4, 0, 1, 1) + self.label_15 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_15.setObjectName("label_15") + self.gridLayout_3.addWidget(self.label_15, 3, 0, 1, 1) + self.check_deletable = QtWidgets.QCheckBox(parent=self.gridLayoutWidget) + self.check_deletable.setText("") + self.check_deletable.setObjectName("check_deletable") + self.gridLayout_3.addWidget(self.check_deletable, 3, 1, 1, 1) + self.db_err_message = QtWidgets.QLabel(parent=self.tab_3) + self.db_err_message.setGeometry(QtCore.QRect(100, 180, 401, 23)) + self.db_err_message.setText("") + self.db_err_message.setObjectName("db_err_message") + self.tabWidget_2.addTab(self.tab_3, "") + self.tab_4 = QtWidgets.QWidget() + self.tab_4.setObjectName("tab_4") + self.tabWidget_2.addTab(self.tab_4, "") + self.verticalLayout_3.addWidget(self.tabWidget_2) + self.stackedWidget_4 = QtWidgets.QStackedWidget(parent=self.verticalLayoutWidget_2) + self.stackedWidget_4.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.stackedWidget_4.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.stackedWidget_4.setObjectName("stackedWidget_4") + self.stackedWidget_4Page1 = QtWidgets.QWidget() + self.stackedWidget_4Page1.setObjectName("stackedWidget_4Page1") + self.tabWidget_3 = QtWidgets.QTabWidget(parent=self.stackedWidget_4Page1) + self.tabWidget_3.setGeometry(QtCore.QRect(780, 10, 441, 441)) + self.tabWidget_3.setObjectName("tabWidget_3") + self.tab_6 = QtWidgets.QWidget() + self.tab_6.setObjectName("tab_6") + self.statistics_table = QtWidgets.QTableWidget(parent=self.tab_6) + self.statistics_table.setGeometry(QtCore.QRect(0, 0, 435, 191)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.statistics_table.sizePolicy().hasHeightForWidth()) + self.statistics_table.setSizePolicy(sizePolicy) + self.statistics_table.setMaximumSize(QtCore.QSize(16777215, 191)) + self.statistics_table.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.statistics_table.setAlternatingRowColors(True) + self.statistics_table.setObjectName("statistics_table") + self.statistics_table.setColumnCount(3) + self.statistics_table.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(2, item) + self.statistics_table.horizontalHeader().setCascadingSectionResizes(False) + self.widget_3 = QtWidgets.QWidget(parent=self.tab_6) + self.widget_3.setGeometry(QtCore.QRect(0, 210, 431, 211)) + self.widget_3.setObjectName("widget_3") + self.tabWidget_3.addTab(self.tab_6, "") + self.tab_7 = QtWidgets.QWidget() + self.tab_7.setObjectName("tab_7") + self.tabWidget_3.addTab(self.tab_7, "") + self.widget = QtWidgets.QWidget(parent=self.stackedWidget_4Page1) + self.widget.setGeometry(QtCore.QRect(10, 10, 761, 441)) + self.widget.setObjectName("widget") + self.horizontalLayoutWidget_3 = QtWidgets.QWidget(parent=self.widget) + self.horizontalLayoutWidget_3.setGeometry(QtCore.QRect(0, 0, 761, 51)) + self.horizontalLayoutWidget_3.setObjectName("horizontalLayoutWidget_3") + self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_3) + self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_7.setObjectName("horizontalLayout_7") + self.btn_del_select_apparats = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_3) + self.btn_del_select_apparats.setObjectName("btn_del_select_apparats") + self.horizontalLayout_7.addWidget(self.btn_del_select_apparats) + spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_7.addItem(spacerItem7) + self.table = QtWidgets.QWidget(parent=self.widget) + self.table.setGeometry(QtCore.QRect(0, 50, 761, 391)) + self.table.setObjectName("table") + self.tableWidget = QtWidgets.QTableWidget(parent=self.table) + self.tableWidget.setGeometry(QtCore.QRect(0, 0, 761, 391)) + self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.tableWidget.setObjectName("tableWidget") + self.tableWidget.setColumnCount(5) + self.tableWidget.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(4, item) + self.stackedWidget_4.addWidget(self.stackedWidget_4Page1) + self.verticalLayout_3.addWidget(self.stackedWidget_4) + self.tabWidget.addTab(self.tab_2, "") + self.tab_5 = QtWidgets.QWidget() + self.tab_5.setObjectName("tab_5") + self.tabWidget.addTab(self.tab_5, "") + self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) + self.horizontalLayout.addLayout(self.gridLayout) + self.verticalLayout.addLayout(self.horizontalLayout) + self.horizontalLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget) + self.horizontalLayoutWidget.setGeometry(QtCore.QRect(1280, 360, 311, 391)) + self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") + self.horizontalLayout_6 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) + self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_6.setObjectName("horizontalLayout_6") + self.frame_creation_progress = QtWidgets.QFrame(parent=self.horizontalLayoutWidget) + self.frame_creation_progress.setObjectName("frame_creation_progress") + self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frame_creation_progress) + self.verticalLayout_4.setSpacing(6) + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.groupBox_2 = QtWidgets.QGroupBox(parent=self.frame_creation_progress) + self.groupBox_2.setEnabled(True) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth()) + self.groupBox_2.setSizePolicy(sizePolicy) + self.groupBox_2.setObjectName("groupBox_2") + self.appdata_check = QtWidgets.QCheckBox(parent=self.groupBox_2) + self.appdata_check.setGeometry(QtCore.QRect(20, 30, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.appdata_check.setFont(font) + self.appdata_check.setObjectName("appdata_check") + self.media_check = QtWidgets.QCheckBox(parent=self.groupBox_2) + self.media_check.setGeometry(QtCore.QRect(20, 70, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.media_check.setFont(font) + self.media_check.setObjectName("media_check") + self.ids_check = QtWidgets.QCheckBox(parent=self.groupBox_2) + self.ids_check.setGeometry(QtCore.QRect(20, 140, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.ids_check.setFont(font) + self.ids_check.setObjectName("ids_check") + self.verticalLayout_4.addWidget(self.groupBox_2) + self.groupBox = QtWidgets.QGroupBox(parent=self.frame_creation_progress) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) + self.groupBox.setSizePolicy(sizePolicy) + self.groupBox.setObjectName("groupBox") + self.media_checked = QtWidgets.QCheckBox(parent=self.groupBox) + self.media_checked.setGeometry(QtCore.QRect(20, 30, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setItalic(False) + font.setUnderline(False) + font.setWeight(50) + font.setKerning(True) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) + self.media_checked.setFont(font) + self.media_checked.setObjectName("media_checked") + self.media_edited_check = QtWidgets.QCheckBox(parent=self.groupBox) + self.media_edited_check.setGeometry(QtCore.QRect(20, 70, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setItalic(False) + font.setUnderline(False) + font.setWeight(50) + font.setKerning(True) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) + self.media_edited_check.setFont(font) + self.media_edited_check.setObjectName("media_edited_check") + self.app_created = QtWidgets.QCheckBox(parent=self.groupBox) + self.app_created.setGeometry(QtCore.QRect(20, 110, 161, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setItalic(False) + font.setUnderline(False) + font.setWeight(50) + font.setKerning(True) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) + self.app_created.setFont(font) + self.app_created.setObjectName("app_created") + self.btn_copy_adis_command = QtWidgets.QPushButton(parent=self.groupBox) + self.btn_copy_adis_command.setGeometry(QtCore.QRect(170, 120, 101, 23)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setItalic(False) + font.setUnderline(False) + font.setWeight(50) + font.setKerning(True) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) + self.btn_copy_adis_command.setFont(font) + self.btn_copy_adis_command.setStatusTip("") + self.btn_copy_adis_command.setWhatsThis("") + self.btn_copy_adis_command.setAccessibleDescription("") + self.btn_copy_adis_command.setAutoFillBackground(False) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap("/home/alexander/GitHub/Semesterapparate/ui/sounds/../../../.designer/backup/icons/information.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.btn_copy_adis_command.setIcon(icon) + self.btn_copy_adis_command.setCheckable(False) + self.btn_copy_adis_command.setChecked(False) + self.btn_copy_adis_command.setAutoDefault(False) + self.btn_copy_adis_command.setObjectName("btn_copy_adis_command") + self.verticalLayout_4.addWidget(self.groupBox) + self.horizontalLayout_6.addWidget(self.frame_creation_progress) + self.frame_2 = QtWidgets.QFrame(parent=self.centralwidget) + self.frame_2.setGeometry(QtCore.QRect(1280, 10, 301, 341)) + self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame_2.setObjectName("frame_2") + self.calendarWidget = QtWidgets.QCalendarWidget(parent=self.frame_2) + self.calendarWidget.setGeometry(QtCore.QRect(0, 0, 291, 191)) + self.calendarWidget.setGridVisible(True) + self.calendarWidget.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.VerticalHeaderFormat.NoVerticalHeader) + self.calendarWidget.setObjectName("calendarWidget") + self.message_frame = QtWidgets.QFrame(parent=self.frame_2) + self.message_frame.setGeometry(QtCore.QRect(0, 210, 291, 121)) + self.message_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.message_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.message_frame.setObjectName("message_frame") + self.label_14 = QtWidgets.QLabel(parent=self.message_frame) + self.label_14.setGeometry(QtCore.QRect(10, 10, 47, 20)) + self.label_14.setObjectName("label_14") + self.line_app_info = QtWidgets.QLineEdit(parent=self.message_frame) + self.line_app_info.setEnabled(True) + self.line_app_info.setGeometry(QtCore.QRect(60, 10, 31, 20)) + self.line_app_info.setObjectName("line_app_info") + self.message_box = QtWidgets.QTextEdit(parent=self.message_frame) + self.message_box.setGeometry(QtCore.QRect(10, 40, 271, 71)) + self.message_box.setObjectName("message_box") + self.btn_delete_message = QtWidgets.QPushButton(parent=self.message_frame) + self.btn_delete_message.setGeometry(QtCore.QRect(130, 10, 75, 23)) + self.btn_delete_message.setObjectName("btn_delete_message") + self.spin_select_message = QtWidgets.QSpinBox(parent=self.message_frame) + self.spin_select_message.setGeometry(QtCore.QRect(210, 10, 42, 22)) + self.spin_select_message.setMinimum(1) + self.spin_select_message.setObjectName("spin_select_message") + self.label_total_day_messages = QtWidgets.QLabel(parent=self.message_frame) + self.label_total_day_messages.setGeometry(QtCore.QRect(260, 10, 21, 22)) + self.label_total_day_messages.setObjectName("label_total_day_messages") + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QtWidgets.QMenuBar(parent=MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1593, 21)) + self.menubar.setObjectName("menubar") + self.menuDatei = QtWidgets.QMenu(parent=self.menubar) + self.menuDatei.setObjectName("menuDatei") + self.menuEinstellungen = QtWidgets.QMenu(parent=self.menubar) + self.menuEinstellungen.setObjectName("menuEinstellungen") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + self.actionBeenden = QtGui.QAction(parent=MainWindow) + self.actionBeenden.setShortcutVisibleInContextMenu(True) + self.actionBeenden.setObjectName("actionBeenden") + self.actionEinstellungen = QtGui.QAction(parent=MainWindow) + self.actionEinstellungen.setShortcutVisibleInContextMenu(True) + self.actionEinstellungen.setObjectName("actionEinstellungen") + self.menuDatei.addAction(self.actionBeenden) + self.menuEinstellungen.addAction(self.actionEinstellungen) + self.menubar.addAction(self.menuDatei.menuAction()) + self.menubar.addAction(self.menuEinstellungen.menuAction()) + + self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(1) + self.tabWidget_2.setCurrentIndex(0) + self.tabWidget_3.setCurrentIndex(0) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + MainWindow.setTabOrder(self.drpdwn_app_nr, self.drpdwn_prof_title) + MainWindow.setTabOrder(self.drpdwn_prof_title, self.drpdwn_prof_name) + MainWindow.setTabOrder(self.drpdwn_prof_name, self.prof_mail) + MainWindow.setTabOrder(self.prof_mail, self.prof_tel_nr) + MainWindow.setTabOrder(self.prof_tel_nr, self.app_name) + MainWindow.setTabOrder(self.app_name, self.app_fach) + MainWindow.setTabOrder(self.app_fach, self.sem_winter) + MainWindow.setTabOrder(self.sem_winter, self.sem_sommer) + MainWindow.setTabOrder(self.sem_sommer, self.sem_year) + MainWindow.setTabOrder(self.sem_year, self.check_eternal_app) + MainWindow.setTabOrder(self.check_eternal_app, self.btn_add_document) + MainWindow.setTabOrder(self.btn_add_document, self.btn_open_document) + MainWindow.setTabOrder(self.btn_open_document, self.btn_apparat_save) + MainWindow.setTabOrder(self.btn_apparat_save, self.btn_apparat_apply) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "Semesterapparatsmanagement")) + self.load_app.setToolTip(_translate("MainWindow", "Load the Semesterapparate from the database")) + self.load_app.setText(_translate("MainWindow", "App. aufrufen")) + self.create_new_app.setText(_translate("MainWindow", "neu. App anlegen")) + self.cancel_active_selection.setText(_translate("MainWindow", "Auswahl abbrechen")) + self.tableWidget_apparate.setSortingEnabled(True) + item = self.tableWidget_apparate.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "AppNr")) + item = self.tableWidget_apparate.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "App Name")) + item = self.tableWidget_apparate.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Professor")) + item = self.tableWidget_apparate.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "gültig bis")) + item = self.tableWidget_apparate.horizontalHeaderItem(4) + item.setText(_translate("MainWindow", "Dauerapparat")) + item = self.tableWidget_apparate.horizontalHeaderItem(5) + item.setText(_translate("MainWindow", "KontoNr")) + self.app_group_box.setTitle(_translate("MainWindow", "Apparatsdetails")) + item = self.dokument_list.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Dokumentname")) + item = self.dokument_list.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Dateityp")) + item = self.dokument_list.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Neu?")) + item = self.dokument_list.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "path")) + self.label_5.setText(_translate("MainWindow", "Apparatsname")) + self.sem_winter.setText(_translate("MainWindow", "Winter")) + self.label_4.setText(_translate("MainWindow", "Prof. Name")) + self.sem_sommer.setText(_translate("MainWindow", "Sommer")) + self.label_3.setText(_translate("MainWindow", "Prof. Titel")) + self.label_6.setText(_translate("MainWindow", "Semester")) + self.sem_year.setPlaceholderText(_translate("MainWindow", "2023")) + self.label_2.setText(_translate("MainWindow", "Apparatsnummer")) + self.btn_apparat_save.setText(_translate("MainWindow", "Speichern")) + self.btn_apparat_apply.setText(_translate("MainWindow", "Aktualisieren")) + self.check_eternal_app.setText(_translate("MainWindow", "Dauerapparat")) + self.label_8.setText(_translate("MainWindow", "Mail")) + self.label_9.setText(_translate("MainWindow", "Tel")) + self.label_10.setText(_translate("MainWindow", "Fach")) + self.mail_mand.setText(_translate("MainWindow", "*")) + self.telnr_mand.setText(_translate("MainWindow", "*")) + self.profname_mand.setText(_translate("MainWindow", "*")) + self.appname_mand.setText(_translate("MainWindow", "*")) + self.fach_mand.setText(_translate("MainWindow", "*")) + self._mand.setText(_translate("MainWindow", "*")) + self.btn_add_document.setText(_translate("MainWindow", "Dokument hinzufügen")) + self.btn_open_document.setText(_translate("MainWindow", "Dokument öffnen")) + self.check_file.setToolTip(_translate("MainWindow", "Abhängig von der Anzahl der Medien kann die Suche sehr lange dauern")) + self.check_file.setText(_translate("MainWindow", "Medien aus Dokument\n" +" hinzufügen")) + self.label_12.setText(_translate("MainWindow", "Prof-ID-aDIS")) + self.label_13.setText(_translate("MainWindow", "Apparat-ID-aDIS")) + self.check_send_mail.setText(_translate("MainWindow", "Mail senden")) + self.tableWidget_apparat_media.setSortingEnabled(True) + item = self.tableWidget_apparat_media.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Buchtitel")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Signatur")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Auflage")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Autor")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(4) + item.setText(_translate("MainWindow", "verfügbar?")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(5) + item.setText(_translate("MainWindow", "Vorgemerkt")) + item = self.tableWidget_apparat_media.horizontalHeaderItem(6) + item.setText(_translate("MainWindow", "Link")) + self.label.setText(_translate("MainWindow", " Medienliste")) + self.chkbx_show_del_media.setText(_translate("MainWindow", "gel. Medien anzeigen")) + self.label_info.setText(_translate("MainWindow", "Medien werden hinzugefügt")) + self.progress_label.setText(_translate("MainWindow", "Medium x/y")) + self.btn_reserve.setText(_translate("MainWindow", "Vorgemertk?")) + self.add_medium.setText(_translate("MainWindow", "Medien hinzufügen")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Anlegen")) + self.btn_search.setText(_translate("MainWindow", "Suchen")) + self.label_7.setText(_translate("MainWindow", "Appnr.:")) + self.label_18.setText(_translate("MainWindow", "Dauerapp:")) + self.label_17.setText(_translate("MainWindow", "Endsemester:")) + self.label_19.setText(_translate("MainWindow", "Erstellsemester:")) + self.label_11.setText(_translate("MainWindow", "Person:")) + self.label_16.setText(_translate("MainWindow", "Fach:")) + self.label_15.setText(_translate("MainWindow", "Löschbar")) + self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_3), _translate("MainWindow", "Statistik")) + self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_4), _translate("MainWindow", "Suchen")) + item = self.statistics_table.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Semester")) + item = self.statistics_table.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Zugang")) + item = self.statistics_table.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Abgang")) + self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.tab_6), _translate("MainWindow", "Tabelle")) + self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.tab_7), _translate("MainWindow", "Erstellte und gelöschte Semesterapparate")) + self.btn_del_select_apparats.setText(_translate("MainWindow", "Ausgewählte Löschen")) + item = self.tableWidget.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", " ")) + item = self.tableWidget.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Apparatsname")) + item = self.tableWidget.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Apparatsnummer")) + item = self.tableWidget.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Person")) + item = self.tableWidget.horizontalHeaderItem(4) + item.setText(_translate("MainWindow", "Fach")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Suchen / Statistik")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_5), _translate("MainWindow", "Admin")) + self.groupBox_2.setTitle(_translate("MainWindow", "Software")) + self.appdata_check.setText(_translate("MainWindow", "Apparatsdaten eingegeben")) + self.media_check.setText(_translate("MainWindow", "Medien hinzugefügt / importiert")) + self.ids_check.setText(_translate("MainWindow", "Prof-ID und Apparat-ID eingetragen")) + self.groupBox.setTitle(_translate("MainWindow", "aDIS")) + self.media_checked.setText(_translate("MainWindow", "Medien geprüft")) + self.media_edited_check.setText(_translate("MainWindow", "Medien bearbeitet")) + self.app_created.setText(_translate("MainWindow", "Apparat angelegt")) + self.btn_copy_adis_command.setToolTip(_translate("MainWindow", "Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren")) + self.btn_copy_adis_command.setText(_translate("MainWindow", " aDIS Abfrage")) + self.label_14.setText(_translate("MainWindow", "Apparat")) + self.btn_delete_message.setText(_translate("MainWindow", "Löschen")) + self.label_total_day_messages.setText(_translate("MainWindow", "TextLabel")) + self.menuDatei.setTitle(_translate("MainWindow", "Datei")) + self.menuEinstellungen.setTitle(_translate("MainWindow", "Bearbeiten")) + self.actionBeenden.setText(_translate("MainWindow", "Beenden")) + self.actionBeenden.setShortcut(_translate("MainWindow", "Ctrl+Q")) + self.actionEinstellungen.setText(_translate("MainWindow", "Einstellungen")) + self.actionEinstellungen.setShortcut(_translate("MainWindow", "Alt+S")) diff --git a/src/ui/untitled.ui b/src/ui/untitled.ui new file mode 100644 index 0000000..ee79033 --- /dev/null +++ b/src/ui/untitled.ui @@ -0,0 +1,692 @@ + + + MainWindow + + + + 0 + 0 + 1280 + 720 + + + + + 0 + 0 + + + + MainWindow + + + + + 0 + 0 + + + + + + 0 + 0 + 1271 + 671 + + + + + + + + + + + 0 + + + + + 0 + 0 + + + + Tab 1 + + + + + 0 + 0 + 1261 + 161 + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Load the Semesterapparate from the database + + + App. aufrufen + + + + + + + neu. App anlegen + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + AppNr + + + + + App Name + + + + + Professor + + + + + Dauerapparat + + + + + + + + + + + + + + + + + + 0 + 160 + 1261 + 21 + + + + Qt::Horizontal + + + + + + 0 + 180 + 1261 + 461 + + + + + + + + Buchtitel + + + + + Autor + + + + + Auflage + + + + + Signatur + + + + + + + + + 0 + 0 + + + + + 12 + 75 + true + + + + Apparatsdetails + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + 820 + 20 + 256 + 192 + + + + + Dokumentname + + + + + Typ + + + + + + + 10 + 30 + 731 + 151 + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 110 + 50 + 69 + 22 + + + + + + + 250 + 20 + 91 + 21 + + + + + 9 + 50 + false + + + + Apparatsname + + + + + + 110 + 80 + 121 + 20 + + + + + 9 + 50 + false + + + + Nachname, Vorname + + + + + + 340 + 50 + 82 + 17 + + + + + 9 + 50 + false + + + + Winter + + + + + + 10 + 80 + 71 + 21 + + + + + 9 + 50 + false + + + + Prof. Name + + + + + + 110 + 20 + 69 + 22 + + + + + + + 340 + 20 + 113 + 20 + + + + + + + 340 + 70 + 82 + 17 + + + + + 9 + 50 + false + + + + Sommer + + + + + + 10 + 50 + 61 + 20 + + + + + 9 + 50 + false + + + + Prof. Titel + + + + + + 270 + 60 + 51 + 21 + + + + + 9 + 50 + false + + + + Semester + + + + + + 410 + 60 + 113 + 20 + + + + + 9 + 50 + false + + + + 2023 + + + + + + 10 + 20 + 101 + 21 + + + + + 9 + 50 + false + + + + Apparatsnummer + + + + + + 260 + 120 + 75 + 23 + + + + + 9 + 50 + false + + + + Speichern + + + + + + 350 + 120 + 75 + 23 + + + + + 9 + 50 + false + + + + Aktualisieren + + + + + + 340 + 90 + 101 + 17 + + + + + 9 + 50 + false + + + + Dauerapparat + + + + + + + 1100 + 40 + 131 + 25 + + + + + 9 + 50 + false + + + + Dokument hinzufügen + + + + + + 1100 + 80 + 131 + 25 + + + + + 9 + 50 + false + + + + Dokument öffnen + + + + + + 1110 + 110 + 25 + 19 + + + + ... + + + + + + 20 + 200 + 47 + 21 + + + + + 9 + 50 + false + + + + Suche + + + + + + 80 + 200 + 211 + 20 + + + + + 9 + 50 + false + + + + Buch oder Signatur + + + + + + 0 + 180 + 1259 + 18 + + + + + 11 + 75 + true + + + + Medienliste + + + + + + + + + + Tab 2 + + + + + + + + + + + + + + + 0 + 0 + 1280 + 21 + + + + + Datei + + + + + Einstellungen + + + + + + + + + + diff --git a/src/ui/untitled_ui.py b/src/ui/untitled_ui.py new file mode 100644 index 0000000..7e1b11c --- /dev/null +++ b/src/ui/untitled_ui.py @@ -0,0 +1,476 @@ +# -*- coding: utf-8 -*- + +################################################################################ +# Form generated from reading UI file 'untitled.ui' +## +# Created by: Qt User Interface Compiler version 6.5.2 +## +# WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import ( + QCoreApplication, + QDate, + QDateTime, + QLocale, + QMetaObject, + QObject, + QPoint, + QRect, + QSize, + Qt, + QTime, + QUrl, +) +from PySide6.QtGui import ( + QAction, + QBrush, + QColor, + QConicalGradient, + QCursor, + QFont, + QFontDatabase, + QGradient, + QIcon, + QImage, + QKeySequence, + QLinearGradient, + QPainter, + QPalette, + QPixmap, + QRadialGradient, + QTransform, +) +from PySide6.QtWidgets import ( + QApplication, + QCheckBox, + QComboBox, + QFormLayout, + QFrame, + QGridLayout, + QGroupBox, + QHBoxLayout, + QHeaderView, + QLabel, + QLineEdit, + QMainWindow, + QMenu, + QMenuBar, + QPushButton, + QRadioButton, + QSizePolicy, + QSpacerItem, + QStatusBar, + QTableWidget, + QTableWidgetItem, + QTabWidget, + QToolButton, + QVBoxLayout, + QWidget, +) + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + if not MainWindow.objectName(): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(1280, 720) + sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) + MainWindow.setSizePolicy(sizePolicy) + self.centralwidget = QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + sizePolicy1 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + sizePolicy1.setHorizontalStretch(0) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth( + self.centralwidget.sizePolicy().hasHeightForWidth() + ) + self.centralwidget.setSizePolicy(sizePolicy1) + self.verticalLayoutWidget = QWidget(self.centralwidget) + self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") + self.verticalLayoutWidget.setGeometry(QRect(0, 0, 1271, 671)) + self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setObjectName("verticalLayout") + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout = QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.gridLayout = QGridLayout() + self.gridLayout.setObjectName("gridLayout") + self.tabWidget = QTabWidget(self.verticalLayoutWidget) + self.tabWidget.setObjectName("tabWidget") + self.tab = QWidget() + self.tab.setObjectName("tab") + sizePolicy2 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.tab.sizePolicy().hasHeightForWidth()) + self.tab.setSizePolicy(sizePolicy2) + self.horizontalLayoutWidget_2 = QWidget(self.tab) + self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2") + self.horizontalLayoutWidget_2.setGeometry(QRect(0, 0, 1261, 161)) + self.horizontalLayout_2 = QHBoxLayout(self.horizontalLayoutWidget_2) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.formLayout = QFormLayout() + self.formLayout.setObjectName("formLayout") + self.verticalLayout_2 = QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.verticalSpacer = QSpacerItem( + 20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding + ) + + self.verticalLayout_2.addItem(self.verticalSpacer) + + self.load_app = QPushButton(self.horizontalLayoutWidget_2) + self.load_app.setObjectName("load_app") + + self.verticalLayout_2.addWidget(self.load_app) + + self.create_new_app = QPushButton(self.horizontalLayoutWidget_2) + self.create_new_app.setObjectName("create_new_app") + + self.verticalLayout_2.addWidget(self.create_new_app) + + self.verticalSpacer_2 = QSpacerItem( + 20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding + ) + + self.verticalLayout_2.addItem(self.verticalSpacer_2) + + self.formLayout.setLayout(0, QFormLayout.LabelRole, self.verticalLayout_2) + + self.tableWidget_apparate = QTableWidget(self.horizontalLayoutWidget_2) + if self.tableWidget_apparate.columnCount() < 4: + self.tableWidget_apparate.setColumnCount(4) + __qtablewidgetitem = QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(0, __qtablewidgetitem) + __qtablewidgetitem1 = QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(1, __qtablewidgetitem1) + __qtablewidgetitem2 = QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(2, __qtablewidgetitem2) + __qtablewidgetitem3 = QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(3, __qtablewidgetitem3) + self.tableWidget_apparate.setObjectName("tableWidget_apparate") + + self.formLayout.setWidget(0, QFormLayout.FieldRole, self.tableWidget_apparate) + + self.horizontalLayout_3 = QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + + self.formLayout.setLayout(2, QFormLayout.LabelRole, self.horizontalLayout_3) + + self.horizontalLayout_4 = QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + + self.formLayout.setLayout(1, QFormLayout.FieldRole, self.horizontalLayout_4) + + self.horizontalLayout_2.addLayout(self.formLayout) + + self.line = QFrame(self.tab) + self.line.setObjectName("line") + self.line.setGeometry(QRect(0, 160, 1261, 21)) + self.line.setFrameShape(QFrame.HLine) + self.line.setFrameShadow(QFrame.Sunken) + self.gridLayoutWidget_2 = QWidget(self.tab) + self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2") + self.gridLayoutWidget_2.setGeometry(QRect(0, 180, 1261, 461)) + self.gridLayout_2 = QGridLayout(self.gridLayoutWidget_2) + self.gridLayout_2.setObjectName("gridLayout_2") + self.gridLayout_2.setContentsMargins(0, 0, 0, 0) + self.tableWidget_apparat_media = QTableWidget(self.gridLayoutWidget_2) + if self.tableWidget_apparat_media.columnCount() < 4: + self.tableWidget_apparat_media.setColumnCount(4) + __qtablewidgetitem4 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(0, __qtablewidgetitem4) + __qtablewidgetitem5 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(1, __qtablewidgetitem5) + __qtablewidgetitem6 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(2, __qtablewidgetitem6) + __qtablewidgetitem7 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(3, __qtablewidgetitem7) + self.tableWidget_apparat_media.setObjectName("tableWidget_apparat_media") + + self.gridLayout_2.addWidget(self.tableWidget_apparat_media, 2, 0, 1, 1) + + self.app_group_box = QGroupBox(self.gridLayoutWidget_2) + self.app_group_box.setObjectName("app_group_box") + sizePolicy3 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) + sizePolicy3.setHorizontalStretch(0) + sizePolicy3.setVerticalStretch(0) + sizePolicy3.setHeightForWidth( + self.app_group_box.sizePolicy().hasHeightForWidth() + ) + self.app_group_box.setSizePolicy(sizePolicy3) + font = QFont() + font.setPointSize(12) + font.setBold(True) + self.app_group_box.setFont(font) + self.app_group_box.setAlignment( + Qt.AlignLeading | Qt.AlignLeft | Qt.AlignVCenter + ) + self.app_group_box.setCheckable(False) + self.dokument_list = QTableWidget(self.app_group_box) + if self.dokument_list.columnCount() < 2: + self.dokument_list.setColumnCount(2) + __qtablewidgetitem8 = QTableWidgetItem() + self.dokument_list.setHorizontalHeaderItem(0, __qtablewidgetitem8) + __qtablewidgetitem9 = QTableWidgetItem() + self.dokument_list.setHorizontalHeaderItem(1, __qtablewidgetitem9) + self.dokument_list.setObjectName("dokument_list") + self.dokument_list.setGeometry(QRect(820, 20, 256, 192)) + self.frame = QFrame(self.app_group_box) + self.frame.setObjectName("frame") + self.frame.setGeometry(QRect(10, 30, 731, 151)) + sizePolicy1.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) + self.frame.setSizePolicy(sizePolicy1) + self.frame.setFrameShape(QFrame.StyledPanel) + self.frame.setFrameShadow(QFrame.Raised) + self.drpdwn_prof_title = QComboBox(self.frame) + self.drpdwn_prof_title.setObjectName("drpdwn_prof_title") + self.drpdwn_prof_title.setGeometry(QRect(110, 50, 69, 22)) + self.label_5 = QLabel(self.frame) + self.label_5.setObjectName("label_5") + self.label_5.setGeometry(QRect(250, 20, 91, 21)) + font1 = QFont() + font1.setPointSize(9) + font1.setBold(False) + self.label_5.setFont(font1) + self.lineEdit = QLineEdit(self.frame) + self.lineEdit.setObjectName("lineEdit") + self.lineEdit.setGeometry(QRect(110, 80, 121, 20)) + self.lineEdit.setFont(font1) + self.sem_winter = QRadioButton(self.frame) + self.sem_winter.setObjectName("sem_winter") + self.sem_winter.setGeometry(QRect(340, 50, 82, 17)) + self.sem_winter.setFont(font1) + self.label_4 = QLabel(self.frame) + self.label_4.setObjectName("label_4") + self.label_4.setGeometry(QRect(10, 80, 71, 21)) + self.label_4.setFont(font1) + self.drpdwn_app_nr = QComboBox(self.frame) + self.drpdwn_app_nr.setObjectName("drpdwn_app_nr") + self.drpdwn_app_nr.setGeometry(QRect(110, 20, 69, 22)) + self.app_name = QLineEdit(self.frame) + self.app_name.setObjectName("app_name") + self.app_name.setGeometry(QRect(340, 20, 113, 20)) + self.sem_sommer = QRadioButton(self.frame) + self.sem_sommer.setObjectName("sem_sommer") + self.sem_sommer.setGeometry(QRect(340, 70, 82, 17)) + self.sem_sommer.setFont(font1) + self.label_3 = QLabel(self.frame) + self.label_3.setObjectName("label_3") + self.label_3.setGeometry(QRect(10, 50, 61, 20)) + self.label_3.setFont(font1) + self.label_6 = QLabel(self.frame) + self.label_6.setObjectName("label_6") + self.label_6.setGeometry(QRect(270, 60, 51, 21)) + self.label_6.setFont(font1) + self.sem_year = QLineEdit(self.frame) + self.sem_year.setObjectName("sem_year") + self.sem_year.setGeometry(QRect(410, 60, 113, 20)) + self.sem_year.setFont(font1) + self.label_2 = QLabel(self.frame) + self.label_2.setObjectName("label_2") + self.label_2.setGeometry(QRect(10, 20, 101, 21)) + self.label_2.setFont(font1) + self.btn_apparat_save = QPushButton(self.frame) + self.btn_apparat_save.setObjectName("btn_apparat_save") + self.btn_apparat_save.setGeometry(QRect(260, 120, 75, 23)) + self.btn_apparat_save.setFont(font1) + self.btn_apparat_apply = QPushButton(self.frame) + self.btn_apparat_apply.setObjectName("btn_apparat_apply") + self.btn_apparat_apply.setGeometry(QRect(350, 120, 75, 23)) + self.btn_apparat_apply.setFont(font1) + self.checkBox = QCheckBox(self.frame) + self.checkBox.setObjectName("checkBox") + self.checkBox.setGeometry(QRect(340, 90, 101, 17)) + self.checkBox.setFont(font1) + self.btn_add_document = QPushButton(self.app_group_box) + self.btn_add_document.setObjectName("btn_add_document") + self.btn_add_document.setGeometry(QRect(1100, 40, 131, 25)) + self.btn_add_document.setFont(font1) + self.btn_open_document = QPushButton(self.app_group_box) + self.btn_open_document.setObjectName("btn_open_document") + self.btn_open_document.setGeometry(QRect(1100, 80, 131, 25)) + self.btn_open_document.setFont(font1) + self.toolButton = QToolButton(self.app_group_box) + self.toolButton.setObjectName("toolButton") + self.toolButton.setGeometry(QRect(1110, 110, 25, 19)) + self.label_7 = QLabel(self.app_group_box) + self.label_7.setObjectName("label_7") + self.label_7.setGeometry(QRect(20, 200, 47, 21)) + self.label_7.setFont(font1) + self.lineEdit_2 = QLineEdit(self.app_group_box) + self.lineEdit_2.setObjectName("lineEdit_2") + self.lineEdit_2.setGeometry(QRect(80, 200, 211, 20)) + self.lineEdit_2.setFont(font1) + self.label = QLabel(self.app_group_box) + self.label.setObjectName("label") + self.label.setGeometry(QRect(0, 180, 1259, 18)) + font2 = QFont() + font2.setPointSize(11) + font2.setBold(True) + self.label.setFont(font2) + + self.gridLayout_2.addWidget(self.app_group_box, 1, 0, 1, 1) + + self.tabWidget.addTab(self.tab, "") + self.tab_2 = QWidget() + self.tab_2.setObjectName("tab_2") + self.tabWidget.addTab(self.tab_2, "") + + self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) + + self.horizontalLayout.addLayout(self.gridLayout) + + self.verticalLayout.addLayout(self.horizontalLayout) + + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QMenuBar(MainWindow) + self.menubar.setObjectName("menubar") + self.menubar.setGeometry(QRect(0, 0, 1280, 21)) + self.menuDatei = QMenu(self.menubar) + self.menuDatei.setObjectName("menuDatei") + self.menuEinstellungen = QMenu(self.menubar) + self.menuEinstellungen.setObjectName("menuEinstellungen") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QStatusBar(MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + + self.menubar.addAction(self.menuDatei.menuAction()) + self.menubar.addAction(self.menuEinstellungen.menuAction()) + + self.retranslateUi(MainWindow) + + self.tabWidget.setCurrentIndex(0) + + QMetaObject.connectSlotsByName(MainWindow) + + # setupUi + + def retranslateUi(self, MainWindow): + MainWindow.setWindowTitle( + QCoreApplication.translate("MainWindow", "MainWindow", None) + ) + # if QT_CONFIG(tooltip) + self.load_app.setToolTip( + QCoreApplication.translate( + "MainWindow", "Load the Semesterapparate from the database", None + ) + ) + # endif // QT_CONFIG(tooltip) + self.load_app.setText( + QCoreApplication.translate("MainWindow", "App. aufrufen", None) + ) + self.create_new_app.setText( + QCoreApplication.translate("MainWindow", "neu. App anlegen", None) + ) + ___qtablewidgetitem = self.tableWidget_apparate.horizontalHeaderItem(0) + ___qtablewidgetitem.setText( + QCoreApplication.translate("MainWindow", "AppNr", None) + ) + ___qtablewidgetitem1 = self.tableWidget_apparate.horizontalHeaderItem(1) + ___qtablewidgetitem1.setText( + QCoreApplication.translate("MainWindow", "App Name", None) + ) + ___qtablewidgetitem2 = self.tableWidget_apparate.horizontalHeaderItem(2) + ___qtablewidgetitem2.setText( + QCoreApplication.translate("MainWindow", "Professor", None) + ) + ___qtablewidgetitem3 = self.tableWidget_apparate.horizontalHeaderItem(3) + ___qtablewidgetitem3.setText( + QCoreApplication.translate("MainWindow", "Dauerapparat", None) + ) + ___qtablewidgetitem4 = self.tableWidget_apparat_media.horizontalHeaderItem(0) + ___qtablewidgetitem4.setText( + QCoreApplication.translate("MainWindow", "Buchtitel", None) + ) + ___qtablewidgetitem5 = self.tableWidget_apparat_media.horizontalHeaderItem(1) + ___qtablewidgetitem5.setText( + QCoreApplication.translate("MainWindow", "Autor", None) + ) + ___qtablewidgetitem6 = self.tableWidget_apparat_media.horizontalHeaderItem(2) + ___qtablewidgetitem6.setText( + QCoreApplication.translate("MainWindow", "Auflage", None) + ) + ___qtablewidgetitem7 = self.tableWidget_apparat_media.horizontalHeaderItem(3) + ___qtablewidgetitem7.setText( + QCoreApplication.translate("MainWindow", "Signatur", None) + ) + self.app_group_box.setTitle( + QCoreApplication.translate("MainWindow", "Apparatsdetails", None) + ) + ___qtablewidgetitem8 = self.dokument_list.horizontalHeaderItem(0) + ___qtablewidgetitem8.setText( + QCoreApplication.translate("MainWindow", "Dokumentname", None) + ) + ___qtablewidgetitem9 = self.dokument_list.horizontalHeaderItem(1) + ___qtablewidgetitem9.setText( + QCoreApplication.translate("MainWindow", "Typ", None) + ) + self.label_5.setText( + QCoreApplication.translate("MainWindow", "Apparatsname", None) + ) + self.lineEdit.setPlaceholderText( + QCoreApplication.translate("MainWindow", "Nachname, Vorname", None) + ) + self.sem_winter.setText( + QCoreApplication.translate("MainWindow", "Winter", None) + ) + self.label_4.setText( + QCoreApplication.translate("MainWindow", "Prof. Name", None) + ) + self.sem_sommer.setText( + QCoreApplication.translate("MainWindow", "Sommer", None) + ) + self.label_3.setText( + QCoreApplication.translate("MainWindow", "Prof. Titel", None) + ) + self.label_6.setText(QCoreApplication.translate("MainWindow", "Semester", None)) + self.sem_year.setPlaceholderText( + QCoreApplication.translate("MainWindow", "2023", None) + ) + self.label_2.setText( + QCoreApplication.translate("MainWindow", "Apparatsnummer", None) + ) + self.btn_apparat_save.setText( + QCoreApplication.translate("MainWindow", "Speichern", None) + ) + self.btn_apparat_apply.setText( + QCoreApplication.translate("MainWindow", "Aktualisieren", None) + ) + self.checkBox.setText( + QCoreApplication.translate("MainWindow", "Dauerapparat", None) + ) + self.btn_add_document.setText( + QCoreApplication.translate("MainWindow", "Dokument hinzuf\u00fcgen", None) + ) + self.btn_open_document.setText( + QCoreApplication.translate("MainWindow", "Dokument \u00f6ffnen", None) + ) + self.toolButton.setText(QCoreApplication.translate("MainWindow", "...", None)) + self.label_7.setText(QCoreApplication.translate("MainWindow", "Suche", None)) + self.lineEdit_2.setPlaceholderText( + QCoreApplication.translate("MainWindow", "Buch oder Signatur", None) + ) + self.label.setText( + QCoreApplication.translate("MainWindow", "Medienliste", None) + ) + self.tabWidget.setTabText( + self.tabWidget.indexOf(self.tab), + QCoreApplication.translate("MainWindow", "Tab 1", None), + ) + self.tabWidget.setTabText( + self.tabWidget.indexOf(self.tab_2), + QCoreApplication.translate("MainWindow", "Tab 2", None), + ) + self.menuDatei.setTitle(QCoreApplication.translate("MainWindow", "Datei", None)) + self.menuEinstellungen.setTitle( + QCoreApplication.translate("MainWindow", "Einstellungen", None) + ) + + # retranslateUi diff --git a/src/ui/widgets/Ui_message_widget.py b/src/ui/widgets/Ui_message_widget.py new file mode 100644 index 0000000..b78daac --- /dev/null +++ b/src/ui/widgets/Ui_message_widget.py @@ -0,0 +1,67 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\widgets\message_widget.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + +from src.backend.database import Database + + +class Ui_Form(object): + def setupUi(self, Form): + Form.setObjectName("Form") + Form.resize(295, 110) + self.label = QtWidgets.QLabel(Form) + self.label.setGeometry(QtCore.QRect(10, 0, 47, 21)) + self.label.setObjectName("label") + self.lineEdit = QtWidgets.QLineEdit(Form) + self.lineEdit.setEnabled(True) + self.lineEdit.setGeometry(QtCore.QRect(60, 0, 41, 20)) + self.lineEdit.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.lineEdit.setReadOnly(True) + self.lineEdit.setObjectName("lineEdit") + self.label_2 = QtWidgets.QLabel(Form) + self.label_2.setGeometry(QtCore.QRect(10, 20, 51, 21)) + self.label_2.setObjectName("label_2") + self.textEdit = QtWidgets.QTextEdit(Form) + self.textEdit.setGeometry(QtCore.QRect(10, 40, 281, 66)) + self.textEdit.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.textEdit.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone) + self.textEdit.setReadOnly(True) + self.textEdit.setObjectName("textEdit") + self.pushButton = QtWidgets.QPushButton(Form) + self.pushButton.setGeometry(QtCore.QRect(210, 10, 75, 23)) + self.pushButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.pushButton.setObjectName("pushButton") + self.hidden_id = QtWidgets.QLabel(Form) + self.hidden_id.setGeometry(QtCore.QRect(140, 10, 47, 13)) + self.hidden_id.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.hidden_id.setObjectName("hidden_id") + self.hidden_id.hide() + self.delete = False + self.pushButton.clicked.connect(self.delete_message) + self.retranslateUi(Form) + QtCore.QMetaObject.connectSlotsByName(Form) + Form.setTabOrder(self.lineEdit, self.textEdit) + + def retranslateUi(self, Form): + _translate = QtCore.QCoreApplication.translate + Form.setWindowTitle(_translate("Form", "Form")) + self.label.setText(_translate("Form", "Apparat:")) + self.label_2.setText(_translate("Form", "Nachricht:")) + self.pushButton.setText(_translate("Form", "Löschen")) + self.hidden_id.setText(_translate("Form", "TextLabel")) + + def set_message(self, message: str, apparat: int, app_id: int): + self.textEdit.setText(message) + self.lineEdit.setText(str(apparat) if apparat else "Alle") + self.hidden_id.setText(str(app_id)) + + def delete_message(self): + db = Database() + print("deleting message") + db.delete_message(self.hidden_id.text()) diff --git a/src/ui/widgets/Ui_progress_overview_widget.py b/src/ui/widgets/Ui_progress_overview_widget.py new file mode 100644 index 0000000..a146656 --- /dev/null +++ b/src/ui/widgets/Ui_progress_overview_widget.py @@ -0,0 +1,149 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\widgets\progress_overview_widget.ui' +# +# Created by: PyQt6 UI code generator 6.3.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_Form(object): + def setupUi(self, Form): + Form.setObjectName("Form") + Form.resize(300, 751) + sizePolicy = QtWidgets.QSizePolicy( + QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed + ) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth()) + Form.setSizePolicy(sizePolicy) + Form.setMaximumSize(QtCore.QSize(300, 751)) + self.group_software = QtWidgets.QGroupBox(Form) + self.group_software.setEnabled(True) + self.group_software.setGeometry(QtCore.QRect(10, 10, 281, 211)) + font = QtGui.QFont() + font.setPointSize(10) + font.setBold(True) + font.setWeight(75) + self.group_software.setFont(font) + self.group_software.setStatusTip("") + self.group_software.setFlat(False) + self.group_software.setCheckable(False) + self.group_software.setChecked(False) + self.group_software.setObjectName("group_software") + self.checkBox = QtWidgets.QCheckBox(self.group_software) + self.checkBox.setGeometry(QtCore.QRect(10, 20, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.checkBox.setFont(font) + self.checkBox.setObjectName("checkBox") + self.checkBox_2 = QtWidgets.QCheckBox(self.group_software) + self.checkBox_2.setGeometry(QtCore.QRect(10, 50, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.checkBox_2.setFont(font) + self.checkBox_2.setObjectName("checkBox_2") + self.checkBox_3 = QtWidgets.QCheckBox(self.group_software) + self.checkBox_3.setGeometry(QtCore.QRect(10, 130, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.checkBox_3.setFont(font) + self.checkBox_3.setObjectName("checkBox_3") + self.groupBox_2 = QtWidgets.QGroupBox(Form) + self.groupBox_2.setGeometry(QtCore.QRect(10, 220, 281, 251)) + font = QtGui.QFont() + font.setPointSize(10) + font.setBold(True) + font.setItalic(False) + font.setUnderline(False) + font.setWeight(75) + font.setKerning(True) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) + self.groupBox_2.setFont(font) + self.groupBox_2.setObjectName("groupBox_2") + self.checkBox_4 = QtWidgets.QCheckBox(self.groupBox_2) + self.checkBox_4.setGeometry(QtCore.QRect(10, 20, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.checkBox_4.setFont(font) + self.checkBox_4.setObjectName("checkBox_4") + self.checkBox_5 = QtWidgets.QCheckBox(self.groupBox_2) + self.checkBox_5.setGeometry(QtCore.QRect(10, 50, 241, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.checkBox_5.setFont(font) + self.checkBox_5.setObjectName("checkBox_5") + self.checkBox_6 = QtWidgets.QCheckBox(self.groupBox_2) + self.checkBox_6.setGeometry(QtCore.QRect(10, 80, 161, 41)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.checkBox_6.setFont(font) + self.checkBox_6.setObjectName("checkBox_6") + self.pushButton = QtWidgets.QPushButton(self.groupBox_2) + self.pushButton.setGeometry(QtCore.QRect(160, 90, 101, 23)) + font = QtGui.QFont() + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.pushButton.setFont(font) + self.pushButton.setStatusTip("") + self.pushButton.setWhatsThis("") + self.pushButton.setAccessibleDescription("") + self.pushButton.setAutoFillBackground(False) + icon = QtGui.QIcon() + icon.addPixmap( + QtGui.QPixmap( + "c:\\Users\\aky547\\GitHub\\Semesterapparate\\ui\\widgets\\../icons/information.png" + ), + QtGui.QIcon.Mode.Normal, + QtGui.QIcon.State.Off, + ) + self.pushButton.setIcon(icon) + self.pushButton.setCheckable(False) + self.pushButton.setChecked(False) + self.pushButton.setObjectName("pushButton") + + self.retranslateUi(Form) + QtCore.QMetaObject.connectSlotsByName(Form) + + def retranslateUi(self, Form): + _translate = QtCore.QCoreApplication.translate + Form.setWindowTitle(_translate("Form", "Form")) + self.group_software.setToolTip( + _translate( + "Form", + "Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren", + ) + ) + self.group_software.setTitle(_translate("Form", "Software")) + self.checkBox.setText(_translate("Form", "Apparatsdaten eingegeben")) + self.checkBox_2.setText(_translate("Form", "Medien hinzugefügt / importiert")) + self.checkBox_3.setText( + _translate("Form", "Prof-ID und Apparat-ID eingetragen") + ) + self.groupBox_2.setTitle(_translate("Form", "aDIS")) + self.checkBox_4.setText(_translate("Form", "Medien geprüft")) + self.checkBox_5.setText(_translate("Form", "Medien bearbeitet")) + self.checkBox_6.setText(_translate("Form", "Apparat angelegt")) + self.pushButton.setToolTip( + _translate( + "Form", + "Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren", + ) + ) + self.pushButton.setText(_translate("Form", " aDIS Abfrage")) diff --git a/src/ui/widgets/__init__.py b/src/ui/widgets/__init__.py new file mode 100644 index 0000000..c503c0e --- /dev/null +++ b/src/ui/widgets/__init__.py @@ -0,0 +1,5 @@ +__all__ = ["filepicker"] +from .collapse import StatusWidget +from .filepicker import FilePicker +from .graph import GraphWidget +from .Ui_message_widget import Ui_Form as Message_Widget diff --git a/src/ui/widgets/collapse.py b/src/ui/widgets/collapse.py new file mode 100644 index 0000000..a5fc084 --- /dev/null +++ b/src/ui/widgets/collapse.py @@ -0,0 +1,76 @@ +# import pysignal pyslot +from PyQt6.QtCore import pyqtSignal +from PyQt6.QtWidgets import ( + QApplication, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + QWidget, +) + + +class StatusWidget(QWidget): + person_double_clicked = pyqtSignal(str,str, int) + + def __init__(self, data, header_label: str): + super(StatusWidget, self).__init__() + + self.tree_widget = QTreeWidget() + self.tree_widget.setHeaderLabels([header_label]) + self.populate_tree(data) + self.header = header_label + layout = QVBoxLayout() + layout.addWidget(self.tree_widget) + self.setLayout(layout) + self.tree_widget.itemDoubleClicked.connect(self.on_item_double_clicked) + def on_item_double_clicked(self, item: QTreeWidgetItem, column: int): + parent_depth = 0 + parent = item.parent() + while parent: + parent_depth += 1 + parent = parent.parent() + print(parent_depth) + # Emit the person_double_clicked signal with the name of the person and the parent depth + self.person_double_clicked.emit(self.header,item.text(column), parent_depth) + + def populate_tree(self, data): + if data == {}: + return + + def __listcount(dictlist: dict[dict[str:list]]): + ret = 0 + for _, value in dictlist.items(): + for _, value2 in value.items(): + ret += len(value2) + return ret + + listitems = __listcount(data) + for action, items in data.items(): + action_item = QTreeWidgetItem( + self.tree_widget, [f"{action} ({str(listitems)})"] + ) + for person, entries in items.items(): + person_item = QTreeWidgetItem( + action_item, [f"{person} ({str(len(entries))})"] + ) + for entry in entries: + entry_item = QTreeWidgetItem(person_item, [entry]) + # Make the person entry collapsible + person_item.setExpanded(False) + + # Make the action entry collapsible + action_item.setExpanded(True) + + +if __name__ == "__main__": + import sys + + app = QApplication(sys.argv) + data = {"test": {"test2": ["test3", "test4"]}} + widget = StatusWidget(data, "test") + + widget.show() + #detect emit signal + widget.person_double_clicked.connect(lambda x: print(x)) + + sys.exit(app.exec()) diff --git a/src/ui/widgets/default_apps.py b/src/ui/widgets/default_apps.py new file mode 100644 index 0000000..b3f3a40 --- /dev/null +++ b/src/ui/widgets/default_apps.py @@ -0,0 +1,15 @@ +from PyQt6 import QtCore, QtGui, QtWidgets + + +class CollapsibleWidget(object): + pass + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class CollapsibleWidget(object): +from PyQt6 import QtCore, QtGui, QtWidgets + + +class CollapsibleWidget(object): diff --git a/src/ui/widgets/filepicker.py b/src/ui/widgets/filepicker.py new file mode 100644 index 0000000..7934787 --- /dev/null +++ b/src/ui/widgets/filepicker.py @@ -0,0 +1,29 @@ +from PyQt6.QtWidgets import QFileDialog, QApplication +from PyQt6.QtCore import QSettings +import sys + +class FilePicker: + def __init__(self): + self.settings = QSettings("PH-Freiburg", "SAP") + self.last_path = self.settings.value("last_path", "/") + self.multi_select = True + + def pick_files(self): + filepicker = QFileDialog() + filepicker.setFileMode(QFileDialog.FileMode.ExistingFiles) + filepicker.setDirectory(self.last_path) + filepicker.setOption(QFileDialog.Option.DontUseNativeDialog, True) + #enable multi select + filepicker.setOption(QFileDialog.Option.DontUseCustomDirectoryIcons, True) + + files, _ = filepicker.getOpenFileNames(caption='Open file', directory=self.last_path) + if files: + self.last_path = files[0] + self.settings.setValue("last_path", self.last_path) + return files + +if __name__ == '__main__': + app = QApplication(sys.argv) + picker = FilePicker() + files = picker.pick_files() + print(files) \ No newline at end of file diff --git a/src/ui/widgets/graph.py b/src/ui/widgets/graph.py new file mode 100644 index 0000000..75cc60c --- /dev/null +++ b/src/ui/widgets/graph.py @@ -0,0 +1,49 @@ +import matplotlib + +matplotlib.use("QtAgg") + +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas +from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar +from matplotlib.figure import Figure +from PyQt6 import QtCore, QtWidgets + + +class graph(FigureCanvas): + def __init__(self, parent=None, width=5, height=4, dpi=100): + fig = Figure(figsize=(width, height), dpi=dpi) + self.axes = fig.add_subplot(111) + self.canvas = FigureCanvas(fig) + super().__init__(fig) + + +# display graph with multiple lines +class GraphWidget(QtWidgets.QWidget): + def __init__(self, parent=None, data=None, legend_labels=None): + super().__init__() + self.graph = graph(self, width=7, height=4.5, dpi=100) + self.graph.axes.plot(data["x"], data["y"], "r", data["x"], data["y2"], "b") + self.toolbar = NavigationToolbar(self.graph, self) + # set legend + self.graph.axes.legend(legend_labels, loc="upper left") + # set the layout + layout = QtWidgets.QVBoxLayout() + layout.addWidget(self.toolbar) + layout.addWidget(self.graph) + self.setLayout(layout) + + # def set_area(self, top=1, bottom= 0.07, left=0.1, right=0.994,hspace=0.2,wspace=0.2): + # self.graph. + + +if __name__ == "__main__": + import sys + + app = QtWidgets.QApplication(sys.argv) + data = { + "x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "y": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "y2": [10, 9, 8, 7, 6, 5, 4, 3, 2, 1], + } + widget = GraphWidget(data=data, legend_labels=["+", "-"]) + widget.show() + sys.exit(app.exec()) diff --git a/src/ui/widgets/message_widget.ui b/src/ui/widgets/message_widget.ui new file mode 100644 index 0000000..c368b5c --- /dev/null +++ b/src/ui/widgets/message_widget.ui @@ -0,0 +1,119 @@ + + + Form + + + + 0 + 0 + 295 + 110 + + + + Form + + + + + 10 + 0 + 47 + 21 + + + + Apparat: + + + + + true + + + + 60 + 0 + 41 + 20 + + + + Qt::NoFocus + + + true + + + + + + 10 + 20 + 51 + 21 + + + + Nachricht: + + + + + + 10 + 40 + 281 + 66 + + + + Qt::NoFocus + + + Qt::ImhNone + + + true + + + + + + 210 + 10 + 75 + 23 + + + + Qt::NoFocus + + + Löschen + + + + + + 140 + 10 + 47 + 13 + + + + Qt::NoFocus + + + TextLabel + + + + + lineEdit + textEdit + + + + diff --git a/src/ui/widgets/progress_overview_widget.ui b/src/ui/widgets/progress_overview_widget.ui new file mode 100644 index 0000000..ee5ab84 --- /dev/null +++ b/src/ui/widgets/progress_overview_widget.ui @@ -0,0 +1,258 @@ + + + Form + + + + 0 + 0 + 300 + 751 + + + + + 0 + 0 + + + + + 300 + 751 + + + + Form + + + + true + + + + 10 + 10 + 281 + 211 + + + + + 10 + 75 + true + + + + Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren + + + + + + Software + + + false + + + false + + + false + + + + + 10 + 20 + 241 + 41 + + + + + 8 + 50 + false + + + + Apparatsdaten eingegeben + + + + + + 10 + 50 + 241 + 41 + + + + + 8 + 50 + false + + + + Medien hinzugefügt / importiert + + + + + + 10 + 130 + 241 + 41 + + + + + 8 + 50 + false + + + + Prof-ID und Apparat-ID eingetragen + + + + + + + 10 + 220 + 281 + 251 + + + + + 10 + 75 + false + true + false + PreferDefault + true + + + + aDIS + + + + + 10 + 20 + 241 + 41 + + + + + 8 + 50 + false + + + + Medien geprüft + + + + + + 10 + 50 + 241 + 41 + + + + + 8 + 50 + false + + + + Medien bearbeitet + + + + + + 10 + 80 + 161 + 41 + + + + + 8 + 50 + false + + + + Apparat angelegt + + + + + + 160 + 90 + 101 + 23 + + + + + 8 + 50 + false + + + + Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren + + + + + + + + + + + + false + + + aDIS Abfrage + + + + ../icons/information.png../icons/information.png + + + false + + + false + + + + + + + diff --git a/src/ui/widgets/progress_widget.py b/src/ui/widgets/progress_widget.py new file mode 100644 index 0000000..df14ab8 --- /dev/null +++ b/src/ui/widgets/progress_widget.py @@ -0,0 +1,16 @@ +from PyQt6 import QtCore, QtGui, QtWidgets +from Ui_progress_overview_widget import Ui_Form + + +class Progress_view(Ui_Form): + def __init__(self, MainWindow): + super().__init__() + self.setupUi(MainWindow) + self.retranslateUi(MainWindow) + self.checkBox_3.setDisabled(True) + self.pushButton.clicked.connect(self.pushButton_clicked) + + def pushButton_clicked(self): + # copies text to clipboard + clipboard = QtWidgets.QApplication.clipboard() + clipboard.setText("") diff --git a/test.py b/test.py new file mode 100644 index 0000000..e691e9e --- /dev/null +++ b/test.py @@ -0,0 +1,135 @@ +# # # # tupl = (0, 0, 0, 0, 0, 0) + + +# # # # def change_value(index: int, state: int): +# # # # global tupl +# # # # tupl = list(tupl) +# # # # print(len(tupl)) +# # # # tupl[index] = state +# # # # tupl = tuple(tupl) + + +# # # # def check_validity() -> bool: +# # # # global tupl +# # # # if all(tupl): +# # # # return True +# # # # else: +# # # # return False + + +# # # # print(tupl) +# # # # print(check_validity()) +# # # # change_value(0, 1) +# # # # for i in range(1, 6): +# # # # change_value(i, 1) +# # # # print(tupl) +# # # # print(check_validity()) +# # # import sqlite3 +# # # from codebase import Database +# # # # print(messages) + +# # # def day_to_message(messages:list[dict[str]]): +# # # print(messages) +# # # ret = [] +# # # #extract the remind_at from each message and add them to ret. If the key already exists, append the message to the list +# # # for message in messages: +# # # print(message) +# # # remind_at = message["remind_at"] +# # # if remind_at in ret: +# # # ret[remind_at].append(message) +# # # else: +# # # ret[remind_at] = [message] +# # # print(ret) +# # # if __name__ =="__man__": +# # # db = Database() + +# # # messages = db.get_messages() +# # # print(messages) +# # # print(day_to_message(messages)) + + +# # from natsort import natsorted + +# # unsorted = ["WiSe 23/24", "SoSe 23", "WiSe 21/22", "SoSe 21", "WiSe 22/23", "SoSe 22"] + +# # def custom_sort(unsorted:list[str])->list[str]: +# # """Sort a list of semesters in the format "SoSe n" and "WiSe n/n+1" in the correct order. +# # Where n == year in 2 digit format + +# # Args: +# # unsorted (list[str]): List of semesters in the format "SoSe n" and "WiSe n/n+1" + +# # Returns: +# # ret (list[str]): Sorted list in correct order +# # """ +# # #split the list into two lists, one with the summer semesters and one with the winter semesters +# # summer = natsorted([ i for i in unsorted if "SoSe" in i]) +# # winter = natsorted([i for i in unsorted if "WiSe" in i]) +# # #merge the lists entries alternately +# # ret = [] +# # for i in range(len(summer)): +# # ret.append(summer[i]) +# # ret.append(winter[i]) +# # return ret +# from typing import Any + +# def statistic_request(**kwargs:Any): + + +# 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']}')" +# return 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) +# query += f"{key}='{value}' AND " +# 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(f"deletesemester='{kwargs['deletesemester']}' AND ", "") +# if "endsemester" in kwargs.keys(): +# if "erstellsemester" in kwargs.keys(): +# query = query.replace(f"endsemester='{kwargs['endsemester']}' AND ", "") +# query = query.replace(f"erstellsemester='{kwargs['erstellsemester']} AND ", "xyz") +# else: +# query = query.replace(f"endsemester='{kwargs['endsemester']}' AND ", "xyz") +# print("replaced") +# query = query.replace("xyz", f"(erstellsemester='{kwargs['endsemester']}' OR verlängerung_bis='{kwargs['endsemester']}') AND ") + +# query = query[:-5].strip() +# return query +# from threads import AutoAdder +# from PyQt6 import QtWidgets +# from ui import parsed_titles_ui +# import sys +# def main(data): +# app = QtWidgets.QApplication(sys.argv) +# dialog = QtWidgets.QDialog() +# ui = parsed_titles_ui() +# ui.setupUi(dialog) +# ui.signatures = data +# ui.app_id = 3 +# ui.prof_id = 1 +# ui.toolButton.click() +# ui.populate_table() +# ui.progressBar.setMaximum(len(data)) +# ui.progressBar.setValue(0) + +# dialog.show() +# sys.exit(app.exec()) + +# if __name__ == "__main__": +# data = ['YH 6876 S344', 'YM 3500 L925', 'CU 3200 W862', 'CW 6940 W842', 'CZ 1360 M379', 'CU 3800 V445', 'CU 3100 L948', 'CU 3200 H379 (3)', 'YC 7093 K95', 'CU 8590 E34 (2)', 'MS 6410 L744 (2)+1', 'CUS778', 'Psy K 120: 125 b', 'Psy L 170: 66', 'MR 2600 M474 (12)+16', 'Psy K 760: 19', 'Psy K 110: 92', 'Psy K 400: 45 a', 'CD 20/10,6'] +# main(data) + +from src.backend.database import Database +import pickle +db = Database() + +query="SELECT * from media where id=1" +_data = db.database.execute(query).fetchall() +var = _data[0][1] +print(pickle.loads(var)) \ No newline at end of file diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/database_test.py b/test/database_test.py new file mode 100644 index 0000000..6be0a02 --- /dev/null +++ b/test/database_test.py @@ -0,0 +1,22 @@ +from src.backend.database import Database +import pickle +def test_connection(): + db=Database() + assert db.database is not None + +def test_insert(): + db=Database() + assert db.database is not None + db.create_user("test_account", "test", "test", "test") + curr_users = db.get_users() + curr_users = [x[2] for x in curr_users] + assert "test_account" in curr_users + db.delete_user("test_account") + curr_users = db.get_users() + curr_users = [x[2] for x in curr_users] + assert "test_account" not in curr_users + +def test_pickle_bookdata(): + db=Database() + assert db.database is not None + \ No newline at end of file diff --git a/test/many_webrequest_test.py b/test/many_webrequest_test.py new file mode 100644 index 0000000..d9445d4 --- /dev/null +++ b/test/many_webrequest_test.py @@ -0,0 +1,10 @@ +from test.webrequest_test import test_webdata_bibtexttransform + + +def many_test_webdata(): + test_webdata_bibtexttransform("RIS") + test_webdata_bibtexttransform("BibTeX") + test_webdata_bibtexttransform("COinS") + test_webdata_bibtexttransform("ARRAY") + test_webdata_bibtexttransform("RDS") + assert True is True \ No newline at end of file diff --git a/test/webrequest_test.py b/test/webrequest_test.py new file mode 100644 index 0000000..1924a00 --- /dev/null +++ b/test/webrequest_test.py @@ -0,0 +1,23 @@ +import pytest +from src.logic.webrequest import WebRequest +from src.logic.webrequest import BibTextTransformer +from src.logic.dataclass import BookData + +def test_webdata_bibtexttransform(source_data:str="RIS"): + request = WebRequest().get_ppn("ST 250 U42 (15) ").get_data() + assert isinstance(request, list) is True + assert len(request)>0 + model:BookData = BibTextTransformer(source_data).get_data(request).return_data() + assert model is not None + assert model.signature =="ST 250 U42 (15)" + assert model.ppn == "1693321114" + assert model.author == "Ullenboom, Christian" + assert model.link == "https://rds.ibs-bw.de/phfreiburg/link?kid=1693321114" + assert model.pages=="1246" + assert model.publisher=="Rheinwerk Computing" + + + + + + \ No newline at end of file