fix broken files after faulty update

This commit is contained in:
2025-01-14 08:51:58 +01:00
parent 598da9bfac
commit 997d618ff1
102 changed files with 2499 additions and 548 deletions

View File

@@ -1,3 +1,4 @@
import pathlib
from .Ui_semesterapparat_ui import Ui_MainWindow as Ui_Semesterapparat

View File

@@ -1,3 +1,4 @@
from .bookdata import BookDataUI as edit_bookdata_ui
from .login import LoginDialog as login_ui
from .mail import Mail_Dialog

View File

@@ -1,3 +1,4 @@
from .dialog_sources.Ui_about import Ui_about
from PyQt6 import QtWidgets
from PyQt6.QtCore import PYQT_VERSION_STR

View File

@@ -1,7 +1,8 @@
from PyQt6 import QtWidgets
from .dialog_sources.Ui_apparat_extend import Ui_Dialog
from src import Icon
from src.backend import generateSemesterByDate, generateSemesterByOffset
from src.backend import Semester
class ApparatExtendDialog(QtWidgets.QDialog, Ui_Dialog):
def __init__(
self,

View File

@@ -1,3 +1,4 @@
from PyQt6 import QtCore, QtWidgets
from src.logic.dataclass import BookData

View File

@@ -1,3 +1,4 @@
from .dialog_sources.Ui_confirm_extend import Ui_extend_confirm
from PyQt6 import QtWidgets

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\about.ui'
#
# Created by: PyQt6 UI code generator 6.6.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\app_status.ui'
#
# Created by: PyQt6 UI code generator 6.6.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\apparat_extend.ui'
#
# Created by: PyQt6 UI code generator 6.7.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\confirm_extend.ui'
#
# Created by: PyQt6 UI code generator 6.7.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\edit_bookdata.ui'
#
# Created by: PyQt6 UI code generator 6.6.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_add_table_entry.ui'
#
# Created by: PyQt6 UI code generator 6.7.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_generate_citation.ui'
#
# Created by: PyQt6 UI code generator 6.6.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_generator_confirm.ui'
#
# Created by: PyQt6 UI code generator 6.6.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\login.ui'
#
# Created by: PyQt6 UI code generator 6.6.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\mail_preview.ui'
#
# Created by: PyQt6 UI code generator 6.7.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\medianadder.ui'
#
# Created by: PyQt6 UI code generator 6.7.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\newMailTemplateDesigner.ui'
#
# Created by: PyQt6 UI code generator 6.6.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\parsed_titles.ui'
#
# Created by: PyQt6 UI code generator 6.6.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\reminder.ui'
#
# Created by: PyQt6 UI code generator 6.6.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\settings.ui'
#
# Created by: PyQt6 UI code generator 6.7.1

View File

@@ -1,10 +1,10 @@
from .dialog_sources.Ui_elsa_add_table_entry import Ui_Dialog
from src.logic.webrequest import WebRequest, BibTextTransformer
from src import Icon
from PyQt6 import QtWidgets
from src.transformers.transformers import DictToTable
from src.logic.zotero import ZoteroController
from icecream import ic
zot = ZoteroController()
dtt = DictToTable()
@@ -117,7 +117,7 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
if table["type"] == "zs":
book = zot.createBook(table["isbn"])
res_key = zot.createJournalArticle(book, table)
ic(book)
logger.debug(book)
a_lastname = table["section_author"].split(";")[0].strip().split(",")[0]
a_firstname = table["section_author"].split(";")[0].strip().split(",")[1]
author = f"{a_lastname}, {a_firstname[0]}"

View File

@@ -1,3 +1,4 @@
from .dialog_sources.Ui_elsa_generate_citation import Ui_Dialog
from PyQt6 import QtWidgets

View File

@@ -1,3 +1,4 @@
from .dialog_sources.Ui_elsa_generator_confirm import Ui_Dialog
from PyQt6 import QtCore, QtWidgets, QtGui

View File

@@ -2,16 +2,15 @@ import hashlib
from PyQt6 import QtCore, QtGui, QtWidgets
from src import Icon
from src import Icon, logger
from src.backend.admin_console import AdminCommands
from src.backend.database import Database
from .dialog_sources.Ui_login import Ui_Dialog
from src import MyLogger
class LoginDialog(Ui_Dialog):
def setupUi(self, Dialog):
self.log = MyLogger("Login")
Dialog.setObjectName("Dialog")
Dialog.resize(218, 190)
self.dialog = Dialog
@@ -76,16 +75,20 @@ class LoginDialog(Ui_Dialog):
if self.db.login(username, hashed_password):
self.lresult = 1 # Indicate successful login
self.lusername = username
logger.success(f"User {username} logged in.")
self.dialog.accept()
else:
# Credentials are invalid, display a warning
if username == "" or password == "":
logger.warning("Invalid username or password. Login failed.")
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:
logger.warning("Invalid username or password. Login failed.")
warning_dialog = QtWidgets.QMessageBox()
warning_dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
warning_dialog.setText(

View File

@@ -4,14 +4,12 @@ import sys
from PyQt6 import QtCore, QtGui, QtWidgets
from src import Icon, settings as config
from src.logic.log import MyLogger
from .dialog_sources.Ui_mail_preview import Ui_eMailPreview as MailPreviewDialog
from .mailTemplate import MailTemplateDialog
logger = MyLogger("Mail")
empty_signature = """<!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" /><meta charset="utf-8" /><style
@@ -52,7 +50,7 @@ class Mail_Dialog(QtWidgets.QDialog, MailPreviewDialog):
# prof_name,
)
logger.log_info("Setting up mail dialog")
logger.info("Setting up mail dialog")
self.appid = app_id
self.appname = app_name
self.subject = app_subject
@@ -84,7 +82,7 @@ class Mail_Dialog(QtWidgets.QDialog, MailPreviewDialog):
self.btn_okay.clicked.connect(self.createAndSendMail)
def open_new_template(self):
logger.log_info("Opening new template dialog")
logger.info("Opening new template dialog")
# TODO: implement new mail template dialog
dialog = MailTemplateDialog()
dialog.exec()
@@ -101,9 +99,9 @@ Tel.: 0761/682-778 | 07617682-545"""
def load_mail_templates(self):
# print("loading mail templates")
logger.log_info("Loading mail templates")
logger.info("Loading mail templates")
mail_templates = os.listdir("mail_vorlagen")
logger.log_info(f"Mail templates: {mail_templates}")
logger.info(f"Mail templates: {mail_templates}")
for template in mail_templates:
self.comboBox.addItem(template)
@@ -121,10 +119,10 @@ Tel.: 0761/682-778 | 07617682-545"""
return f"Guten Tag {name},"
def set_mail(self):
logger.log_info("Setting mail")
logger.info("Setting mail")
email_template = self.comboBox.currentText()
if email_template == "":
logger.log_debug("No mail template selected")
logger.debug("No mail template selected")
return
with open(f"mail_vorlagen/{email_template}", "r", encoding="utf-8") as f:
mail_template = f.read()
@@ -147,10 +145,10 @@ Tel.: 0761/682-778 | 07617682-545"""
)
self.mail_body.setHtml(mail_html)
logger.log_info(f"Mail template set to {email_template}")
logger.info(f"Mail template set to {email_template}")
def createAndSendMail(self):
logger.log_info("Sending mail")
logger.info("Sending mail")
import smtplib
import ssl
from email.mime.multipart import MIMEMultipart
@@ -188,7 +186,7 @@ Tel.: 0761/682-778 | 07617682-545"""
# print("Mail sent")
# end active process
server.quit()
logger.log_info("Mail sent, closing connection to server and dialog")
logger.info("Mail sent, closing connection to server and dialog")
# close the dialog
self.accept()

View File

@@ -1,3 +1,4 @@
import os
from PyQt6 import QtCore, QtGui, QtWidgets

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'ui\dialogs\mail_preview.ui'
#
# Created by: PyQt6 UI code generator 6.3.1

View File

@@ -1,5 +1,5 @@
from PyQt6 import QtCore, QtGui, QtWidgets
from src import MyLogger
from .dialog_sources.Ui_medianadder import Ui_Dialog
from src import Icon
class MedienAdder(QtWidgets.QDialog, Ui_Dialog):

View File

@@ -1,3 +1,4 @@
# 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

View File

@@ -1,12 +1,10 @@
from PyQt6 import QtCore, QtWidgets
from src.logic import AutoAdder
from src.logic.log import MyLogger
from .dialog_sources.Ui_parsed_titles import Ui_Form
logger = MyLogger("AutoTitleAdder")
class ParsedTitles(QtWidgets.QWidget, Ui_Form):
def __init__(self, parent=None):
@@ -35,7 +33,7 @@ class ParsedTitles(QtWidgets.QWidget, Ui_Form):
self.worker = None
def start(self):
logger.log_info("Starting AutoAdder")
logger.info("Starting AutoAdder")
self.worker = AutoAdder(
data=self.signatures,
@@ -54,8 +52,8 @@ class ParsedTitles(QtWidgets.QWidget, Ui_Form):
self.worker.start()
def on_completion(self):
logger.log_info("AutoAdder finished")
logger.log_info("Returning data")
logger.info("AutoAdder finished")
logger.info("Returning data")
# create a function that closes the dialog
@@ -64,7 +62,7 @@ class ParsedTitles(QtWidgets.QWidget, Ui_Form):
length = self.listWidget.count()
# print(f"Length of listWidget: {length}")
if length == 0:
logger.log_info("AutoAdder finished")
logger.info("AutoAdder finished")
self.buttonBox.accepted.emit()
def update_lists(self, signal):

View File

@@ -1,3 +1,4 @@
# 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

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'ui\dialogs\confirm_extend.ui'
#
# Created by: PyQt6 UI code generator 6.3.1

View File

@@ -1,3 +1,4 @@
from PyQt6 import QtWidgets
from .dialog_sources.Ui_reminder import Ui_Erinnerung as Ui_Dialog

View File

@@ -1,3 +1,4 @@
from PyQt6 import QtCore, QtGui, QtWidgets
from src import Icon, settings
from .dialog_sources.Ui_settings import Ui_Dialog as _settings

View File

@@ -7,16 +7,15 @@ import tempfile
import webbrowser
from pathlib import Path
from icecream import ic
from natsort import natsorted
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCore import QThread
from PyQt6.QtGui import QRegularExpressionValidator
from src import Icon, settings
from src import Icon, settings, logger
from src.backend import (
Database,
generateSemesterByDate,
Semester,
recreateFile,
tempdelete,
)
@@ -27,9 +26,10 @@ from src.logic import (
AvailChecker,
BookData,
BookGrabber,
MyLogger,
csv_to_list,
word_docx_to_csv,
Prof,
Apparat,
)
from src.ui import (
About,
@@ -50,7 +50,7 @@ from src.ui import (
ElsaDialog,
UserCreate,
EditUser,
EditProf
EditProf,
)
from src.utils import SemesterDocument
@@ -60,8 +60,7 @@ valid_input = (0, 0, 0, 0, 0, 0)
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")
logger.info("Starting Semesterapparatsmanagement")
super().__init__()
self.active_user = username
self.setupUi(MainWindow)
@@ -172,7 +171,6 @@ class Ui(Ui_Semesterapparat):
self.app_group_box.setEnabled(False)
self.line_2.hide()
self.progress_label.hide()
# self.message_frame.hide()
self.btn_reserve.hide()
self.label_20.hide()
self.line_3.hide()
@@ -247,7 +245,7 @@ class Ui(Ui_Semesterapparat):
apps.append(data)
print(apps)
doc = SemesterDocument(
semester=self.generateSemester(today=True),
semester=Semester(),
filename="Semesterapparate",
apparats=apps,
)
@@ -372,14 +370,12 @@ class Ui(Ui_Semesterapparat):
"""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:
return generateSemesterByDate()
return Semester()
currentYear = self.sem_year.text()
currentYear = int(currentYear[-2:])
@@ -387,7 +383,7 @@ class Ui(Ui_Semesterapparat):
if semester == "SoSe":
return "SoSe " + str(currentYear)
else:
return f"WiSe {currentYear}/{currentYear+1}"
return f"WiSe {currentYear}/{currentYear + 1}"
def open_apparat(self, apparat):
if self.load_app_data(apparat):
@@ -402,41 +398,29 @@ class Ui(Ui_Semesterapparat):
def populate_frame(self, appdata: ApparatData):
# populate the frame with the data from the database
self.drpdwn_app_nr.setCurrentText(str(appdata.appnr))
self.prof_title.setText(appdata.prof_title)
prof_name = appdata.profname.split(" ")
if len(prof_name) > 2:
fname = " ".join(prof_name[1:])
lname = prof_name[0]
prof_name = f"{lname}, {fname}"
else:
prof_name = ", ".join(prof_name)
self.drpdwn_app_nr.setCurrentText(str(appdata.apparat.appnr))
self.prof_title.setText(appdata.prof.title)
prof_name = appdata.prof.name(True)
self.drpdwn_prof_name.setCurrentText(prof_name)
self.prof_mail.setText(appdata.prof_mail)
self.prof_tel_nr.setText(appdata.prof_tel)
self.app_name.setText(appdata.appname)
self.prof_mail.setText(appdata.prof.mail)
self.prof_tel_nr.setText(appdata.prof.telnr)
self.app_name.setText(appdata.apparat.name)
# print("changing dropdown app_fach from '' to ", appdata.app_fach)
self.app_fach.setCurrentText(appdata.app_fach)
self.app_fach.setCurrentText(appdata.apparat.subject)
# print("changed dropdown app_fach to ", self.app_fach.currentText())
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.sem_year.setText(appdata.apparat.get_semester.split(" ")[1])
match appdata.apparat.get_semester.split(" ")[0]:
case "SoSe":
self.sem_sommer.setChecked(True)
self.sem_winter.setChecked(False)
case "WiSe":
self.sem_sommer.setChecked(False)
self.sem_winter.setChecked(True)
self.check_eternal_app.setChecked(appdata.apparat.eternal)
self.prof_id_adis.setText(str(appdata.apparat.prof_id_adis))
self.apparat_id_adis.setText(str(appdata.apparat.apparat_id_adis))
self.app_group_box.setEnabled(True)
self.validateLoadedData()
@@ -449,25 +433,26 @@ class Ui(Ui_Semesterapparat):
self.validate_semester()
def update_apparat(self):
appdata = ApparatData()
appdata.app_fach = self.app_fach.currentText()
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.prof_title.text()
appdata.profname = self.drpdwn_prof_name.currentText()
appdata.semester = (
prof = Prof()
app = Apparat()
app.subject = self.app_fach.currentText()
app.name = self.app_name.text()
app.appnr = self.active_apparat
app.eternal = self.check_eternal_app.isChecked()
prof.mail = self.prof_mail.text()
prof.telnr = self.prof_tel_nr.text()
prof.title = self.prof_title.text()
prof.fullname = self.drpdwn_prof_name.currentText().replace(",", "")
app.created_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()
prof_id = self.db.getProfByName(appdata.prof_details.fullname).id
app.prof_id_adis = self.prof_id_adis.text()
prof_id = self.db.getProfByName(prof.fullname).id
self.add_files(prof_id)
appdata.apparat_adis_id = self.apparat_id_adis.text()
app.apparat_id_adis = self.apparat_id_adis.text()
appdata = ApparatData(prof=prof, apparat=app)
self.db.updateApparat(appdata)
self.update_app_media_list()
@@ -597,7 +582,7 @@ class Ui(Ui_Semesterapparat):
return
selected_prof = self.drpdwn_prof_name.currentText()
data = self.db.getProfData(selected_prof)
# ic(data)
# logger.debug(data)
prof_title = data.title
if prof_title == "None":
prof_title = "Kein Titel"
@@ -701,13 +686,13 @@ class Ui(Ui_Semesterapparat):
def update_progress_label(self, curr, total):
text = f"Medium {curr}/{total}"
self.logger.log_info(text)
logger.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")
logger.info("Finished adding media, hiding progress label")
self.progress_label.hide()
self.progress_label.setText("Bitte warten...")
self.line_2.hide()
@@ -734,7 +719,7 @@ class Ui(Ui_Semesterapparat):
app_id = self.active_apparat
prof_id = self.db.getProfId(self.profdata)
ic(prof_id)
logger.debug(prof_id)
# check if app_id is in database
if self.db.checkApparatExistsById(app_id) is False:
# create apparat
@@ -1066,7 +1051,7 @@ class Ui(Ui_Semesterapparat):
data = __open_dialog(signatures)
# add the data to the database
for book in data:
if type(book) != BookData:
if not isinstance(book, BookData):
continue
self.db.addBookToDatabase(
bookdata=book, app_id=app_id, prof_id=prof_id
@@ -1083,7 +1068,7 @@ class Ui(Ui_Semesterapparat):
if data == []:
return
for book in data:
if type(book) != BookData:
if not isinstance(book, BookData):
continue
self.db.addBookToDatabase(
bookdata=book, app_id=app_id, prof_id=prof_id
@@ -1099,10 +1084,10 @@ class Ui(Ui_Semesterapparat):
"Bitte warten, bis alle Medien hinzugefügt wurden"
)
app_id = self.active_apparat
ic(self.profdata)
logger.debug(self.profdata)
prof_id = self.db.getProfId(self.profdata)
ic(prof_id)
logger.debug(prof_id)
# check if apparat in database
# if app_id not in database, create apparat
@@ -1110,7 +1095,7 @@ class Ui(Ui_Semesterapparat):
if not self.db.checkApparatExistsById(app_id):
# create apparat
# print("Creating apparat")
if self.btn_save_apparat(False) == False:
if not self.btn_save_apparat(False):
return
created = True
if self.dokument_list.rowCount() == 0:
@@ -1155,7 +1140,7 @@ class Ui(Ui_Semesterapparat):
]
signatures = [i for i in signatures if i != ""]
# ic(signatures)
# logger.debug(signatures)
# print("starting thread")
if prof_id is None:
prof_id = self.db.getProfId(self.profdata)
@@ -1218,23 +1203,29 @@ class Ui(Ui_Semesterapparat):
if not self.validate_fields():
self.confirm_popup("Bitte alle Pflichtfelder ausfüllen!", title="Fehler")
return False
appd = ApparatData()
appd.appnr = self.active_apparat
appd.prof_title = self.prof_title.text()
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()
appd.app_fach = self.app_fach.currentText()
appd.erstellsemester = self.generateSemester()
appd.deleted = 0
appd.prof_adis_id = self.prof_id_adis.text()
appd.apparat_adis_id = self.apparat_id_adis.text()
prof = Prof(
fullname=self.drpdwn_prof_name.currentText(),
telnr=self.prof_tel_nr.text(),
mail=self.prof_mail.text(),
)
prof.title = self.prof_title.text()
apparat = Apparat(
appnr=self.active_apparat,
name=self.app_name.text(),
created_semester=self.generateSemester(),
eternal=1 if self.check_eternal_app.isChecked() else 0,
subject=self.app_fach.currentText(),
deleted=0,
prof_id_adis=self.prof_id_adis.text(),
apparat_id_adis=self.apparat_id_adis.text(),
)
appd = ApparatData(prof=prof, apparat=apparat)
error = self.db.createApparat(appd)
if error:
self.confirm_popup(error.__str__(), title="Fehler")
return False
if self.dokument_list.rowCount() > 0:
self.add_files()
if error is not None:
@@ -1251,15 +1242,16 @@ class Ui(Ui_Semesterapparat):
if self.check_send_mail.isChecked():
self.contact_prof(
apparat=appd.appnr,
apparat=appd.apparat.appnr,
mail="Information zum Semesterapparat",
location="",
pid=appd.profname,
pid=appd.prof.fullname,
)
if clear_fields:
# print("clearing fields")
self.__clear_fields()
return True
def send_mail_preview(self):
pass
@@ -1270,12 +1262,12 @@ class Ui(Ui_Semesterapparat):
@property
def profdata(self):
return {
"title":self.prof_title.text(),
"title": self.prof_title.text(),
"profname": self.drpdwn_prof_name.currentText(),
"prof_mail":self.prof_mail.text(),
"prof_tel":self.prof_tel_nr.text()
"prof_mail": self.prof_mail.text(),
"prof_tel": self.prof_tel_nr.text(),
}
def add_files(self, prof_id=None):
files = []
for i in range(self.dokument_list.rowCount()):
@@ -1304,12 +1296,13 @@ class Ui(Ui_Semesterapparat):
def update_apparat_list(self):
self.tableWidget_apparate.setRowCount(0)
for apparat in self.apparats:
self.insert_apparat_into_table(apparat)
logger.info("Inserted {} apparats into table".format(len(self.apparats)))
def insert_apparat_into_table(self, apparat):
# ic(apparat)
# logger.debug(apparat)
def __dauer_check(apparat):
return "Ja" if apparat[7] == 1 else "Nein"
@@ -1339,7 +1332,6 @@ class Ui(Ui_Semesterapparat):
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()
@@ -1357,7 +1349,7 @@ class Ui(Ui_Semesterapparat):
return
pid = self.__get_table_data_field(self.tableWidget_apparate, pos[0], 2)
app_id = self.__get_table_data_field(self.tableWidget_apparate, pos[0], 0)
ic(pos, pid)
logger.debug(pos, pid)
extend_action.triggered.connect(self.extend_apparat)
delete_action.triggered.connect(lambda: self.delete_apparat(pos))
# pass pos to contact_prof
@@ -1368,7 +1360,7 @@ class Ui(Ui_Semesterapparat):
menu.exec(self.tableWidget_apparate.mapToGlobal(position))
def reminder(self):
self.logger.log_info("Opening reminder dialog")
logger.info("Opening reminder dialog")
reminder = reminder_ui()
reminder.exec()
tableposition = self.tableWidget_apparate.currentRow()
@@ -1385,17 +1377,17 @@ class Ui(Ui_Semesterapparat):
self.calendarWidget.updateCells()
# self.db.update_bookdata(data, book_id)
# self.db.update_bookdata(data)
self.logger.log_info("Commited message to database")
logger.info("Commited message to database")
# self.update_app_media_list()
def get_reminders(self):
messages = self.db.getAllMessages()
self.logger.log_info(f"Got {len(messages)} messages from database")
logger.info(f"Got {len(messages)} messages from database")
self.calendarWidget.setMessages(messages)
self.calendarWidget.updateCells()
def open_reminder(self):
if settings.mail.use_user_name == False:
if not settings.mail.use_user_name:
print("False")
selected_date = self.calendarWidget.selectedDate().toString("yyyy-MM-dd")
# # print(selected_date)
@@ -1542,6 +1534,7 @@ class Ui(Ui_Semesterapparat):
prof_id=self.db.getProfId(self.profdata),
)
print(medium.adis_idn, medium.signature)
def edit_medium(self):
book = self.tableWidget_apparat_media.item(
self.tableWidget_apparat_media.currentRow(), 1
@@ -1592,7 +1585,7 @@ class Ui(Ui_Semesterapparat):
prof_id=prof_id,
signature=signature,
)
message = f'Soll das Medium "{self.tableWidget_apparat_media.item(self.tableWidget_apparat_media.currentRow(),0).text()}" wirklich gelöscht werden?'
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, title="Löschen?")
# print(state)
if state == 1:
@@ -1642,12 +1635,12 @@ class Ui(Ui_Semesterapparat):
return
def __get_table_data_field(self, table, row, column):
ic(row, column)
logger.debug(row, column)
row = int(row)
return table.item(row, column).text()
def __contact_dialog(self, apparat, location: tuple | str, mail=None, pid=""):
ic(location, pid, apparat)
logger.debug(location, pid, apparat)
active_apparat_id = (
self.drpdwn_app_nr.currentText() if apparat is None else apparat
@@ -1674,7 +1667,7 @@ class Ui(Ui_Semesterapparat):
app_subject = self.app_fach.currentText()
else:
app_subject = self.db.getApparatData(active_apparat_id, app_name)
app_subject = app_subject.app_fach
app_subject = app_subject.apparat.subject
# profname = f"{profname.split(" ")[1]} {profname.split(" ")[0]}"
# print(pid)
if prof_id:
@@ -1696,8 +1689,8 @@ class Ui(Ui_Semesterapparat):
self.mail_thread.show()
def contact_prof(self, apparat="", location="", mail="", pid=""):
ic(apparat)
ic(location)
logger.debug(apparat)
logger.debug(location)
if self.active_apparat == "":
if apparat is False:
self.confirm_popup(
@@ -1733,8 +1726,8 @@ class Ui(Ui_Semesterapparat):
def launch_gui():
# print("trying to login")
# print("checking if database available")
log = MyLogger("login")
log.log_info("Starting login dialog")
logger.info("Starting login dialog")
app = QtWidgets.QApplication(sys.argv)
login_dialog = QtWidgets.QDialog()
ui = login_ui()

View File

@@ -1,9 +1,9 @@
from src import logger
from PyQt6 import QtWidgets, QtCore
from PyQt6.QtCore import QDate
from PyQt6.QtGui import QColor, QPen
from src.backend import Database
import darkdetect
from icecream import ic
color = "#ddfb00" if darkdetect.isDark() else "#2204ff"
pen = QPen(QColor(color))
@@ -22,7 +22,7 @@ class MessageCalendar(QtWidgets.QCalendarWidget):
def getMessages(self):
# Get the messages from the database
messages = Database().getAllMessages()
ic(messages)
logger.debug(messages)
self.setMessages(messages)
def deleteMessage(self, id):

View File

@@ -1,3 +1,4 @@
__all__ = ["filepicker"]
from .collapse import StatusWidget
from .filepicker import FilePicker

View File

@@ -1,3 +1,4 @@
from PyQt6 import QtWidgets, QtCore, QtGui
from PyQt6.QtCore import pyqtSignal
from .widget_sources.Ui_admin_create_user import Ui_Dialog

View File

@@ -1,9 +1,10 @@
from .widget_sources.Ui_admin_edit_prof import Ui_Dialog#
from PyQt6 import QtWidgets, QtCore
from PyQt6.QtCore import pyqtSignal
from icecream import ic
from src.backend import Database
from src import logger
from src.logic import Prof
from src.backend import Database
class EditProf(QtWidgets.QDialog, Ui_Dialog):
def __init__(self):
super(EditProf, self).__init__()
@@ -59,7 +60,7 @@ class EditProf(QtWidgets.QDialog, Ui_Dialog):
else:
self.faculty_member_old_telnr.setText(data.telnr)
self.faculty_member_oldmail.setText(data.mail)
ic(data)
logger.debug(data)
(
self.edit_faculty_member_title.setText(data.title)
if data.title is not None
@@ -83,7 +84,7 @@ class EditProf(QtWidgets.QDialog, Ui_Dialog):
olddata = self.db.getProfByName(
self.edit_faculty_member_select_member.currentText()
)
ic(olddata)
logger.debug(olddata)
data = olddata
oldlname = data.lastname
oldfname = data.firstname

View File

@@ -1,7 +1,7 @@
from .widget_sources.Ui_admin_edit_user import Ui_Dialog
from PyQt6 import QtWidgets, QtCore
from PyQt6.QtCore import pyqtSignal
from icecream import ic
from src.backend import Database
from src.backend import AdminCommands
admin = AdminCommands()

View File

@@ -1,3 +1,4 @@
from .widget_sources.Ui_calendar_entry import Ui_Dialog
from PyQt6 import QtWidgets, QtCore
from PyQt6.QtCore import pyqtSignal, QDate

View File

@@ -1,3 +1,4 @@
# import pysignal pyslot
from PyQt6.QtCore import pyqtSignal as Signal
from PyQt6.QtWidgets import (

View File

@@ -1,14 +1,12 @@
import os
from natsort import natsorted
from icecream import ic
from .widget_sources.Ui_elsa_maindialog import Ui_Dialog
from PyQt6 import QtCore, QtWidgets, QtGui
from PyQt6.QtGui import QRegularExpressionValidator
from PyQt6.QtCore import QDate
from src import Icon
from src.backend import recreateElsaFile, generateSemesterByDate, Database
from src.logic import elsa_word_to_csv, MyLogger, Prof
from src.logic.log import log
from src import Icon, logger
from src.backend import recreateElsaFile, Semester, Database
from src.logic import elsa_word_to_csv, Prof
from src.ui import popus_confirm
from src.ui.dialogs import ElsaAddEntry
from src.ui.widgets import FilePicker
@@ -39,6 +37,23 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.quote_entry.clicked.connect(self.elsa_table_entry)
self.quote_entry.setEnabled(False)
self.newProf.hide()
self.splitter = QtWidgets.QSplitter(QtCore.Qt.Orientation.Horizontal)
self.splitter.addWidget(self.media_table)
self.splitter.addWidget(self.statistics)
self.results.layout().removeWidget(self.media_table)
self.results.layout().removeWidget(self.statistics)
self.results.layout().addWidget(self.splitter)
self.elsa_statistics_table.setColumnCount(2)
# set header to occupy the whole width and auto scale based on table width
self.elsa_statistics_table.horizontalHeader().setStretchLastSection(True)
self.elsa_statistics_table.horizontalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.ResizeMode.Stretch
)
# if table size gets smaller, set horitzontal headers text to be left aligned
self.elsa_statistics_table.horizontalHeader().setDefaultAlignment(
QtCore.Qt.AlignmentFlag.AlignLeft
)
# self.table_elsa_list.
Icon("person", self.prof_icon)
# validators
# prof mail
@@ -55,12 +70,12 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
)
##Variables
self.logger = MyLogger("ElsaDialog")
self.db = Database()
self.graph_data = {"x": [generateSemesterByDate()], "y": [0]}
self.graph_data = {"x": [Semester().value], "y": [0]}
self.createProf = False
self.profs = self.getProfs()
self.elsa_prof.addItems(self.getProfs())
self.elsa_prof.addItems([prof[0] for prof in self.profs])
self.elsa_prof.addItem("")
self.elsa_prof.setCurrentText("")
# implement a check for the prof name. if name is not in list and has schema of lastname, firstname, show newProf frame
@@ -70,7 +85,7 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.newProf_title.textChanged.connect(self.checkProfData)
self.loadFrame()
log.info("Elsa Dialog loaded")
logger.info("Elsa Dialog loaded")
# self.show()
def checkProfData(self):
@@ -84,14 +99,20 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
):
self.elsa_save.setEnabled(True)
self.elsa_save.setToolTip("")
self.newProf_mail.setToolTip("")
self.newProf_telnr.setToolTip("")
else:
self.elsa_save.setEnabled(False)
self.elsa_save.setToolTip("Bitte erst Daten eingeben")
self.newProf_mail.setToolTip("Bitte geben Sie eine gültige E-Mail ein")
self.newProf_telnr.setToolTip(
"Bitte geben Sie eine gültige Telefonnummer ein"
)
def checkProf(self):
if (
", " in self.elsa_prof.currentText()
and self.elsa_prof.currentText() not in self.getProfs()
and self.elsa_prof.currentText() not in [prof[0] for prof in self.profs]
):
self.newProf.show()
self.elsa_save.setEnabled(False)
@@ -105,7 +126,9 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
def getProfs(self):
profs = self.db.getProfs()
profs = [f"{prof.lastname}, {prof.firstname}" for prof in profs]
profs = [
("{}, {}".format(prof.lastname, prof.firstname), prof.id) for prof in profs
]
profs = list(set(profs))
profs.sort()
@@ -161,7 +184,7 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.elsa_date.setText(QDate.currentDate().toString("dd.MM.yyyy"))
def addSemester(self):
self.elsa_semester.setText(generateSemesterByDate())
self.elsa_semester.setText(Semester().value)
def update_elsa(self):
prof = self.elsa_prof.currentText()
@@ -205,11 +228,14 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
fullname=f"{prof.split(", ")[0]} {prof.split(", ")[1]}",
)
prof_id = self.db.getProfId(profdata)
ic(profdata, prof_id)
logger.debug(profdata, prof_id)
if prof_id is None:
self.db.createProf(profdata)
prof_id = self.db.getProfId(prof)
self.profs.append(
"f{}, {}".format(profdata.lastname, profdata.firstname), prof_id
)
elsa_id = self.db.createElsaApparat(
date,
prof_id,
@@ -228,12 +254,12 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
files,
elsa_id,
)
log.info("Stored {} files in the database", len(files))
logger.info("Stored {} files in the database", len(files))
self.cancel_elsa_creation()
self.refresh_elsa_table()
self.elsa_prof.setCurrentText("")
self.quote_entry.setEnabled(False)
log.info("Saved apparat to database, id {}", elsa_id)
logger.info("Saved apparat to database, id {}", elsa_id)
def refresh_elsa_table(self):
self.elsa_table.setRowCount(0)
@@ -253,13 +279,13 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
def open_elsa(self):
prof = self.elsa_table.item(self.elsa_table.currentRow(), 0).text()
print(prof)
logger.info("prof", prof)
date = self.elsa_table.item(self.elsa_table.currentRow(), 1).text()
semester = self.elsa_table.item(self.elsa_table.currentRow(), 2).text()
self.elsa_update.setEnabled(True)
self.elsa_save.setEnabled(False)
if self.elsa_prof.currentText() == prof and date == self.elsa_date.text():
self.logger.log_info("Same prof, stopping")
logger.debug("Same prof, stopping")
return
self.create_frame_elsa.setEnabled(True)
self.dokument_list_elsa.setRowCount(0)
@@ -269,24 +295,21 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
elsa_apparats = self.db.getElsaApparats()
elsa_id = None
for apparat in elsa_apparats:
print(apparat)
if (
apparat[1] == date
and apparat[2] == semester
and apparat[3] == self.db.getProfId({"profname": prof})
):
elsa_id = apparat[0]
# print(elsa_id)
break
self.elsa_date.setText(date)
self.elsa_semester.setText(semester)
self.elsa_prof.setCurrentText(prof)
ic(elsa_id)
logger.info("Elsa ID is {}", elsa_id)
if elsa_id is None:
return
documents = self.db.getElsaFiles(elsa_id)
for document in documents:
# print(document)
self.dokument_list_elsa.insertRow(0)
self.dokument_list_elsa.setItem(
0, 0, QtWidgets.QTableWidgetItem(document[0])
@@ -340,13 +363,11 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.table_elsa_list.setItem(0, 11, QtWidgets.QTableWidgetItem(scan["type"]))
def addDokumentElsa(self):
# print("Add document")
picker = FilePicker()
files = picker.pick_files()
datalist = []
for file in files:
data = {}
# print(file)
filename = file.split("/")[-1]
filetype = filename.split(".")[-1]
self.dokument_list_elsa.insertRow(0)
@@ -360,27 +381,6 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
data["path"] = file
data["type"] = filetype
datalist.append(data)
# elsa_id = self.db.getElsaId(
# self.elsa_prof.currentText(),
# self.elsa_semester.text(),
# self.elsa_date.text(),
# )
# # print(elsa_id)
# if elsa_id is None:
# # create elsa
# self.db.createElsaApparat(
# self.elsa_date.text(),
# self.elsa_prof.currentText(),
# self.elsa_semester.text(),
# )
# elsa_id = self.db.getElsaId(
# self.elsa_prof.currentText(),
# self.elsa_semester.text(),
# self.elsa_date.text(),
# )
# self.db.insertElsaFile(datalist, elsa_id)
# self.elsa_save.setEnabled(False)
# self.refresh_elsa_table()
def parseDokumentElsa(self):
if self.dokument_list_elsa.rowCount() == 0:
@@ -389,7 +389,6 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
# get the file path of the selected file based on it's row
row = self.dokument_list_elsa.currentRow()
file = self.dokument_list_elsa.item(row, 3).text()
# print(file)
if file == "Database":
filename = self.dokument_list_elsa.item(row, 0).text()
filetype = self.dokument_list_elsa.item(row, 1).text()
@@ -397,14 +396,13 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
file = recreateElsaFile(
filename=filename, filetype=filetype, open=False
)
# print(file)
data, _ = elsa_word_to_csv(file)
elsa_id = self.db.getElsaId(
self.db.getProfId(Prof(fullname=self.elsa_prof.currentText())),
self.elsa_semester.text(),
self.elsa_date.text(),
)
ic(
logger.debug(
elsa_id,
self.elsa_prof.currentText(),
self.elsa_semester.text(),
@@ -441,14 +439,13 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
try:
self.elsa_statistics.removeTab(1)
except:
self.logger.log_debug("No tab to remove")
logger.debug("No tab to remove")
self.elsa_table.setRowCount(0)
elsa_apparats = self.db.getElsaApparats()
elsa_apparats = natsorted(elsa_apparats, key=lambda x: x[2], reverse=True)
# x = semester, y = number of apparats
for apparat in elsa_apparats:
# print(apparat)
data = self.insert_elsa_into_table(apparat)
semester = data[0]
number = data[1]
@@ -466,7 +463,7 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
generateMissing,
"Anzahl der Apparate",
)
ic(self.graph_data)
logger.debug(self.graph_data)
self.elsa_statistics_table.setRowCount(0)
for i in range(len(self.graph_data["x"])):
self.elsa_statistics_table.insertRow(0)
@@ -479,7 +476,7 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.elsa_statistics.addTab(graph, "Graph")
def launch():
log.debug("Launching Elsa Dialog")
logger.debug("Launching Elsa Dialog")
app = QtWidgets.QApplication([])
window = ElsaDialog()
window.show()

View File

@@ -1,3 +1,4 @@
import random
from typing import Union

View File

@@ -1,31 +1,28 @@
from .widget_sources.Ui_search_statistic_page import Ui_Dialog
from PyQt6 import QtWidgets, QtGui, QtCore
from PyQt6.QtCore import pyqtSignal
from src.backend import Database, generateSemesterByDate
from src.logic import custom_sort, Prof
from src import MyLogger
from src.backend import Database, Semester
from src import logger
from src.logic import custom_sort, Prof, sort_semesters_list
from src.ui import ApparatExtendDialog
from src.ui.dialogs import Mail_Dialog
from src.ui.widgets import DataGraph, StatusWidget
from natsort import natsorted
from icecream import ic
class MyComboBox(QtWidgets.QComboBox):
def __init__(self, parent=None):
super().__init__(parent)
class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
apparat_open = pyqtSignal(str)
reloadSignal = pyqtSignal()
refreshSignal = pyqtSignal()
def __init__(self):
self.logger = MyLogger("SearchStatisticPage")
self.logger.log_info("SearchStatisticPage started")
logger.info("SearchStatisticPage started")
super().__init__()
self.setupUi(self)
self.book_search_result.horizontalHeader().setSectionResizeMode(
@@ -51,7 +48,14 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
self.tableWidget.resizeRowsToContents()
self.db = Database()
self.box_appnrs.addItems(str(i) for i in self.db.getUnavailableApparatNumbers())
self.splitter = QtWidgets.QSplitter(QtCore.Qt.Orientation.Horizontal)
# insert splitter in apparatResult to allow resizing of the columns
self.splitter.addWidget(self.app_results)
self.splitter.addWidget(self.stats)
self.apparatResult.layout().removeWidget(self.stats)
self.apparatResult.layout().removeWidget(self.app_results)
self.apparatResult.layout().addWidget(self.splitter)
self.semester = Semester().value
self.populate_tab()
def restore_apparat(self):
@@ -90,15 +94,15 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
extend.exec()
if extend.result() == QtWidgets.QDialog.DialogCode.Accepted:
data = extend.get_data()
ic(data)
logger.debug(data)
app_name = self.tableWidget.item(self.tableWidget.currentRow(), 1).text()
app_id = self.db.getApparatId(app_name)
self.db.setNewSemesterDate(app_id, data["semester"], data["dauerapp"])
#remove the row
# remove the row
self.tableWidget.removeRow(self.tableWidget.currentRow())
self.refreshSignal.emit()
def tabW2_changed(self):
def tabW2_changed(self):
if self.tabWidget_2.currentIndex() == 0:
self.stackedWidget_4.setCurrentIndex(0)
else:
@@ -113,12 +117,11 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
"title": title if title != "" else None,
}
params = {key: value for key, value in params.items() if value is not None}
# ic(params)
logger.debug(params)
retdata = self.db.searchBook(params)
if retdata is None:
return
for book in retdata:
self.book_search_result.insertRow(0)
self.book_search_result.setItem(
0, 0, QtWidgets.QTableWidgetItem(book[0].title)
@@ -145,10 +148,9 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
selected_apparats.append(data)
# delete all selected apparats
ic(selected_apparats)
logger.debug(selected_apparats)
dialogs = []
for i in selected_apparats:
app_id = i["app_id"]
app_name = i["app_name"]
prof_name = i["prof_name"]
@@ -206,7 +208,7 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
self.box_dauerapp.setEnabled(True)
def populate_tab(self, table_or_graph=0):
self.logger.log_info("populate_tab started")
logger.info("populate_tab started")
# add default values to the dropdowns
self.box_appnrs.clear()
self.box_appnrs.addItem("")
@@ -232,9 +234,13 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
apparats = [str(apparat) for apparat in apparats]
self.box_appnrs.addItems(apparats)
persons = self.db.getProfs()
self.box_person.addItems([f"{person.lastname}, {person.firstname}" for person in persons])
persons = sorted(persons, key=lambda x: x.lastname)
self.box_person.addItems(
[f"{person.lastname}, {person.firstname}" for person in persons]
)
self.box_fach.addItems(subject[1] for subject in self.db.getSubjects())
semester = self.db.getSemersters()
semester = self.db.getSemesters()
semester = sort_semesters_list(semester)
self.box_erstellsemester.addItems(semester)
self.box_semester.addItems(semester)
self.statistics_table.setRowCount(0)
@@ -269,7 +275,7 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
# place the graph into tabWidget_3
self.tabWidget_3.addTab(graph, "Graph")
self.tabWidget_3.setCurrentIndex(table_or_graph)
self.logger.log_info("populate_tab finished")
logger.info("populate_tab finished")
def delete_selected_apparats(self):
# get all selected apparats
@@ -281,9 +287,9 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
selected_apparat_rows.append(i)
# delete all selected apparats
# # print(selected_apparats)
self.logger.log_info(f"Deleting apparats: {selected_apparats}")
logger.info(f"Deleting apparats: {selected_apparats}")
for apparat in selected_apparats:
self.db.deleteApparat(apparat, generateSemesterByDate())
self.db.deleteApparat(apparat, self.semester)
for row in selected_apparat_rows:
# set the background of the row to red
for j in range(5):
@@ -295,10 +301,10 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
def statistics(self):
"""Generate the statistics based on the selected filters."""
self.tableWidget.setRowCount(0)
active_semseter = generateSemesterByDate()
active_semseter = self.semester
self.db_err_message.setText("")
self.btn_del_select_apparats.setEnabled(True)
self.btn_notify_for_deletion.setEnabled(True)
self.btn_del_select_apparats.setEnabled(False)
self.btn_notify_for_deletion.setEnabled(False)
params = {
"appnr": (
self.box_appnrs.currentText()
@@ -306,7 +312,7 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
else None
),
"prof_id": (
self.db.getProfId(self.box_person.currentText())
self.db.getProfId(Prof(fullname=self.box_person.currentText()))
if self.box_person.currentText() != ""
else None
),
@@ -348,29 +354,22 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
self.db_err_message.setText("Keine Ergebnisse gefunden")
return
data = []
sem_year = active_semseter.split(" ")[1]
sem_time = active_semseter.split(" ")[0]
if sem_time == "WiSe":
sem_year = int(sem_year.split("/")[0])
else:
sem_year = int(sem_year)
for entry in result:
if "deletable" in params.keys():
entry_sem_time = entry[5].split(" ")[0]
entry_sem_year = entry[5].split(" ")[1]
if entry_sem_time == "SoSe":
entry_sem_year = int(entry_sem_year)
if (entry_sem_year < sem_year) or (
sem_time == "WiSe" and entry_sem_year == sem_year
):
data.append(entry)
else:
entry_sem_year = int(entry_sem_year.split("/")[0])
if entry_sem_year < sem_year:
data.append(entry)
sem = Semester().from_string(
entry[8] if entry[8] is not None else entry[5]
)
logger.info(f"Semester: {sem}")
if sem.isPastSemester(Semester()):
data.append(entry)
else:
data.append(entry)
self.tableWidget.setRowCount(len(data))
if len(data) > 0:
self.btn_del_select_apparats.setEnabled(True)
self.btn_notify_for_deletion.setEnabled(True)
for i in range(len(data)):
# set the items 0 = clickable checkbox, 1 = appname, 2 = profname, 3 = fach
self.tableWidget.setItem(i, 0, QtWidgets.QTableWidgetItem(""))

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\admin_create_user.ui'
#
# Created by: PyQt6 UI code generator 6.7.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\admin_edit_prof.ui'
#
# Created by: PyQt6 UI code generator 6.7.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\admin_edit_user.ui'
#
# Created by: PyQt6 UI code generator 6.7.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\calendar_entry.ui'
#
# Created by: PyQt6 UI code generator 6.7.1

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\elsa_maindialog.ui'
#
# Created by: PyQt6 UI code generator 6.7.1
@@ -187,15 +188,36 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.create_frame_elsa)
self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
self.horizontalLayout_6.setObjectName("horizontalLayout_6")
self.quote_entry = QtWidgets.QPushButton(parent=Dialog)
self.quote_entry.setObjectName("quote_entry")
self.horizontalLayout_6.addWidget(self.quote_entry)
spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_6.addItem(spacerItem5)
self.verticalLayout.addLayout(self.horizontalLayout_6)
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.table_elsa_list = QtWidgets.QTableWidget(parent=Dialog)
self.verticalLayout.addLayout(self.horizontalLayout_5)
self.results = QtWidgets.QWidget(parent=Dialog)
self.results.setObjectName("results")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.results)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.statistics = QtWidgets.QWidget(parent=self.results)
self.statistics.setObjectName("statistics")
self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.statistics)
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.media_table = QtWidgets.QWidget(parent=self.statistics)
self.media_table.setObjectName("media_table")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.media_table)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
self.horizontalLayout_9.setObjectName("horizontalLayout_9")
self.quote_entry = QtWidgets.QPushButton(parent=self.media_table)
self.quote_entry.setObjectName("quote_entry")
self.horizontalLayout_9.addWidget(self.quote_entry)
spacerItem5 = QtWidgets.QSpacerItem(
40,
20,
QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum,
)
self.horizontalLayout_9.addItem(spacerItem5)
self.verticalLayout_4.addLayout(self.horizontalLayout_9)
self.table_elsa_list = QtWidgets.QTableWidget(parent=self.media_table)
self.table_elsa_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.table_elsa_list.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
self.table_elsa_list.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectItems)
@@ -230,13 +252,14 @@ class Ui_Dialog(object):
self.table_elsa_list.setHorizontalHeaderItem(11, item)
self.table_elsa_list.horizontalHeader().setDefaultSectionSize(85)
self.table_elsa_list.horizontalHeader().setMinimumSectionSize(31)
self.horizontalLayout_5.addWidget(self.table_elsa_list)
self.elsa_statistics = QtWidgets.QTabWidget(parent=Dialog)
self.verticalLayout_4.addWidget(self.table_elsa_list)
self.horizontalLayout_7.addWidget(self.media_table)
self.elsa_statistics = QtWidgets.QTabWidget(parent=self.statistics)
self.elsa_statistics.setObjectName("elsa_statistics")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.tab)
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.horizontalLayout_8 = QtWidgets.QHBoxLayout(self.tab)
self.horizontalLayout_8.setObjectName("horizontalLayout_8")
self.elsa_statistics_table = QtWidgets.QTableWidget(parent=self.tab)
self.elsa_statistics_table.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.elsa_statistics_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
@@ -250,14 +273,16 @@ class Ui_Dialog(object):
item = QtWidgets.QTableWidgetItem()
self.elsa_statistics_table.setHorizontalHeaderItem(1, item)
self.elsa_statistics_table.horizontalHeader().setDefaultSectionSize(169)
self.horizontalLayout_7.addWidget(self.elsa_statistics_table)
self.horizontalLayout_8.addWidget(self.elsa_statistics_table)
self.elsa_statistics.addTab(self.tab, "")
self.horizontalLayout_5.addWidget(self.elsa_statistics)
self.horizontalLayout_5.setStretch(0, 7)
self.horizontalLayout_5.setStretch(1, 3)
self.verticalLayout.addLayout(self.horizontalLayout_5)
self.horizontalLayout_7.addWidget(self.elsa_statistics)
self.horizontalLayout_3.addWidget(self.statistics)
self.results_table = QtWidgets.QWidget(parent=self.results)
self.results_table.setObjectName("results_table")
self.horizontalLayout_3.addWidget(self.results_table)
self.verticalLayout.addWidget(self.results)
self.verticalLayout.setStretch(0, 1)
self.verticalLayout.setStretch(3, 2)
self.verticalLayout.setStretch(4, 2)
self.retranslateUi(Dialog)
self.elsa_statistics.setCurrentIndex(0)
@@ -277,12 +302,8 @@ class Ui_Dialog(object):
Dialog.setTabOrder(self.seperateEntries, self.check_file_elsa)
Dialog.setTabOrder(self.check_file_elsa, self.elsa_save)
Dialog.setTabOrder(self.elsa_save, self.elsa_update)
Dialog.setTabOrder(self.elsa_update, self.quote_entry)
Dialog.setTabOrder(self.quote_entry, self.elsa_statistics)
Dialog.setTabOrder(self.elsa_statistics, self.table_elsa_list)
Dialog.setTabOrder(self.table_elsa_list, self.elsa_table)
Dialog.setTabOrder(self.elsa_table, self.elsa_statistics_table)
Dialog.setTabOrder(self.elsa_statistics_table, self.dokument_list_elsa)
Dialog.setTabOrder(self.elsa_update, self.elsa_table)
Dialog.setTabOrder(self.elsa_table, self.dokument_list_elsa)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate

View File

@@ -1,3 +1,4 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\search_statistic_page.ui'
#
# Created by: PyQt6 UI code generator 6.7.1
@@ -12,7 +13,7 @@ from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(1244, 767)
Dialog.resize(1250, 767)
self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
self.verticalLayout.setObjectName("verticalLayout")
self.tabWidget_2 = QtWidgets.QTabWidget(parent=Dialog)
@@ -150,24 +151,26 @@ class Ui_Dialog(object):
self.apparatResult.setObjectName("apparatResult")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.apparatResult)
self.horizontalLayout.setObjectName("horizontalLayout")
self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.app_results = QtWidgets.QWidget(parent=self.apparatResult)
self.app_results.setObjectName("app_results")
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.app_results)
self.verticalLayout_7.setObjectName("verticalLayout_7")
self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.verticalLayout_5 = QtWidgets.QVBoxLayout()
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.horizontalLayout_7.addLayout(self.verticalLayout_5)
self.btn_del_select_apparats = QtWidgets.QPushButton(parent=self.apparatResult)
self.btn_del_select_apparats = QtWidgets.QPushButton(parent=self.app_results)
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)
self.btn_notify_for_deletion = QtWidgets.QPushButton(parent=self.apparatResult)
self.btn_notify_for_deletion = QtWidgets.QPushButton(parent=self.app_results)
self.btn_notify_for_deletion.setObjectName("btn_notify_for_deletion")
self.horizontalLayout_7.addWidget(self.btn_notify_for_deletion)
spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_7.addItem(spacerItem4)
self.verticalLayout_4.addLayout(self.horizontalLayout_7)
self.tableWidget = QtWidgets.QTableWidget(parent=self.apparatResult)
self.verticalLayout_7.addLayout(self.horizontalLayout_7)
self.tableWidget = QtWidgets.QTableWidget(parent=self.app_results)
self.tableWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.tableWidget.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
@@ -185,14 +188,18 @@ class Ui_Dialog(object):
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
self.tableWidget.horizontalHeader().setStretchLastSection(True)
self.verticalLayout_4.addWidget(self.tableWidget)
self.horizontalLayout.addLayout(self.verticalLayout_4)
self.tabWidget_3 = QtWidgets.QTabWidget(parent=self.apparatResult)
self.verticalLayout_7.addWidget(self.tableWidget)
self.horizontalLayout.addWidget(self.app_results)
self.stats = QtWidgets.QWidget(parent=self.apparatResult)
self.stats.setObjectName("stats")
self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.stats)
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.tabWidget_3 = QtWidgets.QTabWidget(parent=self.stats)
self.tabWidget_3.setObjectName("tabWidget_3")
self.statistic_table = QtWidgets.QWidget()
self.statistic_table.setObjectName("statistic_table")
self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.statistic_table)
self.verticalLayout_6.setObjectName("verticalLayout_6")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.statistic_table)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.statistics_table = QtWidgets.QTableWidget(parent=self.statistic_table)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
@@ -219,17 +226,16 @@ class Ui_Dialog(object):
self.statistics_table.horizontalHeader().setSortIndicatorShown(True)
self.statistics_table.horizontalHeader().setStretchLastSection(False)
self.statistics_table.verticalHeader().setStretchLastSection(True)
self.verticalLayout_6.addWidget(self.statistics_table)
self.verticalLayout_4.addWidget(self.statistics_table)
self.dataLayout = QtWidgets.QHBoxLayout()
self.dataLayout.setObjectName("dataLayout")
self.verticalLayout_6.addLayout(self.dataLayout)
self.verticalLayout_4.addLayout(self.dataLayout)
self.tabWidget_3.addTab(self.statistic_table, "")
self.graph_table = QtWidgets.QWidget()
self.graph_table.setObjectName("graph_table")
self.tabWidget_3.addTab(self.graph_table, "")
self.horizontalLayout.addWidget(self.tabWidget_3)
self.horizontalLayout.setStretch(0, 55)
self.horizontalLayout.setStretch(1, 45)
self.horizontalLayout_5.addWidget(self.tabWidget_3)
self.horizontalLayout.addWidget(self.stats)
self.stackedWidget_4.addWidget(self.apparatResult)
self.bookresult = QtWidgets.QWidget()
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
@@ -285,8 +291,7 @@ class Ui_Dialog(object):
Dialog.setTabOrder(self.box_dauerapp, self.btn_search)
Dialog.setTabOrder(self.btn_search, self.btn_del_select_apparats)
Dialog.setTabOrder(self.btn_del_select_apparats, self.btn_notify_for_deletion)
Dialog.setTabOrder(self.btn_notify_for_deletion, self.tabWidget_3)
Dialog.setTabOrder(self.tabWidget_3, self.book_search_result)
Dialog.setTabOrder(self.btn_notify_for_deletion, self.book_search_result)
Dialog.setTabOrder(self.book_search_result, self.seach_by_signature)
Dialog.setTabOrder(self.seach_by_signature, self.search_by_title)
Dialog.setTabOrder(self.search_by_title, self.book_search)