elsa functions, graphs, fixes #9, #7

This commit is contained in:
WorldTeacher
2024-05-24 16:30:31 +02:00
parent bdf7fc37f1
commit 271f9a3309

View File

@@ -17,7 +17,7 @@ from PyQt6.QtCore import QDate, QThread
from PyQt6.QtGui import QColor, QRegularExpressionValidator from PyQt6.QtGui import QColor, QRegularExpressionValidator
from src.backend.admin_console import AdminCommands from src.backend.admin_console import AdminCommands
from src.backend.create_file import recreateFile from src.backend.create_file import recreateElsaFile, recreateFile
from src.backend.database import Database from src.backend.database import Database
from src.backend.delete_temp_contents import delete_temp_contents from src.backend.delete_temp_contents import delete_temp_contents
from src.backend.semester import generateSemesterByDate from src.backend.semester import generateSemesterByDate
@@ -26,11 +26,11 @@ from src.logic.constants import APP_NRS, PROF_TITLES
from src.logic.csvparser import csv_to_list from src.logic.csvparser import csv_to_list
from src.logic.dataclass import ApparatData, BookData from src.logic.dataclass import ApparatData, BookData
from src.logic.log import MyLogger from src.logic.log import MyLogger
from src.logic.wordparser import word_docx_to_csv from src.logic.wordparser import elsa_word_to_csv, word_docx_to_csv
from src.ui import ( from src.ui import (
App_Ext_Dialog, App_Ext_Dialog,
DataGraph,
FilePicker, FilePicker,
GraphWidget,
Mail_Dialog, Mail_Dialog,
StatusWidget, StatusWidget,
Ui_Semesterapparat, Ui_Semesterapparat,
@@ -199,7 +199,6 @@ class Ui(Ui_Semesterapparat):
userrole = self.db.getRole(self.active_user) userrole = self.db.getRole(self.active_user)
# hide admin interface when non-admin is logged in # hide admin interface when non-admin is logged in
if userrole == "admin": if userrole == "admin":
self.tabWidget.setTabVisible(3, True) self.tabWidget.setTabVisible(3, True)
else: else:
self.tabWidget.setTabVisible(3, False) self.tabWidget.setTabVisible(3, False)
@@ -255,11 +254,7 @@ class Ui(Ui_Semesterapparat):
self.validate_thread.start() self.validate_thread.start()
# get all current apparats and cache them in a list # get all current apparats and cache them in a list
self.apparats = self.db.getAllAparats(deleted=0) self.apparats = self.get_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 self.old_apparats = self.apparats # create a clone to compare against later
# if length of apparats changes, update box_apparats # if length of apparats changes, update box_apparats
@@ -297,6 +292,17 @@ class Ui(Ui_Semesterapparat):
# statistic side buttons # statistic side buttons
self.btn_notify_for_deletion.clicked.connect(self.notify_for_deletion) self.btn_notify_for_deletion.clicked.connect(self.notify_for_deletion)
self.btn_notify_for_deletion.setEnabled(False) self.btn_notify_for_deletion.setEnabled(False)
# elsa buttons
self.elsa_add_new.clicked.connect(self.add_new_elsa)
self.elsa_cancel_create.clicked.connect(self.cancel_elsa_creation)
self.elsa_save.clicked.connect(self.save_elsa)
self.elsa_date_today.clicked.connect(self.generateTodayDateElsa)
self.active_semester.clicked.connect(self.addSemester)
self.elsa_table.doubleClicked.connect(self.open_elsa)
self.btn_add_document_elsa.clicked.connect(self.addDokumentElsa)
self.check_file_elsa.clicked.connect(self.parseDokumentElsa)
self.btn_open_document_elsa.clicked.connect(self.openDocumentElsa)
# admin buttons # admin buttons
self.user_frame_addUser.clicked.connect(self.add_user) self.user_frame_addUser.clicked.connect(self.add_user)
self.pushButton.clicked.connect(self.delete_user) self.pushButton.clicked.connect(self.delete_user)
@@ -309,6 +315,206 @@ class Ui(Ui_Semesterapparat):
self.mail_thread = None self.mail_thread = None
self.autoGrabber = None self.autoGrabber = None
def add_new_elsa(self):
self.create_frame_elsa.setEnabled(True)
self.elsa_cancel_create.setEnabled(True)
self.active_semester.setEnabled(True)
profs = self.db.getProfs()
for prof in profs:
self.elsa_prof.addItem(f"{prof[3]}, {prof[2]}")
self.elsa_prof.setCurrentText("")
self.elsa_date.setText("")
self.elsa_semester.setText("")
def cancel_elsa_creation(self):
self.create_frame_elsa.setEnabled(False)
self.elsa_cancel_create.setEnabled(False)
self.elsa_prof.setCurrentText("")
self.elsa_date.setText("")
self.elsa_semester.setText("")
self.dokument_list_elsa.setRowCount(0)
self.table_elsa_list.setRowCount(0)
def generateTodayDateElsa(self):
self.elsa_date.setText(QDate.currentDate().toString("dd.MM.yyyy"))
def addSemester(self):
self.elsa_semester.setText(self.generateSemester(today=True))
def save_elsa(self):
if (
self.elsa_prof.currentText() == ""
or self.elsa_semester.text() == ""
or self.elsa_date.text() == ""
):
# warning message
self.confirm_popup("Bitte füllen Sie alle Felder aus")
return
prof = self.elsa_prof.currentText()
semester = self.elsa_semester.text()
date = self.elsa_date.text()
self.db.createElsaApparat(date, prof, semester)
self.cancel_elsa_creation()
def insert_elsa_into_table(self, apparat):
self.elsa_table.insertRow(0)
date = apparat[1]
semester = apparat[2]
prof = apparat[3]
self.elsa_table.setItem(0, 0, QtWidgets.QTableWidgetItem(prof))
self.elsa_table.setItem(0, 1, QtWidgets.QTableWidgetItem(date))
self.elsa_table.setItem(0, 2, QtWidgets.QTableWidgetItem(semester))
return (semester, 1)
def open_elsa(self):
prof = self.elsa_table.item(self.elsa_table.currentRow(), 0).text()
date = self.elsa_table.item(self.elsa_table.currentRow(), 1).text()
semester = self.elsa_table.item(self.elsa_table.currentRow(), 2).text()
if self.elsa_prof.currentText() == prof:
self.logger.log_info("Same prof, stopping")
return
self.dokument_list_elsa.setRowCount(0)
self.table_elsa_list.setRowCount(0)
self.elsa_cancel_create.setEnabled(True)
# get elsa apparats, iterate over them and find the one where all matches
elsa_apparats = self.db.getElsaApparats()
elsa_id = None
for apparat in elsa_apparats:
if apparat[1] == date and apparat[2] == semester and apparat[3] == prof:
elsa_id = apparat[0]
print(elsa_id)
break
if elsa_id is None:
return
self.elsa_date.setText(date)
self.elsa_semester.setText(semester)
self.elsa_prof.setCurrentText(prof)
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])
)
self.dokument_list_elsa.setItem(
0, 1, QtWidgets.QTableWidgetItem(document[1])
)
self.dokument_list_elsa.setItem(0, 2, QtWidgets.QTableWidgetItem(""))
self.dokument_list_elsa.setItem(
0, 3, QtWidgets.QTableWidgetItem("Database")
)
scans = self.db.getElsaMedia(elsa_id)
if scans == []:
self.MainWindow.setStatusTip("ELSA-Apparat hat noch keine Daten")
self.create_frame_elsa.setEnabled(True)
else:
self.MainWindow.setStatusTip(
"ELSA-Apparat hat bereits alle benötigten Daten"
)
for scan in scans:
self.table_elsa_list.insertRow(0)
self.table_elsa_list.setItem(0, 0, QtWidgets.QTableWidgetItem(scan[1]))
self.table_elsa_list.setItem(0, 1, QtWidgets.QTableWidgetItem(scan[2]))
self.table_elsa_list.setItem(0, 2, QtWidgets.QTableWidgetItem(scan[3]))
self.table_elsa_list.setItem(0, 3, QtWidgets.QTableWidgetItem(scan[4]))
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)
self.dokument_list_elsa.setItem(0, 0, QtWidgets.QTableWidgetItem(filename))
self.dokument_list_elsa.setItem(0, 1, QtWidgets.QTableWidgetItem(filetype))
self.dokument_list_elsa.setItem(0, 2, QtWidgets.QTableWidgetItem("*"))
self.dokument_list_elsa.setItem(0, 3, QtWidgets.QTableWidgetItem(file))
# set tooltip of row 3 to the file path for each row
self.dokument_list_elsa.item(0, 3).setToolTip(file)
data["name"] = filename
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:
# get length of elsa table
rows = self.elsa_table.rowCount()
elsa_id = rows + 1
self.db.insertElsaFile(datalist, elsa_id)
self.elsa_save.click()
def parseDokumentElsa(self):
if self.dokument_list_elsa.rowCount() == 0:
return
else:
# 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()
file = recreateElsaFile(
filename=filename, filetype=filetype, open=False
)
print(file)
data = elsa_word_to_csv(file)
for row in data:
self.table_elsa_list.insertRow(0)
ic(row)
chapter_title = row[2]
book_title = row[4]
signature = row[7]
pages = row[6]
data = {
"chapter": chapter_title,
"title": book_title,
"signature": signature,
"pages": pages,
}
self.table_elsa_list.setItem(
0, 0, QtWidgets.QTableWidgetItem(chapter_title)
)
self.table_elsa_list.setItem(
0, 1, QtWidgets.QTableWidgetItem(book_title)
)
self.table_elsa_list.setItem(
0, 2, QtWidgets.QTableWidgetItem(signature)
)
self.table_elsa_list.setItem(0, 3, QtWidgets.QTableWidgetItem(pages))
self.db.addElsaMedia(
data,
self.db.getElsaId(
self.elsa_prof.currentText(),
self.elsa_semester.text(),
self.elsa_date.text(),
),
)
def openDocumentElsa(self):
# open the selected document
row = self.dokument_list_elsa.currentRow()
location = self.dokument_list_elsa.item(row, 3).text()
filetype = self.dokument_list_elsa.item(row, 1).text()
filename = self.dokument_list_elsa.item(row, 0).text()
if location == "Database":
recreateElsaFile(filename, filetype, open=True)
else:
os.system(f"{filename}")
def notify_for_deletion(self): def notify_for_deletion(self):
# get all selected apparats # get all selected apparats
selected_apparats: list[dict] = [] selected_apparats: list[dict] = []
@@ -343,6 +549,12 @@ class Ui(Ui_Semesterapparat):
self.btn_notify_for_deletion.setEnabled(False) self.btn_notify_for_deletion.setEnabled(False)
def get_apparats(self):
alist = self.db.getAllAparats(deleted=0)
alist = natsorted(alist, key=lambda x: x[4], reverse=True)
for apparat in alist:
self.insert_apparat_into_table(apparat)
def populate_appfach_dropdown(self): def populate_appfach_dropdown(self):
self.app_fach.clear() self.app_fach.clear()
self.app_fach.addItem("") self.app_fach.addItem("")
@@ -356,10 +568,43 @@ class Ui(Ui_Semesterapparat):
# documentation.show() # documentation.show()
def tabW1_changed(self): def tabW1_changed(self):
if self.tabWidget.currentIndex() == 1: if self.tabWidget.currentIndex() == 1: # Statistic
# self.tabWidget.setCurrentIndex(1) # self.tabWidget.setCurrentIndex(1)
self.tabWidget_2.setCurrentIndex(1) self.tabWidget_2.setCurrentIndex(1)
self.tabWidget_2.setCurrentIndex(0) self.tabWidget_2.setCurrentIndex(0)
if self.tabWidget.currentIndex() == 0: # Apparate
# clear all entries from the table
self.tableWidget_apparate.setRowCount(0)
self.get_apparats()
if self.tabWidget.currentIndex() == 2: # Elsa
self.elsa_cancel_create.click()
try:
self.elsa_statistics.removeTab(1)
except:
pass
self.elsa_table.setRowCount(0)
elsa_apparats = self.db.getElsaApparats()
elsa_apparats = natsorted(elsa_apparats, key=lambda x: x[2], reverse=True)
graph_data = {}
for apparat in elsa_apparats:
print(apparat)
data = self.insert_elsa_into_table(apparat)
if data[0] in graph_data.keys():
graph_data["x"].append(data[0])
graph_data["y"].append(data[1])
else:
graph_data["x"] = [data[0]]
graph_data["y"] = [data[1]]
generateMissing = True if len(graph_data["x"]) > 1 else False
graph = DataGraph(
"ELSA Apparate pro Semester",
graph_data,
generateMissing,
"Anzahl der Apparate",
)
self.elsa_statistics.addTab(graph, "Graph")
def search_book(self): def search_book(self):
self.book_search_result.setRowCount(0) self.book_search_result.setRowCount(0)
@@ -772,13 +1017,12 @@ class Ui(Ui_Semesterapparat):
graph_data = { graph_data = {
"x": [i[0] for i in data], "x": [i[0] for i in data],
"y": [i[1] for i in data], "y": {"Erstellt": [i[1] for i in data], "Gelöscht": [i[2] for i in data]},
"y2": [i[2] for i in data],
} }
graph = GraphWidget(data=graph_data, legend_labels=["Erstellt", "Gelöscht"]) graph = DataGraph(title="Erstellte und gelöschte Apparate", data=graph_data)
# place the graph into tabWidget_3 # place the graph into tabWidget_3
self.tabWidget_3.addTab(graph, "Erstellte und gelöschte Semesterapparate") self.tabWidget_3.addTab(graph, "Graph")
self.tabWidget_3.setCurrentIndex(0) self.tabWidget_3.setCurrentIndex(0)
def tab_changed(self): def tab_changed(self):
@@ -787,11 +1031,6 @@ class Ui(Ui_Semesterapparat):
return return
elif curr_tab == 1: # statistics tab elif curr_tab == 1: # statistics tab
self.populate_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): def populate_dropdown(self, box, data):
box.clear() box.clear()
@@ -973,6 +1212,7 @@ class Ui(Ui_Semesterapparat):
self.cancel_active_selection.click() self.cancel_active_selection.click()
self.check_send_mail.show() self.check_send_mail.show()
self.chkbx_show_del_media.show() self.chkbx_show_del_media.show()
self.cancel_active_selection.setEnabled(False)
def confirm_popup(self, message: str): def confirm_popup(self, message: str):
dial = QtWidgets.QDialog() dial = QtWidgets.QDialog()
@@ -1132,7 +1372,7 @@ class Ui(Ui_Semesterapparat):
return None return None
def load_app_data(self, app_id=None): def load_app_data(self, app_id=None):
self.cancel_active_selection.setEnabled(True)
if isinstance(app_id, str): if isinstance(app_id, str):
# double click the tableWidget_apparate row with the given app_id # double click the tableWidget_apparate row with the given app_id
row, column = self.get_index_of_value(self.tableWidget_apparate, app_id) row, column = self.get_index_of_value(self.tableWidget_apparate, app_id)
@@ -1188,6 +1428,7 @@ class Ui(Ui_Semesterapparat):
self.btn_apparat_save.show() if self.btn_apparat_save.isHidden() else None self.btn_apparat_save.show() if self.btn_apparat_save.isHidden() else None
# clear dokumemt_list # clear dokumemt_list
self.dokument_list.setRowCount(0) self.dokument_list.setRowCount(0)
self.cancel_active_selection.setEnabled(True)
self.frame.setEnabled(True) self.frame.setEnabled(True)
self.sem_year.setEnabled(True) self.sem_year.setEnabled(True)
@@ -1712,6 +1953,7 @@ class Ui(Ui_Semesterapparat):
self.groupBox_2.hide() self.groupBox_2.hide()
self.groupBox.hide() self.groupBox.hide()
self.check_send_mail.setChecked(False) self.check_send_mail.setChecked(False)
self.cancel_active_selection.setEnabled(False)
if not self.validate_fields(): if not self.validate_fields():
self.confirm_popup("Bitte alle Pflichtfelder ausfüllen!") self.confirm_popup("Bitte alle Pflichtfelder ausfüllen!")
@@ -1793,7 +2035,6 @@ class Ui(Ui_Semesterapparat):
def insert_apparat_into_table(self, apparat): def insert_apparat_into_table(self, apparat):
# ic(apparat) # ic(apparat)
def __dauer_check(apparat): def __dauer_check(apparat):
return "Ja" if apparat[7] == 1 else "Nein" return "Ja" if apparat[7] == 1 else "Nein"