small fixes, working state, ui update

This commit is contained in:
WorldTeacher
2024-02-12 14:03:06 +01:00
parent cbd3ae80c7
commit 892fa97f58
5 changed files with 128 additions and 100 deletions

View File

@@ -114,7 +114,7 @@ class Database:
result = self.query_db("SELECT bookdata, id FROM media WHERE app_id=? AND prof_id=?", (app_id,prof_id)) result = self.query_db("SELECT bookdata, id FROM media WHERE app_id=? AND prof_id=?", (app_id,prof_id))
books = [(load_pickle(i[0]),i[1]) for i in result] books = [(load_pickle(i[0]),i[1]) for i in result]
# ic(books) # ic(books)
book = [i for i in books if i[0].signature == signature][0] book = [i for i in books if i[0].signature == signature][0][1]
return book return book
def getBookBasedOnSignature(self, app_id:str, prof_id:str,signature:str)->BookData: def getBookBasedOnSignature(self, app_id:str, prof_id:str,signature:str)->BookData:
result = self.query_db("SELECT bookdata FROM media WHERE app_id=? AND prof_id=?", (app_id,prof_id)) result = self.query_db("SELECT bookdata FROM media WHERE app_id=? AND prof_id=?", (app_id,prof_id))
@@ -179,7 +179,6 @@ class Database:
qdata = self.query_db(f"SELECT id,bookdata,available FROM media WHERE (app_id={app_id} AND prof_id={prof_id}) AND (deleted={deleted if deleted == 0 else '1 OR deleted=0'})") qdata = self.query_db(f"SELECT id,bookdata,available FROM media WHERE (app_id={app_id} AND prof_id={prof_id}) AND (deleted={deleted if deleted == 0 else '1 OR deleted=0'})")
ret_result = [] ret_result = []
for result_a in qdata: for result_a in qdata:
ic(result_a)
data = {"id": int, "bookdata": BookData, "available": int} data = {"id": int, "bookdata": BookData, "available": int}
data["id"] = result_a[0] data["id"] = result_a[0]
data["bookdata"] = pickle.loads(result_a[1]) data["bookdata"] = pickle.loads(result_a[1])

View File

@@ -12,9 +12,10 @@ from icecream import ic
class BookGrabber(QThread): class BookGrabber(QThread):
updateSignal = pyqtSignal(int, int) updateSignal = pyqtSignal(int, int)
done = pyqtSignal()
def __init__(self,app_id, prof_id, mode, data, parent=None): def __init__(self,app_id, prof_id, mode, data, parent=None):
super(BookGrabber, self).__init__(parent = None) super(BookGrabber, self).__init__(parent = None)
self.is_Running = True
self.logger = MyLogger("Worker") self.logger = MyLogger("Worker")
self.logger.log_info("Starting worker thread") self.logger.log_info("Starting worker thread")
self.data = data self.data = data
@@ -36,71 +37,71 @@ class BookGrabber(QThread):
# self.book_id = None # self.book_id = None
def run(self): def run(self):
self.db = Database() while self.is_Running:
item = 0 self.db = Database()
iterdata = self.data item = 0
print(iterdata) iterdata = self.data
for entry in iterdata: print(iterdata)
signature = str(entry) for entry in iterdata:
self.logger.log_info("Processing entry: " + signature) signature = str(entry)
self.logger.log_info("Processing entry: " + signature)
webdata = WebRequest().get_ppn(entry).get_data() webdata = WebRequest().get_ppn(entry).get_data()
if webdata == "error": if webdata == "error":
continue continue
bd = BibTextTransformer(self.mode).get_data(webdata).return_data() bd = BibTextTransformer(self.mode).get_data(webdata).return_data()
transformer = BibTextTransformer("RDS") transformer = BibTextTransformer("RDS")
rds = transformer.get_data(webdata).return_data("rds_availability") rds = transformer.get_data(webdata).return_data("rds_availability")
bd.signature = entry bd.signature = entry
# confirm lock is acquired # confirm lock is acquired
print("lock acquired, adding book to database") print("lock acquired, adding book to database")
self.db.addBookToDatabase(bd, self.app_id, self.prof_id) self.db.addBookToDatabase(bd, self.app_id, self.prof_id)
# get latest book id # get latest book id
self.book_id = self.db.getLastBookId() self.book_id = self.db.getLastBookId()
self.logger.log_info("Added book to database") self.logger.log_info("Added book to database")
state = 0 state = 0
print(len(rds.items)) print(len(rds.items))
for rds_item in rds.items: for rds_item in rds.items:
sign = rds_item.superlocation sign = rds_item.superlocation
loc = rds_item.location loc = rds_item.location
# print(item.location) ic(sign,loc)
if self.app_id in sign or self.app_id in loc: ic(rds_item)
state = 1 if self.app_id in sign or self.app_id in loc:
break state = 1
break
# for book in self.books: # for book in self.books:
# if book["bookdata"].signature == entry: # if book["bookdata"].signature == entry:
# book_id = book["id"] # book_id = book["id"]
# break # break
self.logger.log_info(f"State of {signature}: {state}") self.logger.log_info(f"State of {signature}: {state}")
print( print(
"lock acquired, updating availability of " "updating availability of "
+ str(self.book_id) + str(self.book_id)
+ " to " + " to "
+ str(state) + str(state)
) )
try: try:
self.db.setAvailability(self.book_id, state) self.db.setAvailability(self.book_id, state)
except sqlite3.OperationalError as e: except sqlite3.OperationalError as e:
self.logger.log_error(f"Failed to update availability: {e}") self.logger.log_error(f"Failed to update availability: {e}")
# time.sleep(5)
item += 1
self.updateSignal.emit(item, len(self.data))
self.logger.log_info("Worker thread finished")
# teminate thread
self.app_id = None
self.prof_id = None
self.mode = None
self.data = None
self.quit()
# time.sleep(5)
item += 1
self.updateSignal.emit(item, len(self.data))
self.logger.log_info("Worker thread finished")
# self.done.emit()
if not self.is_Running:
break
def stop(self):
self.is_Running = False
class AvailChecker(QThread): class AvailChecker(QThread):
updateSignal = pyqtSignal(str, int) updateSignal = pyqtSignal(str, int)
updateProgress = pyqtSignal(int,int) updateProgress = pyqtSignal(int,int)
def __init__( def __init__(
self, links: list = [], appnumber: int = None, parent=None, books=list[dict] self, links: list = None, appnumber: int = None, parent=None, books=list[dict]
): ):
if links is None: if links is None:
links = [] links = []

View File

@@ -174,7 +174,6 @@ class Ui(Ui_Semesterapparat):
# self.tableWidget_apparate.text # self.tableWidget_apparate.text
self.actionEinstellungen.triggered.connect(self.open_settings) self.actionEinstellungen.triggered.connect(self.open_settings)
# set validators # set validators
self.sem_year.setValidator(QtGui.QIntValidator())
self.sem_year.setText(str(QtCore.QDate.currentDate().year())) self.sem_year.setText(str(QtCore.QDate.currentDate().year()))
self.prof_mail.setValidator( self.prof_mail.setValidator(
QRegularExpressionValidator( QRegularExpressionValidator(
@@ -306,7 +305,6 @@ class Ui(Ui_Semesterapparat):
self.pushButton.clicked.connect(self.delete_user) self.pushButton.clicked.connect(self.delete_user)
self.update_user.clicked.connect(self.update_user_data) self.update_user.clicked.connect(self.update_user_data)
self.update_faculty_member.clicked.connect(self.edit_faculty_member_action) self.update_faculty_member.clicked.connect(self.edit_faculty_member_action)
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("")
@@ -1100,7 +1098,6 @@ class Ui(Ui_Semesterapparat):
text = f"Medium {curr}/{total}" text = f"Medium {curr}/{total}"
self.logger.log_info(text) self.logger.log_info(text)
self.progress_label.setText(text) self.progress_label.setText(text)
self.MainWindow.setStatusTip(f"Medien werden hinzugefügt, bitte warten... {curr}/{total}")
# update tableWidget_apparat_media # update tableWidget_apparat_media
self.update_app_media_list() self.update_app_media_list()
@@ -1141,23 +1138,21 @@ class Ui(Ui_Semesterapparat):
# create apparat # create apparat
self.btn_save_apparat() self.btn_save_apparat()
# create a thread that updates the progress label after each medium # create a thread that updates the progress label after each medium
thread = QThread()
grabber = BookGrabber(mode=mode, app_id=app_id, prof_id=prof_id, data=data) grabber = BookGrabber(mode=mode, app_id=app_id, prof_id=prof_id, data=data)
# grabber.mode = mode # grabber.mode = mode
# grabber.data = data # grabber.data = data
# grabber.app_id = app_id # grabber.app_id = app_id
# grabber.prof_id = prof_id # grabber.prof_id = prof_id
grabber.moveToThread(thread)
grabber.finished.connect(thread.quit)
grabber.finished.connect(grabber.deleteLater) grabber.finished.connect(grabber.deleteLater)
grabber.finished.connect(self.hide_progress_label) grabber.finished.connect(self.hide_progress_label)
grabber.finished.connect(self.update_app_media_list) grabber.finished.connect(self.update_app_media_list)
grabber.updateSignal.connect(self.update_progress_label) grabber.updateSignal.connect(self.update_progress_label)
# worker.finished.connect(worker.deleteLater)
grabber.start() grabber.start()
self.threadeds.append(thread) # run grabber.deletelater
self.grabbers.append(grabber) grabber.stop()
grabber.wait()
grabber.quit()
# for book in data: # for book in data:
# # self.progress_label.setText(f"Medium {ct}/{len(data)}") # # self.progress_label.setText(f"Medium {ct}/{len(data)}")
@@ -1177,7 +1172,6 @@ class Ui(Ui_Semesterapparat):
self.threadeds.clear() self.threadeds.clear()
def _update_progress(current, all_titles): def _update_progress(current, all_titles):
self.avail_status.setText( "{}/{}".format(current, all_titles)) self.avail_status.setText( "{}/{}".format(current, all_titles))
self.btn_reserve.setStatusTip(f"Verfügbarkeit wird geprüft, bitte warten... {current}/{all_titles}")
def _hide_progress_label(): def _hide_progress_label():
self.label_20.hide() self.label_20.hide()
self.avail_status.hide() self.avail_status.hide()
@@ -1208,18 +1202,20 @@ class Ui(Ui_Semesterapparat):
deleted=0, deleted=0,
) )
thread = QThread() # thread = QThread()
appnumber = self.active_apparat() appnumber = self.active_apparat()
print(links) print(links)
availcheck = AvailChecker(links, appnumber, books=books) availcheck = AvailChecker(links, appnumber, books=books)
availcheck.moveToThread(thread) # availcheck.moveToThread(thread)
availcheck.finished.connect(thread.quit) # availcheck.finished.connect(thread.quit)
availcheck.finished.connect(availcheck.deleteLater) availcheck.finished.connect(availcheck.deleteLater)
availcheck.finished.connect(self.update_app_media_list) availcheck.finished.connect(self.update_app_media_list)
availcheck.updateProgress.connect(_update_progress) availcheck.updateProgress.connect(_update_progress)
availcheck.finished.connect(_hide_progress_label) availcheck.finished.connect(_hide_progress_label)
availcheck.start() availcheck.start()
self.threadeds.append(thread) # kill availcheck after completion
# self.threadeds.append(thread)
self.grabbers.append(availcheck) self.grabbers.append(availcheck)
def btn_cancel_active_selection(self): def btn_cancel_active_selection(self):
@@ -1533,17 +1529,16 @@ class Ui(Ui_Semesterapparat):
signatures = [i for i in signatures if i != ""] signatures = [i for i in signatures if i != ""]
ic(signatures) ic(signatures)
print("starting thread") print("starting thread")
thread = QThread()
grabber = BookGrabber(mode = "ARRAY", app_id = app_id,prof_id = prof_id,data = signatures) grabber = BookGrabber(mode = "ARRAY", app_id = app_id,prof_id = prof_id,data = signatures)
# grabber.mode = "ARRAY" # grabber.mode = "ARRAY"
# grabber.data = signatures # grabber.data = signatures
# grabber.app_id = app_id # grabber.app_id = app_id
# grabber.prof_id = prof_id # grabber.prof_id = prof_id
grabber.moveToThread(thread) # grabber.moveToThread(thread)
self.label_info.show() self.label_info.show()
self.progress_label.show() self.progress_label.show()
self.line_2.show() self.line_2.show()
grabber.finished.connect(thread.quit) # grabber.finished.connect(thread.quit)
grabber.finished.connect(grabber.deleteLater) grabber.finished.connect(grabber.deleteLater)
grabber.finished.connect(self.hide_progress_label) grabber.finished.connect(self.hide_progress_label)
grabber.finished.connect(self.update_app_media_list) grabber.finished.connect(self.update_app_media_list)
@@ -1553,6 +1548,7 @@ class Ui(Ui_Semesterapparat):
grabber.start() grabber.start()
# self.thread = thread # self.thread = thread
# kill grabber after completion
self.grabbers.append(grabber) self.grabbers.append(grabber)
def unlock_apparate(self): def unlock_apparate(self):
@@ -1818,7 +1814,7 @@ class Ui(Ui_Semesterapparat):
signature=book, signature=book,
prof_id=self.db.getProfId(self.drpdwn_prof_name.currentText()), prof_id=self.db.getProfId(self.drpdwn_prof_name.currentText()),
) )
book_id = self.db.getBookIdBasedOnSignature(self.active_apparat(),self.db.getProfId(self.drpdwn_prof_name.currentText()),book)
widget = QtWidgets.QDialog() widget = QtWidgets.QDialog()
bookedit = edit_bookdata_ui() bookedit = edit_bookdata_ui()
bookedit.setupUi(widget) bookedit.setupUi(widget)
@@ -1841,28 +1837,48 @@ class Ui(Ui_Semesterapparat):
selected_apparat_id = self.tableWidget_apparate.item( selected_apparat_id = self.tableWidget_apparate.item(
self.tableWidget_apparate.currentRow(), 0 self.tableWidget_apparate.currentRow(), 0
).text() ).text()
signature = self.tableWidget_apparat_media.item( # check how many rows are selected
self.tableWidget_apparat_media.currentRow(), 1 selected_rows = self.tableWidget_apparat_media.selectionModel().selectedRows()
).text() if len(selected_rows) == 1:
# bookdata= self.db.getBookIdBasedOnSignature(selected_apparat_id,prof_id=self.db.get_prof_id(self.drpdwn_prof_name.currentText()),signature=signature) signature = self.tableWidget_apparat_media.item(
book_id = self.db.getBookIdBasedOnSignature( self.tableWidget_apparat_media.currentRow(), 1
selected_apparat_id, ).text()
prof_id=self.db.getProfId(self.drpdwn_prof_name.currentText()), book_id = self.db.getBookIdBasedOnSignature(
signature=signature, selected_apparat_id,
) prof_id=self.db.getProfId(self.drpdwn_prof_name.currentText()),
message = f'Soll das Medium "{self.tableWidget_apparat_media.item(self.tableWidget_apparat_media.currentRow(),0).text()}" wirklich gelöscht werden?' signature=signature,
state = self.confirm_popup(message) )
print(state) message = f'Soll das Medium "{self.tableWidget_apparat_media.item(self.tableWidget_apparat_media.currentRow(),0).text()}" wirklich gelöscht werden?'
if state == 1: state = self.confirm_popup(message)
self.db.deleteBook(book_id) print(state)
self.update_app_media_list() if state == 1:
pass self.db.deleteBook(book_id)
self.update_app_media_list()
pass
else:
# get all selected rows
ranges = self.tableWidget_apparat_media.selectedRanges()
rows = []
for r in ranges:
for row in range(r.topRow(), r.bottomRow() + 1):
rows.append(row)
print(rows)
message = f"Sollen die {len(rows)} Medien wirklich gelöscht werden?"
state = self.confirm_popup(message)
if state == 1:
for _ in rows:
signature = self.tableWidget_apparat_media.item(_, 1).text()
book_id = self.db.getBookIdBasedOnSignature(
selected_apparat_id,
prof_id=self.db.getProfId(self.drpdwn_prof_name.currentText()),
signature=signature,
)
self.db.deleteBook(book_id)
self.update_app_media_list()
def extend_apparat(self): def extend_apparat(self):
framework = QtWidgets.QDialog() framework = QtWidgets.QDialog()
frame = App_Ext_Dialog() frame = App_Ext_Dialog()
frame.setupUi(framework) frame.setupUi(framework)
frame.sem_year.setValidator(QtGui.QIntValidator())
frame.sem_year.setText(str(QtCore.QDate.currentDate().year())) frame.sem_year.setText(str(QtCore.QDate.currentDate().year()))
framework.exec() framework.exec()
# return data from dialog if ok is pressed # return data from dialog if ok is pressed

View File

@@ -23,6 +23,7 @@ class Ui_MainWindow(object):
MainWindow.setMinimumSize(QtCore.QSize(1278, 800)) MainWindow.setMinimumSize(QtCore.QSize(1278, 800))
MainWindow.setMaximumSize(QtCore.QSize(1920, 800)) MainWindow.setMaximumSize(QtCore.QSize(1920, 800))
MainWindow.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) MainWindow.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu)
MainWindow.setStatusTip("")
self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget = QtWidgets.QWidget(MainWindow)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
@@ -1227,7 +1228,7 @@ class Ui_MainWindow(object):
self.retranslateUi(MainWindow) self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0) self.tabWidget.setCurrentIndex(0)
self.tabWidget_2.setCurrentIndex(0) self.tabWidget_2.setCurrentIndex(1)
self.stackedWidget_4.setCurrentIndex(1) self.stackedWidget_4.setCurrentIndex(1)
self.tabWidget_3.setCurrentIndex(1) self.tabWidget_3.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow)
@@ -1320,6 +1321,7 @@ class Ui_MainWindow(object):
self.label_6.setText(_translate("MainWindow", "Semester")) self.label_6.setText(_translate("MainWindow", "Semester"))
self.sem_year.setPlaceholderText(_translate("MainWindow", "2023")) self.sem_year.setPlaceholderText(_translate("MainWindow", "2023"))
self.label_2.setText(_translate("MainWindow", "Apparatsnummer")) self.label_2.setText(_translate("MainWindow", "Apparatsnummer"))
self.btn_apparat_save.setStatusTip(_translate("MainWindow", "searching"))
self.btn_apparat_save.setText(_translate("MainWindow", "Speichern")) self.btn_apparat_save.setText(_translate("MainWindow", "Speichern"))
self.btn_apparat_apply.setText(_translate("MainWindow", "Aktualisieren")) self.btn_apparat_apply.setText(_translate("MainWindow", "Aktualisieren"))
self.check_eternal_app.setText(_translate("MainWindow", "Dauerapparat")) self.check_eternal_app.setText(_translate("MainWindow", "Dauerapparat"))
@@ -1350,7 +1352,8 @@ class Ui_MainWindow(object):
item = self.tableWidget_apparat_media.horizontalHeaderItem(3) item = self.tableWidget_apparat_media.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "Autor")) item.setText(_translate("MainWindow", "Autor"))
item = self.tableWidget_apparat_media.horizontalHeaderItem(4) item = self.tableWidget_apparat_media.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "verfügbar?")) item.setText(_translate("MainWindow", "im Apparat?"))
item.setToolTip(_translate("MainWindow", "Diese Angabe ist nicht zuverlässig. Ist das ❌ vorhanden, kann das Medium im Apparat sein, aber aufgrund eines Bugs nicht gefunden worden"))
item = self.tableWidget_apparat_media.horizontalHeaderItem(5) item = self.tableWidget_apparat_media.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "Vorgemerkt")) item.setText(_translate("MainWindow", "Vorgemerkt"))
item = self.tableWidget_apparat_media.horizontalHeaderItem(6) item = self.tableWidget_apparat_media.horizontalHeaderItem(6)

View File

@@ -40,6 +40,9 @@
<property name="windowTitle"> <property name="windowTitle">
<string>Semesterapparatsmanagement</string> <string>Semesterapparatsmanagement</string>
</property> </property>
<property name="statusTip">
<string/>
</property>
<widget class="QWidget" name="centralwidget"> <widget class="QWidget" name="centralwidget">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -607,6 +610,9 @@
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="statusTip">
<string>searching</string>
</property>
<property name="text"> <property name="text">
<string>Speichern</string> <string>Speichern</string>
</property> </property>
@@ -1228,7 +1234,10 @@
</column> </column>
<column> <column>
<property name="text"> <property name="text">
<string>verfügbar?</string> <string>im Apparat?</string>
</property>
<property name="toolTip">
<string>Diese Angabe ist nicht zuverlässig. Ist das ❌ vorhanden, kann das Medium im Apparat sein, aber aufgrund eines Bugs nicht gefunden worden</string>
</property> </property>
</column> </column>
<column> <column>
@@ -1427,7 +1436,7 @@
</size> </size>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>1</number>
</property> </property>
<widget class="QWidget" name="tab_3"> <widget class="QWidget" name="tab_3">
<attribute name="title"> <attribute name="title">