delete unneeded files
This commit is contained in:
@@ -1,27 +0,0 @@
|
|||||||
from docx import Document
|
|
||||||
|
|
||||||
data = {}
|
|
||||||
wordDoc = Document("files/Semesterapparat - Anmeldung.docx")
|
|
||||||
paragraphs = wordDoc.tables
|
|
||||||
for table in paragraphs:
|
|
||||||
for column in table.columns:
|
|
||||||
cellcount = 0
|
|
||||||
for _cell in column.cells:
|
|
||||||
if cellcount < 12:
|
|
||||||
cellcount += 1
|
|
||||||
# print(f"cell:{cell.text}")
|
|
||||||
|
|
||||||
# # print(f'paragraphs[{i}]: {paragraphs[i]}')
|
|
||||||
# data[i] = paragraphs[i]
|
|
||||||
|
|
||||||
# for i in range(0, len(paragraphs)):
|
|
||||||
# for i in range(2, len(paragraphs)):
|
|
||||||
# data[i] = paragraphs[i]
|
|
||||||
|
|
||||||
# print(data)
|
|
||||||
|
|
||||||
# for table in wordDoc.tables:
|
|
||||||
# for row in table.rows:
|
|
||||||
# # print('---')
|
|
||||||
# for cell in row.cells:
|
|
||||||
# # print(f'cell:{cell.text}')
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
import tabula
|
|
||||||
|
|
||||||
file = "files/Semesterapparat - Anmeldung.pdf"
|
|
||||||
|
|
||||||
|
|
||||||
def extract_book_data(file):
|
|
||||||
tabula.read_pdf(file, pages="all", encoding="utf-8", multiple_tables=True)
|
|
||||||
tabula.convert_into(file, file.replace(".pdf"), output_format="csv", pages="all")
|
|
||||||
with open("files/Semesterapparat - Anmeldung.csv", "r") as f:
|
|
||||||
f.read()
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
@@ -1,194 +0,0 @@
|
|||||||
import os
|
|
||||||
|
|
||||||
# from icecream import ic
|
|
||||||
from omegaconf import OmegaConf
|
|
||||||
from PyQt6 import QtWidgets
|
|
||||||
from PyQt6.QtCore import QThread
|
|
||||||
from PyQt6.QtCore import pyqtSignal as Signal
|
|
||||||
|
|
||||||
from src.backend.database import Database
|
|
||||||
from src.logic.log import MyLogger
|
|
||||||
from src.logic.webrequest import BibTextTransformer, WebRequest
|
|
||||||
|
|
||||||
# from src.transformers import RDS_AVAIL_DATA
|
|
||||||
from src.ui.dialogs.Ui_mail_preview import Ui_eMailPreview
|
|
||||||
|
|
||||||
config = OmegaConf.load("config.yaml")
|
|
||||||
|
|
||||||
|
|
||||||
class BackgroundChecker(QThread):
|
|
||||||
"""Check all apparats for available Books"""
|
|
||||||
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class MockAvailCheck:
|
|
||||||
def __init__(
|
|
||||||
self, links: list = None, appnumber: int = None, parent=None, books=list[dict]
|
|
||||||
):
|
|
||||||
if links is None:
|
|
||||||
links = []
|
|
||||||
super().__init__(parent)
|
|
||||||
self.logger = MyLogger("MockAvailChecker")
|
|
||||||
self.logger.log_info("Starting worker thread")
|
|
||||||
self.logger.log_info(
|
|
||||||
"Checking availability for "
|
|
||||||
+ str(links)
|
|
||||||
+ " with appnumber "
|
|
||||||
+ str(appnumber)
|
|
||||||
+ "..."
|
|
||||||
)
|
|
||||||
self.links = links
|
|
||||||
self.appnumber = appnumber
|
|
||||||
self.books = books
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.db = Database()
|
|
||||||
state = 0
|
|
||||||
count = 0
|
|
||||||
result = []
|
|
||||||
for link in self.links:
|
|
||||||
self.logger.log_info("Processing entry: " + str(link))
|
|
||||||
data = WebRequest().get_ppn(link).get_data()
|
|
||||||
transformer = BibTextTransformer("RDS")
|
|
||||||
rds = transformer.get_data(data).return_data("rds_availability")
|
|
||||||
|
|
||||||
for item in rds.items:
|
|
||||||
sign = item.superlocation
|
|
||||||
loc = item.location
|
|
||||||
# ic(item.location, item.superlocation)
|
|
||||||
if self.appnumber in sign or self.appnumber in loc:
|
|
||||||
state = 1
|
|
||||||
book_id = None
|
|
||||||
for book in self.books:
|
|
||||||
if book["bookdata"].signature == link:
|
|
||||||
book_id = book["id"]
|
|
||||||
break
|
|
||||||
self.logger.log_info(f"State of {link}: " + str(state))
|
|
||||||
print(
|
|
||||||
"lock acquired, updating availability of "
|
|
||||||
+ str(book_id)
|
|
||||||
+ " to "
|
|
||||||
+ str(state)
|
|
||||||
)
|
|
||||||
result.append((item.callnumber, state))
|
|
||||||
count += 1
|
|
||||||
return result
|
|
||||||
|
|
||||||
self.logger.log_info("Worker thread finished")
|
|
||||||
# teminate thread
|
|
||||||
|
|
||||||
|
|
||||||
class Mailer(Ui_eMailPreview):
|
|
||||||
updateSignal = Signal(int)
|
|
||||||
|
|
||||||
def __init__(self, data=None, parent=None):
|
|
||||||
super(QThread).__init__()
|
|
||||||
super(Ui_eMailPreview).__init__()
|
|
||||||
|
|
||||||
self.logger = MyLogger("Mailer")
|
|
||||||
self.data = data
|
|
||||||
self.appid = data["app_id"]
|
|
||||||
self.appname = data["app_name"]
|
|
||||||
self.subject = data["app_subject"]
|
|
||||||
self.profname = data["prof_name"]
|
|
||||||
self.mail_data = ""
|
|
||||||
self.prof_mail = data["prof_mail"]
|
|
||||||
self.dialog = QtWidgets.QDialog()
|
|
||||||
self.comboBox.currentIndexChanged.connect(self.set_mail)
|
|
||||||
self.prof_name.setText(self.prof_name)
|
|
||||||
self.mail_name.setText(self.prof_mail)
|
|
||||||
self.load_mail_templates()
|
|
||||||
self.gender_female.clicked.connect(self.set_mail)
|
|
||||||
self.gender_male.clicked.connect(self.set_mail)
|
|
||||||
self.gender_non.clicked.connect(self.set_mail)
|
|
||||||
self.buttonBox.accepted.connect(self.createAndSendMail)
|
|
||||||
|
|
||||||
def load_mail_templates(self):
|
|
||||||
# print("loading mail templates")
|
|
||||||
mail_templates = os.listdir("mail_vorlagen")
|
|
||||||
for template in mail_templates:
|
|
||||||
self.comboBox.addItem(template)
|
|
||||||
|
|
||||||
def get_greeting(self):
|
|
||||||
if self.gender_male.isChecked():
|
|
||||||
return "Sehr geehrter Herr"
|
|
||||||
elif self.gender_female.isChecked():
|
|
||||||
return "Sehr geehrte Frau"
|
|
||||||
elif self.gender_non.isChecked():
|
|
||||||
return "Guten Tag"
|
|
||||||
|
|
||||||
def set_mail(self):
|
|
||||||
email_template = self.comboBox.currentText()
|
|
||||||
if email_template == "":
|
|
||||||
return
|
|
||||||
with open(f"mail_vorlagen/{email_template}", "r", encoding="utf-8") as f:
|
|
||||||
mail_template = f.read()
|
|
||||||
email_header = email_template.split(".eml")[0]
|
|
||||||
if "{AppNr}" in email_template:
|
|
||||||
email_header = email_template.split(".eml")[0]
|
|
||||||
email_header = email_header.format(AppNr=self.appid, AppName=self.appname)
|
|
||||||
self.mail_header.setText(email_header)
|
|
||||||
self.mail_data = mail_template.split("<html>")[0]
|
|
||||||
mail_html = mail_template.split("<html>")[1]
|
|
||||||
mail_html = "<html>" + mail_html
|
|
||||||
Appname = self.appname
|
|
||||||
mail_html = mail_html.format(
|
|
||||||
Profname=self.prof_name.text().split(" ")[-1],
|
|
||||||
Appname=Appname,
|
|
||||||
AppNr=self.appid,
|
|
||||||
AppSubject=self.subject,
|
|
||||||
greeting=self.get_greeting(),
|
|
||||||
)
|
|
||||||
|
|
||||||
self.mail_body.setHtml(mail_html)
|
|
||||||
|
|
||||||
def createAndSendMail(self):
|
|
||||||
import smtplib
|
|
||||||
from email.mime.multipart import MIMEMultipart
|
|
||||||
from email.mime.text import MIMEText
|
|
||||||
|
|
||||||
smtp_server = config["mail"]["smtp_server"]
|
|
||||||
port: int = config["mail"]["port"]
|
|
||||||
sender_email = config["mail"]["sender"]
|
|
||||||
password = config["mail"]["password"]
|
|
||||||
message = MIMEMultipart()
|
|
||||||
message["From"] = sender_email
|
|
||||||
message["To"] = self.prof_mail
|
|
||||||
message["Subject"] = self.mail_header.text()
|
|
||||||
mail_body = self.mail_body.toHtml()
|
|
||||||
message.attach(MIMEText(mail_body, "html"))
|
|
||||||
mail = message.as_string()
|
|
||||||
|
|
||||||
server = smtplib.SMTP_SSL(smtp_server, port)
|
|
||||||
# server.starttls()
|
|
||||||
# server.auth(mechanism="PLAIN")
|
|
||||||
if config["mail"]["use_user_name"] == 1:
|
|
||||||
# print(config["mail"]["user_name"])
|
|
||||||
server.login(config["mail"]["user_name"], password)
|
|
||||||
else:
|
|
||||||
server.login(sender_email, password)
|
|
||||||
server.sendmail(sender_email, self.prof_mail, mail)
|
|
||||||
# print("Mail sent")
|
|
||||||
# end active process
|
|
||||||
server.quit()
|
|
||||||
|
|
||||||
|
|
||||||
class MailThread(QThread):
|
|
||||||
updateSignal = Signal(int)
|
|
||||||
|
|
||||||
def __init__(self, data=None, parent=None):
|
|
||||||
super(QThread).__init__()
|
|
||||||
super(MailThread).__init__()
|
|
||||||
self.logger = MyLogger("MailThread")
|
|
||||||
self.data = data
|
|
||||||
|
|
||||||
def show_ui(self):
|
|
||||||
self.mailer = Mailer()
|
|
||||||
self.mailer.__init__()
|
|
||||||
self.mailer.dialog.exec_()
|
|
||||||
self.mailer.dialog.show()
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.show_ui()
|
|
||||||
self.updateSignal.emit(1)
|
|
||||||
@@ -1,266 +0,0 @@
|
|||||||
import sqlite3
|
|
||||||
import time
|
|
||||||
|
|
||||||
from PyQt6.QtCore import QThread, pyqtSignal
|
|
||||||
|
|
||||||
from src.backend.database import Database
|
|
||||||
from src.logic.log import MyLogger
|
|
||||||
from src.logic.webrequest import BibTextTransformer, WebRequest
|
|
||||||
|
|
||||||
# from icecream import ic
|
|
||||||
|
|
||||||
|
|
||||||
class BookGrabber(QThread):
|
|
||||||
updateSignal = pyqtSignal(int, int)
|
|
||||||
|
|
||||||
def __init__(self, filename):
|
|
||||||
super(BookGrabber, self).__init__(parent=None)
|
|
||||||
self.is_Running = True
|
|
||||||
self.logger = MyLogger("Worker")
|
|
||||||
self.logger.log_info("Starting worker thread")
|
|
||||||
self.data, self.app_id, self.prof_id, self.mode = self.readFile(filename)
|
|
||||||
|
|
||||||
self.book_id = None
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
def readFile(self, filename):
|
|
||||||
with open(filename, "r") as file:
|
|
||||||
data = file.readlines()
|
|
||||||
app_id = data[0].strip()
|
|
||||||
prof_id = data[1].strip()
|
|
||||||
mode = data[2].strip()
|
|
||||||
data = data[3:]
|
|
||||||
return data, app_id, prof_id, mode
|
|
||||||
|
|
||||||
# def resetValues(self):
|
|
||||||
# self.app_id = None
|
|
||||||
# self.prof_id = None
|
|
||||||
# self.mode = None
|
|
||||||
# self.data = None
|
|
||||||
# self.book_id = None
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
while self.is_Running:
|
|
||||||
self.db = Database()
|
|
||||||
item = 0
|
|
||||||
iterdata = self.data
|
|
||||||
print(iterdata)
|
|
||||||
for entry in iterdata:
|
|
||||||
signature = str(entry)
|
|
||||||
self.logger.log_info("Processing entry: " + signature)
|
|
||||||
|
|
||||||
webdata = WebRequest().get_ppn(entry).get_data()
|
|
||||||
if webdata == "error":
|
|
||||||
continue
|
|
||||||
bd = BibTextTransformer(self.mode).get_data(webdata).return_data()
|
|
||||||
transformer = BibTextTransformer("RDS")
|
|
||||||
rds = transformer.get_data(webdata).return_data("rds_availability")
|
|
||||||
bd.signature = entry
|
|
||||||
# confirm lock is acquired
|
|
||||||
print("lock acquired, adding book to database")
|
|
||||||
self.db.addBookToDatabase(bd, self.app_id, self.prof_id)
|
|
||||||
# get latest book id
|
|
||||||
self.book_id = self.db.getLastBookId()
|
|
||||||
self.logger.log_info("Added book to database")
|
|
||||||
state = 0
|
|
||||||
print(len(rds.items))
|
|
||||||
for rds_item in rds.items:
|
|
||||||
sign = rds_item.superlocation
|
|
||||||
loc = rds_item.location
|
|
||||||
# ic(sign, loc)
|
|
||||||
# ic(rds_item)
|
|
||||||
if self.app_id in sign or self.app_id in loc:
|
|
||||||
state = 1
|
|
||||||
break
|
|
||||||
|
|
||||||
# for book in self.books:
|
|
||||||
# if book["bookdata"].signature == entry:
|
|
||||||
# book_id = book["id"]
|
|
||||||
# break
|
|
||||||
self.logger.log_info(f"State of {signature}: {state}")
|
|
||||||
print(
|
|
||||||
"updating availability of "
|
|
||||||
+ str(self.book_id)
|
|
||||||
+ " to "
|
|
||||||
+ str(state)
|
|
||||||
)
|
|
||||||
try:
|
|
||||||
self.db.setAvailability(self.book_id, state)
|
|
||||||
except sqlite3.OperationalError as 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")
|
|
||||||
self.stop()
|
|
||||||
if not self.is_Running:
|
|
||||||
break
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
self.is_Running = False
|
|
||||||
|
|
||||||
|
|
||||||
class AvailChecker(QThread):
|
|
||||||
updateSignal = pyqtSignal(str, int)
|
|
||||||
updateProgress = pyqtSignal(int, int)
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self, links: list = None, appnumber: int = None, parent=None, books=list[dict]
|
|
||||||
):
|
|
||||||
if links is None:
|
|
||||||
links = []
|
|
||||||
super().__init__(parent)
|
|
||||||
self.logger = MyLogger("AvailChecker")
|
|
||||||
self.logger.log_info("Starting worker thread")
|
|
||||||
self.logger.log_info(
|
|
||||||
"Checking availability for "
|
|
||||||
+ str(links)
|
|
||||||
+ " with appnumber "
|
|
||||||
+ str(appnumber)
|
|
||||||
+ "..."
|
|
||||||
)
|
|
||||||
self.links = links
|
|
||||||
self.appnumber = appnumber
|
|
||||||
self.books = books
|
|
||||||
self.logger.log_info(
|
|
||||||
f"Started worker with appnumber: {self.appnumber} and links: {self.links} and {len(self.books)} books..."
|
|
||||||
)
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.db = Database()
|
|
||||||
state = 0
|
|
||||||
count = 0
|
|
||||||
for link in self.links:
|
|
||||||
self.logger.log_info("Processing entry: " + str(link))
|
|
||||||
data = WebRequest().get_ppn(link).get_data()
|
|
||||||
transformer = BibTextTransformer("RDS")
|
|
||||||
rds = transformer.get_data(data).return_data("rds_availability")
|
|
||||||
|
|
||||||
book_id = None
|
|
||||||
for item in rds.items:
|
|
||||||
sign = item.superlocation
|
|
||||||
loc = item.location
|
|
||||||
# print(item.location)
|
|
||||||
if self.appnumber in sign or self.appnumber in loc:
|
|
||||||
state = 1
|
|
||||||
break
|
|
||||||
for book in self.books:
|
|
||||||
if book["bookdata"].signature == link:
|
|
||||||
book_id = book["id"]
|
|
||||||
break
|
|
||||||
self.logger.log_info(f"State of {link}: " + str(state))
|
|
||||||
print("Updating availability of " + str(book_id) + " to " + str(state))
|
|
||||||
self.db.setAvailability(book_id, state)
|
|
||||||
count += 1
|
|
||||||
self.updateProgress.emit(count, len(self.links))
|
|
||||||
self.updateSignal.emit(item.callnumber, state)
|
|
||||||
|
|
||||||
self.logger.log_info("Worker thread finished")
|
|
||||||
# teminate thread
|
|
||||||
|
|
||||||
self.quit()
|
|
||||||
|
|
||||||
|
|
||||||
class AutoAdder(QThread):
|
|
||||||
updateSignal = pyqtSignal(int)
|
|
||||||
|
|
||||||
setTextSignal = pyqtSignal(int)
|
|
||||||
progress = pyqtSignal(int)
|
|
||||||
|
|
||||||
def __init__(self, data=None, app_id=None, prof_id=None, parent=None):
|
|
||||||
super().__init__(parent)
|
|
||||||
self.logger = MyLogger("AutoAdder")
|
|
||||||
self.data = data
|
|
||||||
self.app_id = app_id
|
|
||||||
self.prof_id = prof_id
|
|
||||||
|
|
||||||
print("Launched AutoAdder")
|
|
||||||
print(self.data, self.app_id, self.prof_id)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.db = Database()
|
|
||||||
# show the dialog, start the thread to gather data and dynamically update progressbar and listwidget
|
|
||||||
self.logger.log_info("Starting worker thread")
|
|
||||||
item = 0
|
|
||||||
for entry in self.data:
|
|
||||||
try:
|
|
||||||
# webdata = WebRequest().get_ppn(entry).get_data()
|
|
||||||
# bd = BibTextTransformer("ARRAY").get_data(webdata).return_data()
|
|
||||||
# bd.signature = entry
|
|
||||||
self.updateSignal.emit(item)
|
|
||||||
self.setTextSignal.emit(entry)
|
|
||||||
# qsleep
|
|
||||||
item += 1
|
|
||||||
self.progress.emit(item)
|
|
||||||
print(item, len(self.data))
|
|
||||||
time.sleep(1)
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
self.logger.log_exception(
|
|
||||||
f"The query failed with message {e} for signature {entry}"
|
|
||||||
)
|
|
||||||
continue
|
|
||||||
if item == len(self.data):
|
|
||||||
self.logger.log_info("Worker thread finished")
|
|
||||||
# teminate thread
|
|
||||||
self.finished.emit()
|
|
||||||
|
|
||||||
|
|
||||||
class MockAvailCheck:
|
|
||||||
def __init__(
|
|
||||||
self, links: list = None, appnumber: int = None, parent=None, books=list[dict]
|
|
||||||
):
|
|
||||||
if links is None:
|
|
||||||
links = []
|
|
||||||
super().__init__(parent)
|
|
||||||
self.logger = MyLogger("MockAvailChecker")
|
|
||||||
self.logger.log_info("Starting worker thread")
|
|
||||||
self.logger.log_info(
|
|
||||||
"Checking availability for "
|
|
||||||
+ str(links)
|
|
||||||
+ " with appnumber "
|
|
||||||
+ str(appnumber)
|
|
||||||
+ "..."
|
|
||||||
)
|
|
||||||
self.links = links
|
|
||||||
self.appnumber = appnumber
|
|
||||||
self.books = books
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.db = Database()
|
|
||||||
state = 0
|
|
||||||
count = 0
|
|
||||||
result = []
|
|
||||||
for link in self.links:
|
|
||||||
self.logger.log_info("Processing entry: " + str(link))
|
|
||||||
data = WebRequest().get_ppn(link).get_data()
|
|
||||||
transformer = BibTextTransformer("RDS")
|
|
||||||
rds = transformer.get_data(data).return_data("rds_availability")
|
|
||||||
|
|
||||||
for item in rds.items:
|
|
||||||
sign = item.superlocation
|
|
||||||
loc = item.location
|
|
||||||
# ic(item.location, item.superlocation)
|
|
||||||
if self.appnumber in sign or self.appnumber in loc:
|
|
||||||
state = 1
|
|
||||||
book_id = None
|
|
||||||
for book in self.books:
|
|
||||||
if book["bookdata"].signature == link:
|
|
||||||
book_id = book["id"]
|
|
||||||
break
|
|
||||||
self.logger.log_info(f"State of {link}: " + str(state))
|
|
||||||
print(
|
|
||||||
"lock acquired, updating availability of "
|
|
||||||
+ str(book_id)
|
|
||||||
+ " to "
|
|
||||||
+ str(state)
|
|
||||||
)
|
|
||||||
result.append((item.callnumber, state))
|
|
||||||
count += 1
|
|
||||||
return result
|
|
||||||
|
|
||||||
self.logger.log_info("Worker thread finished")
|
|
||||||
# teminate thread
|
|
||||||
Reference in New Issue
Block a user