From 0a9818940ccae6ba82b8f548c5b58aad87096229 Mon Sep 17 00:00:00 2001 From: WorldTeacher <41587052+WorldTeacher@users.noreply.github.com> Date: Fri, 26 Jan 2024 08:28:01 +0100 Subject: [PATCH] add files --- .trunk/configs/ruff.toml | 17 + .trunk/trunk.yaml | 1 + __main__.py | 0 database_testing.py | 19 + db_testing.py | 46 + log.py | 65 + sap.db | Bin 0 -> 647168 bytes src/__init__.py | 0 src/backend/__init__.py | 0 src/backend/admin_console.py | 52 + src/backend/database.py | 748 +++++ src/backend/db.py | 130 + src/backend/pickles.py | 9 + src/backend/settings.py | 26 + src/logic/__init__.py | 0 src/logic/c_sort.py | 59 + src/logic/constants.py | 221 ++ src/logic/csvparser.py | 27 + src/logic/dataclass.py | 76 + src/logic/fileparser.py | 45 + src/logic/get_msword_content.py | 31 + src/logic/get_pdf_content.py | 11 + src/logic/mail.py | 0 src/logic/pdfparser.py | 30 + src/logic/settings.py | 20 + src/logic/threads.py | 195 ++ src/logic/userInterface.py | 1974 +++++++++++ src/logic/webrequest.py | 176 + src/logic/wordparser.py | 26 + src/transformers/__init__.py | 1 + src/transformers/transformers.py | 310 ++ src/ui/Ui_plotdata.py | 47 + src/ui/Ui_semesterapparat_ui.py | 1445 +++++++++ src/ui/Ui_semesterapparat_ui.ts | 232 ++ src/ui/Ui_setupwizard.py | 71 + src/ui/__init__.py | 29 + src/ui/dialogs/Ui_edit_bookdata.py | 157 + src/ui/dialogs/Ui_fileparser.py | 109 + src/ui/dialogs/Ui_login.py | 113 + src/ui/dialogs/Ui_medianadder.py | 240 ++ src/ui/dialogs/Ui_medianadder.ts | 4 + src/ui/dialogs/Ui_new_subject.py | 63 + src/ui/dialogs/Ui_parsed_titles.py | 158 + src/ui/dialogs/Ui_reminder.py | 52 + src/ui/dialogs/Ui_settings.py | 202 ++ src/ui/dialogs/Ui_settings.ts | 4 + src/ui/dialogs/__init__.py | 24 + src/ui/dialogs/add_media.ui | 90 + src/ui/dialogs/app_ext.py | 114 + src/ui/dialogs/app_status.ui | 19 + src/ui/dialogs/apparat_extend.ui | 191 ++ src/ui/dialogs/apparat_extend_ui.py | 83 + src/ui/dialogs/confirm_extend.ui | 78 + src/ui/dialogs/confirm_extend_ui.py | 45 + src/ui/dialogs/edit_bookdata.ui | 216 ++ src/ui/dialogs/ext_app.py | 51 + src/ui/dialogs/extend_apparat.ui | 81 + src/ui/dialogs/fileparser.ui | 129 + src/ui/dialogs/login.ui | 120 + src/ui/dialogs/mail.py | 69 + src/ui/dialogs/mail_preview.py | 81 + src/ui/dialogs/mail_preview.ui | 133 + src/ui/dialogs/medianadder.ui | 557 ++++ src/ui/dialogs/medianadder_ui.ts | 47 + src/ui/dialogs/medienadder.py | 82 + src/ui/dialogs/new_subject.ui | 132 + src/ui/dialogs/new_subject_ui.py | 59 + src/ui/dialogs/parsed_titles.ui | 163 + src/ui/dialogs/parsed_titles_ui.py | 81 + src/ui/dialogs/popup_confirm.py | 48 + src/ui/dialogs/reminder.ui | 114 + src/ui/dialogs/resources.qrc | 0 src/ui/dialogs/settings.py | 48 + src/ui/dialogs/settings.ui | 308 ++ src/ui/extensions/__init__.py | 0 src/ui/icons/critical.png | Bin 0 -> 252 bytes src/ui/icons/information.png | Bin 0 -> 245 bytes src/ui/icons/logo_SAP.ico | Bin 0 -> 128503 bytes src/ui/icons/logo_SAP.png | Bin 0 -> 279654 bytes src/ui/icons/question.png | Bin 0 -> 252 bytes src/ui/icons/warning.png | Bin 0 -> 222 bytes src/ui/mainwindow.py | 360 ++ src/ui/plotdata.ui | 64 + src/ui/plotdata_ui.py | 47 + src/ui/resources.qrc | 14 + src/ui/sap.py | 512 +++ src/ui/semesterapparat_ui.ts | 234 ++ src/ui/semesterapparat_ui.ui | 2890 +++++++++++++++++ src/ui/semesterapparat_ui_ui.py | 1437 ++++++++ src/ui/setupwizard.ui | 149 + src/ui/setupwizard_ui.py | 90 + src/ui/sounds/semesterapparat_ui.ui | 2146 ++++++++++++ src/ui/sounds/semesterapparat_ui_ui.py | 1075 ++++++ src/ui/untitled.ui | 692 ++++ src/ui/untitled_ui.py | 476 +++ src/ui/widgets/Ui_message_widget.py | 67 + src/ui/widgets/Ui_progress_overview_widget.py | 149 + src/ui/widgets/__init__.py | 5 + src/ui/widgets/collapse.py | 76 + src/ui/widgets/default_apps.py | 15 + src/ui/widgets/filepicker.py | 29 + src/ui/widgets/graph.py | 49 + src/ui/widgets/message_widget.ui | 119 + src/ui/widgets/progress_overview_widget.ui | 258 ++ src/ui/widgets/progress_widget.py | 16 + test.py | 135 + test/__init__.py | 0 test/database_test.py | 22 + test/many_webrequest_test.py | 10 + test/webrequest_test.py | 23 + 110 files changed, 21563 insertions(+) create mode 100644 __main__.py create mode 100644 database_testing.py create mode 100644 db_testing.py create mode 100644 log.py create mode 100644 sap.db create mode 100644 src/__init__.py create mode 100644 src/backend/__init__.py create mode 100644 src/backend/admin_console.py create mode 100644 src/backend/database.py create mode 100644 src/backend/db.py create mode 100644 src/backend/pickles.py create mode 100644 src/backend/settings.py create mode 100644 src/logic/__init__.py create mode 100644 src/logic/c_sort.py create mode 100644 src/logic/constants.py create mode 100644 src/logic/csvparser.py create mode 100644 src/logic/dataclass.py create mode 100644 src/logic/fileparser.py create mode 100644 src/logic/get_msword_content.py create mode 100644 src/logic/get_pdf_content.py create mode 100644 src/logic/mail.py create mode 100644 src/logic/pdfparser.py create mode 100644 src/logic/settings.py create mode 100644 src/logic/threads.py create mode 100644 src/logic/userInterface.py create mode 100644 src/logic/webrequest.py create mode 100644 src/logic/wordparser.py create mode 100644 src/transformers/__init__.py create mode 100644 src/transformers/transformers.py create mode 100644 src/ui/Ui_plotdata.py create mode 100644 src/ui/Ui_semesterapparat_ui.py create mode 100644 src/ui/Ui_semesterapparat_ui.ts create mode 100644 src/ui/Ui_setupwizard.py create mode 100644 src/ui/__init__.py create mode 100644 src/ui/dialogs/Ui_edit_bookdata.py create mode 100644 src/ui/dialogs/Ui_fileparser.py create mode 100644 src/ui/dialogs/Ui_login.py create mode 100644 src/ui/dialogs/Ui_medianadder.py create mode 100644 src/ui/dialogs/Ui_medianadder.ts create mode 100644 src/ui/dialogs/Ui_new_subject.py create mode 100644 src/ui/dialogs/Ui_parsed_titles.py create mode 100644 src/ui/dialogs/Ui_reminder.py create mode 100644 src/ui/dialogs/Ui_settings.py create mode 100644 src/ui/dialogs/Ui_settings.ts create mode 100644 src/ui/dialogs/__init__.py create mode 100644 src/ui/dialogs/add_media.ui create mode 100644 src/ui/dialogs/app_ext.py create mode 100644 src/ui/dialogs/app_status.ui create mode 100644 src/ui/dialogs/apparat_extend.ui create mode 100644 src/ui/dialogs/apparat_extend_ui.py create mode 100644 src/ui/dialogs/confirm_extend.ui create mode 100644 src/ui/dialogs/confirm_extend_ui.py create mode 100644 src/ui/dialogs/edit_bookdata.ui create mode 100644 src/ui/dialogs/ext_app.py create mode 100644 src/ui/dialogs/extend_apparat.ui create mode 100644 src/ui/dialogs/fileparser.ui create mode 100644 src/ui/dialogs/login.ui create mode 100644 src/ui/dialogs/mail.py create mode 100644 src/ui/dialogs/mail_preview.py create mode 100644 src/ui/dialogs/mail_preview.ui create mode 100644 src/ui/dialogs/medianadder.ui create mode 100644 src/ui/dialogs/medianadder_ui.ts create mode 100644 src/ui/dialogs/medienadder.py create mode 100644 src/ui/dialogs/new_subject.ui create mode 100644 src/ui/dialogs/new_subject_ui.py create mode 100644 src/ui/dialogs/parsed_titles.ui create mode 100644 src/ui/dialogs/parsed_titles_ui.py create mode 100644 src/ui/dialogs/popup_confirm.py create mode 100644 src/ui/dialogs/reminder.ui create mode 100644 src/ui/dialogs/resources.qrc create mode 100644 src/ui/dialogs/settings.py create mode 100644 src/ui/dialogs/settings.ui create mode 100644 src/ui/extensions/__init__.py create mode 100644 src/ui/icons/critical.png create mode 100644 src/ui/icons/information.png create mode 100644 src/ui/icons/logo_SAP.ico create mode 100644 src/ui/icons/logo_SAP.png create mode 100644 src/ui/icons/question.png create mode 100644 src/ui/icons/warning.png create mode 100644 src/ui/mainwindow.py create mode 100644 src/ui/plotdata.ui create mode 100644 src/ui/plotdata_ui.py create mode 100644 src/ui/resources.qrc create mode 100644 src/ui/sap.py create mode 100644 src/ui/semesterapparat_ui.ts create mode 100644 src/ui/semesterapparat_ui.ui create mode 100644 src/ui/semesterapparat_ui_ui.py create mode 100644 src/ui/setupwizard.ui create mode 100644 src/ui/setupwizard_ui.py create mode 100644 src/ui/sounds/semesterapparat_ui.ui create mode 100644 src/ui/sounds/semesterapparat_ui_ui.py create mode 100644 src/ui/untitled.ui create mode 100644 src/ui/untitled_ui.py create mode 100644 src/ui/widgets/Ui_message_widget.py create mode 100644 src/ui/widgets/Ui_progress_overview_widget.py create mode 100644 src/ui/widgets/__init__.py create mode 100644 src/ui/widgets/collapse.py create mode 100644 src/ui/widgets/default_apps.py create mode 100644 src/ui/widgets/filepicker.py create mode 100644 src/ui/widgets/graph.py create mode 100644 src/ui/widgets/message_widget.ui create mode 100644 src/ui/widgets/progress_overview_widget.ui create mode 100644 src/ui/widgets/progress_widget.py create mode 100644 test.py create mode 100644 test/__init__.py create mode 100644 test/database_test.py create mode 100644 test/many_webrequest_test.py create mode 100644 test/webrequest_test.py 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 0000000000000000000000000000000000000000..54d1ca278c347e2362018278091ef5439dfd896d GIT binary patch literal 647168 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

yQVL1zwN`DuCB)g%@*M}`h%yKS2 zPshym4qpq--u2m=Zka&w@y05G8YMvzbkp@xyfHcsMTistS|g}mmu^Xp5(2?chpN4& zr$=3fyuaJ~ox2O-Xi@L6T9A;Olu$eB2(elC&bNH1w5Y@+Wnp2G>K|E~D3@LY`IDGM zS|L;-?p7pqOGyx8Zf-P6q^zR)fkJ%A>>hAa$r5C2S>~oHYyTS_KHVB;QB~y zr6ATqX5^eY+>*sc+=H}%XN0jHE;hmfAyrbOqQtC~?P3>!oq0Uwe24pn_i z(B;5bgb_rnW&F-0Bfmt?8@oY?h_uO=ip8Ep2@chKEd#M3F7jc96x_aImAY%)obD`%FcplNDL8>CryRI+7Jx1cld0hk|;yxe^pFcXg<77eU!?9i+AR zstOw$wn<9E6vw*R?#H>JO~8vd8|f&Rw3Hqm~DM<+IGtT~Kuusp(=F-$n=j$O5Y05uGC$L4ry2`IFFJ zFRtKHlY=azq^n(iAW)Wtf<_{T{FelNNk+a|td;ZfNtEU)^EZp-l~TPXz1&pQUU})# z>ml&R=dNPGrBhSmW0};siPSS3QU`u#kwdo+t!DsVeu92Z73LL>R~C^Hlr=Q*+T1gX zAQw3>Rb|SR&<&m|ly)K;yuZpjdV{=9dN@loN?%va+l@Quyag+T`S{?Arz=!9K?wMn zD>MvM>Qyq4P-zu!gTBOjZQ@snsP%S3bc|oBV!GM;*x0ee(mh-&By#oOgJI|xv1AcQ z-tp^{Mc3Ciq{wnN(S`d8UOP|bdgC@b|53a1Q;Bw-eIFerBJJd^*NsDOv#~gxk`$3> zy*u*Gd5N{L?z`Q_>WvhdlY(w~F@aO5of^ufpDlM&M2U+ur?gMdA zf&_bWrBP>VU$k3$E&kTZT<{EovizBEjK3bVq={P7qoi@;tx zex(9?vJ$W9TPr)yYrX%K(M=A^BCYHH|FmnM-uHhW{ZP-ZA9=C+j}N_k;1Bn|-1Vp5 z5AJVA&(K_JcB3_J*kksPmMxD@a(lU1wpXTZQ!0 zhaL(iI=C^Zz4kEBF}+B8H}5tN0zqW{FC>9rl!~Vjx>+0q58cc!Q#>u*{8F&FbD*g6 zJ2U5=qTSw)sJ;U0fQ>+h>-$_7g6cw*JColGtQD!iWq=XGug}*R39x%pg^ib_y16zr zw?<&8Z0>I!VDmegWRN3JJTg3-<$bKqNnNeU!((b!5ztb|G#QDCYZXFIR0!?&$in^a$%W|7hM0-9ze|OhLV~B(n zfvC&4S!?bGg{X?+b4f%1>JR$A{SLLk$(1^$%5Lm&k(^F<-93QYb>Cu?G_pm3PQvK4 z(^G;P@*v0%`rSLt;|V}Z1gKeQ?ql1d#=x5iwmmyBnx-R0QBs=#&|vGx_cn*!)C^?; zGcVC$_a30lw&SbFyc)gjvhWYPtPuu2MCr&P2y@1ny&m|TDi~%|4)?A2`%&G0^R;Fd zTOLsapO3%g5_F?ljUj__r`D?T7#`_c%(C)Oy^FE`8Xt(bK zpX>SwxO3peSre&9?wO}2xUIv^^+s^ykQnlhdY9YW|bC6XoY&08>~cby_1 zOR!@W8DC2c!UU~4n&ud7&mij^>H`9akzPOxYIhobV(ZxMZ+xZ0+gXLE$u;NvBA$nc z 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 z�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 C122sL literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cc65ce904abeb9bfa472d0e9fa66a841eb663158 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^*Hqo~|NsBboH_G91H-&+ znva3vj3q&S!3+-1ZlnP@^E_P~Ln?0h_HE=nWFX+W-^uf!T!4YoGK-~OG`?wQD(eeQ z^WaT&k=NW*U{|iF{&Cgv-}m=17d&FO*8RzlbKw39r>7n#rgQaP)jF0oRb6ssh}E?P zm%<)i%G|y5h~|n3!4pn|rV2jP3$@y`B7o`tQDuGc`nW%bZ-$@QSMtHQ%6<)d#uSzw zwS0#1$&OEJLN4^oQqeHalXRQBS?!o9^A9HLlqIrDjWhoOUCQ9;>gTe~DWM4f^X*`Q literal 0 HcmV?d00001 diff --git a/src/ui/icons/information.png b/src/ui/icons/information.png new file mode 100644 index 0000000000000000000000000000000000000000..622dc877eadbd0df498ce3a2afac93cfc9778994 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*VGc-|NsBboH>($;XhD} z?R|h3kYX$e@(X5gcy=QV$eH5l;uunKYwg5~oXm;>F5)}c%+eXtJeUu%ExJ+fd(ukI zS!I5u{iDZgJ8r2kYN!>If0y1;UNrNGc&pN{&31QfwO4FC_9;nWqU4&1GXpx#aZcnu zDw*zaA>e_&Qf=oy=Yq6OnfGM{_P+dyzT)g>loWZI9;Pt74s`FXd!hY7;-c{aNA5(W pT9+@6ZnSQVmDz3ZMk#O)Bja}E$sbNHYX-WH!PC{xWt~$(698##S}Xtn literal 0 HcmV?d00001 diff --git a/src/ui/icons/logo_SAP.ico b/src/ui/icons/logo_SAP.ico new file mode 100644 index 0000000000000000000000000000000000000000..d62f0cb4420d27bbf422084ad31e7718c0d9ca27 GIT binary patch literal 128503 zcmd3Ng;P{t*gqg3t#mg_gEW%TuypJ$4brfbbR&Ya)Y9GT(z&F70!ue6z2H~6RHOt% zf4=j+f5h+1+&SktXYMn1=H7eGGoQf1!p6eK`k#i4#fFvm1`Esi-#9Aje`8((Y^?A9 z=9HBFFIK_Aq7A{u5)t{|7y-b-de!&uPPYGxpJQPie!<3i{;&U^e6F}ySZNp7Sc!)E znxsSwME_Eg0=3kP|7Z1oE`opSST|v>&#|!H7y{LlLBShmk1oO1==@iaZ)asrtlNZi ze82YxJ*mluTDW545DF=4T(x=V`ySBTx0q~mRYBW-r2Zmw;s3YcTSA=HwZGR?p%-rx zzx=(%{nsbk;Qan8L-9vuctnkyl9G}<=`F+a=SqfO{@yEw`7r%{M(~`Hnw*-NnsT8I zoQ#kX-{v+ef${UMGO;U{+mv7a<@>FQn{Yz2BGh1AsL!6y4>)QrO(#Q>XCB$}xdH3`^8bf#XK5 z%CdsxPIm8@2dEokED6c0x2mfRR&NiF@i2MaSS$u+_)0lM0Q?PKD$`lxjGi^*+l-Vv zLAr}C;gw;e9bbM4U#-9D^^zvItCY1Pp1x?HMfa=#Xf~V1)WnxJoEpm*`|S$E^?gT$ zzU3e+Q|>q>k=+y4Dzg&0iTo(-{l1Bq`(JIZg7v!Gt(|-NXFE{!1I}#rCsjnm#5z$r++>045G0#w;wp+qwH}pE!^iP=ODOxJ;@8Gq;glF$hQ2${v>%eTxrBCB1=mN zE}_S*En6r4dyX7krZP_^`t<#By&=0tqDgh-0#=x#Y{P@)zaW8Y%y|nED9CGi~wt z_C-(8X@O9|fMgZ5tVxKFQHr2-&3LLUI~y*HZM}rCybd()!gZ>lA<7xDw3Dx88UXIcc?m`AVp{@n^=(^NPnczlfbV$#Hxc!kOOq;rjCnh-qRgvsS&Pay zrEibmSAxILpPBe#htj#1Un1eMg6QnHUooUM+0|)!6^qRC?EEN=iTh300wXeLjzcs5 zqg9iQ;nN{s>XNLS02SP$1!~$qXbJ_d1U1GgV#czu!st=DhSH+S+*G%v*KBnPu4x{W z9d#>0P#DQX^u3le1-YH)V)bv6&KTqTQ3R@9BN-@;5nS4p3kLQ0lOrko-QM(NuQ?+6 zf1ZQf8o~V5ZjI|nq@AdjmRxKmb&~pW6ACgF3v4KESrpdeN7tTG9ZjuTjg(O{uc)-T z_SNTvQtKWS9@!SL)RT+*>H<~TK_#X1-@j|ritFcV#7iPN&0~Zc^Mp^Uq*iYMO1kj` zD ztByP(y{?$OcKFb;nHw>qc&YEJ&;D>0kao-_s0UKiqFChndW##tAiFe*T32u*#;sugROX%Oi9!Un^+|v$?Sf{q zJ=`t3*1RVDQ5$J-E?43oXKDp)$G$nKTwt0y2RYPT+~3Ex=qVvPGY&n z+gI7hB}cW?3{PHp@VSEc>ont_0R;ia?&(G=8+B8zhq8`oER`KZyqO523?!_`E@6Ko zMO>fj&tpgp(Yi-pS-pDWyhl0cm`8mfFO=&TWZz8K=BU*M5x>dzh)eK&Kpr{d_>R{;OAYhVu? zMa6hH=wVW`#P8B))P5=0IU;!L4%-E_W^yPgwIN;wTc^sqpDphxVyo?G8=haToW20p zGP(Rpiu~2yeDa)<;yI0P!Ol4PL_88vNRt

e#S6b$ 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 literal 0 HcmV?d00001 diff --git a/src/ui/icons/logo_SAP.png b/src/ui/icons/logo_SAP.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4e3500ecfac1b22e927e9aa4b5ca60db18bc35 GIT binary patch literal 279654 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%0AjW)4w`S`cyxgs_2 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 }YG1WhStAihJ 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 literal 0 HcmV?d00001 diff --git a/src/ui/icons/question.png b/src/ui/icons/question.png new file mode 100644 index 0000000000000000000000000000000000000000..35d103bcc5a8a2bd8d2ea5470f19a863a7fb412c GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*VGc-|NsBboH>($;XhD} z?R|h3kYX$e@(X5gcy=QV$eHcw;uunKtM%eRUS>remy3e8*km*q)|fP8C@B0|uldpH zSc~_wO}Ccwix=n{6u0$r3)EmObKj_P1EF zMqu@whYQZ~?pZL;;eUfz%lssXBVoJ&W*&1Iv#pI-E^OD9+;D_BVN#x#0{3Qb`@fn$ wESF9{(6XDM<{`7>?{&f#{CD^<%oh;3_p?UXx-{mCD$tn>p00i_>zopr0Dfs(LI3~& literal 0 HcmV?d00001 diff --git a/src/ui/icons/warning.png b/src/ui/icons/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..ae04ee43dcac94297f4f2b9cd4c1a3d27e6b63b2 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^*Hqo~|Nj|g&YTGp*d!5d z2c#HFg8YIR9G=}s19BQXT^vIyZiSxN$a`2pp!MP86@lM8{O4-UThVmABO^iNREOrK zBX1K@J1p+Z)t$Y+GX87Emj$-}ZdmQ%OKEmrWz3W``{02r4Yu~)&n)&6UWq0uY}1x- z?enwX*z{=ShprIT0G0&CBw-P;4NR*O8XbSn + + 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