Files
SemesterapparatsManager/src/ui/widgets/elsa_main.py

477 lines
18 KiB
Python

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.ui import popus_confirm
from src.ui.dialogs import ElsaAddEntry
from src.ui.widgets import FilePicker
from src.ui.widgets import DataGraph
class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
def __init__(self):
super().__init__()
self.setupUi(self)
self.table_elsa_list.setContextMenuPolicy(
QtCore.Qt.ContextMenuPolicy.CustomContextMenu
)
self.table_elsa_list.customContextMenuRequested.connect(self.elsa_context_menu)
# elsa buttons
Icon("semester", self.active_semester)
Icon("today", self.elsa_date_today)
self.create_frame_elsa.setEnabled(False)
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_update.clicked.connect(self.update_elsa)
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)
self.quote_entry.clicked.connect(self.elsa_table_entry)
self.quote_entry.setEnabled(False)
self.newProf.hide()
Icon("person", self.prof_icon)
# validators
# prof mail
self.newProf_mail.setValidator(
QRegularExpressionValidator(
QtCore.QRegularExpression(
r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}"
)
)
)
self.newProf_telnr.setValidator(QtGui.QIntValidator())
self.newProf_telnr.setValidator(
QtGui.QRegularExpressionValidator(QtCore.QRegularExpression(r"^\d{3,14}"))
)
##Variables
self.logger = MyLogger("ElsaDialog")
self.db = Database()
self.graph_data = {"x": [generateSemesterByDate()], "y": [0]}
self.createProf = False
self.elsa_prof.addItems(self.getProfs())
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
self.elsa_prof.currentTextChanged.connect(self.checkProf)
self.newProf_mail.textChanged.connect(self.checkProfData)
self.newProf_telnr.textChanged.connect(self.checkProfData)
self.newProf_title.textChanged.connect(self.checkProfData)
self.loadFrame()
# self.show()
def checkProfData(self):
if (
(self.newProf_mail.text() != "" and self.newProf_mail.hasAcceptableInput())
and self.newProf_title.text() != ""
and (
self.newProf_telnr.text() != ""
and self.newProf_telnr.hasAcceptableInput()
)
):
self.elsa_save.setEnabled(True)
self.elsa_save.setToolTip("")
else:
self.elsa_save.setEnabled(False)
self.elsa_save.setToolTip("Bitte erst Daten eingeben")
def checkProf(self):
if (
", " in self.elsa_prof.currentText()
and self.elsa_prof.currentText() not in self.getProfs()
):
self.newProf.show()
self.elsa_save.setEnabled(False)
self.elsa_save.setToolTip("Bitte erst Daten eingeben")
self.createProf = True
else:
self.newProf.hide()
self.createProf = False
self.elsa_save.setEnabled(True)
self.elsa_save.setToolTip("")
def getProfs(self):
profs = self.db.getProfs()
profs = [f"{prof.lastname}, {prof.firstname}" for prof in profs]
profs = list(set(profs))
profs.sort()
return profs
def elsa_context_menu(self, position):
menu = QtWidgets.QMenu()
# TODO: add functions
pass
def elsa_table_entry(self):
data = ElsaAddEntry()
selected_row = self.table_elsa_list.currentRow()
signature = self.table_elsa_list.item(selected_row, 10).text()
mediatype = self.table_elsa_list.item(selected_row, 11).text()
data.searchIdent.setText(signature)
if mediatype == "Zeitschriftenaufsätze":
data.btn_zs.click()
elif mediatype == "Herausgeberwerke":
data.btn_hg.click()
elif mediatype == "Monografien":
data.btn_mono.click()
data.search()
data.exec()
def add_new_elsa(self):
self.create_frame_elsa.setEnabled(True)
self.elsa_cancel_create.setEnabled(True)
self.dokument_list_elsa.setRowCount(0)
profs = self.db.getProfs()
profs = [f"{prof.lastname}, {prof.firstname}" for prof in profs]
elsa_profs = self.db.getElsaProfs()
profs.extend(elsa_profs)
profs = list(set(profs))
profs.sort()
for prof in profs:
self.elsa_prof.addItem(prof)
self.elsa_prof.setCurrentText("")
self.elsa_date.setText("")
self.elsa_semester.setText("")
self.elsa_save.setEnabled(True)
self.elsa_update.setEnabled(False)
self.elsa_prof.setFocus()
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)
self.quote_entry.setEnabled(False)
self.elsa_save.setEnabled(False)
self.elsa_update.setEnabled(False)
def generateTodayDateElsa(self):
self.elsa_date.setText(QDate.currentDate().toString("dd.MM.yyyy"))
def addSemester(self):
self.elsa_semester.setText(generateSemesterByDate())
def update_elsa(self):
prof = self.elsa_prof.currentText()
date = self.elsa_date.text()
semester = self.elsa_semester.text()
elsa_id = self.db.getElsaId(prof, semester, date)
if elsa_id is None:
return
self.db.updateElsaApparat(elsa_id, prof, semester, date)
self.elsa_update.setEnabled(False)
self.cancel_elsa_creation()
def confirm_popup(self, message: str, title: str):
popup = popus_confirm(title=title)
popup.textEdit.setReadOnly(True)
popup.textEdit.setText(message)
popup.exec()
return popup.result()
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", title="Fehler")
return
prof = self.elsa_prof.currentText()
semester = self.elsa_semester.text()
date = self.elsa_date.text()
profdata = Prof(
firstname=prof.split(", ")[1],
lastname=prof.split(", ")[0],
mail=self.newProf_mail.text(),
telnr=self.newProf_telnr.text(),
title=self.newProf_title.text(),
fullname=f"{prof.split(", ")[0]} {prof.split(", ")[1]}",
)
prof_id = self.db.getProfId(profdata)
ic(profdata, prof_id)
if prof_id is None:
self.db.createProf(profdata)
prof_id = self.db.getProfId(prof)
elsa_id = self.db.createElsaApparat(
date,
prof_id,
semester,
)
if self.dokument_list_elsa.rowCount() > 0:
files = []
for i in range(self.dokument_list_elsa.rowCount()):
filename = self.dokument_list_elsa.item(i, 0).text()
filetype = self.dokument_list_elsa.item(i, 1).text()
file_path = self.dokument_list_elsa.item(i, 3).text()
file = {"name": filename, "path": file_path, "type": filetype}
files.append(file)
self.db.insertElsaFile(
files,
elsa_id,
)
self.cancel_elsa_creation()
self.refresh_elsa_table()
self.elsa_prof.clear()
self.elsa_prof.addItems(self.getProfs())
self.elsa_prof.addItem("")
self.elsa_prof.setCurrentText("")
self.quote_entry.setEnabled(False)
def refresh_elsa_table(self):
self.elsa_table.setRowCount(0)
elsa_apparats = self.db.getElsaApparats()
for apparat in elsa_apparats:
self.insert_elsa_into_table(apparat)
def insert_elsa_into_table(self, apparat):
self.elsa_table.insertRow(0)
date = apparat[1]
semester = apparat[2]
prof = self.db.getProfNameById(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()
print(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")
return
self.create_frame_elsa.setEnabled(True)
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
self.elsa_date.setText(date)
self.elsa_semester.setText(semester)
self.elsa_prof.setCurrentText(prof)
ic(elsa_id)
if elsa_id is None:
log.
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])
)
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.create_frame_elsa.setEnabled(True)
for scan in scans:
self.setElsaRow(scan)
self.quote_entry.setEnabled(True)
# self.cancel_elsa_creation()
def setElsaRow(self, scan):
self.table_elsa_list.insertRow(0)
self.table_elsa_list.setItem(
0, 0, QtWidgets.QTableWidgetItem(scan["work_author"])
)
self.table_elsa_list.setItem(
0, 1, QtWidgets.QTableWidgetItem(scan["section_author"])
)
self.table_elsa_list.setItem(0, 2, QtWidgets.QTableWidgetItem(scan["year"]))
self.table_elsa_list.setItem(0, 3, QtWidgets.QTableWidgetItem(scan["issue"]))
self.table_elsa_list.setItem(0, 4, QtWidgets.QTableWidgetItem(scan["edition"]))
self.table_elsa_list.setItem(
0, 5, QtWidgets.QTableWidgetItem(scan["work_title"])
)
self.table_elsa_list.setItem(
0, 6, QtWidgets.QTableWidgetItem(scan["chapter_title"])
)
self.table_elsa_list.setItem(
0,
7,
QtWidgets.QTableWidgetItem(scan["pages"]),
)
self.table_elsa_list.setItem(0, 8, QtWidgets.QTableWidgetItem(scan["location"]))
self.table_elsa_list.setItem(
0, 9, QtWidgets.QTableWidgetItem(scan["publisher"])
)
self.table_elsa_list.setItem(
0, 10, QtWidgets.QTableWidgetItem(scan["signature"])
)
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)
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:
# # 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:
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, doctype = elsa_word_to_csv(file)
elsa_id = self.db.getElsaId(
self.elsa_prof.currentText(),
self.elsa_semester.text(),
self.elsa_date.text(),
)
for row in data:
if ";" in row["pages"]:
count = row["pages"].split(";")
for i in range(len(count)):
row["pages"] = count[i]
self.setElsaRow(
row,
)
else:
self.setElsaRow(row)
self.db.addElsaMedia(row, elsa_id)
self.quote_entry.setEnabled(True)
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 loadFrame(self):
self.elsa_cancel_create.click()
try:
self.elsa_statistics.removeTab(1)
except:
self.logger.log_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]
if semester not in self.graph_data["x"]:
self.graph_data["x"].append(semester)
self.graph_data["y"].append(number)
else:
index = self.graph_data["x"].index(semester)
self.graph_data["y"][index] += number
generateMissing = True if len(self.graph_data["x"]) > 1 else False
graph = DataGraph(
"ELSA Apparate pro Semester",
self.graph_data,
generateMissing,
"Anzahl der Apparate",
)
ic(self.graph_data)
self.elsa_statistics_table.setRowCount(0)
for i in range(len(self.graph_data["x"])):
self.elsa_statistics_table.insertRow(0)
self.elsa_statistics_table.setItem(
0, 0, QtWidgets.QTableWidgetItem(self.graph_data["x"][i])
)
self.elsa_statistics_table.setItem(
0, 1, QtWidgets.QTableWidgetItem(str(self.graph_data["y"][i]))
)
self.elsa_statistics.addTab(graph, "Graph")
def launch():
app = QtWidgets.QApplication([])
window = ElsaDialog()
window.show()
app.exec()