1 Commits

Author SHA1 Message Date
0458ccd443 update gitignore 2025-05-09 12:06:31 +02:00
155 changed files with 3660 additions and 13920 deletions

22
.bumpversion.toml Normal file
View File

@@ -0,0 +1,22 @@
[tool.bumpversion]
current_version = "0.2.1"
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
serialize = ["{major}.{minor}.{patch}"]
search = "{current_version}"
replace = "{new_version}"
regex = false
ignore_missing_version = false
ignore_missing_files = false
tag = true
sign_tags = false
tag_name = "v{new_version}"
tag_message = "Bump version: {current_version} → {new_version}"
allow_dirty = false
commit = true
message = "Bump version: {current_version} → {new_version}"
commit_args = ""
setup_hooks = []
pre_commit_hooks = []
post_commit_hooks = []
[[tool.bumpversion.files]]
filename = "src/__init__.py"

View File

@@ -1,59 +0,0 @@
on:
workflow_dispatch:
inputs:
release_notes:
description: Release notes (use \n for newlines)
type: string
required: false
github_release:
description: 'Create Gitea Release'
default: true
type: boolean
bump:
description: 'Bump type'
required: false
default: 'patch'
type: choice
options:
- 'major'
- 'minor'
- 'patch'
jobs:
bump:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install UV
uses: astral-sh/setup-uv@v5
- name: Set up Python
run: uv python install
with:
python-version-file: "pyproject.toml"
- name: Install dependencies
run: uv sync --locked --all-extras --dev
- name: Install Bump tool
run: uv tool install bump-my-version
- name: Bump version
id: bump_version
run: |
uv tool run bump-my-version bump ${{ github.event.inputs.bump }} --tag --allow-dirty
- name: Add release notes
id: add_release_notes
run: |
echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
echo "${{ github.event.inputs.release_notes }}" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: Create Gitea Release
if: ${{ github.event.inputs.github_release == 'true' }}
uses: softprops/action-gh-release@v1
with:
tag_name:
release_name: Release ${{ github.sha }}
body: ${{ env.RELEASE_NOTES }}
draft: false
prerelease: false

8
.gitignore vendored
View File

@@ -226,8 +226,6 @@ output
config.yaml config.yaml
**/tempCodeRunnerFile.py **/tempCodeRunnerFile.py
uv.lock
logs/ uv.lock
*.pdf logs
*.docx
test.py

View File

@@ -1 +0,0 @@
1.0.0

4
__main__.py Normal file
View File

@@ -0,0 +1,4 @@
from src.ui.userInterface import launch_gui as UI
if __name__ == "__main__":
UI() #:des

69
build.app.json Normal file
View File

@@ -0,0 +1,69 @@
{
"version": "auto-py-to-exe-configuration_v1",
"pyinstallerOptions": [
{
"optionDest": "noconfirm",
"value": true
},
{
"optionDest": "filenames",
"value": "C:/Users/aky547/GitHub/SemesterapparatsManager/__main__.py"
},
{
"optionDest": "onefile",
"value": false
},
{
"optionDest": "console",
"value": false
},
{
"optionDest": "icon_file",
"value": "C:/Users/aky547/Downloads/VZjRNn1k.ico"
},
{
"optionDest": "name",
"value": "SemesterAppMan"
},
{
"optionDest": "clean_build",
"value": true
},
{
"optionDest": "strip",
"value": false
},
{
"optionDest": "noupx",
"value": false
},
{
"optionDest": "disable_windowed_traceback",
"value": false
},
{
"optionDest": "uac_admin",
"value": false
},
{
"optionDest": "uac_uiaccess",
"value": false
},
{
"optionDest": "argv_emulation",
"value": false
},
{
"optionDest": "bootloader_ignore_signals",
"value": false
},
{
"optionDest": "datas",
"value": "C:/Users/aky547/GitHub/SemesterapparatsManager/config.yaml;."
}
],
"nonPyinstallerOptions": {
"increaseRecursionLimit": true,
"manualArguments": ""
}
}

View File

@@ -1,31 +0,0 @@
import os
import shutil
with open(".version", "r") as version_file:
version = version_file.read().strip()
print("Building the project...")
print("Cleaning build dir...")
# clear dist directory
if os.path.exists("dist"):
shutil.rmtree("dist")
os.makedirs("dist")
print("Build directory cleaned.")
build = input("Include console in build? (y/n): ").strip().lower()
command = f"uv run python -m nuitka --standalone --output-dir=dist --include-data-dir=./config=config --include-data-dir=./site=site --include-data-dir=./icons=icons --include-data-dir=./mail_vorlagen=mail_vorlagen --enable-plugin=pyside6 --product-name=SemesterApparatsManager --product-version={version} --output-filename=SAM.exe --windows-icon-from-ico=icons/logo.ico"
executable = "main.py"
if build == 'y':
os.system(f"{command} {executable}")
else:
command += " --windows-console-mode=disable"
os.system(f"{command} {executable}")
# rename main.dist in dist dir to SemesterApparatsManager
os.rename("dist/main.dist", "dist/SemesterApparatsManager")
print("Build complete.")

View File

@@ -1,57 +0,0 @@
default_apps: true
save_path: .
icon_path: icons/
openAI:
api_key:
model:
zotero:
api_key:
library_id:
library_type: user
database:
name: semesterapparate.db
path: .
temp: ~/AppData/Local/SAM/SemesterApparatsManager/Cache
mail:
smtp_server:
port:
sender:
printer_mail:
user_name:
use_user_name: true
password:
signature:
colors:
dark: '#6b6160'
light: '#000000'
warning: '#ff0000'
success: '#00ff00'
icons:
locked: locked.svg
logo: logo.ico
show_password: visibility_off.svg
hide_password: visibility_on.svg
settings: settings.svg
today: calendar_today.svg
save: save.svg
edit_note: edit_note.svg
warning: warning.svg
error: error.svg
mail: mail.svg
semester: semester.svg
template_fail: test_fail.svg
offAction: shutdown.svg
info: info.svg
help: help.svg
close: close.svg
notification: notification.svg
valid_true: check_success.svg
valid_false: check_fail.svg
edit: edit.svg
important_warn: red_warn.svg
person: person_add.svg
database: database.svg
icons: icons.svg
api: api.svg
print: print.svg
db_search: db_search.svg

View File

@@ -1,19 +1,8 @@
from typing import Optional, Any, Union from typing import Optional
from dataclasses import dataclass from dataclasses import dataclass
from omegaconf import OmegaConf, DictConfig from omegaconf import OmegaConf, DictConfig
import os import os
from pathlib import Path
@dataclass
class OpenAI:
api_key: str
model: str
def getattr(self, name: str):
return getattr(self, name)
def _setattr(self, name: str, value: Any):
setattr(self, name, value)
@dataclass @dataclass
class Zotero: class Zotero:
@@ -21,29 +10,25 @@ class Zotero:
library_id: str library_id: str
library_type: str library_type: str
def getattr(self, name: str): def getattr(self, name):
return getattr(self, name) return getattr(self, name)
def _setattr(self, name: str, value: Any): def _setattr(self, name, value):
setattr(self, name, value) setattr(self, name, value)
@dataclass @dataclass
class Database: class Database:
name: str name: str
path: Union[str, Path, None] path: str
temp: Union[str, Path, None] temp: str
def getattr(self, name: str):
def getattr(self, name):
return getattr(self, name) return getattr(self, name)
def _setattr(self, name: str, value: Any): def _setattr(self, name, value):
setattr(self, name, value) setattr(self, name, value)
def __post_init__(self):
if isinstance(self.path, str):
self.path = Path(self.path).expanduser()
if isinstance(self.temp, str):
self.temp = Path(self.temp).expanduser()
@dataclass @dataclass
class Mail: class Mail:
@@ -74,13 +59,13 @@ class Mail:
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px;
margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>""" margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>"""
def getattr(self, name: str): def getattr(self, name):
return getattr(self, name) return getattr(self, name)
def _setattr(self, name: str, value: Any): def _setattr(self, name, value):
setattr(self, name, value) setattr(self, name, value)
def setValue(self, **kwargs: Any): def setValue(self, **kwargs):
for key, value in kwargs.items(): for key, value in kwargs.items():
if hasattr(self, key): if hasattr(self, key):
setattr(self, key, value) setattr(self, key, value)
@@ -94,7 +79,7 @@ class Icons:
self._colors = None self._colors = None
self._icons = None self._icons = None
def assign(self, key: str, value: Any): def assign(self, key, value):
setattr(self, key, value) setattr(self, key, value)
@property @property
@@ -102,7 +87,7 @@ class Icons:
return self._path return self._path
@path.setter @path.setter
def path(self, value: Any): def path(self, value):
self._path = value self._path = value
@property @property
@@ -110,7 +95,7 @@ class Icons:
return self._colors return self._colors
@colors.setter @colors.setter
def colors(self, value: Any): def colors(self, value):
self._colors = value self._colors = value
@property @property
@@ -118,10 +103,10 @@ class Icons:
return self._icons return self._icons
@icons.setter @icons.setter
def icons(self, value: Any): def icons(self, value):
self._icons = value self._icons = value
def get(self, name: str): def get(self, name):
return self.icons.get(name) return self.icons.get(name)
@@ -136,7 +121,7 @@ class Config:
""" """
_config: Optional[DictConfig] = None _config: Optional[DictConfig] = None
config_exists: bool = True
def __init__(self, config_path: str): def __init__(self, config_path: str):
""" """
Loads the configuration file and stores it for future access. Loads the configuration file and stores it for future access.
@@ -148,22 +133,10 @@ class Config:
FileNotFoundError: Configuration file not found FileNotFoundError: Configuration file not found
""" """
if not os.path.exists(config_path): if not os.path.exists(config_path):
# copy base config file to the given path raise FileNotFoundError(f"Configuration file not found: {config_path}")
base = "config/base_config.yaml"
if not os.path.exists(base):
raise FileNotFoundError(f"Base configuration file not found: {base}")
with open(base, "r") as base_file:
base_config = base_file.read()
with open(config_path, "w") as config_file:
config_file.write(base_config)
self.config_exists = False
self._config = OmegaConf.load(config_path) self._config = OmegaConf.load(config_path)
self.config_path = config_path self.config_path = config_path
@property
def exists(self) -> bool:
return self.config_exists
def save(self): def save(self):
""" """
Saves the current configuration to the file. Saves the current configuration to the file.
@@ -173,22 +146,16 @@ class Config:
""" """
OmegaConf.save(self._config, self.config_path) OmegaConf.save(self._config, self.config_path)
def reload(self):
"""
Reloads the configuration from the file.
"""
self._config = OmegaConf.load(self.config_path)
@property @property
def zotero(self): def zotero(self):
return Zotero(**self._config.zotero) return Zotero(**self._config.zotero)
@property @property
def zotero_attr(self, name: str): def zotero_attr(self, name):
return getattr(self.zotero, name) return getattr(self.zotero, name)
@zotero_attr.setter @zotero_attr.setter
def zotero_attr(self, name: str, value: Any): def zotero_attr(self, name, value):
self.zotero._setattr(name, value) self.zotero._setattr(name, value)
@property @property
@@ -196,37 +163,30 @@ class Config:
return Database(**self._config.database) return Database(**self._config.database)
@property @property
def database_attr(self, name: str): def database_attr(self, name):
return getattr(self.database, name) return getattr(self.database, name)
@database_attr.setter @database_attr.setter
def database_attr(self, name: str, value: Any): def database_attr(self, name, value):
self.database._setattr(name, value) self.database._setattr(name, value)
@property
def openAI(self):
return OpenAI(**self._config.openAI)
@property @property
def mail(self): def mail(self):
return Mail(**self._config.mail) return Mail(**self._config.mail)
def mail_attr(self, name: str): def mail_attr(self, name):
return getattr(self.mail, name) return getattr(self.mail, name)
def set_mail_attr(self, name: str, value: Any): def set_mail_attr(self, name, value):
OmegaConf.update(self._config, f"mail.{name}", value) OmegaConf.update(self._config, f"mail.{name}", value)
def set_database_attr(self, name: str, value: Any): def set_database_attr(self, name, value):
OmegaConf.update(self._config, f"database.{name}", value) OmegaConf.update(self._config, f"database.{name}", value)
def set_zotero_attr(self, name: str, value: Any): def set_zotero_attr(self, name, value):
OmegaConf.update(self._config, f"zotero.{name}", value) OmegaConf.update(self._config, f"zotero.{name}", value)
def set_openai_attr(self, name: str, value: Any): def set_icon_attr(self, name, value):
OmegaConf.update(self._config, f"openAI.{name}", value)
def set_icon_attr(self, name: str, value: Any):
OmegaConf.update(self._config, f"icons.{name}", value) OmegaConf.update(self._config, f"icons.{name}", value)
@property @property

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e3e3e3"><path d="M472-120q-73-1-137.5-13.5t-112-34Q175-189 147.5-218T120-280q0 33 27.5 62t75 50.5q47.5 21.5 112 34T472-120Zm-71-204q-30-3-58-8t-53.5-12q-25.5-7-48-15.5T200-379q19 11 41.5 19.5t48 15.5q25.5 7 53.5 12t58 8Zm79-275q86 0 177.5-26T760-679q-11-29-100.5-55T480-760q-91 0-178.5 25.5T200-679q15 29 104.5 54.5T480-599Zm-61 396q10 23 23 44t30 39q-73-1-137.5-13.5t-112-34Q175-189 147.5-218T120-280v-400q0-33 28.5-62t77.5-51q49-22 114.5-34.5T480-840q74 0 139.5 12.5T734-793q49 22 77.5 51t28.5 62q0 33-28.5 62T734-567q-49 22-114.5 34.5T480-520q-85 0-157-15t-123-44v101q40 37 100 54t121 22q-8 15-13 34.5t-7 43.5q-60-7-111.5-20T200-379v99q14 25 77 47t142 30ZM864-40 756-148q-22 13-46 20.5t-50 7.5q-75 0-127.5-52.5T480-300q0-75 52.5-127.5T660-480q75 0 127.5 52.5T840-300q0 26-7.5 50T812-204L920-96l-56 56ZM660-200q42 0 71-29t29-71q0-42-29-71t-71-29q-42 0-71 29t-29 71q0 42 29 71t71 29Z"/></svg>

Before

Width:  |  Height:  |  Size: 992 B

0
icons/icons.yaml Normal file
View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

After

Width:  |  Height:  |  Size: 264 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e3e3e3"><path d="M640-640v-120H320v120h-80v-200h480v200h-80Zm-480 80h640-640Zm560 100q17 0 28.5-11.5T760-500q0-17-11.5-28.5T720-540q-17 0-28.5 11.5T680-500q0 17 11.5 28.5T720-460Zm-80 260v-160H320v160h320Zm80 80H240v-160H80v-240q0-51 35-85.5t85-34.5h560q51 0 85.5 34.5T880-520v240H720v160Zm80-240v-160q0-17-11.5-28.5T760-560H200q-17 0-28.5 11.5T160-520v160h80v-80h480v80h80Z"/></svg>

Before

Width:  |  Height:  |  Size: 482 B

33
mail.py Normal file
View File

@@ -0,0 +1,33 @@
from PyQt6 import QtWidgets
from src.ui.dialogs.mail import Mail_Dialog
def launch_gui(app_id="", app_name="", app_subject="", prof_name="", prof_mail=""):
QtWidgets.QApplication([""])
dialog = Mail_Dialog(
app_id=app_id,
app_name=app_name,
app_subject=app_subject,
prof_name=prof_name,
prof_mail=prof_mail,
# default_mail="Information bezüglich der Auflösung des Semesterapparates",
)
dialog.exec()
if __name__ == "__main__":
app_id = "123"
app_name = "Test"
app_subject = "TestFach"
prof_name = "Test"
prof_mail = "kirchneralexander020@gmail.com"
launch_gui(
app_id=app_id,
app_name=app_name,
app_subject=app_subject,
prof_name=prof_name,
prof_mail=prof_mail,
)

View File

@@ -1,54 +0,0 @@
Message-ID: <987b46cf-2d8b-4a27-acb3-c50f61d3d85d@ph-freiburg.de>
Date: Tue, 31 Oct 2023 11:38:34 +0100
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
From: Alexander Kirchner <alexander.kirchner@ph-freiburg.de>
Subject: =?UTF-8?Q?Information_bez=C3=BCglich_der_Aufl=C3=B6sung_des_Semeste?=
=?UTF-8?Q?rapparates_=7BAppNr=7D?=
Content-Language: de-DE
X-Mozilla-Draft-Info: internal/draft; vcard=0; receipt=0; DSN=0; uuencode=0;
attachmentreminder=0; deliveryformat=0
X-Identity-Key: id1
Fcc: imap://aky547@imap.ph-freiburg.de/INBOX/Sent
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Sehr geehrte/r {Profname}, <br>
</p>
<p><br>
</p>
auf die E-Mail bezüglich der Auflösung oder Verlängerung der
Semesterapparate haben wir von Ihnen keine Rückmeldung erhalten.
Deshalb gehen wir davon aus, dass der Apparat aufgelöst werden kann.
Die Medien, die im Apparat aufgestellt waren, werden nun wieder
regulär ausleihbar und sind dann an ihren Standorten bei den Fächern
zu finden. <br>
<br>
Falls Sie den Apparat erneut, oder einen neuen Apparat anlegen
wollen, können Sie mir das ausgefüllte Formular zur Einrichtung des
Apparates (<a class="moz-txt-link-freetext"
href="https://www.ph-freiburg.de/bibliothek/lernen/semesterapparate/info-lehrende-sem.html">https://www.ph-freiburg.de/bibliothek/lernen/semesterapparate/info-lehrende-sem.html</a>)
zukommen lassen. Im Falle einer Verlängerung des Apparates reicht
eine Antwort auf diese Mail.
<p><br>
</p>
<p>Bei Fragen können Sie sich jederzeit an mich wenden.<br>
</p>
<p><br>
</p>
<pre class="moz-signature" cols="72">--
Freundliche Grüße
Alexander Kirchner
Bibliothek der Pädagogischen Hochschule Freiburg
Tel. 0761/682-778</pre>
</body>
</html>

15
main.py
View File

@@ -1,19 +1,4 @@
from src import first_launch, settings
from src.ui.widgets.welcome_wizard import launch_wizard as startup
from PySide6 import QtWidgets
import sys
from src.ui.userInterface import launch_gui as UI from src.ui.userInterface import launch_gui as UI
if __name__ == "__main__": if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
if not first_launch:
setup = startup()
if setup == 1:
settings.reload()
# kill qApplication singleton
UI()
else:
sys.exit()
else:
UI() UI()

View File

@@ -1,11 +1,10 @@
[project] [project]
name = "semesterapparatsmanager" name = "semesterapparatsmanager"
version = "1.0.0" version = "0.1.0"
description = "Add your description here" description = "Add your description here"
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
dependencies = [ dependencies = [
"appdirs>=1.4.4",
"beautifulsoup4>=4.12.3", "beautifulsoup4>=4.12.3",
"bump-my-version>=0.29.0", "bump-my-version>=0.29.0",
"chardet>=5.2.0", "chardet>=5.2.0",
@@ -18,11 +17,10 @@ dependencies = [
"mkdocs-material-extensions>=1.3.1", "mkdocs-material-extensions>=1.3.1",
"natsort>=8.4.0", "natsort>=8.4.0",
"omegaconf>=2.3.0", "omegaconf>=2.3.0",
"openai>=1.79.0",
"pandas>=2.2.3", "pandas>=2.2.3",
"playwright>=1.49.1", "playwright>=1.49.1",
"pyramid>=2.0.2", "pyqt6>=6.8.0",
"pyside6>=6.9.1", "pyqtgraph>=0.13.7",
"python-docx>=1.1.2", "python-docx>=1.1.2",
"pyzotero>=1.6.4", "pyzotero>=1.6.4",
"ratelimit>=2.2.1", "ratelimit>=2.2.1",
@@ -35,29 +33,3 @@ dev = [
"icecream>=2.1.4", "icecream>=2.1.4",
"nuitka>=2.5.9", "nuitka>=2.5.9",
] ]
[tool.bumpversion]
current_version = "1.0.0"
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
serialize = ["{major}.{minor}.{patch}"]
search = "{current_version}"
replace = "{new_version}"
regex = false
ignore_missing_version = false
ignore_missing_files = false
tag = true
sign_tags = false
tag_name = "v{new_version}"
tag_message = "Bump version: {current_version} → {new_version}"
allow_dirty = true
commit = true
message = "Bump version: {current_version} → {new_version}"
moveable_tags = []
commit_args = ""
setup_hooks = []
pre_commit_hooks = []
post_commit_hooks = []
[[tool.bumpversion.files]]
filename = "src/__init__.py"
[[tool.bumpversion.files]]
filename = ".version"

View File

@@ -1,34 +1,16 @@
__version__ = "1.0.0" from config import Config
__author__ = "Alexander Kirchner"
__all__ = ["__version__", "__author__", "Icon", "settings"]
import os import os
from appdirs import AppDirs
from config import Config settings = Config("config/config.yaml")
if not os.path.exists(settings.database.temp):
os.mkdir(settings.database.temp)
app = AppDirs("SemesterApparatsManager", "SAM")
LOG_DIR = app.user_log_dir
CONFIG_DIR = app.user_config_dir
if not os.path.exists(LOG_DIR):
os.makedirs(LOG_DIR)
if not os.path.exists(CONFIG_DIR):
os.makedirs(CONFIG_DIR)
settings = Config(f"{CONFIG_DIR}/config.yaml")
DATABASE_DIR = (
app.user_config_dir if settings.database.path is None else settings.database.path
)
if not os.path.exists(DATABASE_DIR):
os.makedirs(DATABASE_DIR)
first_launch = settings.exists
if not os.path.exists(settings.database.temp.expanduser()):
settings.database.temp.expanduser().mkdir(parents=True, exist_ok=True)
from .utils.icon import Icon from .utils.icon import Icon
__version__ = "0.2.1"
__author__ = "Alexander Kirchner"
if not os.path.exists("logs"): if not os.path.exists("logs"):
os.mkdir("logs") os.mkdir("logs")
# open and close the file to create it # open and close the file to create it

View File

@@ -1,8 +1,7 @@
from .semester import Semester
from .database import Database from .database import Database
from .semester import Semester
from .admin_console import AdminCommands from .admin_console import AdminCommands
from .thread_bookgrabber import BookGrabber from .thread_bookgrabber import BookGrabber
from .threads_availchecker import AvailChecker from .threads_availchecker import AvailChecker
from .threads_autoadder import AutoAdder from .threads_autoadder import AutoAdder
from .documentation_thread import DocumentationThread from .documentation_thread import DocumentationThread
from .create_file import recreateFile, recreateElsaFile

View File

@@ -2,14 +2,6 @@ import hashlib
import random import random
from .database import Database from .database import Database
import loguru
import sys
from src import LOG_DIR
log = loguru.logger
log.remove()
log.add(sys.stdout, level="INFO")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
# change passwords for apparats, change passwords for users, list users, create and delete users etc # change passwords for apparats, change passwords for users, list users, create and delete users etc
@@ -17,14 +9,9 @@ log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
class AdminCommands: class AdminCommands:
"""Basic Admin commands for the admin console. This class is used to create, delete, and list users. It also has the ability to change passwords for users.""" """Basic Admin commands for the admin console. This class is used to create, delete, and list users. It also has the ability to change passwords for users."""
def __init__(self, db_path=None): def __init__(self):
"""Default Constructor for the AdminCommands class.""" """Defaulf Constructor for the AdminCommands class."""
if db_path is None:
self.db = Database() self.db = Database()
else:
self.db = Database(db_path=db_path)
log.info("AdminCommands initialized with database connection.")
log.debug("location: {}", self.db.db_path)
def create_password(self, password: str) -> tuple[str, str]: def create_password(self, password: str) -> tuple[str, str]:
"""Create a hashed password and a salt for the password. """Create a hashed password and a salt for the password.
@@ -57,20 +44,6 @@ class AdminCommands:
hashed_password = self.hash_password("admin") hashed_password = self.hash_password("admin")
self.db.createUser("admin", salt + hashed_password, "admin", salt) self.db.createUser("admin", salt + hashed_password, "admin", salt)
def create_user(self, username: str, password: str, role: str = "user") -> bool:
"""Create a new user in the database.
Args:
username (str): the username of the user to be created.
password (str): the password of the user to be created.
role (str, optional): the role of the user to be created. Defaults to "user".
"""
hashed_password, salt = self.create_password(password)
status = self.db.createUser(
user=username, password=salt + hashed_password, role=role, salt=salt
)
return status
def hash_password(self, password: str) -> str: def hash_password(self, password: str) -> str:
"""Hash a password using SHA256. """Hash a password using SHA256.

View File

@@ -4,17 +4,18 @@ from pathlib import Path
from src.backend.database import Database from src.backend.database import Database
db = Database()
import loguru import loguru
import sys import sys
from src import LOG_DIR
log = loguru.logger log = loguru.logger
log.remove() log.remove()
log.add(sys.stdout, level="INFO") log.add("application.log", rotation="1 week", retention="1 month")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") log.add(
sys.stdout,
)
db = Database()
def recreateFile(name: str, app_id: int, filetype: str, open: bool = True) -> Path: def recreateFile(name: str, app_id: int, filetype: str, open: bool = True) -> Path:
""" """
recreateFile creates a file from the database and opens it in the respective program, if the open parameter is set to True. recreateFile creates a file from the database and opens it in the respective program, if the open parameter is set to True.

View File

@@ -1,23 +1,17 @@
import datetime
import json
import os import os
import sqlite3 as sql import sqlite3 as sql
import sys
import tempfile import tempfile
from dataclasses import asdict
from pathlib import Path from pathlib import Path
from string import ascii_lowercase as lower from src import settings
from string import digits, punctuation
from typing import Any, List, Optional, Tuple, Union from typing import Any, List, Optional, Tuple, Union
import datetime
import loguru
from src import LOG_DIR, settings, DATABASE_DIR
from src.backend.db import ( from src.backend.db import (
CREATE_ELSA_FILES_TABLE, CREATE_ELSA_FILES_TABLE,
CREATE_ELSA_MEDIA_TABLE, CREATE_ELSA_MEDIA_TABLE,
CREATE_ELSA_TABLE, CREATE_ELSA_TABLE,
CREATE_TABLE_APPARAT, CREATE_TABLE_APPARAT,
CREATE_TABLE_APPKONTOS,
CREATE_TABLE_FILES, CREATE_TABLE_FILES,
CREATE_TABLE_MEDIA, CREATE_TABLE_MEDIA,
CREATE_TABLE_MESSAGES, CREATE_TABLE_MESSAGES,
@@ -26,17 +20,25 @@ from src.backend.db import (
CREATE_TABLE_USER, CREATE_TABLE_USER,
) )
from src.errors import AppPresentError, NoResultError from src.errors import AppPresentError, NoResultError
from src.logic import ELSA, Apparat, ApparatData, BookData, Prof from src.logic import ApparatData, BookData, Prof, Apparat, ELSA
from src.logic.constants import SEMAP_MEDIA_ACCOUNTS from src.logic.constants import SEMAP_MEDIA_ACCOUNTS
from src.utils.blob import create_blob from src.utils import create_blob, dump_pickle, load_pickle
from .semester import Semester from .semester import Semester
from string import ascii_lowercase as lower, digits, punctuation
import sys
from loguru import logger as log
log = loguru.logger logger = log
log.remove() logger.remove()
log.add(sys.stdout, level="INFO") logger.add("logs/database.log", rotation="1 week", enqueue=True)
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") log.add(
"logs/application.log",
rotation="1 day",
compression="zip",
)
# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO")
logger.add(sys.stdout)
ascii_lowercase = lower + digits + punctuation ascii_lowercase = lower + digits + punctuation
@@ -44,11 +46,12 @@ ascii_lowercase = lower + digits + punctuation
# get the line that called the function # get the line that called the function
class Database: class Database:
database = settings.database
""" """
Initialize the database and create the tables if they do not exist. Initialize the database and create the tables if they do not exist.
""" """
def __init__(self, db_path: Union[Path, None] = None): def __init__(self, db_path: str = None):
""" """
Default constructor for the database class Default constructor for the database class
@@ -56,41 +59,23 @@ class Database:
db_path (str, optional): Optional Path for testing / specific purposes. Defaults to None. db_path (str, optional): Optional Path for testing / specific purposes. Defaults to None.
""" """
if db_path is None: if db_path is None:
if settings.database.path is not None: self.db_path = self.database.path + self.database.name
self.db_path = Path( self.db_path = self.db_path.replace("~", str(Path.home()))
settings.database.path.expanduser(), settings.database.name logger.debug(self.db_path)
)
else:
self.db_path = None
# self.db_path = self.db_path.replace("~", str(Path.home()))
else: else:
self.db_path = db_path self.db_path = db_path
log.debug(f"Database path: {self.db_path}")
self.db_initialized = False
def initializeDatabase(self):
if not self.db_initialized:
self.checkDatabaseStatus() self.checkDatabaseStatus()
self.db_initialized = True
def overwritePath(self, new_db_path: str):
log.debug("got new path, overwriting")
self.db_path = Path(new_db_path)
def checkDatabaseStatus(self): def checkDatabaseStatus(self):
path = settings.database.path path = self.database.path
if path is None: path = path.replace("~", str(Path.home()))
path = Path(DATABASE_DIR) path = os.path.abspath(path)
# path = path.replace("~", str(Path.home()))
# path = os.path.abspath(path)
if not os.path.exists(path): if not os.path.exists(path):
# create path # create path
# log.debug(path) # print(path)
os.makedirs(path) os.makedirs(path)
if self.get_db_contents() == []: if self.get_db_contents() == []:
log.critical("Database does not exist, creating tables") logger.critical("Database does not exist, creating tables")
log.critical(f"Path: {path}")
self.create_tables() self.create_tables()
self.insertSubjects() self.insertSubjects()
@@ -153,6 +138,7 @@ class Database:
cursor.execute(CREATE_TABLE_APPARAT) cursor.execute(CREATE_TABLE_APPARAT)
cursor.execute(CREATE_TABLE_MESSAGES) cursor.execute(CREATE_TABLE_MESSAGES)
cursor.execute(CREATE_TABLE_MEDIA) cursor.execute(CREATE_TABLE_MEDIA)
cursor.execute(CREATE_TABLE_APPKONTOS)
cursor.execute(CREATE_TABLE_FILES) cursor.execute(CREATE_TABLE_FILES)
cursor.execute(CREATE_TABLE_PROF) cursor.execute(CREATE_TABLE_PROF)
cursor.execute(CREATE_TABLE_USER) cursor.execute(CREATE_TABLE_USER)
@@ -173,18 +159,15 @@ class Database:
""" """
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
log.debug(f"Inserting {params} into database with query {query}") logger.debug(f"Inserting {params} into database with query {query}")
cursor.execute(query, params) cursor.execute(query, params)
conn.commit() conn.commit()
self.close_connection(conn) self.close_connection(conn)
@log.catch @logger.catch
def query_db( def query_db(
self, self, query: str, args: Tuple = (), one: bool = False
query: str, ) -> Union[Tuple, List[Tuple]]:
args: Tuple[Any, Any] = (), # type:ignore
one: bool = False, # type:ignore
) -> Union[Tuple[Any, Any], List[Tuple[Any, Any]]]:
""" """
Query the Database for the sent query. Query the Database for the sent query.
@@ -199,7 +182,6 @@ class Database:
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
logs_query = query logs_query = query
logs_args = args logs_args = args
if "fileblob" in query: if "fileblob" in query:
# set fileblob arg in logger to "too long" # set fileblob arg in logger to "too long"
@@ -213,15 +195,14 @@ class Database:
# log_message = f"Querying database with query {query}" # log_message = f"Querying database with query {query}"
if "INTO user" in query: if "INTO user" in query:
log_message = f"Querying database with query {query}" log_message = f"Querying database with query {query}"
# log.debug(f"DB Query: {log_message}") # logger.debug(f"DB Query: {log_message}")
log.debug(log_message)
try: try:
cursor.execute(query, args) cursor.execute(query, args)
rv = cursor.fetchall() rv = cursor.fetchall()
conn.commit() conn.commit()
self.close_connection(conn) self.close_connection(conn)
except sql.OperationalError as e: except sql.OperationalError as e:
log.error(f"Error in query: {e}") logger.error(f"Error in query: {e}")
return None return None
return (rv[0] if rv else None) if one else rv return (rv[0] if rv else None) if one else rv
@@ -237,7 +218,7 @@ class Database:
app_id (str): The apparat id where the book should be added to app_id (str): The apparat id where the book should be added to
prof_id (str): The id of the professor where the book should be added to. prof_id (str): The id of the professor where the book should be added to.
""" """
log.info(f"Adding book {bookdata.signature} to database") logger.info(f"Adding book {bookdata.signature} to database")
if app_id is None or prof_id is None: if app_id is None or prof_id is None:
raise ValueError("Apparate ID or Prof ID is None") raise ValueError("Apparate ID or Prof ID is None")
conn = self.connect() conn = self.connect()
@@ -245,26 +226,22 @@ class Database:
t_query = ( t_query = (
f"SELECT bookdata FROM media WHERE app_id={app_id} AND prof_id={prof_id}" f"SELECT bookdata FROM media WHERE app_id={app_id} AND prof_id={prof_id}"
) )
log.debug(t_query) logger.debug(t_query)
# # log.debug(t_query) # # print(t_query)
result = cursor.execute(t_query).fetchall() result = cursor.execute(t_query).fetchall()
result = [BookData().from_string(i[0]) for i in result] result = [load_pickle(i[0]) for i in result]
if bookdata in result: if bookdata in result:
# log.debug("Bookdata already in database") # print("Bookdata already in database")
# check if the book was deleted in the apparat # check if the book was deleted in the apparat
query = ( query = (
"SELECT deleted FROM media WHERE app_id=? AND prof_id=? AND bookdata=?" "SELECT deleted FROM media WHERE app_id=? AND prof_id=? AND bookdata=?"
) )
params = (app_id, prof_id, json.dumps(asdict(bookdata), ensure_ascii=False)) params = (app_id, prof_id, dump_pickle(bookdata))
result = cursor.execute(query, params).fetchone() result = cursor.execute(query, params).fetchone()
if result[0] == 1: if result[0] == 1:
# log.debug("Book was deleted, updating bookdata") # print("Book was deleted, updating bookdata")
query = "UPDATE media SET deleted=0 WHERE app_id=? AND prof_id=? AND bookdata=?" query = "UPDATE media SET deleted=0 WHERE app_id=? AND prof_id=? AND bookdata=?"
params = ( params = (app_id, prof_id, dump_pickle(bookdata))
app_id,
prof_id,
json.dumps(asdict(bookdata), ensure_ascii=False),
)
cursor.execute(query, params) cursor.execute(query, params)
conn.commit() conn.commit()
return return
@@ -272,11 +249,11 @@ class Database:
query = ( query = (
"INSERT INTO media (bookdata, app_id, prof_id,deleted) VALUES (?, ?, ?,?)" "INSERT INTO media (bookdata, app_id, prof_id,deleted) VALUES (?, ?, ?,?)"
) )
converted = json.dumps(asdict(bookdata), ensure_ascii=False) converted = dump_pickle(bookdata)
params = (converted, app_id, prof_id, 0) params = (converted, app_id, prof_id, 0)
cursor.execute(query, params) cursor.execute(query, params)
logMessage = f"Added book with signature {bookdata.signature} to database, data: {converted}" logMessage = f"Added book with signature {bookdata.signature} to database, data: {converted}"
log.info(logMessage) logger.info(logMessage)
conn.commit() conn.commit()
self.close_connection(conn) self.close_connection(conn)
@@ -298,7 +275,7 @@ class Database:
"SELECT bookdata, id FROM media WHERE app_id=? AND prof_id=?", "SELECT bookdata, id FROM media WHERE app_id=? AND prof_id=?",
(app_id, prof_id), (app_id, prof_id),
) )
books = [(BookData().from_string(i[0]), i[1]) for i in result] books = [(load_pickle(i[0]), i[1]) for i in result]
book = [i for i in books if i[0].signature == signature][0][1] book = [i for i in books if i[0].signature == signature][0][1]
return book return book
@@ -319,7 +296,7 @@ class Database:
result = self.query_db( result = self.query_db(
"SELECT bookdata FROM media WHERE app_id=? AND prof_id=?", (app_id, prof_id) "SELECT bookdata FROM media WHERE app_id=? AND prof_id=?", (app_id, prof_id)
) )
books: list[BookData] = [BookData().from_string(i[0]) for i in result] books: list[BookData] = [load_pickle(i[0]) for i in result]
book = [i for i in books if i.signature == signature][0] book = [i for i in books if i.signature == signature][0]
return book return book
@@ -345,7 +322,7 @@ class Database:
list[tuple[BookData, int]]: A list of tuples containing the wrapped Metadata and the id of the book list[tuple[BookData, int]]: A list of tuples containing the wrapped Metadata and the id of the book
""" """
rdata = self.query_db("SELECT * FROM media WHERE deleted=0") rdata = self.query_db("SELECT * FROM media WHERE deleted=0")
# log.debug(rdata, len(rdata)) # logger.debug(rdata, len(rdata))
mode = 0 mode = 0
if len(data) == 1: if len(data) == 1:
if "signature" in data.keys(): if "signature" in data.keys():
@@ -358,7 +335,7 @@ class Database:
return None return None
ret = [] ret = []
for book in rdata: for book in rdata:
bookdata = BookData().from_string(book[1]) bookdata = load_pickle(book[1])
app_id = book[2] app_id = book[2]
prof_id = book[3] prof_id = book[3]
if mode == 1: if mode == 1:
@@ -373,7 +350,7 @@ class Database:
and data["title"] in bookdata.title and data["title"] in bookdata.title
): ):
ret.append((bookdata, app_id, prof_id)) ret.append((bookdata, app_id, prof_id))
# log.debug(ret) # logger.debug(ret)
return ret return ret
def setAvailability(self, book_id: str, available: str): def setAvailability(self, book_id: str, available: str):
@@ -417,14 +394,14 @@ class Database:
Returns: Returns:
BookData: The metadata of the book wrapped in a BookData object BookData: The metadata of the book wrapped in a BookData object
""" """
return BookData().from_string( return load_pickle(
self.query_db( self.query_db(
"SELECT bookdata FROM media WHERE id=?", (book_id,), one=True "SELECT bookdata FROM media WHERE id=?", (book_id,), one=True
)[0] )[0]
) )
def getBooks( def getBooks(
self, app_id: Union[str, int], prof_id: Union[str, int], deleted: int = 0 self, app_id: Union[str, int], prof_id: Union[str, int], deleted=0
) -> list[dict[str, Union[BookData, int]]]: ) -> list[dict[str, Union[BookData, int]]]:
""" """
Get the Books based on the apparat id and the professor id Get the Books based on the apparat id and the professor id
@@ -446,7 +423,7 @@ class Database:
for result_a in qdata: for result_a in qdata:
data: dict[str, Any] = {"id": int, "bookdata": BookData, "available": int} data: dict[str, Any] = {"id": int, "bookdata": BookData, "available": int}
data["id"] = result_a[0] data["id"] = result_a[0]
data["bookdata"] = BookData().from_string(result_a[1]) data["bookdata"] = load_pickle(result_a[1])
data["available"] = result_a[2] data["available"] = result_a[2]
ret_result.append(data) ret_result.append(data)
return ret_result return ret_result
@@ -460,10 +437,10 @@ class Database:
bookdata (BookData): The new metadata of the book bookdata (BookData): The new metadata of the book
""" """
query = "UPDATE media SET bookdata= ? WHERE id=?" query = "UPDATE media SET bookdata= ? WHERE id=?"
book = bookdata.to_dict book = dump_pickle(bookdata)
self.query_db(query, (book, book_id)) self.query_db(query, (book, book_id))
def deleteBook(self, book_id: int): def deleteBook(self, book_id):
""" """
Delete a book from the database Delete a book from the database
@@ -473,7 +450,7 @@ class Database:
self.query_db("UPDATE media SET deleted=1 WHERE id=?", (book_id,)) self.query_db("UPDATE media SET deleted=1 WHERE id=?", (book_id,))
# File Interactions # File Interactions
def getBlob(self, filename: str, app_id: Union[str, int]) -> bytes: def getBlob(self, filename, app_id: Union[str, int]):
""" """
Get a blob from the database Get a blob from the database
@@ -525,14 +502,16 @@ class Database:
str: The filename of the recreated file str: The filename of the recreated file
""" """
blob = self.getBlob(filename, app_id) blob = self.getBlob(filename, app_id)
tempdir = settings.database.temp.expanduser() tempdir = self.database.temp
if not tempdir.exists(): tempdir = tempdir.replace("~", str(Path.home()))
tempdir.mkdir(parents=True, exist_ok=True) tempdir_path = Path(tempdir)
if not os.path.exists(tempdir_path):
os.mkdir(tempdir_path)
file = tempfile.NamedTemporaryFile( file = tempfile.NamedTemporaryFile(
delete=False, dir=tempdir_path, mode="wb", suffix=f".{filetype}" delete=False, dir=tempdir_path, mode="wb", suffix=f".{filetype}"
) )
file.write(blob) file.write(blob)
# log.debug("file created") # print("file created")
return file.name return file.name
def getFiles(self, app_id: Union[str, int], prof_id: int) -> list[tuple]: def getFiles(self, app_id: Union[str, int], prof_id: int) -> list[tuple]:
@@ -560,7 +539,7 @@ class Database:
return [i[0] for i in data] return [i[0] for i in data]
def insertSubjects(self): def insertSubjects(self):
# log.debug("Inserting subjects") # print("Inserting subjects")
subjects = [ subjects = [
"Biologie", "Biologie",
"Chemie", "Chemie",
@@ -603,24 +582,21 @@ class Database:
return self.query_db("SELECT * FROM subjects") return self.query_db("SELECT * FROM subjects")
# Messages # Messages
def addMessage( def addMessage(self, message: dict, user: str, app_id: Union[str, int]):
self, messages: list[dict[str, Any]], user: str, app_id: Union[str, int]
):
"""add a Message to the database """add a Message to the database
Args: Args:
messages (list[dict[str, Any]]): the messages to be added message (dict): the message to be added
user (str): the user who added the messages user (str): the user who added the message
app_id (Union[str,int]): the id of the apparat app_id (Union[str,int]): the id of the apparat
""" """
def __getUserId(user: str): def __getUserId(user):
return self.query_db( return self.query_db(
"SELECT id FROM user WHERE username=?", (user,), one=True "SELECT id FROM user WHERE username=?", (user,), one=True
)[0] )[0]
user_id = __getUserId(user) user_id = __getUserId(user)
for message in messages:
self.query_db( self.query_db(
"INSERT INTO messages (message, user_id, remind_at,appnr) VALUES (?,?,?,?)", "INSERT INTO messages (message, user_id, remind_at,appnr) VALUES (?,?,?,?)",
(message["message"], user_id, message["remind_at"], app_id), (message["message"], user_id, message["remind_at"], app_id),
@@ -633,7 +609,7 @@ class Database:
list[dict[str, str, str, str]]: a list of dictionaries containing the message, the user who added the message, the apparat id and the id of the message list[dict[str, str, str, str]]: a list of dictionaries containing the message, the user who added the message, the apparat id and the id of the message
""" """
def __get_user_name(user_id: int): def __get_user_name(user_id):
return self.query_db( return self.query_db(
"SELECT username FROM user WHERE id=?", (user_id,), one=True "SELECT username FROM user WHERE id=?", (user_id,), one=True
)[0] )[0]
@@ -651,17 +627,17 @@ class Database:
] ]
return ret return ret
def getMessages(self, date: str) -> list[dict[str, str]]: def getMessages(self, date: str) -> list[dict[str, str, str, str]]:
"""Get all the messages for a specific date """Get all the messages for a specific date
Args: Args:
date (str): a date.datetime object formatted as a string in the format "YYYY-MM-DD" date (str): a date.datetime object formatted as a string in the format "YYYY-MM-DD"
Returns: Returns:
list[dict[str, str]]: a list of dictionaries containing the message, the user who added the message, the apparat id and the id of the message list[dict[str, str, str, str]]: a list of dictionaries containing the message, the user who added the message, the apparat id and the id of the message
""" """
def __get_user_name(user_id: int): def __get_user_name(user_id):
return self.query_db( return self.query_db(
"SELECT username FROM user WHERE id=?", (user_id,), one=True "SELECT username FROM user WHERE id=?", (user_id,), one=True
)[0] )[0]
@@ -673,13 +649,13 @@ class Database:
] ]
return ret return ret
def deleteMessage(self, message_id: int): def deleteMessage(self, message_id):
"""Delete a message from the database """Delete a message from the database
Args: Args:
message_id (str): the id of the message message_id (str): the id of the message
""" """
log.debug(f"Deleting message with id {message_id}") logger.debug(f"Deleting message with id {message_id}")
self.query_db("DELETE FROM messages WHERE id=?", (message_id,)) self.query_db("DELETE FROM messages WHERE id=?", (message_id,))
# Prof data # Prof data
@@ -715,9 +691,7 @@ class Database:
)[0] )[0]
return f"{title} " if title is not None else "" return f"{title} " if title is not None else ""
def getSpecificProfData( def getSpecificProfData(self, prof_id: Union[str, int], fields: List[str]) -> tuple:
self, prof_id: Union[str, int], fields: List[str]
) -> tuple[Any, ...]:
"""A customisable function to get specific data of a professor based on the id """A customisable function to get specific data of a professor based on the id
Args: Args:
@@ -734,18 +708,6 @@ class Database:
query += " FROM prof WHERE id=?" query += " FROM prof WHERE id=?"
return self.query_db(query, (prof_id,), one=True)[0] return self.query_db(query, (prof_id,), one=True)[0]
def getProfById(self, prof_id: Union[str, int]) -> Prof:
"""Get a professor based on the id
Args:
prof_id (Union[str,int]): the id of the professor
Returns:
Prof: a Prof object containing the data of the professor
"""
data = self.query_db("SELECT * FROM prof WHERE id=?", (prof_id,), one=True)
return Prof().from_tuple(data)
def getProfData(self, profname: str): def getProfData(self, profname: str):
"""Get mail, telephone number and title of a professor based on the name """Get mail, telephone number and title of a professor based on the name
@@ -786,7 +748,7 @@ class Database:
return [Prof().from_tuple(prof) for prof in profs] return [Prof().from_tuple(prof) for prof in profs]
# Apparat # Apparat
def getAllAparats(self, deleted: int = 0) -> list[Apparat]: def getAllAparats(self, deleted=0) -> list[tuple]:
"""Get all the apparats in the database """Get all the apparats in the database
Args: Args:
@@ -795,13 +757,9 @@ class Database:
Returns: Returns:
list[tuple]: a list of tuples containing the apparats list[tuple]: a list of tuples containing the apparats
""" """
apparats = self.query_db( return self.query_db(
"SELECT * FROM semesterapparat WHERE deletion_status=?", (deleted,) "SELECT * FROM semesterapparat WHERE deletion_status=?", (deleted,)
) )
ret: list[Apparat] = []
for apparat in apparats:
ret.append(Apparat().from_tuple(apparat))
return ret
def getApparatData(self, appnr, appname) -> ApparatData: def getApparatData(self, appnr, appname) -> ApparatData:
"""Get the Apparat data based on the apparat number and the name """Get the Apparat data based on the apparat number and the name
@@ -852,7 +810,7 @@ class Database:
) )
numbers = [i[0] for i in numbers] numbers = [i[0] for i in numbers]
numbers.sort() numbers.sort()
log.info(f"Currently used apparat numbers: {numbers}") logger.info(f"Currently used apparat numbers: {numbers}")
return numbers return numbers
def setNewSemesterDate(self, app_id: Union[str, int], newDate, dauerapp=False): def setNewSemesterDate(self, app_id: Union[str, int], newDate, dauerapp=False):
@@ -906,26 +864,26 @@ class Database:
Returns: Returns:
Optional[int]: the id of the apparat Optional[int]: the id of the apparat
""" """
log.debug(apparat) logger.debug(apparat)
app = apparat.apparat app = apparat.apparat
prof = apparat.prof prof = apparat.prof
present_prof = self.getProfByName(prof.name()) present_prof = self.getProfByName(prof.name())
prof_id = present_prof.id prof_id = present_prof.id
log.debug(present_prof) logger.debug(present_prof)
app_id = self.getApparatId(app.name) app_id = self.getApparatId(app.name)
if app_id: if app_id:
return AppPresentError(app_id) return AppPresentError(app_id)
if not prof_id: if not prof_id:
log.debug("prof id not present, creating prof with data", prof) logger.debug("prof id not present, creating prof with data", prof)
prof_id = self.createProf(prof) prof_id = self.createProf(prof)
log.debug(prof_id) logger.debug(prof_id)
query = f"INSERT OR IGNORE INTO semesterapparat (appnr, name, erstellsemester, dauer, prof_id, fach,deletion_status,konto) VALUES ('{app.appnr}', '{app.name}', '{app.created_semester}', '{app.eternal}', {prof_id}, '{app.subject}', '{0}', '{SEMAP_MEDIA_ACCOUNTS[app.appnr]}')" query = f"INSERT OR IGNORE INTO semesterapparat (appnr, name, erstellsemester, dauer, prof_id, fach,deletion_status,konto) VALUES ('{app.appnr}', '{app.name}', '{app.created_semester}', '{app.eternal}', {prof_id}, '{app.subject}', '{0}', '{SEMAP_MEDIA_ACCOUNTS[app.appnr]}')"
log.debug(query) logger.debug(query)
self.query_db(query) self.query_db(query)
return None return None
def getApparatsByProf(self, prof_id: Union[str, int]) -> list[Apparat]: def getApparatsByProf(self, prof_id: Union[str, int]) -> list[tuple]:
"""Get all apparats based on the professor id """Get all apparats based on the professor id
Args: Args:
@@ -939,7 +897,7 @@ class Database:
) )
ret = [] ret = []
for i in data: for i in data:
log.debug(i) print(i)
ret.append(Apparat().from_tuple(i)) ret.append(Apparat().from_tuple(i))
return ret return ret
@@ -1021,15 +979,11 @@ class Database:
app_id (Union[str, int]): the id of the apparat app_id (Union[str, int]): the id of the apparat
semester (str): the semester the apparat should be deleted from semester (str): the semester the apparat should be deleted from
""" """
log.info(f"Deleting apparat with id {app_id} in semester {semester}") logger.info(f"Deleting apparat with id {app_id} in semester {semester}")
self.query_db( self.query_db(
"UPDATE semesterapparat SET deletion_status=1, deleted_date=? WHERE appnr=?", "UPDATE semesterapparat SET deletion_status=1, deleted_date=? WHERE appnr=?",
(semester, app_id), (semester, app_id),
) )
self.query_db(
"UPDATE media SET deleted=1 WHERE app_id=?",
(app_id,),
)
def isEternal(self, id): def isEternal(self, id):
"""check if the apparat is eternal (dauerapparat) """check if the apparat is eternal (dauerapparat)
@@ -1054,14 +1008,11 @@ class Database:
Returns: Returns:
str: the name of the apparat str: the name of the apparat
""" """
result = self.query_db( return self.query_db(
"SELECT name FROM semesterapparat WHERE appnr=? AND prof_id=?", "SELECT name FROM semesterapparat WHERE appnr=? AND prof_id=?",
(app_id, prof_id), (app_id, prof_id),
one=True, one=True,
) )[0]
if result:
return result[0]
return None
def updateApparat(self, apparat_data: ApparatData): def updateApparat(self, apparat_data: ApparatData):
"""Update an apparat in the database """Update an apparat in the database
@@ -1079,7 +1030,7 @@ class Database:
apparat_data.apparat.apparat_id_adis, apparat_data.apparat.apparat_id_adis,
apparat_data.apparat.appnr, apparat_data.apparat.appnr,
) )
log.debug(f"Updating apparat with query {query} and params {params}") logger.debug(f"Updating apparat with query {query} and params {params}")
self.query_db(query, params) self.query_db(query, params)
def checkApparatExists(self, app_name: str): def checkApparatExists(self, app_name: str):
@@ -1131,7 +1082,7 @@ class Database:
Returns: Returns:
list: the result of the query list: the result of the query
""" """
log.debug(f"Query: {query}") logger.debug(f"Query: {query}")
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
result = cursor.execute(query).fetchall() result = cursor.execute(query).fetchall()
@@ -1144,7 +1095,7 @@ class Database:
result_a = tuple(result_a) result_a = tuple(result_a)
result[result.index(orig_value)] = result_a result[result.index(orig_value)] = result_a
self.close_connection(conn) self.close_connection(conn)
log.debug(f"Query result: {result}") logger.debug(f"Query result: {result}")
return result return result
if "deletable" in kwargs.keys(): if "deletable" in kwargs.keys():
@@ -1159,9 +1110,9 @@ class Database:
kwargs["dauer"] = kwargs["dauer"].replace("Ja", "1").replace("Nein", "0") kwargs["dauer"] = kwargs["dauer"].replace("Ja", "1").replace("Nein", "0")
query = "SELECT * FROM semesterapparat WHERE " query = "SELECT * FROM semesterapparat WHERE "
for key, value in kwargs.items() if kwargs.items() is not None else {}: for key, value in kwargs.items() if kwargs.items() is not None else {}:
# log.debug(key, value) # print(key, value)
query += f"{key}='{value}' AND " query += f"{key}='{value}' AND "
# log.debug(query) # print(query)
# remove deletesemester part from normal query, as this will be added to the database upon deleting the apparat # remove deletesemester part from normal query, as this will be added to the database upon deleting the apparat
if "deletesemester" in kwargs.keys(): if "deletesemester" in kwargs.keys():
query = query.replace( query = query.replace(
@@ -1177,24 +1128,24 @@ class Database:
query = query.replace( query = query.replace(
f"endsemester='{kwargs['endsemester']}' AND ", "xyz" f"endsemester='{kwargs['endsemester']}' AND ", "xyz"
) )
# log.debug("replaced") # print("replaced")
query = query.replace( query = query.replace(
"xyz", "xyz",
f"(erstellsemester='{kwargs['endsemester']}' OR verlängerung_bis='{kwargs['endsemester']}') AND ", f"(erstellsemester='{kwargs['endsemester']}' OR verlängerung_bis='{kwargs['endsemester']}') AND ",
) )
# remove all x="" parts from the query where x is a key in kwargs # remove all x="" parts from the query where x is a key in kwargs
log.info(f"Query before: {query}") logger.info(f"Query before: {query}")
query = query.strip() query = query.strip()
query = query[:-4] query = query[:-4]
log.info(f"Query after: {query}") logger.info(f"Query after: {query}")
# check if query ends with lowercase letter or a '. if not, remove last symbol and try again # check if query ends with lowercase letter or a '. if not, remove last symbol and try again
while query[-1] not in ascii_lowercase and query[-1] != "'": while query[-1] not in ascii_lowercase and query[-1] != "'":
query = query[:-1] query = query[:-1]
query = query.strip() query = query.strip()
# log.debug(query) # print(query)
res = __query(query) res = __query(query)
# log.debug(res) # print(res)
return res return res
# Admin data # Admin data
@@ -1217,14 +1168,11 @@ class Database:
Returns: Returns:
bool: True if the login was successful, False if not bool: True if the login was successful, False if not
""" """
try:
salt = self.query_db( salt = self.query_db(
"SELECT salt FROM user WHERE username=?", (user,), one=True "SELECT salt FROM user WHERE username=?", (user,), one=True
)[0] )[0]
if salt is None: if salt is None:
return False return False
except TypeError:
return False
hashed_password = salt + hashed_password hashed_password = salt + hashed_password
password = self.query_db( password = self.query_db(
"SELECT password FROM user WHERE username=?", (user,), one=True "SELECT password FROM user WHERE username=?", (user,), one=True
@@ -1299,13 +1247,6 @@ class Database:
"INSERT OR IGNORE INTO user (username, password, role, salt) VALUES (?,?,?,?)", "INSERT OR IGNORE INTO user (username, password, role, salt) VALUES (?,?,?,?)",
(user, password, role, salt), (user, password, role, salt),
) )
# check if user was created
return (
self.query_db(
"SELECT username FROM user WHERE username=?", (user,), one=True
)
is not None
)
def deleteUser(self, user): def deleteUser(self, user):
"""delete an unser """delete an unser
@@ -1373,15 +1314,15 @@ class Database:
""" """
return self.query_db("SELECT titel, fname,lname,mail,telnr,fullname FROM prof") return self.query_db("SELECT titel, fname,lname,mail,telnr,fullname FROM prof")
def restoreApparat(self, app_id: Union[str, int], app_name: str): def restoreApparat(self, app_id: Union[str, int]):
"""restore an apparat from the database """restore an apparat from the database
Args: Args:
app_id (Union[str, int]): the id of the apparat app_id (Union[str, int]): the id of the apparat
""" """
return self.query_db( return self.query_db(
"UPDATE semesterapparat SET deletion_status=0, deleted_date=NULL WHERE appnr=? and name=?", "UPDATE semesterapparat SET deletion_status=0, deleted_date=NULL WHERE appnr=?",
(app_id, app_name), (app_id,),
) )
# ELSA # ELSA
@@ -1492,16 +1433,17 @@ class Database:
blob = self.query_db( blob = self.query_db(
"SELECT fileblob FROM elsa_files WHERE filename=?", (filename,), one=True "SELECT fileblob FROM elsa_files WHERE filename=?", (filename,), one=True
)[0] )[0]
# log.debug(blob) # print(blob)
tempdir = settings.database.temp.expanduser() tempdir = self.database.tempdir
if not tempdir.exists(): tempdir = tempdir.replace("~", str(Path.home()))
tempdir.mkdir(parents=True, exist_ok=True) tempdir_path = Path(tempdir)
if not os.path.exists(tempdir_path):
os.mkdir(tempdir_path)
file = tempfile.NamedTemporaryFile( file = tempfile.NamedTemporaryFile(
delete=False, dir=tempdir_path, mode="wb", suffix=f".{filetype}" delete=False, dir=tempdir_path, mode="wb", suffix=f".{filetype}"
) )
file.write(blob) file.write(blob)
# log.debug("file created") # print("file created")
return file.name return file.name
def getElsaApparats(self) -> ELSA: def getElsaApparats(self) -> ELSA:
@@ -1510,11 +1452,9 @@ class Database:
Returns: Returns:
list[tuple]: a list of tuples containing the ELSA apparats list[tuple]: a list of tuples containing the ELSA apparats
""" """
return self.query_db( return self.query_db("SELECT * FROM elsa")
"SELECT * FROM elsa ORDER BY substr(date, 7, 4) || '-' || substr(date, 4, 2) || '-' || substr(date, 1, 2)"
)
def getElsaId(self, prof_id: int, semester: str, date: str) -> int: def getElsaId(self, prof_id, semester, date):
"""get the id of an ELSA apparat based on the professor, semester and date """get the id of an ELSA apparat based on the professor, semester and date
Args: Args:
@@ -1551,7 +1491,7 @@ class Database:
### ###
def createProf(self, profdata: Prof): def createProf(self, profdata: Prof):
log.debug(profdata) logger.debug(profdata)
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
fname = profdata.firstname fname = profdata.firstname
@@ -1562,7 +1502,7 @@ class Database:
title = profdata.title title = profdata.title
query = f"INSERT INTO prof (fname, lname, fullname, mail, telnr,titel) VALUES ('{fname}','{lname}','{fullname}','{mail}','{telnr}','{title}')" query = f"INSERT INTO prof (fname, lname, fullname, mail, telnr,titel) VALUES ('{fname}','{lname}','{fullname}','{mail}','{telnr}','{title}')"
log.debug(query) logger.debug(query)
cursor.execute(query) cursor.execute(query)
conn.commit() conn.commit()
@@ -1596,7 +1536,9 @@ class Database:
""" """
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
if isinstance(profdata, dict): if isinstance(profdata, Prof):
fullname = profdata.name()
else:
name = profdata["profname"] name = profdata["profname"]
if "," in name: if "," in name:
fname = name.split(", ")[1].strip() fname = name.split(", ")[1].strip()
@@ -1604,10 +1546,8 @@ class Database:
fullname = f"{lname} {fname}" fullname = f"{lname} {fname}"
else: else:
fullname = profdata["profname"] fullname = profdata["profname"]
else:
fullname = profdata.name()
query = f"SELECT id FROM prof WHERE fullname = '{fullname}'" query = f"SELECT id FROM prof WHERE fullname = '{fullname}'"
log.debug(query) logger.debug(query)
cursor.execute(query) cursor.execute(query)
result = cursor.fetchone() result = cursor.fetchone()
@@ -1625,7 +1565,7 @@ class Database:
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
query = f"SELECT * FROM prof WHERE fullname = '{fullname}'" query = f"SELECT * FROM prof WHERE fullname = '{fullname}'"
log.debug(query) logger.debug(query)
result = cursor.execute(query).fetchone() result = cursor.execute(query).fetchone()
if result: if result:
@@ -1633,7 +1573,7 @@ class Database:
else: else:
return Prof() return Prof()
def getProfIDByApparat(self, apprarat_id: int) -> Optional[int]: def getProfIDByApparat(self, apprarat_id):
"""Get the prof id based on the semesterapparat id from the database """Get the prof id based on the semesterapparat id from the database
Args: Args:
@@ -1646,12 +1586,12 @@ class Database:
query = f"SELECT prof_id from semesterapparat WHERE appnr = '{apprarat_id}' and deletion_status = 0" query = f"SELECT prof_id from semesterapparat WHERE appnr = '{apprarat_id}' and deletion_status = 0"
data = self.query_db(query) data = self.query_db(query)
if data: if data:
log.info("Prof ID: " + str(data[0][0])) logger.info("Prof ID: " + str(data[0][0]))
return data[0][0] return data[0][0]
else: else:
return None return None
def copyBookToApparat(self, book_id: int, apparat: int): def copyBookToApparat(self, book_id, apparat):
# get book data # get book data
new_apparat_id = apparat new_apparat_id = apparat
new_prof_id = self.getProfIDByApparat(new_apparat_id) new_prof_id = self.getProfIDByApparat(new_apparat_id)
@@ -1672,7 +1612,7 @@ class Database:
connection.commit() connection.commit()
connection.close() connection.close()
def moveBookToApparat(self, book_id: int, appratat: int): def moveBookToApparat(self, book_id, appratat):
"""Move the book to the new apparat """Move the book to the new apparat
Args: Args:
@@ -1687,18 +1627,10 @@ class Database:
connection.commit() connection.commit()
connection.close() connection.close()
def getApparatNameByAppNr(self, appnr: int): def getApparatNameByAppNr(self, appnr):
query = f"SELECT name FROM semesterapparat WHERE appnr = '{appnr}' and deletion_status = 0" query = f"SELECT name FROM semesterapparat WHERE appnr = '{appnr}' and deletion_status = 0"
data = self.query_db(query) data = self.query_db(query)
if data: if data:
return data[0][0] return data[0][0]
else: else:
return None return None
def fetch_one(self, query: str, args: tuple[Any, ...] = ()) -> tuple[Any, ...]:
connection = self.connect()
cursor = connection.cursor()
cursor.execute(query, args)
result = cursor.fetchone()
connection.close()
return result

View File

@@ -12,12 +12,12 @@ CREATE_TABLE_APPARAT = """CREATE TABLE semesterapparat (
deleted_date TEXT, deleted_date TEXT,
apparat_id_adis INTEGER, apparat_id_adis INTEGER,
prof_id_adis INTEGER, prof_id_adis INTEGER,
konto INTEGER, konto INTEGER REFERENCES app_kontos (id),
FOREIGN KEY (prof_id) REFERENCES prof (id) FOREIGN KEY (prof_id) REFERENCES prof (id)
)""" )"""
CREATE_TABLE_MEDIA = """CREATE TABLE media ( CREATE_TABLE_MEDIA = """CREATE TABLE media (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
bookdata TEXT, bookdata BLOB,
app_id INTEGER, app_id INTEGER,
prof_id INTEGER, prof_id INTEGER,
deleted INTEGER DEFAULT (0), deleted INTEGER DEFAULT (0),
@@ -26,7 +26,13 @@ CREATE_TABLE_MEDIA = """CREATE TABLE media (
FOREIGN KEY (prof_id) REFERENCES prof (id), FOREIGN KEY (prof_id) REFERENCES prof (id),
FOREIGN KEY (app_id) REFERENCES semesterapparat (id) FOREIGN KEY (app_id) REFERENCES semesterapparat (id)
)""" )"""
CREATE_TABLE_APPKONTOS = """CREATE TABLE app_kontos (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
app_id INTEGER,
konto INTEGER,
passwort TEXT,
FOREIGN KEY (app_id) REFERENCES semesterapparat (id)
)"""
CREATE_TABLE_FILES = """CREATE TABLE files ( CREATE_TABLE_FILES = """CREATE TABLE files (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
filename TEXT, filename TEXT,

View File

@@ -9,7 +9,10 @@ def delete_temp_contents():
""" """
delete_temp_contents deletes the contents of the temp directory. delete_temp_contents deletes the contents of the temp directory.
""" """
path = database.temp.expanduser() path = database.temp
path = path.replace("~", str(Path.home()))
path = Path(path)
path = path.resolve()
for root, dirs, files in os.walk(path): for root, dirs, files in os.walk(path):
for file in files: for file in files:
os.remove(os.path.join(root, file)) os.remove(os.path.join(root, file))

View File

@@ -1,23 +1,11 @@
from PySide6.QtCore import QThread, Slot from PyQt6.QtCore import QThread
from src.utils.documentation import website, QuietHandler from src.utils.documentation import run_mkdocs
from wsgiref.simple_server import make_server
class DocumentationThread(QThread): class DocumentationThread(QThread):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self._server = None # store server so we can shut it down
def run(self): def run(self):
# launch_documentation() # launch_documentation()
self._server = make_server( run_mkdocs()
"localhost", 8000, website(), handler_class=QuietHandler
)
while not self.isInterruptionRequested():
self._server.handle_request()
@Slot() # slot you can connect to aboutToQuit
def stop(self):
self.requestInterruption() # ask the loop above to exit
if self._server:
self._server.shutdown() # unblock handle_request()

View File

@@ -1,242 +1,131 @@
"""Semester helper class
A small utility around the *German* academic calendar that distinguishes
between *Wintersemester* (WiSe) and *Sommersemester* (SoSe).
Key points
----------
* A **`Semester`** is identified by a *term* ("SoSe" or "WiSe") and the last two
digits of the calendar year in which the term *starts*.
* Formatting **never** pads the year with a leading zero so ``6`` stays ``6``.
* ``offset(n)`` and the static ``generate_missing`` reliably walk the timeline
one semester at a time with correct year transitions:
SoSe 6 → **WiSe 6/7** → SoSe 7 → WiSe 7/8 → …
"""
from __future__ import annotations
import datetime import datetime
import re from src import logger
from dataclasses import dataclass from dataclasses import dataclass
import loguru
import sys
from src import LOG_DIR
log = loguru.logger
log.remove()
log.add(sys.stdout, level="INFO")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
@dataclass
# @dataclass
class Semester: class Semester:
"""Represents a German university semester (WiSe or SoSe).""" logger.debug("Semester class loaded")
# ------------------------------------------------------------------ _year: int | None = str(datetime.datetime.now().year)[2:]
# Classlevel defaults will be *copied* to each instance and then _semester: str | None = None
# potentially overwritten in ``__init__``.
# ------------------------------------------------------------------
_year: int | None = int(str(datetime.datetime.now().year)[2:]) # 24 → 24
_semester: str | None = None # "WiSe" or "SoSe" set later
_month: int | None = datetime.datetime.now().month _month: int | None = datetime.datetime.now().month
value: str | None = None # Humanreadable label, e.g. "WiSe 23/24" value: str = None
logger.debug(
# ------------------------------------------------------------------ f"Initialized Semester class with values: month: {_month}, semester: {_semester}, year {_year}"
# Construction helpers )
# ------------------------------------------------------------------ def __post_init__(self):
def __init__( if isinstance(self._year, str):
self, self._year = int(self._year)
year: int | None = None,
semester: str | None = None,
month: int | None = None,
) -> None:
if year is not None:
self._year = int(year)
if semester is not None:
if semester not in ("WiSe", "SoSe"):
raise ValueError("semester must be 'WiSe' or 'SoSe'")
self._semester = semester
if month is not None:
self._month = month
self.__post_init__()
def __post_init__(self) -> None: # noqa: D401 keep original name
if self._year is None: if self._year is None:
self._year = int(str(datetime.datetime.now().year)[2:]) self._year = datetime.datetime.now().year[2:]
if self._month is None: if self._month is None:
self._month = datetime.datetime.now().month self._month = datetime.datetime.now().month
if self._semester is None: if self._semester is None:
self._generate_semester_from_month() self.generateSemester()
self._compute_value() self.computeValue()
# ------------------------------------------------------------------ def __str__(self):
# Dunder helpers return self.value
# ------------------------------------------------------------------
def __str__(self) -> str: # noqa: D401 keep original name
return self.value or "<invalid Semester>"
def __repr__(self) -> str: # Helpful for debugging lists def generateSemester(self):
return f"Semester({self._year!r}, {self._semester!r})" if self._month <= 3 or self._month > 9:
self._semester = "WiSe"
else:
self._semester = "SoSe"
# ------------------------------------------------------------------ @logger.catch
# Internal helpers def computeValue(self):
# ------------------------------------------------------------------ # year is only last two digits
def _generate_semester_from_month(self) -> None:
"""Infer *WiSe* / *SoSe* from the month attribute."""
self._semester = "WiSe" if (self._month <= 3 or self._month > 9) else "SoSe"
def _compute_value(self) -> None:
"""Humanreadable semester label e.g. ``WiSe 23/24`` or ``SoSe 24``."""
year = self._year year = self._year
valueyear = str(year)
if self._semester == "WiSe": if self._semester == "WiSe":
next_year = (year + 1) % 100 # wrap 99 → 0 if self._month < 4:
self.value = f"WiSe {year}/{next_year}" valueyear = str(year - 1) + "/" + str(year)
else: # SoSe else:
self.value = f"SoSe {year}" valueyear = str(year) + "/" + str(year + 1)
self.value = f"{self._semester} {valueyear}"
# ------------------------------------------------------------------ @logger.catch
# Public API def offset(self, value: int) -> str:
# ------------------------------------------------------------------ """Generate a new Semester object by offsetting the current semester by a given value
def offset(self, value: int) -> "Semester":
"""Return a new :class:`Semester` *value* steps away.
The algorithm maps every semester to a monotonically increasing Args:
*linear index* so that simple addition suffices: value (int): The value by which the semester should be offset
``index = year * 2 + (0 if SoSe else 1)``. Returns:
str: the new semester value
""" """
if not isinstance(value, int): assert isinstance(value, int), "Value must be an integer"
raise TypeError("value must be an int (number of semesters to jump)")
if value == 0: if value == 0:
return Semester(self._year, self._semester) return self
if value > 0:
if value % 2 == 0:
return Semester(
self._year - value // 2, self._semester - value // 2 + 1
)
else:
semester = self._semester
semester = "SoSe" if semester == "WiSe" else "WiSe"
return Semester(self._year + value // 2, semester)
else:
if value % 2 == 0:
return Semester(self.year + value // 2, self._semester)
else:
semester = self._semester
semester = "SoSe" if semester == "WiSe" else "WiSe"
return Semester(self._year + value // 2, semester)
current_idx = self._year * 2 + (0 if self._semester == "SoSe" else 1) def isPastSemester(self, semester) -> bool:
target_idx = current_idx + value """Checks if the current Semester is a past Semester compared to the given Semester
if target_idx < 0:
raise ValueError("offset would result in a negative year not supported")
new_year, semester_bit = divmod(target_idx, 2) Args:
new_semester = "SoSe" if semester_bit == 0 else "WiSe" semester (str): The semester to compare to
return Semester(new_year, new_semester)
# ------------------------------------------------------------------ Returns:
# Comparison helpers bool: True if the current semester is in the past, False otherwise
# ------------------------------------------------------------------ """
def isPastSemester(self, other: "Semester") -> bool: if self.year < semester.year:
if self.year < other.year: return True
if self.year == semester.year:
if self.semester == "WiSe" and semester.semester == "SoSe":
return True return True
if self.year == other.year:
return (
self.semester == "WiSe" and other.semester == "SoSe"
) # WiSe before next SoSe
return False return False
def isFutureSemester(self, other: "Semester") -> bool: def isFutureSemester(self, semester: "Semester") -> bool:
if self.year > other.year: """Checks if the current Semester is a future Semester compared to the given Semester
Args:
semester (str): The semester to compare to
Returns:
bool: True if the current semester is in the future, False otherwise
"""
if self.year > semester.year:
return True
if self.year == semester.year:
if self.semester == "SoSe" and semester.semester == "WiSe":
return True return True
if self.year == other.year:
return (
self.semester == "SoSe" and other.semester == "WiSe"
) # SoSe after WiSe of same year
return False return False
def isMatch(self, other: "Semester") -> bool: def from_string(self, val):
return self.year == other.year and self.semester == other.semester self.value = val
self._year = int(val[-2:])
self._semester = val[:4]
return self
# ------------------------------------------------------------------
# Convenience properties
# ------------------------------------------------------------------
@property @property
def next(self) -> "Semester": def next(self):
return self.offset(1) return self.offset(1)
@property @property
def previous(self) -> "Semester": def previous(self):
return self.offset(-1) return self.offset(-1)
@property @property
def year(self) -> int: def year(self):
return self._year return self._year
@property @property
def semester(self) -> str: def semester(self):
return self._semester return self._semester
# ------------------------------------------------------------------
# Static helpers
# ------------------------------------------------------------------
@staticmethod
def generate_missing(start: "Semester", end: "Semester") -> list[str]:
"""Return all consecutive semesters from *start* to *end* (inclusive)."""
if not isinstance(start, Semester) or not isinstance(end, Semester):
raise TypeError("start and end must be Semester instances")
if start.isFutureSemester(end) and not start.isMatch(end):
raise ValueError("'start' must not be after 'end'")
chain: list[Semester] = [start.value]
current = start
while not current.isMatch(end):
current = current.next
chain.append(current.value)
if len(chain) > 1000: # sanity guard
raise RuntimeError("generate_missing exceeded sane iteration limit")
return chain
# ------------------------------------------------------------------
# Parsing helper
# ------------------------------------------------------------------
@classmethod
def from_string(cls, s: str) -> "Semester":
"""Parse a humanreadable semester label and return a :class:`Semester`.
Accepted formats (caseinsensitive)::
"SoSe <YY>" → SoSe of year YY
"WiSe <YY>/<YY+1>" → Winter term starting in YY
"WiSe <YY>" → Shorthand for the above (next year implied)
``YY`` may contain a leading zero ("06" → 6).
"""
if not isinstance(s, str):
raise TypeError("s must be a string")
pattern = r"\s*(WiSe|SoSe)\s+(\d{1,2})(?:\s*/\s*(\d{1,2}))?\s*"
m = re.fullmatch(pattern, s, flags=re.IGNORECASE)
if not m:
raise ValueError(
"invalid semester string format expected 'SoSe YY' or 'WiSe YY/YY' (spacing flexible)"
)
term_raw, y1_str, y2_str = m.groups()
term = term_raw.capitalize() # normalize case → "WiSe" or "SoSe"
year = int(y1_str.lstrip("0") or "0") # "06" → 6, "0" stays 0
if term == "SoSe":
if y2_str is not None:
raise ValueError(
"SoSe string should not contain '/' followed by a second year"
)
return cls(year, "SoSe")
# term == "WiSe"
if y2_str is not None:
next_year = int(y2_str.lstrip("0") or "0")
expected_next = (year + 1) % 100
if next_year != expected_next:
raise ValueError("WiSe second year must equal first year + 1 (mod 100)")
# Accept both explicit "WiSe 6/7" and shorthand "WiSe 6"
return cls(year, "WiSe")
# ------------------------- quick selftest -------------------------
if __name__ == "__main__":
# Chain generation demo ------------------------------------------------
s_start = Semester(6, "SoSe") # SoSe 6
s_end = Semester(25, "WiSe") # WiSe 25/26
chain = Semester.generate_missing(s_start, s_end)
print("generate_missing:", [str(s) for s in chain])
# Parsing demo ---------------------------------------------------------
for label in ["SoSe 6", "WiSe 6/7", "wise 23/24", "WiSe 9"]:
print("from_string:", label, "", Semester.from_string(label))

View File

@@ -1,39 +1,43 @@
from PySide6.QtCore import QThread import sqlite3
from PySide6.QtCore import Signal
from PyQt6.QtCore import QThread
from PyQt6.QtCore import pyqtSignal as Signal
from src.backend import Database from src.backend import Database
from src.logic.webrequest import BibTextTransformer, WebRequest from src.logic.webrequest import BibTextTransformer, WebRequest
import loguru
import sys import sys
from src import LOG_DIR from loguru import logger as log
log = loguru.logger
log.remove()
log.add(sys.stdout, level="INFO")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
logger = log
logger.remove()
logger.add("logs/bookgrabber_thread.log", rotation="1 week", enqueue=True)
log.add(
"logs/application.log",
rotation="1 day",
compression="zip",
)
# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO") # logger.add(sys.stderr, format="{time} {level} {message}", level="INFO")
log.add(sys.stdout, level="INFO") logger.add(sys.stdout)
class BookGrabber(QThread): class BookGrabber(QThread):
updateSignal = Signal(int, int) updateSignal = Signal(int, int)
done = Signal() done = Signal()
def __init__(self): def __init__(self, appnr: int):
super(BookGrabber, self).__init__(parent=None) super(BookGrabber, self).__init__(parent=None)
self.is_Running = True self.is_Running = True
log.info("Starting worker thread") logger.info("Starting worker thread")
self.data = [] self.data = None
self.app_id = None self.app_id = None
self.prof_id = None self.prof_id = None
self.mode = None self.mode = None
self.book_id = None self.book_id = None
self.use_any = False self.use_any = False
self.use_exact = False self.use_exact = False
self.app_id = None self.appnr = appnr
self.tstate = (self.app_id, self.prof_id, self.mode, self.data) self.tstate = (self.app_id, self.prof_id, self.mode, self.data)
self.request = WebRequest()
def add_values( def add_values(
self, app_id: int, prof_id: int, mode: str, data, any_book=False, exact=False self, app_id: int, prof_id: int, mode: str, data, any_book=False, exact=False
@@ -41,26 +45,27 @@ class BookGrabber(QThread):
self.app_id = app_id self.app_id = app_id
self.prof_id = prof_id self.prof_id = prof_id
self.mode = mode self.mode = mode
self.data: list[str] = data self.data = data
self.use_any = any_book self.use_any = any_book
self.use_exact = exact self.use_exact = exact
log.info(f"Working on {len(self.data)} entries") logger.info(f"Working on {len(self.data)} entries")
self.tstate = (self.app_id, self.prof_id, self.mode, self.data) self.tstate = (self.app_id, self.prof_id, self.mode, self.data)
log.debug("State: " + str(self.tstate)) logger.debug("State: " + str(self.tstate))
self.request.set_apparat(self.app_id) # print(self.tstate)
# log.debug(self.tstate)
def run(self): def run(self):
self.db = Database() self.db = Database()
item = 0 item = 0
iterdata = self.data iterdata = self.data
# log.debug(iterdata) # print(iterdata)
if self.prof_id is None:
self.prof_id = self.db.getProfNameByApparat(self.app_id)
for entry in iterdata: for entry in iterdata:
# log.debug(entry) # print(entry)
log.info("Processing entry: {}", entry) signature = str(entry)
logger.info("Processing entry: " + signature)
webdata = self.request.get_ppn(entry) webdata = WebRequest().set_apparat(self.appnr).get_ppn(entry)
if self.use_any: if self.use_any:
webdata = webdata.use_any_book webdata = webdata.use_any_book
webdata = webdata.get_data() webdata = webdata.get_data()
@@ -69,12 +74,12 @@ class BookGrabber(QThread):
continue continue
bd = BibTextTransformer(self.mode) bd = BibTextTransformer(self.mode)
log.debug(webdata) print(webdata)
if self.mode == "ARRAY": if self.mode == "ARRAY":
if self.use_exact: if self.use_exact:
bd = bd.use_signature(entry) bd = bd.use_signature(entry)
bd = bd.get_data(webdata).return_data() bd = bd.get_data(webdata).return_data()
log.debug(bd) print(bd)
if bd is None: if bd is None:
# bd = BookData # bd = BookData
continue continue
@@ -87,29 +92,27 @@ class BookGrabber(QThread):
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()
log.info("Added book to database") logger.info("Added book to database")
state = 0 state = 0
for result in transformer.RDS_DATA: for result in transformer.RDS_DATA:
# log.debug(result.RDS_LOCATION) # print(result.RDS_LOCATION)
if str(self.app_id) in result.RDS_LOCATION: if str(self.app_id) in result.RDS_LOCATION:
state = 1 state = 1
break break
log.info(f"State of {entry}: {state}") logger.info(f"State of {signature}: {state}")
log.debug( print("updating availability of " + str(self.book_id) + " to " + str(state))
"updating availability of " + str(self.book_id) + " to " + str(state)
)
try: try:
self.db.setAvailability(self.book_id, state) self.db.setAvailability(self.book_id, state)
log.debug("Added book to database") print("Added book to database")
except Exception as e: except Exception as e:
log.error(f"Failed to update availability: {e}") logger.error(f"Failed to update availability: {e}")
log.debug("Failed to update availability: " + str(e)) print("Failed to update availability: " + str(e))
# time.sleep(5) # time.sleep(5)
item += 1 item += 1
self.updateSignal.emit(item, len(self.data)) self.updateSignal.emit(item, len(self.data))
log.info("Worker thread finished") logger.info("Worker thread finished")
# self.done.emit() # self.done.emit()
self.quit() self.quit()
@@ -124,7 +127,7 @@ class BookGrabberTest(QThread):
def __init__(self, appnr: int): def __init__(self, appnr: int):
super(BookGrabberTest, self).__init__(parent=None) super(BookGrabberTest, self).__init__(parent=None)
self.is_Running = True self.is_Running = True
log.info("Starting worker thread") logger.info("Starting worker thread")
self.data = None self.data = None
self.app_id = None self.app_id = None
self.prof_id = None self.prof_id = None
@@ -132,7 +135,7 @@ class BookGrabberTest(QThread):
self.book_id = None self.book_id = None
self.use_any = False self.use_any = False
self.use_exact = False self.use_exact = False
self.app_id = appnr self.appnr = appnr
self.tstate = (self.app_id, self.prof_id, self.mode, self.data) self.tstate = (self.app_id, self.prof_id, self.mode, self.data)
self.results = [] self.results = []
@@ -145,21 +148,21 @@ class BookGrabberTest(QThread):
self.data = data self.data = data
self.use_any = any_book self.use_any = any_book
self.use_exact = exact self.use_exact = exact
log.info(f"Working on {len(self.data)} entries") logger.info(f"Working on {len(self.data)} entries")
self.tstate = (self.app_id, self.prof_id, self.mode, self.data) self.tstate = (self.app_id, self.prof_id, self.mode, self.data)
log.debug("State: " + str(self.tstate)) logger.debug("State: " + str(self.tstate))
# log.debug(self.tstate) # print(self.tstate)
def run(self): def run(self):
item = 0 item = 0
iterdata = self.data iterdata = self.data
# log.debug(iterdata) # print(iterdata)
for entry in iterdata: for entry in iterdata:
# log.debug(entry) # print(entry)
signature = str(entry) signature = str(entry)
log.info("Processing entry: " + signature) logger.info("Processing entry: " + signature)
webdata = WebRequest().set_apparat(self.app_id).get_ppn(entry) webdata = WebRequest().set_apparat(self.appnr).get_ppn(entry)
if self.use_any: if self.use_any:
webdata = webdata.use_any_book webdata = webdata.use_any_book
webdata = webdata.get_data() webdata = webdata.get_data()
@@ -182,22 +185,22 @@ class BookGrabberTest(QThread):
# confirm lock is acquired # confirm lock is acquired
# get latest book id # get latest book id
log.info("Added book to database") logger.info("Added book to database")
state = 0 state = 0
for result in transformer.RDS_DATA: for result in transformer.RDS_DATA:
# log.debug(result.RDS_LOCATION) # print(result.RDS_LOCATION)
if str(self.app_id) in result.RDS_LOCATION: if str(self.app_id) in result.RDS_LOCATION:
state = 1 state = 1
break break
log.info(f"State of {signature}: {state}") logger.info(f"State of {signature}: {state}")
# log.debug("updating availability of " + str(self.book_id) + " to " + str(state)) # print("updating availability of " + str(self.book_id) + " to " + str(state))
self.results.append(bd) self.results.append(bd)
# time.sleep(5) # time.sleep(5)
item += 1 item += 1
self.updateSignal.emit(item, len(self.data)) self.updateSignal.emit(item, len(self.data))
log.info("Worker thread finished") logger.info("Worker thread finished")
# self.done.emit() # self.done.emit()
self.quit() self.quit()

View File

@@ -1,17 +1,10 @@
import time import time
# from icecream import ic # from icecream import ic
from PySide6.QtCore import QThread from PyQt6.QtCore import QThread
from PySide6.QtCore import Signal as Signal from PyQt6.QtCore import pyqtSignal as Signal
from src.backend import Database from src.backend import Database
import loguru
import sys
from src import LOG_DIR
log = loguru.logger
log.remove()
log.add(sys.stdout, level="INFO")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
# from src.transformers import RDS_AVAIL_DATA # from src.transformers import RDS_AVAIL_DATA
@@ -35,7 +28,7 @@ class AutoAdder(QThread):
def run(self): def run(self):
self.db = Database() self.db = Database()
# show the dialog, start the thread to gather data and dynamically update progressbar and listwidget # show the dialog, start the thread to gather data and dynamically update progressbar and listwidget
log.info("Starting worker thread") logger.info("Starting worker thread")
item = 0 item = 0
for entry in self.data: for entry in self.data:
try: try:
@@ -47,11 +40,11 @@ class AutoAdder(QThread):
except Exception as e: except Exception as e:
# print(e) # print(e)
log.exception( logger.exception(
f"The query failed with message {e} for signature {entry}" f"The query failed with message {e} for signature {entry}"
) )
continue continue
if item == len(self.data): if item == len(self.data):
log.info("Worker thread finished") logger.info("Worker thread finished")
# teminate thread # teminate thread
self.finished.emit() self.finished.emit()

View File

@@ -1,22 +1,14 @@
import time import time
# from icecream import ic # from icecream import ic
from PySide6.QtCore import QThread from PyQt6.QtCore import QThread
from PySide6.QtCore import Signal as Signal from PyQt6.QtCore import pyqtSignal as Signal
from src.backend.database import Database from src.backend.database import Database
from src import LOG_DIR
from src.logic.webrequest import BibTextTransformer, WebRequest from src.logic.webrequest import BibTextTransformer, WebRequest
# from src.transformers import RDS_AVAIL_DATA # from src.transformers import RDS_AVAIL_DATA
import loguru
import sys
log = loguru.logger
log.remove()
log.add(sys.stdout, level="INFO")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
class AvailChecker(QThread): class AvailChecker(QThread):
@@ -29,8 +21,8 @@ class AvailChecker(QThread):
if links is None: if links is None:
links = [] links = []
super().__init__(parent) super().__init__(parent)
log.info("Starting worker thread") logger.info("Starting worker thread")
log.info( logger.info(
"Checking availability for " "Checking availability for "
+ str(links) + str(links)
+ " with appnumber " + " with appnumber "
@@ -40,7 +32,7 @@ class AvailChecker(QThread):
self.links = links self.links = links
self.appnumber = appnumber self.appnumber = appnumber
self.books = books self.books = books
log.info( logger.info(
f"Started worker with appnumber: {self.appnumber} and links: {self.links} and {len(self.books)} books..." f"Started worker with appnumber: {self.appnumber} and links: {self.links} and {len(self.books)} books..."
) )
time.sleep(2) time.sleep(2)
@@ -50,7 +42,7 @@ class AvailChecker(QThread):
state = 0 state = 0
count = 0 count = 0
for link in self.links: for link in self.links:
log.info("Processing entry: " + str(link)) logger.info("Processing entry: " + str(link))
data = WebRequest().set_apparat(self.appnumber).get_ppn(link).get_data() data = WebRequest().set_apparat(self.appnumber).get_ppn(link).get_data()
transformer = BibTextTransformer("RDS") transformer = BibTextTransformer("RDS")
rds = transformer.get_data(data).return_data("rds_availability") rds = transformer.get_data(data).return_data("rds_availability")
@@ -67,14 +59,14 @@ class AvailChecker(QThread):
if book["bookdata"].signature == link: if book["bookdata"].signature == link:
book_id = book["id"] book_id = book["id"]
break break
log.info(f"State of {link}: " + str(state)) logger.info(f"State of {link}: " + str(state))
# print("Updating availability of " + str(book_id) + " to " + str(state)) # print("Updating availability of " + str(book_id) + " to " + str(state))
self.db.setAvailability(book_id, state) self.db.setAvailability(book_id, state)
count += 1 count += 1
self.updateProgress.emit(count, len(self.links)) self.updateProgress.emit(count, len(self.links))
self.updateSignal.emit(item.callnumber, state) self.updateSignal.emit(item.callnumber, state)
log.info("Worker thread finished") logger.info("Worker thread finished")
# teminate thread # teminate thread
self.quit() self.quit()

View File

@@ -2,5 +2,5 @@ from .dataclass import ApparatData, BookData, Prof, Apparat, ELSA
from .c_sort import custom_sort, sort_semesters_list from .c_sort import custom_sort, sort_semesters_list
from .constants import APP_NRS, PROF_TITLES, SEMAP_MEDIA_ACCOUNTS from .constants import APP_NRS, PROF_TITLES, SEMAP_MEDIA_ACCOUNTS
from .csvparser import csv_to_list from .csvparser import csv_to_list
from .wordparser import elsa_word_to_csv, word_docx_to_csv, word_to_semap, SemapDocument from .wordparser import elsa_word_to_csv, word_docx_to_csv, word_to_semap
from .zotero import ZoteroController from .zotero import ZoteroController

View File

@@ -1,38 +1,38 @@
import re
from dataclasses import dataclass, field from dataclasses import dataclass, field
from enum import Enum from enum import Enum
import json
from typing import Union, Any, Optional
@dataclass @dataclass
class Prof: class Prof:
id: Optional[int] = None id: int = None
_title: Optional[str] = None _title: str = None
firstname: Optional[str] = None firstname: str = None
lastname: Optional[str] = None lastname: str = None
fullname: Optional[str] = None fullname: str = None
mail: Optional[str] = None mail: str = None
telnr: Optional[str] = None telnr: str = None
# add function that sets the data based on a dict # add function that sets the data based on a dict
def from_dict(self, data: dict[str, Union[str, int]]): def from_dict(self, data: dict):
for key, value in data.items(): for key, value in data.items():
if hasattr(self, key): if hasattr(self, key):
setattr(self, key, value) setattr(self, key, value)
return self return self
@property @property
def title(self) -> str: def title(self):
if self._title is None or self._title == "None": if self._title is None or self._title == "None":
return "" return ""
return self._title return self._title
@title.setter @title.setter
def title(self, value: str): def title(self, value):
self._title = value self._title = value
# add function that sets the data from a tuple # add function that sets the data from a tuple
def from_tuple(self, data: tuple[Union[str, int], ...]): def from_tuple(self, data: tuple):
setattr(self, "id", data[0]) setattr(self, "id", data[0])
setattr(self, "_title", data[1]) setattr(self, "_title", data[1])
setattr(self, "firstname", data[2]) setattr(self, "firstname", data[2])
@@ -42,7 +42,7 @@ class Prof:
setattr(self, "telnr", data[6]) setattr(self, "telnr", data[6])
return self return self
def name(self, comma: bool = False) -> Optional[str]: def name(self, comma=False):
if self.firstname is None and self.lastname is None: if self.firstname is None and self.lastname is None:
if "," in self.fullname: if "," in self.fullname:
self.firstname = self.fullname.split(",")[1].strip() self.firstname = self.fullname.split(",")[1].strip()
@@ -62,9 +62,9 @@ class BookData:
signature: str | None = None signature: str | None = None
edition: str | None = None edition: str | None = None
link: str | None = None link: str | None = None
isbn: Union[str, list[str], None] = field(default_factory=list) isbn: str | list | None = field(default_factory=list)
author: str | None = None author: str | None = None
language: Union[str, list[str], None] = field(default_factory=list) language: str | list | None = field(default_factory=list)
publisher: str | None = None publisher: str | None = None
place: str | None = None place: str | None = None
year: str | None = None year: str | None = None
@@ -73,33 +73,35 @@ class BookData:
in_apparat: bool | None = False in_apparat: bool | None = False
adis_idn: str | None = None adis_idn: str | None = None
def from_dict(self, data: dict) -> "BookData": def from_dict(self, data: dict):
for key, value in data.items(): for key, value in data.items():
setattr(self, key, value) setattr(self, key, value)
return self
@property def to_dict(self):
def to_dict(self) -> str: return self.__dict__
"""Convert the dataclass to a dictionary."""
return json.dumps(self.__dict__, ensure_ascii=False)
def from_dataclass(self, dataclass: Optional[Any]) -> None: def from_dataclass(self, dataclass):
if dataclass is None:
return
for key, value in dataclass.__dict__.items(): for key, value in dataclass.__dict__.items():
setattr(self, key, value) setattr(self, key, value)
def from_string(self, data: str) -> "BookData": def from_string(self, data: str):
ndata = json.loads(data) if not data.startswith("BookData"):
return BookData(**ndata) raise ValueError("No valid BookData string")
else:
pattern = r"(\w+)='([^']*)'"
data_dict = dict(re.findall(pattern, data))
# print(data_dict)
for key, value in data_dict.items():
setattr(self, key, value)
return self
@dataclass @dataclass
class MailData: class MailData:
subject: Optional[str] = None subject: str | None = None
body: Optional[str] = None body: str | None = None
mailto: Optional[str] = None mailto: str | None = None
prof: Optional[str] = None prof: str | None = None
class Subjects(Enum): class Subjects(Enum):
@@ -129,15 +131,15 @@ class Subjects(Enum):
ECONOMICS = (24, "Wirtschaftslehre") ECONOMICS = (24, "Wirtschaftslehre")
@property @property
def id(self) -> int: def id(self):
return self.value[0] return self.value[0]
@property @property
def name(self) -> str: def name(self):
return self.value[1] return self.value[1]
@classmethod @classmethod
def get_index(cls, name: str) -> Optional[int]: def get_index(cls, name):
for i in cls: for i in cls:
if i.name == name: if i.name == name:
return i.id - 1 return i.id - 1
@@ -160,7 +162,7 @@ class Apparat:
prof_id_adis: str | None = None prof_id_adis: str | None = None
konto: int | None = None konto: int | None = None
def from_tuple(self, data: tuple[Any, ...]) -> "Apparat": def from_tuple(self, data: tuple):
self.id = data[0] self.id = data[0]
self.name = data[1] self.name = data[1]
self.prof_id = data[2] self.prof_id = data[2]
@@ -178,7 +180,7 @@ class Apparat:
return self return self
@property @property
def get_semester(self) -> Optional[str]: def get_semester(self):
if self.extend_until is not None: if self.extend_until is not None:
return self.extend_until return self.extend_until
else: else:
@@ -192,7 +194,7 @@ class ELSA:
semester: str | None = None semester: str | None = None
prof_id: int | None = None prof_id: int | None = None
def from_tuple(self, data: tuple[Any, ...]) -> "ELSA": def from_tuple(self, data):
self.id = data[0] self.id = data[0]
self.date = data[1] self.date = data[1]
self.semester = data[2] self.semester = data[2]

View File

@@ -0,0 +1,27 @@
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}')

View File

@@ -0,0 +1,10 @@
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()

92
src/logic/log.py Normal file
View File

@@ -0,0 +1,92 @@
import logging
import logging.handlers
import os
from loguru import logger as log
import sys
if not os.path.exists("logs"):
os.mkdir("logs")
# open and close the file to create it
logger = log
logger.remove()
logger.add("logs/application.log", rotation="50MB")
# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO")
logger.add(
sys.stdout,
colorize=True,
format="<green>{time}</green> <level>{message}</level>",
level="WARNING",
)
log_filesize = 10 * 1024**2 # 10MB
backups = 5
# Create a common file handler for all loggers
common_file_handler = logging.handlers.RotatingFileHandler(
"logs/application.log",
mode="a",
encoding="utf-8",
maxBytes=log_filesize,
backupCount=backups,
)
common_file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
common_file_handler.setFormatter(formatter)
# set max file size to 10MB, if exceeded, create a new file
class MyLogger:
def __init__(self, logger_name):
self.logger = logging.getLogger(logger_name)
self.logger.setLevel(logging.DEBUG)
self.logger.addHandler(common_file_handler)
self.encoding = "utf-8"
def log_info(self, message: str):
# ensure that the message is encoded in utf-8
self.logger.info(message.encode(self.encoding))
def log_debug(self, message: str):
self.logger.debug(message.encode(self.encoding))
def log_warning(self, message: str):
self.logger.warning(message.encode(self.encoding))
def log_error(self, message: str):
self.logger.error(message.encode(self.encoding))
def log_critical(self, message: str):
self.logger.critical(message.encode(self.encoding))
def log_exception(self, message: str):
self.logger.exception(message)
# Usage example:
if __name__ == "__main__":
logger1 = MyLogger("Logger1")
logger2 = MyLogger("Logger2")
logger1.log_info("This is an info message from Logger1")
logger1.log_debug("This is a debug message from Logger1")
logger1.log_warning("This is a warning message from Logger1")
logger1.log_error("This is an error message from Logger1")
logger1.log_critical("This is a critical message from Logger1")
logger2.log_info("This is an info message from Logger2")
logger2.log_debug("This is a debug message from Logger2")
logger2.log_warning("This is a warning message from Logger2")
logger2.log_error("This is an error message from Logger2")
logger2.log_critical("This is a critical message from Logger2")
try:
# Simulate an exception
raise Exception("An exception occurred")
except Exception:
logger1.log_exception("An exception occurred in Logger1")
logger2.log_exception("An exception occurred in Logger2")

1
src/logic/mail.py Normal file
View File

@@ -0,0 +1 @@

View File

@@ -1,53 +0,0 @@
from openai import OpenAI
from src import settings
import json
def init_client():
"""Initialize the OpenAI client with the API key and model from settings."""
global client, model, api_key
if not settings.openAI.api_key:
raise ValueError("OpenAI API key is not set in the configuration.")
if not settings.openAI.model:
raise ValueError("OpenAI model is not set in the configuration.")
model = settings.openAI.model
api_key = settings.openAI.api_key
client = OpenAI(api_key=api_key)
return client
def run_shortener(title:str, length:int):
client = init_client()
response = client.responses.create(
model=model,
instructions="""you are a sentence shortener. The next message will contain the string to shorten and the length limit.
You need to shorten the string to be under the length limit, while keeping as much detail as possible. The result may NOT be longer than the length limit.
based on that, please reply only the shortened string. Give me 5 choices. if the length is too long, discard the string and try another one.Return the data as a python list containing the result as {"shortened_string": shortened_string, "length": lengthasInt}. Do not return the answer in a codeblock, use a pure string. Before answering, check the results and if ANY is longer than the needed_length, discard all and try again""",
input=f'{{"string":"{title}", "needed_length":{length}}}',
)
answers = response.output_text
return eval(answers) # type: ignore
#answers are strings in json format, so we need to convert them to a list of dicts
def name_tester(name: str):
client = init_client()
response = client.responses.create(
model = model,
instructions="""you are a name tester, You are given a name and will have to split the name into first name, last name, and if present the title. Return the name in a json format with the keys "title", "first_name", "last_name". If no title is present, set title to none. Do NOt return the answer in a codeblock, use a pure json string. Assume the names are in the usual german naming scheme""",
input = f'{{"name":"{name}"}}'
)
answers = response.output_text
return json.loads(answers)
def semester_converter(semester:str):
client = init_client()
response = client.responses.create(
model = model,
instructions="""you are a semester converter. You will be given a string. Convert this into a string like this: SoSe YY or WiSe YY/YY+1. Do not return the answer in a codeblock, use a pure string.""",
input = semester
)
answers = response.output_text
return answers

194
src/logic/threads.py Normal file
View File

@@ -0,0 +1,194 @@
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)

266
src/logic/threads_copy.py Normal file
View File

@@ -0,0 +1,266 @@
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

View File

@@ -1,24 +1,13 @@
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from src import logger
# import sleep_and_retry decorator to retry requests # import sleep_and_retry decorator to retry requests
from ratelimit import limits, sleep_and_retry from ratelimit import limits, sleep_and_retry
from typing import Union, Any, Optional
from src.logic.dataclass import BookData from src.logic.dataclass import BookData
from src.transformers import ARRAYData, BibTeXData, COinSData, RDSData, RISData from src.transformers import ARRAYData, BibTeXData, COinSData, RDSData, RISData
from src.transformers.transformers import RDS_AVAIL_DATA, RDS_GENERIC_DATA
import loguru
import sys
from src import LOG_DIR
log = loguru.logger
log.remove()
log.add(sys.stdout, level="INFO")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO")
API_URL = "https://rds.ibs-bw.de/phfreiburg/opac/RDSIndexrecord/{}/" API_URL = "https://rds.ibs-bw.de/phfreiburg/opac/RDSIndexrecord/{}/"
@@ -49,23 +38,23 @@ class WebRequest:
self.ppn = None self.ppn = None
self.data = None self.data = None
self.timeout = 5 self.timeout = 5
log.info("Initialized WebRequest") logger.info("Initialized WebRequest")
@property @property
def use_any_book(self): def use_any_book(self):
"""use any book that matches the search term""" """use any book that matches the search term"""
self.use_any = True self.use_any = True
log.info("Using any book") logger.info("Using any book")
return self return self
def set_apparat(self, apparat: int): def set_apparat(self, apparat):
self.apparat = apparat self.apparat = apparat
if int(self.apparat) < 10: if int(self.apparat) < 10:
self.apparat = f"0{self.apparat}" self.apparat = f"0{self.apparat}"
log.info(f"Set apparat to {self.apparat}") logger.info(f"Set apparat to {self.apparat}")
return self return self
def get_ppn(self, signature: str): def get_ppn(self, signature):
self.signature = signature self.signature = signature
if "+" in signature: if "+" in signature:
signature = signature.replace("+", "%2B") signature = signature.replace("+", "%2B")
@@ -76,15 +65,15 @@ class WebRequest:
@sleep_and_retry @sleep_and_retry
@limits(calls=RATE_LIMIT, period=RATE_PERIOD) @limits(calls=RATE_LIMIT, period=RATE_PERIOD)
def search_book(self, searchterm: str) -> str: def search_book(self, searchterm: str):
response = requests.get(PPN_URL.format(searchterm), timeout=self.timeout) response = requests.get(PPN_URL.format(searchterm), timeout=self.timeout)
return response.text return response.text
def get_book_links(self, searchterm: str) -> list[str]: def get_book_links(self, searchterm: str):
response: str = self.search_book(searchterm) # type:ignore response = self.search_book(searchterm)
soup = BeautifulSoup(response, "html.parser") soup = BeautifulSoup(response, "html.parser")
links = soup.find_all("a", class_="title getFull") links = soup.find_all("a", class_="title getFull")
res: list[str] = [] res = []
for link in links: for link in links:
res.append(BASE + link["href"]) res.append(BASE + link["href"])
return res return res
@@ -96,15 +85,13 @@ class WebRequest:
response = requests.get(link, timeout=self.timeout) response = requests.get(link, timeout=self.timeout)
return response.text return response.text
except requests.exceptions.RequestException as e: except requests.exceptions.RequestException as e:
log.error(f"Request failed: {e}") logger.error(f"Request failed: {e}")
return None return None
def get_data(self) -> Union[list[str], None]: def get_data(self):
links = self.get_book_links(self.ppn) links = self.get_book_links(self.ppn)
log.debug(f"Links: {links}")
return_data: list[str] = []
for link in links: for link in links:
result: str = self.search(link) # type:ignore result = self.search(link)
# in result search for class col-xs-12 rds-dl RDS_LOCATION # in result search for class col-xs-12 rds-dl RDS_LOCATION
# if found, return text of href # if found, return text of href
soup = BeautifulSoup(result, "html.parser") soup = BeautifulSoup(result, "html.parser")
@@ -114,18 +101,7 @@ class WebRequest:
item_location = location.find( item_location = location.find(
"div", class_="col-xs-12 col-md-7 col-lg-8 rds-dl-panel" "div", class_="col-xs-12 col-md-7 col-lg-8 rds-dl-panel"
).text.strip() ).text.strip()
log.debug(f"Item location: {item_location}")
if self.use_any: if self.use_any:
pre_tag = soup.find_all("pre")
if pre_tag:
for tag in pre_tag:
data = tag.text.strip()
return_data.append(data)
return return_data
else:
log.error("No <pre> tag found")
raise ValueError("No <pre> tag found")
elif f"Semesterapparat-{self.apparat}" in item_location:
pre_tag = soup.find_all("pre") pre_tag = soup.find_all("pre")
return_data = [] return_data = []
if pre_tag: if pre_tag:
@@ -134,14 +110,18 @@ class WebRequest:
return_data.append(data) return_data.append(data)
return return_data return return_data
else: else:
log.error("No <pre> tag found") logger.error("No <pre> tag found")
raise ValueError("No <pre> tag found")
if f"Semesterapparat-{self.apparat}" in item_location:
pre_tag = soup.find_all("pre")
return_data = []
if pre_tag:
for tag in pre_tag:
data = tag.text.strip()
return_data.append(data)
return return_data return return_data
else: else:
log.error( logger.error("No <pre> tag found")
f"Signature {self.signature} not found in {item_location}"
)
# return_data = []
return return_data return return_data
def get_data_elsa(self): def get_data_elsa(self):
@@ -162,7 +142,7 @@ class WebRequest:
return_data.append(data) return_data.append(data)
return return_data return return_data
else: else:
log.error("No <pre> tag found") logger.error("No <pre> tag found")
return return_data return return_data
@@ -180,7 +160,7 @@ class BibTextTransformer:
self.field = None self.field = None
self.signature = None self.signature = None
if mode not in self.valid_modes: if mode not in self.valid_modes:
log.error(f"Mode {mode} not valid") logger.error(f"Mode {mode} not valid")
raise ValueError(f"Mode {mode} not valid") raise ValueError(f"Mode {mode} not valid")
self.data = None self.data = None
# self.bookdata = BookData(**self.data) # self.bookdata = BookData(**self.data)
@@ -190,7 +170,7 @@ class BibTextTransformer:
self.signature = signature self.signature = signature
return self return self
def get_data(self, data: Union[list[str]] = None) -> "BibTextTransformer": def get_data(self, data: list):
RIS_IDENT = "TY -" RIS_IDENT = "TY -"
ARRAY_IDENT = "[kid]" ARRAY_IDENT = "[kid]"
COinS_IDENT = "ctx_ver" COinS_IDENT = "ctx_ver"
@@ -223,15 +203,7 @@ class BibTextTransformer:
self.data = line self.data = line
return self return self
def return_data( def return_data(self, option=None) -> BookData:
self, option: Any = None
) -> Union[
Optional[BookData],
Optional[RDS_GENERIC_DATA],
Optional[RDS_AVAIL_DATA],
None,
dict[str, Union[RDS_AVAIL_DATA, RDS_GENERIC_DATA]],
]:
"""Return Data to caller. """Return Data to caller.
Args: Args:
@@ -253,7 +225,7 @@ class BibTextTransformer:
return RISData().transform(self.data) return RISData().transform(self.data)
case "RDS": case "RDS":
return RDSData().transform(self.data).return_data(option) return RDSData().transform(self.data).return_data(option)
case _: case None:
return None return None
# if self.mode == "ARRAY": # if self.mode == "ARRAY":
@@ -270,7 +242,7 @@ class BibTextTransformer:
def cover(isbn): def cover(isbn):
test_url = f"https://www.buchhandel.de/cover/{isbn}/{isbn}-cover-m.jpg" test_url = f"https://www.buchhandel.de/cover/{isbn}/{isbn}-cover-m.jpg"
# log.debug(test_url) # print(test_url)
data = requests.get(test_url, stream=True) data = requests.get(test_url, stream=True)
return data.content return data.content
@@ -280,8 +252,8 @@ def get_content(soup, css_class):
if __name__ == "__main__": if __name__ == "__main__":
# log.debug("main") # print("main")
link = "CU 8500 K64" link = "CU 8500 K64"
data = WebRequest(71).get_ppn(link).get_data() data = WebRequest(71).get_ppn(link).get_data()
bib = BibTextTransformer("ARRAY").get_data().return_data() bib = BibTextTransformer("ARRAY").get_data().return_data()
log.debug(bib) print(bib)

View File

@@ -1,22 +1,21 @@
import sys
import zipfile
from dataclasses import dataclass
from typing import Any, Union
import loguru
import pandas as pd import pandas as pd
from bs4 import BeautifulSoup
from docx import Document from docx import Document
from dataclasses import dataclass
import sys
from loguru import logger as log
from src import LOG_DIR logger = log
from src.backend import Semester logger.remove()
from src.logic.openai import name_tester, run_shortener, semester_converter logger.add("logs/wordparser.log", rotation="1 week", enqueue=True)
log.add(
log = loguru.logger f"logs/application.log",
log.remove() rotation="1 day",
log.add(sys.stdout, level="INFO") compression="zip",
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") enqueue=True,
)
# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO")
logger.add(sys.stdout)
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
@@ -52,9 +51,8 @@ class Book:
] ]
) )
def from_dict(self, data: dict[str, Any]): def from_dict(self, data: dict):
for key, value in data.items(): for key, value in data.items():
value = value.strip()
if value == "\u2002\u2002\u2002\u2002\u2002": if value == "\u2002\u2002\u2002\u2002\u2002":
value = "" value = ""
@@ -69,7 +67,7 @@ class Book:
self.location = value.split(",")[0] if "," in value else value self.location = value.split(",")[0] if "," in value else value
self.publisher = value.split(",")[1] if "," in value else "" self.publisher = value.split(",")[1] if "," in value else ""
elif key == "Standnummer": elif key == "Standnummer":
self.signature = value.strip() self.signature = value
elif key == "Interne Vermerke": elif key == "Interne Vermerke":
self.internal_notes = value self.internal_notes = value
@@ -80,46 +78,18 @@ class SemapDocument:
phoneNumber: int = None phoneNumber: int = None
mail: str = None mail: str = None
title: str = None title: str = None
title_suggestions: list[str] = None semester: str = None
semester: Union[str, Semester] = None
books: list[Book] = None books: list[Book] = None
eternal: bool = False
personName: str = None
personTitle: str = None
title_length = 0
title_max_length = 0
def __post_init__(self):
self.title_suggestions = []
@property
def nameSetter(self):
data = name_tester(self.personTitle)
name = f"{data['last_name']}, {data['first_name']}"
if data["title"] is not None:
title = data["title"]
self.personTitle = title
self.personName = name
self.title_length = len(self.title) + 3 + len(self.personName.split(",")[0])
if self.title_length > 40:
log.warning("Title is too long")
name_len = len(self.personName.split(",")[0])
self.title_max_length = 38 - name_len
suggestions = run_shortener(self.title, self.title_max_length)
for suggestion in suggestions:
self.title_suggestions.append(suggestion["shortened_string"])
else:
self.title_suggestions = []
pass
@property @property
def renameSemester(self) -> None: def renameSemester(self) -> None:
if ", Dauer" in self.semester: if self.semester is not None:
self.semester = self.semester.split(",")[0] if "sommersemester" in self.semester.lower():
self.eternal = True year = self.semester.split(" ")[-1]
self.semester = Semester().from_string(self.semester) self.semester = f"SoSe {year}"
else: elif "wintersemester" in self.semester.lower():
log.warning("Semester {} is not valid", self.semester) year = self.semester.split(" ")[-1]
self.semester = Semester().from_string(semester_converter(self.semester)) self.semester = f"WiSe {year}"
@property @property
def signatures(self) -> list[str]: def signatures(self) -> list[str]:
@@ -135,14 +105,11 @@ def word_docx_to_csv(path: str) -> list[pd.DataFrame]:
for table in tables: for table in tables:
data = [] data = []
for row in table.rows: for row in table.rows:
row_data: list[Any] = [] row_data = []
for cell in row.cells: for cell in row.cells:
text = cell.text text = cell.text
text = text.replace("\n", "") text = text.replace("\n", "")
row_data.append(text) row_data.append(text)
if text == "Ihr Fach:":
row_data.append(get_fach(path))
data.append(row_data) data.append(row_data)
df = pd.DataFrame(data) df = pd.DataFrame(data)
df.columns = df.iloc[0] df.columns = df.iloc[0]
@@ -150,27 +117,11 @@ def word_docx_to_csv(path: str) -> list[pd.DataFrame]:
m_data.append(df) m_data.append(df)
# for df[0, 1]: merge i and i+1 as key, value
return m_data return m_data
def get_fach(path: str) -> str:
document = zipfile.ZipFile(path)
xml_data = document.read("word/document.xml")
document.close()
soup = BeautifulSoup(xml_data, "xml")
# text we need is in <w:p w14:paraId="12456A32" ... > -> w:r -> w:t
paragraphs = soup.find_all("w:p")
names = []
for para in paragraphs:
para_id = para.get("w14:paraId")
if para_id == "12456A32":
# get the data in the w:t
for run in para.find_all("w:r"):
data = run.find("w:t")
return data.contents[0]
def makeDict(): def makeDict():
return { return {
"work_author": None, "work_author": None,
@@ -230,7 +181,7 @@ def tuple_to_dict(tlist: tuple, type: str) -> dict:
return ret return ret
def elsa_word_to_csv(path: str): def elsa_word_to_csv(path):
doc = Document(path) doc = Document(path)
# # print all lines in doc # # print all lines in doc
doctype = [para.text for para in doc.paragraphs if para.text != ""][-1] doctype = [para.text for para in doc.paragraphs if para.text != ""][-1]
@@ -241,11 +192,11 @@ def elsa_word_to_csv(path: str):
} }
tables = doc.tables tables = doc.tables
m_data: list[pd.DataFrame] = [] m_data = []
for table in tables: for table in tables:
data: list[list[str]] = [] data = []
for row in table.rows: for row in table.rows:
row_data: list[str] = [] row_data = []
for cell in row.cells: for cell in row.cells:
text = cell.text text = cell.text
text = text.replace("\n", "") text = text.replace("\n", "")
@@ -261,25 +212,21 @@ def elsa_word_to_csv(path: str):
data = [ data = [
row for row in df.itertuples(index=False, name=None) if row != tuples[doctype] row for row in df.itertuples(index=False, name=None) if row != tuples[doctype]
] ]
# log.debug(data) # print(data)
return tuple_to_dict(data, doctype), doctype return tuple_to_dict(data, doctype), doctype
def word_to_semap(word_path: str) -> SemapDocument: def word_to_semap(word_path: str) -> SemapDocument:
log.info("Parsing Word Document {}", word_path) logger.info("Parsing Word Document {}", word_path)
semap = SemapDocument() semap = SemapDocument()
df = word_docx_to_csv(word_path) df = word_docx_to_csv(word_path)
apparatdata = df[0] apparatdata = df[0]
apparatdata = apparatdata.to_dict() apparatdata = apparatdata.to_dict()
keys = list(apparatdata.keys()) keys = list(apparatdata.keys())
print(apparatdata, keys) appdata = {keys[i]: keys[i + 1] for i in range(0, len(keys), 2)}
appdata = {keys[i]: keys[i + 1] for i in range(0, len(keys) - 1, 2)}
semap.phoneNumber = appdata["Telefon:"] semap.phoneNumber = appdata["Telefon:"]
semap.subject = appdata["Ihr Fach:"] semap.subject = appdata["Ihr Fach:"]
semap.mail = appdata["Mailadresse:"] semap.mail = appdata["Mailadresse:"]
semap.personName = ",".join(appdata["Ihr Name und Titel:"].split(",")[:-1])
semap.personTitle = ",".join(appdata["Ihr Name und Titel:"].split(",")[-1:]).strip()
apparatdata = df[1] apparatdata = df[1]
apparatdata = apparatdata.to_dict() apparatdata = apparatdata.to_dict()
keys = list(apparatdata.keys()) keys = list(apparatdata.keys())
@@ -287,8 +234,6 @@ def word_to_semap(word_path: str) -> SemapDocument:
semap.title = appdata["Veranstaltung:"] semap.title = appdata["Veranstaltung:"]
semap.semester = appdata["Semester:"] semap.semester = appdata["Semester:"]
semap.renameSemester semap.renameSemester
semap.nameSetter
books = df[2] books = df[2]
booklist = [] booklist = []
for i in range(len(books)): for i in range(len(books)):
@@ -303,13 +248,13 @@ def word_to_semap(word_path: str) -> SemapDocument:
continue continue
else: else:
booklist.append(book) booklist.append(book)
log.info("Found {} books", len(booklist)) logger.info("Found {} books", len(booklist))
semap.books = booklist semap.books = booklist
return semap return semap
if __name__ == "__main__": if __name__ == "__main__":
else_df = elsa_word_to_csv( else_df = word_to_semap(
"C:/Users/aky547/Desktop/ELSA_Bestellung Scann Der Westen und der Rest.docx" "C:/Users/aky547/Desktop/SA 80 titelmeldung_SoSe2025 Burth.docx"
) )
print(else_df)

View File

@@ -160,8 +160,6 @@ class ZoteroController:
zoterocfg = settings.zotero zoterocfg = settings.zotero
def __init__(self): def __init__(self):
if self.zoterocfg.library_id is None:
return
self.zot = zotero.Zotero( self.zot = zotero.Zotero(
self.zoterocfg.library_id, self.zoterocfg.library_id,
self.zoterocfg.library_type, self.zoterocfg.library_type,

View File

@@ -6,15 +6,9 @@ from dataclasses import dataclass
from dataclasses import field as dataclass_field from dataclasses import field as dataclass_field
from typing import Any, List from typing import Any, List
from src import LOG_DIR
from src.logic.dataclass import BookData
import loguru
import sys
log = loguru.logger
log.remove() from src.logic.dataclass import BookData
log.add(sys.stdout, level="INFO")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
###Pydatnic models ###Pydatnic models
@@ -137,8 +131,8 @@ class ARRAYData:
return data return data
except Exception: except Exception:
# # log.debug(f"ARRAYData.transform failed, {source}, {search}") # # print(f"ARRAYData.transform failed, {source}, {search}")
log.exception(f"ARRAYData.transform failed, no string {search}") logger.exception(f"ARRAYData.transform failed, no string {search}")
return "" return ""
def _get_list_entry(source: str, search: str, entry: str) -> str: def _get_list_entry(source: str, search: str, entry: str) -> str:
@@ -515,4 +509,4 @@ if __name__ == "__main__":
ret = RDSData().transform(data) ret = RDSData().transform(data)
data = ret.return_data("rds_availability") data = ret.return_data("rds_availability")
# log.debug(data) # print(data)

52
src/ui/Ui_switchtest.py Normal file
View File

@@ -0,0 +1,52 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\switchtest.ui'
#
# Created by: PyQt6 UI code generator 6.6.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt6 import QtCore, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setWindowModality(QtCore.Qt.WindowModality.WindowModal)
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.select_action_box = QtWidgets.QComboBox(parent=self.centralwidget)
self.select_action_box.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.select_action_box.setObjectName("select_action_box")
self.select_action_box.addItem("")
self.select_action_box.addItem("")
self.select_action_box.addItem("")
self.select_action_box.addItem("")
self.verticalLayout.addWidget(self.select_action_box)
self.localwidget = QtWidgets.QWidget(parent=self.centralwidget)
self.localwidget.setObjectName("localwidget")
self.verticalLayout.addWidget(self.localwidget)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.select_action_box.setItemText(
0, _translate("MainWindow", "Aktion auswählen")
)
self.select_action_box.setItemText(1, _translate("MainWindow", "edit_prof"))
self.select_action_box.setItemText(2, _translate("MainWindow", "add_user"))
self.select_action_box.setItemText(3, _translate("MainWindow", "edit_user"))

View File

@@ -1,6 +1,6 @@
import pathlib import pathlib
from .semesterapparat_ui_ui import Ui_MainWindow as Ui_Semesterapparat from .Ui_semesterapparat_ui import Ui_MainWindow as Ui_Semesterapparat
# from .dialogs import ( # from .dialogs import (
# ApparatExtendDialog, # ApparatExtendDialog,

View File

@@ -1,157 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\edit_bookdata.ui'
#
# Created by: PySide6 UI code generator 6.3.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
from src.logic.dataclass import BookData
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Metadaten")
Dialog.resize(448, 572)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setGeometry(QtCore.QRect(260, 530, 161, 32))
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(
QtWidgets.QDialogButtonBox.StandardButton.Cancel
| QtWidgets.QDialogButtonBox.StandardButton.Ok
)
self.buttonBox.setObjectName("buttonBox")
self.gridLayoutWidget = QtWidgets.QWidget(Dialog)
self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 441, 531))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setSizeConstraint(
QtWidgets.QLayout.SizeConstraint.SetDefaultConstraint
)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.label_10 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_10.setObjectName("label_10")
self.gridLayout.addWidget(self.label_10, 10, 1, 1, 1)
self.label = QtWidgets.QLabel(self.gridLayoutWidget)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 1, 1, 1)
self.label_9 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_9.setObjectName("label_9")
self.gridLayout.addWidget(self.label_9, 9, 1, 1, 1)
self.label_8 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_8.setObjectName("label_8")
self.gridLayout.addWidget(self.label_8, 8, 1, 1, 1)
self.label_12 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_12.setObjectName("label_12")
self.gridLayout.addWidget(self.label_12, 6, 1, 1, 1)
self.line_edition = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_edition.setObjectName("line_edition")
self.gridLayout.addWidget(self.line_edition, 2, 2, 1, 1)
self.label_3 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 2, 1, 1, 1)
self.label_4 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 3, 1, 1, 1)
self.line_link = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_link.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.ArrowCursor))
self.line_link.setReadOnly(True)
self.line_link.setObjectName("line_link")
self.gridLayout.addWidget(self.line_link, 6, 2, 1, 1)
self.label_5 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 4, 1, 1, 1)
self.label_7 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_7.setObjectName("label_7")
self.gridLayout.addWidget(self.label_7, 7, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 5, 1, 1, 1)
self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 1, 1, 1, 1)
spacerItem = QtWidgets.QSpacerItem(
5,
20,
QtWidgets.QSizePolicy.Policy.Fixed,
QtWidgets.QSizePolicy.Policy.Minimum,
)
self.gridLayout.addItem(spacerItem, 8, 0, 1, 1)
self.line_title = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_title.setObjectName("line_title")
self.gridLayout.addWidget(self.line_title, 0, 2, 1, 1)
self.line_signature = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_signature.setObjectName("line_signature")
self.gridLayout.addWidget(self.line_signature, 1, 2, 1, 1)
self.line_author = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_author.setObjectName("line_author")
self.gridLayout.addWidget(self.line_author, 3, 2, 1, 1)
self.line_lang = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_lang.setObjectName("line_lang")
self.gridLayout.addWidget(self.line_lang, 8, 2, 1, 1)
self.line_ppn = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_ppn.setObjectName("line_ppn")
self.gridLayout.addWidget(self.line_ppn, 5, 2, 1, 1)
self.line_isbn = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_isbn.setObjectName("line_isbn")
self.gridLayout.addWidget(self.line_isbn, 7, 2, 1, 1)
self.line_year = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_year.setObjectName("line_year")
self.gridLayout.addWidget(self.line_year, 9, 2, 1, 1)
self.line_pages = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_pages.setObjectName("line_pages")
self.gridLayout.addWidget(self.line_pages, 10, 2, 1, 1)
self.line_publisher = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.line_publisher.setObjectName("line_publisher")
self.gridLayout.addWidget(self.line_publisher, 4, 2, 1, 1)
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label_10.setText(_translate("Dialog", "Seiten"))
self.label.setText(_translate("Dialog", "Titel"))
self.label_9.setText(_translate("Dialog", "Jahr"))
self.label_8.setText(_translate("Dialog", "Sprache"))
self.label_12.setText(_translate("Dialog", "Link"))
self.label_3.setText(_translate("Dialog", "Auflage"))
self.label_4.setText(_translate("Dialog", "Autor"))
self.label_5.setText(_translate("Dialog", "Herausgeber"))
self.label_7.setText(_translate("Dialog", "ISBN(s)"))
self.label_6.setText(_translate("Dialog", "PPN"))
self.label_2.setText(_translate("Dialog", "Signatur"))
def populate_fields(self, data: BookData):
self.line_author.setText(data.author)
self.line_edition.setText(data.edition)
self.line_isbn.setText(", ".join(data.isbn))
self.line_lang.setText(data.language)
self.line_link.setText(data.link)
self.line_pages.setText(data.pages)
self.line_ppn.setText(data.ppn)
self.line_publisher.setText(data.publisher)
self.line_signature.setText(data.signature)
self.line_title.setText(data.title)
self.line_year.setText(data.year)
def get_data(self) -> BookData:
return BookData(
ppn=self.line_ppn.text().strip(),
title=self.line_title.text().strip(),
signature=self.line_signature.text().strip(),
edition=self.line_edition.text().strip(),
link=self.line_link.text().strip(),
isbn=self.line_isbn.text().split(","),
author=self.line_author.text().strip(),
language=self.line_lang.text().strip(),
publisher=self.line_publisher.text().strip(),
year=self.line_year.text().strip(),
pages=self.line_pages.text().strip(),
)

View File

@@ -1,109 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\fileparser.ui'
#
# Created by: PySide6 UI code generator 6.3.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
from src.logic.webrequest import BibTextTransformer, WebRequest
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(402, 301)
self.progressBar = QtWidgets.QProgressBar(Dialog)
self.progressBar.setGeometry(QtCore.QRect(10, 60, 381, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.frame = QtWidgets.QFrame(Dialog)
self.frame.setGeometry(QtCore.QRect(10, 10, 381, 41))
self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.frame.setObjectName("frame")
self.horizontalLayoutWidget = QtWidgets.QWidget(self.frame)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 381, 41))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.count = QtWidgets.QLabel(self.horizontalLayoutWidget)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.count.setFont(font)
self.count.setTextFormat(QtCore.Qt.TextFormat.PlainText)
self.count.setObjectName("count")
self.horizontalLayout.addWidget(self.count)
self.label_2 = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.label_2.setObjectName("label_2")
self.horizontalLayout.addWidget(self.label_2)
spacerItem = QtWidgets.QSpacerItem(
40,
20,
QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum,
)
self.horizontalLayout.addItem(spacerItem)
self.frame_2 = QtWidgets.QFrame(Dialog)
self.frame_2.setGeometry(QtCore.QRect(10, 100, 381, 201))
self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.frame_2.setObjectName("frame_2")
self.listWidget = QtWidgets.QListWidget(self.frame_2)
self.listWidget.setGeometry(QtCore.QRect(0, 0, 381, 191))
self.listWidget.setObjectName("listWidget")
self.signatures = []
self.returned = []
# self.data_gathering_complete = QtCore.Signal()
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "Es wurden"))
self.count.setText(_translate("Dialog", "0"))
self.label_2.setText(_translate("Dialog", "Signaturen gefunden."))
def moveToThread(self, thread):
self.progressBar.moveToThread(thread)
self.frame.moveToThread(thread)
self.horizontalLayoutWidget.moveToThread(thread)
self.horizontalLayout.moveToThread(thread)
self.label.moveToThread(thread)
self.count.moveToThread(thread)
self.label_2.moveToThread(thread)
self.frame_2.moveToThread(thread)
self.listWidget.moveToThread(thread)
def run(self):
for signature in self.signatures:
self.count.setText(str(self.signatures.index(signature) + 1))
self.listWidget.addItem(signature)
webdata = WebRequest().get_ppn(signature).get_data()
bookdata = BibTextTransformer("ARRAY").get_data(webdata).return_data()
self.returned.append(bookdata)
self.progressBar.setValue(self.signatures.index(signature) + 1)
# self.data_gathering_complete.emit()
def deleteLater(self):
self.progressBar.deleteLater()
self.frame.deleteLater()
self.horizontalLayoutWidget.deleteLater()
self.horizontalLayout.deleteLater()
self.label.deleteLater()
self.count.deleteLater()
self.label_2.deleteLater()
self.frame_2.deleteLater()
self.listWidget.deleteLater()
self.signatures = []
self.returned = []
self.retranslateUi.deleteLater()
super().deleteLater()

View File

@@ -1,112 +0,0 @@
# Form implementation generated from reading ui file '/home/alexander/GitHub/Semesterapparate/ui/dialogs/login.ui'
#
# Created by: PySide6 UI code generator 6.5.3
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
import hashlib
from PySide6 import QtCore, QtWidgets
from src.backend.database import Database
from src.backend.admin_console import AdminCommands
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(218, 190)
self.dialog = Dialog
self.login_button = QtWidgets.QPushButton(parent=Dialog)
self.login_button.setGeometry(QtCore.QRect(30, 140, 76, 32))
self.login_button.setObjectName("login_button")
self.login_button.setText("Login")
self.login_button.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus)
self.cancel_button = QtWidgets.QPushButton(parent=Dialog)
self.cancel_button.setGeometry(QtCore.QRect(120, 140, 76, 32))
self.cancel_button.setObjectName("cancel_button")
self.cancel_button.setText("Cancel")
self.cancel_button.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus)
self.cancel_button.clicked.connect(self.cancel_buttonfn)
self.label = QtWidgets.QLabel(parent=Dialog)
self.label.setGeometry(QtCore.QRect(20, 40, 71, 21))
self.label.setObjectName("label")
self.lineEdit = QtWidgets.QLineEdit(parent=Dialog)
self.lineEdit.setGeometry(QtCore.QRect(80, 40, 113, 21))
self.lineEdit.setObjectName("lineEdit")
# set strong focus to lineEdit
self.lineEdit.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
self.label_2 = QtWidgets.QLabel(parent=Dialog)
self.label_2.setGeometry(QtCore.QRect(20, 80, 71, 21))
self.label_2.setObjectName("label_2")
self.lineEdit_2 = QtWidgets.QLineEdit(parent=Dialog)
self.lineEdit_2.setGeometry(QtCore.QRect(80, 80, 113, 21))
self.lineEdit_2.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhSensitiveData)
# set echo mode to password
self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
self.lineEdit_2.setClearButtonEnabled(True)
self.lineEdit_2.setObjectName("lineEdit_2")
self.retranslateUi(Dialog)
# if buttonbox accepted is clicked, launch login test
self.login_button.clicked.connect(self.login)
self.lresult = -1
self.lusername = ""
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "Username"))
self.label_2.setText(_translate("Dialog", "Password"))
def login(self):
username = self.lineEdit.text()
password = self.lineEdit_2.text()
print(type(username), password)
# Assuming 'Database' is a class to interact with your database
db = Database()
hashed_password = hashlib.sha256(
password.encode()
).hexdigest()
if len(db.getUsers()) == 0:
AdminCommands().create_admin()
self.lresult = 1 # Indicate successful login
self.lusername = username
self.dialog.accept()
if db.login(username, hashed_password):
self.lresult = 1 # Indicate successful login
self.lusername = username
self.dialog.accept()
else:
# Credentials are invalid, display a warning
if username == "" or password == "":
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:
warning_dialog = QtWidgets.QMessageBox()
warning_dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
warning_dialog.setText(
"Invalid username or password. Please try again."
)
warning_dialog.setWindowTitle("Login Failed")
warning_dialog.exec()
def cancel_buttonfn(self):
self.dialog.reject()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec())

View File

@@ -1,183 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\mail_preview.ui'
#
# Created by: PySide6 UI code generator 6.3.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
import subprocess
import tempfile
import os
import re
from omegaconf import OmegaConf
config = OmegaConf.load("config.yaml")
class Ui_eMailPreview(object):
def setupUi(
self,
eMailPreview,
app_id="",
app_name="",
app_subject="",
prof_name="",
data=None,
):
eMailPreview.setObjectName("eMailPreview")
eMailPreview.resize(676, 676)
self.buttonBox = QtWidgets.QDialogButtonBox(eMailPreview)
self.buttonBox.setGeometry(QtCore.QRect(310, 630, 341, 32))
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox")
self.gridLayoutWidget = QtWidgets.QWidget(eMailPreview)
self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 661, 621))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.label_5 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 0, 0, 1, 1)
self.prof_name = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.prof_name.setObjectName("prof_name")
self.gridLayout.addWidget(self.prof_name, 2, 2, 1, 1)
self.label_3 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_3.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignTop)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 5, 0, 1, 1)
self.mail_name = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.mail_name.setObjectName("mail_name")
self.gridLayout.addWidget(self.mail_name, 1, 2, 1, 1)
self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
self.label_4 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1)
self.mail_header = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.mail_header.setObjectName("mail_header")
self.gridLayout.addWidget(self.mail_header, 3, 2, 1, 1)
self.label = QtWidgets.QLabel(self.gridLayoutWidget)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
self.comboBox = QtWidgets.QComboBox(self.gridLayoutWidget)
self.comboBox.setObjectName("comboBox")
self.gridLayout.addWidget(self.comboBox, 0, 2, 1, 1)
self.mail_body = QtWidgets.QTextEdit(self.gridLayoutWidget)
self.mail_body.setObjectName("mail_body")
self.gridLayout.addWidget(self.mail_body, 5, 2, 1, 1)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.gender_male = QtWidgets.QRadioButton(self.gridLayoutWidget)
self.gender_male.setObjectName("gender_male")
self.horizontalLayout_3.addWidget(self.gender_male)
self.gender_female = QtWidgets.QRadioButton(self.gridLayoutWidget)
self.gender_female.setObjectName("gender_female")
self.horizontalLayout_3.addWidget(self.gender_female)
self.gender_non = QtWidgets.QRadioButton(self.gridLayoutWidget)
self.gender_non.setObjectName("gender_non")
self.horizontalLayout_3.addWidget(self.gender_non)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_3.addItem(spacerItem)
self.gridLayout.addLayout(self.horizontalLayout_3, 4, 2, 1, 1)
self.label_6 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 4, 0, 1, 1)
self.retranslateUi(eMailPreview)
self.buttonBox.accepted.connect(eMailPreview.accept) # type: ignore
self.buttonBox.rejected.connect(eMailPreview.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(eMailPreview)
self._appid = app_id
self._appname = app_name
self._subject = app_subject
self.prof_name.setText(prof_name)
self._mail_data = ""
self._data = data
self.load_mail_templates()
self.comboBox.addItem("")
self.comboBox.setCurrentText("")
self.buttonBox.accepted.connect(self.save_mail)
self.comboBox.currentIndexChanged.connect(self.set_mail)
self.gender_female.clicked.connect(self.set_mail)
self.gender_male.clicked.connect(self.set_mail)
self.gender_non.clicked.connect(self.set_mail)
def retranslateUi(self, eMailPreview):
_translate = QtCore.QCoreApplication.translate
eMailPreview.setWindowTitle(_translate("eMailPreview", "Dialog"))
self.label_5.setText(_translate("eMailPreview", "Art"))
self.label_3.setText(_translate("eMailPreview", "Mail"))
self.label_2.setText(_translate("eMailPreview", "Prof"))
self.label_4.setText(_translate("eMailPreview", "Betreff"))
self.label.setText(_translate("eMailPreview", "eMail"))
self.gender_male.setText(_translate("eMailPreview", "M"))
self.gender_female.setText(_translate("eMailPreview", "W"))
self.gender_non.setText(_translate("eMailPreview", "Divers"))
self.label_6.setText(_translate("eMailPreview", "Geschlecht"))
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()
header = re.findall(r"Subject: (.*)", mail_template)
if header:
email_header = header[0]
else:
email_header = email_template.split(".eml")[0]
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
mail_html = mail_html.format(
Profname=self.prof_name.text().split(" ")[1], Appname=self._appname, AppNr=self._appid, AppSubject = self._subject,greeting = self.get_greeting()
)
self.mail_body.setHtml(mail_html)
def load_mail_templates(self):
mail_templates = os.listdir("mail_vorlagen")
mail_templates = [f for f in mail_templates if f.endswith(".eml")]
print(mail_templates)
self.comboBox.addItems(mail_templates)
def save_mail(self):
# create a temporary file
mail_header = self.mail_header.text()
mail_body = self.mail_body.toHtml()
mail = self.mail_data + mail_body
mail = mail.replace("Subject:", f"Subject: {mail_header}")
directory = config["database"]["tempdir"]
directory = directory.replace("~", str(os.path.expanduser("~")))
with tempfile.NamedTemporaryFile(
mode="w", delete=False, suffix=".eml", encoding="utf-8", dir=directory
) as f:
f.write(mail)
self.mail_path = f.name
print(self.mail_path)
# open the file using thunderbird
subprocess.Popen([f"{self.mail_path}"])
# delete the file
# os.remove(self.mail_path)
def launch():
app = QtWidgets.QApplication([])
eMailPreview = QtWidgets.QDialog()
ui = Ui_eMailPreview()
ui.setupUi(eMailPreview, "1","Test","Biologie","Kirchner, Alexander")
eMailPreview.show()
app.exec()

View File

@@ -1,240 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\medianadder.ui'
#
# Created by: PySide6 UI code generator 6.3.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(637, 491)
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(20, 10, 47, 21))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Dialog)
self.label_2.setGeometry(QtCore.QRect(20, 40, 47, 21))
self.label_2.setObjectName("label_2")
self.comboBox = QtWidgets.QComboBox(Dialog)
self.comboBox.setGeometry(QtCore.QRect(70, 40, 69, 22))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.lineEdit = QtWidgets.QLineEdit(Dialog)
self.lineEdit.setGeometry(QtCore.QRect(70, 10, 113, 20))
self.lineEdit.setObjectName("lineEdit")
self.label_3 = QtWidgets.QLabel(Dialog)
self.label_3.setGeometry(QtCore.QRect(20, 70, 47, 21))
self.label_3.setObjectName("label_3")
self.widget = QtWidgets.QWidget(Dialog)
self.widget.setGeometry(QtCore.QRect(330, 90, 301, 341))
self.widget.setObjectName("widget")
self.treeWidget = QtWidgets.QTreeWidget(self.widget)
self.treeWidget.setEnabled(True)
self.treeWidget.setGeometry(QtCore.QRect(0, 0, 301, 341))
self.treeWidget.setAutoFillBackground(False)
self.treeWidget.setLineWidth(0)
self.treeWidget.setMidLineWidth(0)
self.treeWidget.setVerticalScrollBarPolicy(
QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff
)
self.treeWidget.setHorizontalScrollBarPolicy(
QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff
)
self.treeWidget.setSizeAdjustPolicy(
QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents
)
self.treeWidget.setEditTriggers(
QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers
)
self.treeWidget.setAlternatingRowColors(True)
self.treeWidget.setSelectionMode(
QtWidgets.QAbstractItemView.SelectionMode.NoSelection
)
self.treeWidget.setTextElideMode(QtCore.Qt.TextElideMode.ElideMiddle)
self.treeWidget.setUniformRowHeights(True)
self.treeWidget.setItemsExpandable(False)
self.treeWidget.setExpandsOnDoubleClick(False)
self.treeWidget.setObjectName("treeWidget")
font = QtGui.QFont()
font.setPointSize(7)
self.treeWidget.headerItem().setFont(0, font)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern)
item_0.setBackground(2, brush)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
brush = QtGui.QBrush(QtGui.QColor(0, 255, 0))
brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern)
item_0.setBackground(2, brush)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
self.treeWidget.header().setCascadingSectionResizes(False)
self.treeWidget.header().setDefaultSectionSize(60)
self.treeWidget.header().setHighlightSections(False)
self.treeWidget.header().setMinimumSectionSize(20)
self.listWidget = QtWidgets.QListWidget(Dialog)
self.listWidget.setGeometry(QtCore.QRect(10, 90, 281, 341))
self.listWidget.setContextMenuPolicy(
QtCore.Qt.ContextMenuPolicy.CustomContextMenu
)
self.listWidget.setObjectName("listWidget")
self.label_4 = QtWidgets.QLabel(Dialog)
self.label_4.setGeometry(QtCore.QRect(330, 50, 181, 21))
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(Dialog)
self.label_5.setGeometry(QtCore.QRect(200, 70, 41, 21))
self.label_5.setObjectName("label_5")
self.list_amount = QtWidgets.QLabel(Dialog)
self.list_amount.setGeometry(QtCore.QRect(240, 70, 47, 21))
self.list_amount.setObjectName("list_amount")
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setGeometry(QtCore.QRect(10, 450, 156, 23))
self.buttonBox.setStandardButtons(
QtWidgets.QDialogButtonBox.StandardButton.Cancel
| QtWidgets.QDialogButtonBox.StandardButton.Ok
)
self.buttonBox.setCenterButtons(False)
self.buttonBox.setObjectName("buttonBox")
self.buttonBox.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus)
# self.buttonBox.accepted.disconnect()
# set the activation action for the buttonBox to be shift enter
self.buttonBox.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
self.lineEdit.returnPressed.connect(self.add_to_list)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "Signatur"))
self.label_2.setText(_translate("Dialog", "Modus"))
self.comboBox.setItemText(0, _translate("Dialog", "ARRAY"))
self.comboBox.setItemText(1, _translate("Dialog", "BibTeX"))
self.comboBox.setItemText(2, _translate("Dialog", "COinS"))
self.comboBox.setItemText(3, _translate("Dialog", "RIS"))
self.lineEdit.setPlaceholderText(_translate("Dialog", "Signatur / ISBN"))
self.label_3.setText(_translate("Dialog", "Queue"))
self.treeWidget.headerItem().setText(
0, _translate("Dialog", "Datensatz\\Metadata")
)
self.treeWidget.headerItem().setText(1, _translate("Dialog", "Array"))
self.treeWidget.headerItem().setText(2, _translate("Dialog", "BibTeX"))
self.treeWidget.headerItem().setText(3, _translate("Dialog", "COinS"))
self.treeWidget.headerItem().setText(4, _translate("Dialog", "RIS"))
__sortingEnabled = self.treeWidget.isSortingEnabled()
self.treeWidget.setSortingEnabled(False)
self.treeWidget.topLevelItem(0).setText(0, _translate("Dialog", "PPN"))
self.treeWidget.topLevelItem(0).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(0).setText(2, _translate("Dialog", "0"))
self.treeWidget.topLevelItem(0).setText(3, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(0).setText(4, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(1).setText(0, _translate("Dialog", "Signatur"))
self.treeWidget.topLevelItem(1).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(1).setText(2, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(1).setText(3, _translate("Dialog", "0"))
self.treeWidget.topLevelItem(1).setText(4, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(2).setText(0, _translate("Dialog", "Autor"))
self.treeWidget.topLevelItem(2).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(2).setText(2, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(2).setText(3, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(2).setText(4, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(3).setText(0, _translate("Dialog", "ISBN"))
self.treeWidget.topLevelItem(3).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(3).setText(2, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(3).setText(3, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(3).setText(4, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(4).setText(0, _translate("Dialog", "Jahr"))
self.treeWidget.topLevelItem(4).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(4).setText(2, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(4).setText(3, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(4).setText(4, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(5).setText(0, _translate("Dialog", "Auflage"))
self.treeWidget.topLevelItem(5).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(5).setText(2, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(5).setText(3, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(5).setText(4, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(6).setText(0, _translate("Dialog", "Sprache"))
self.treeWidget.topLevelItem(6).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(6).setText(2, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(6).setText(3, _translate("Dialog", "0"))
self.treeWidget.topLevelItem(6).setText(4, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(7).setText(0, _translate("Dialog", "Herausgeber"))
self.treeWidget.topLevelItem(7).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(7).setText(2, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(7).setText(3, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(7).setText(4, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(8).setText(0, _translate("Dialog", "Seiten"))
self.treeWidget.topLevelItem(8).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(8).setText(2, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(8).setText(3, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(8).setText(4, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(9).setText(0, _translate("Dialog", "Titel"))
self.treeWidget.topLevelItem(9).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(9).setText(2, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(9).setText(3, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(9).setText(4, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(10).setText(0, _translate("Dialog", "Link"))
self.treeWidget.topLevelItem(10).setText(1, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(10).setText(2, _translate("Dialog", "0"))
self.treeWidget.topLevelItem(10).setText(3, _translate("Dialog", "1"))
self.treeWidget.topLevelItem(10).setText(4, _translate("Dialog", "1"))
self.treeWidget.setSortingEnabled(__sortingEnabled)
self.label_4.setText(_translate("Dialog", "Belegbare Felder per Anbieter"))
self.label_5.setText(_translate("Dialog", "Anzahl:"))
self.list_amount.setText(_translate("Dialog", "0"))
self.recolorize()
self.listWidget.customContextMenuRequested.connect(self.custom_context_menu)
def add_to_list(self):
text = self.lineEdit.text().strip()
if text == "":
return
else:
self.listWidget.addItem(text)
self.list_amount.setText(str(self.listWidget.count()))
self.lineEdit.clear()
def recolorize(self):
# set the color of the cells of the treeWidget to red if the field is not supported by the provider
# else set it to green
for i in range(self.treeWidget.topLevelItemCount()):
for j in range(1, self.treeWidget.columnCount()):
if self.treeWidget.topLevelItem(i).text(j) == "0":
self.treeWidget.topLevelItem(i).setBackground(
j, QtGui.QColor(255, 0, 0)
)
else:
self.treeWidget.topLevelItem(i).setBackground(
j, QtGui.QColor(0, 255, 0)
)
# remove the text from the cells
self.treeWidget.topLevelItem(i).setText(j, "")
def custom_context_menu(self):
menu = QtWidgets.QMenu()
menu.addAction("Remove")
action = menu.exec(QtGui.QCursor.pos())
if action.text() == "Remove":
self.remove_from_list()
def remove_from_list(self):
self.listWidget.takeItem(self.listWidget.currentRow())
self.list_amount.setText(str(self.listWidget.count()))

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
</TS>

View File

@@ -1,158 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\parsed_titles.ui'
#
# Created by: PySide6 UI code generator 6.3.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
from src.logic.log import MyLogger
from src.logic.threads import AutoAdder
logger = MyLogger("AutoTitleAdder")
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(402, 316)
self.frame = QtWidgets.QFrame(Form)
self.frame.setGeometry(QtCore.QRect(10, 10, 381, 41))
self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.frame.setObjectName("frame")
self.horizontalLayoutWidget = QtWidgets.QWidget(self.frame)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 381, 41))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.count = QtWidgets.QLabel(self.horizontalLayoutWidget)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.count.setFont(font)
self.count.setTextFormat(QtCore.Qt.TextFormat.PlainText)
self.count.setObjectName("count")
self.horizontalLayout.addWidget(self.count)
self.label_2 = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.label_2.setObjectName("label_2")
self.horizontalLayout.addWidget(self.label_2)
spacerItem = QtWidgets.QSpacerItem(
40,
20,
QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum,
)
self.horizontalLayout.addItem(spacerItem)
self.frame_2 = QtWidgets.QFrame(Form)
self.frame_2.setGeometry(QtCore.QRect(10, 80, 381, 201))
self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.frame_2.setObjectName("frame_2")
self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.frame_2)
self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 10, 381, 191))
self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.listWidget = QtWidgets.QListWidget(self.horizontalLayoutWidget_2)
self.listWidget.setObjectName("listWidget")
self.horizontalLayout_2.addWidget(self.listWidget)
self.listWidget_done = QtWidgets.QListWidget(self.horizontalLayoutWidget_2)
self.listWidget_done.setObjectName("listWidget_done")
self.horizontalLayout_2.addWidget(self.listWidget_done)
self.progressBar = QtWidgets.QProgressBar(Form)
self.progressBar.setGeometry(QtCore.QRect(10, 60, 381, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.buttonBox = QtWidgets.QDialogButtonBox(Form)
self.buttonBox.setGeometry(QtCore.QRect(230, 290, 156, 23))
self.buttonBox.setStandardButtons(
QtWidgets.QDialogButtonBox.StandardButton.Cancel
| QtWidgets.QDialogButtonBox.StandardButton.Ok
)
self.buttonBox.setObjectName("buttonBox")
self.toolButton = QtWidgets.QToolButton(Form)
self.toolButton.setGeometry(QtCore.QRect(20, 290, 25, 19))
self.toolButton.setObjectName("toolButton")
self.signatures = []
self.prof_id = None
self.app_id = None
self.thread = QtCore.QThread()
self.toolButton.hide()
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
self.toolButton.clicked.connect(self.start)
# if cancel is clicked, terminate the thread
self.buttonBox.rejected.connect(self.thread_quit)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "Es wurden"))
self.count.setText(_translate("Form", "0"))
self.label_2.setText(_translate("Form", "Signaturen gefunden."))
self.toolButton.setText(_translate("Form", "..."))
def populate_table(self):
for i in range(len(self.signatures)):
self.listWidget.addItem(QtWidgets.QListWidgetItem())
self.listWidget.item(i).setText(self.signatures[i])
self.listWidget.item(i).setToolTip("Daten werden gesammelt")
def update_progress_bar(self, value: int):
self.progressBar.setValue(value)
def thread_quit(self):
print("Terminating thread")
self.thread.terminate()
self.thread.quit()
self.thread.deleteLater()
self.thread = None
def start(self):
logger.log_info("Starting AutoAdder")
self.thread = AutoAdder(
data=self.signatures,
app_id=self.app_id,
prof_id=self.prof_id,
)
self.thread.finished.connect(self.on_completion)
self.thread.updateSignal.connect(self.update_progress_bar)
self.thread.setTextSignal.connect(self.update_lists)
self.thread.progress.connect(self.determine_progress)
self.thread.finished.connect(self.thread.quit)
self.thread.finished.connect(self.thread.deleteLater)
# self.thread.updateSignal.connect(self.update_progress_label)
# worker.finished.connect(worker.deleteLater)
self.thread.start()
def on_completion(self):
logger.log_info("AutoAdder finished")
logger.log_info("Returning data")
# create a function that closes the dialog
def determine_progress(self, signal):
# check length of listWidget
length = self.listWidget.count()
print(f"Length of listWidget: {length}")
if length == 0:
logger.log_info("AutoAdder finished")
self.buttonBox.accepted.emit()
def update_lists(self, signal):
# get text of first entry in listWidget
text = self.listWidget.item(0).text()
# remove first entry
self.listWidget.takeItem(0)
# add first entry to listWidget_done
self.listWidget_done.addItem(text)

View File

@@ -1,52 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\reminder.ui'
#
# Created by: PySide6 UI code generator 6.3.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Erinnerung):
Erinnerung.setObjectName("Erinnerung")
Erinnerung.resize(369, 308)
self.buttonBox = QtWidgets.QDialogButtonBox(Erinnerung)
self.buttonBox.setGeometry(QtCore.QRect(190, 270, 161, 32))
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(
QtWidgets.QDialogButtonBox.StandardButton.Cancel
| QtWidgets.QDialogButtonBox.StandardButton.Ok
)
self.buttonBox.setObjectName("buttonBox")
self.message_box = QtWidgets.QTextEdit(Erinnerung)
self.message_box.setGeometry(QtCore.QRect(10, 60, 341, 201))
self.message_box.setObjectName("message_box")
self.label = QtWidgets.QLabel(Erinnerung)
self.label.setGeometry(QtCore.QRect(10, 30, 61, 21))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Erinnerung)
self.label_2.setGeometry(QtCore.QRect(150, 30, 81, 21))
self.label_2.setObjectName("label_2")
self.dateEdit = QtWidgets.QDateEdit(Erinnerung)
self.dateEdit.setGeometry(QtCore.QRect(240, 30, 110, 22))
self.dateEdit.setObjectName("dateEdit")
self.dateEdit.setDate(QtCore.QDate.currentDate())
self.retranslateUi(Erinnerung)
self.buttonBox.accepted.connect(Erinnerung.accept) # type: ignore
self.buttonBox.rejected.connect(Erinnerung.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Erinnerung)
def retranslateUi(self, Erinnerung):
_translate = QtCore.QCoreApplication.translate
Erinnerung.setWindowTitle(_translate("Erinnerung", "Dialog"))
self.label.setText(_translate("Erinnerung", "Nachricht:"))
self.label_2.setText(_translate("Erinnerung", "Erinnerung am:"))
def return_message(self) -> dict:
return {
"message": self.message_box.toPlainText(),
"remind_at": self.dateEdit.date().toString("yyyy-MM-dd"),
}

View File

@@ -1,202 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\settings.ui'
#
# Created by: PySide6 UI code generator 6.3.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from omegaconf import OmegaConf
from PySide6 import QtCore, QtWidgets
config = OmegaConf.load("config.yaml")
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(743, 576)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setGeometry(QtCore.QRect(120, 540, 621, 32))
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(
QtWidgets.QDialogButtonBox.StandardButton.Cancel
| QtWidgets.QDialogButtonBox.StandardButton.Ok
)
self.buttonBox.setObjectName("buttonBox")
self.frame = QtWidgets.QFrame(Dialog)
self.frame.setGeometry(QtCore.QRect(0, 0, 741, 541))
self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.frame.setObjectName("frame")
self.label = QtWidgets.QLabel(self.frame)
self.label.setGeometry(QtCore.QRect(400, 30, 161, 21))
self.label.setObjectName("label")
self.line = QtWidgets.QFrame(self.frame)
self.line.setGeometry(QtCore.QRect(370, 0, 20, 541))
self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Plain)
self.line.setLineWidth(1)
self.line.setMidLineWidth(0)
self.line.setFrameShape(QtWidgets.QFrame.Shape.VLine)
self.line.setObjectName("line")
self.textBrowser = QtWidgets.QTextBrowser(self.frame)
self.textBrowser.setGeometry(QtCore.QRect(400, 50, 311, 51))
self.textBrowser.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.textBrowser.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone)
self.textBrowser.setObjectName("textBrowser")
self.label_2 = QtWidgets.QLabel(self.frame)
self.label_2.setGeometry(QtCore.QRect(10, 20, 161, 21))
self.label_2.setObjectName("label_2")
self.os_apps = QtWidgets.QCheckBox(self.frame)
self.os_apps.setGeometry(QtCore.QRect(410, 110, 161, 17))
self.os_apps.setObjectName("os_apps")
self.formLayoutWidget = QtWidgets.QWidget(self.frame)
self.formLayoutWidget.setGeometry(QtCore.QRect(10, 50, 361, 491))
self.formLayoutWidget.setObjectName("formLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.formLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.label_3 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 0, 0, 1, 1)
self.label_5 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 2, 0, 1, 1)
self.db_path = QtWidgets.QLineEdit(self.formLayoutWidget)
self.db_path.setEnabled(False)
self.db_path.setObjectName("db_path")
self.gridLayout.addWidget(self.db_path, 1, 1, 1, 1)
self.save_path = QtWidgets.QLineEdit(self.formLayoutWidget)
self.save_path.setObjectName("save_path")
self.gridLayout.addWidget(self.save_path, 2, 1, 1, 1)
self.label_4 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 1, 0, 1, 1)
self.db_name = QtWidgets.QLineEdit(self.formLayoutWidget)
self.db_name.setObjectName("db_name")
self.gridLayout.addWidget(self.db_name, 0, 1, 1, 1)
self.tb_set_save_path = QtWidgets.QToolButton(self.formLayoutWidget)
self.tb_set_save_path.setObjectName("tb_set_save_path")
self.gridLayout.addWidget(self.tb_set_save_path, 2, 2, 1, 1)
spacerItem = QtWidgets.QSpacerItem(
20,
40,
QtWidgets.QSizePolicy.Policy.Minimum,
QtWidgets.QSizePolicy.Policy.Expanding,
)
self.gridLayout.addItem(spacerItem, 3, 1, 1, 1)
self.tb_select_db = QtWidgets.QToolButton(self.formLayoutWidget)
self.tb_select_db.setObjectName("tb_select_db")
self.gridLayout.addWidget(self.tb_select_db, 0, 2, 1, 1)
self.scrollArea = QtWidgets.QScrollArea(self.frame)
self.scrollArea.setGeometry(QtCore.QRect(400, 130, 331, 411))
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 329, 409))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.treeWidget = QtWidgets.QTreeWidget(self.scrollAreaWidgetContents)
self.treeWidget.setGeometry(QtCore.QRect(0, 0, 331, 411))
self.treeWidget.setObjectName("treeWidget")
self.treeWidget.setContextMenuPolicy(
QtCore.Qt.ContextMenuPolicy.ActionsContextMenu
)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.label_3.setBuddy(self.db_name)
self.label_5.setBuddy(self.save_path)
self.label_4.setBuddy(self.db_path)
self.tb_select_db.clicked.connect(self.select_db)
self.tb_set_save_path.clicked.connect(self.set_save_path)
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.db_name, self.db_path)
Dialog.setTabOrder(self.db_path, self.save_path)
Dialog.setTabOrder(self.save_path, self.os_apps)
Dialog.setTabOrder(self.os_apps, self.textBrowser)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "Dateispezifische Einstellungen"))
self.textBrowser.setHtml(
_translate(
"Dialog",
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">\n'
'<html><head><meta name="qrichtext" content="1" /><style type="text/css">\n'
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
'<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hier können Einstellungen f<>r bestehende Dateiformate geändert, oder neue Dateiformate eingefügt werden</p>\n'
'<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>',
)
)
self.label_2.setText(_translate("Dialog", "Allgemeine Einstellungen"))
self.os_apps.setToolTip(
_translate(
"Dialog",
"Verwendet im Betriebssystem festgelegte Anwendungen um Dateien zu öffnen",
)
)
self.os_apps.setText(_translate("Dialog", "Standard-Apps verwenden"))
self.label_3.setToolTip(
_translate(
"Dialog",
'<html><head/><body><p>Name der Datenbank, welche verwendet werden soll. <span style=" font-weight:600;">Muss</span> auf .db enden</p></body></html>',
)
)
self.label_3.setText(_translate("Dialog", "Datenbankname"))
self.label_5.setToolTip(
_translate(
"Dialog",
"Pfad, an dem heruntergeladene Dateien gespeichert werden sollen",
)
)
self.label_5.setText(_translate("Dialog", "Speicherpfad"))
self.label_4.setText(_translate("Dialog", "Datenbankpfad"))
self.db_name.setText(_translate("Dialog", "sap.db"))
self.tb_set_save_path.setText(_translate("Dialog", "..."))
self.tb_select_db.setText(_translate("Dialog", "..."))
self.load_config()
def load_config(self):
self.db_name.setText(config.database.name)
self.db_path.setText(config.database.path)
self.save_path.setText(config.save_path)
self.os_apps.setChecked(config.default_apps)
applications = config.custom_applications
for application in applications:
name = application.application
file_type = application.extensions
display_name = application.name
print(name, file_type, display_name) #
# create new item
item = QtWidgets.QTreeWidgetItem(self.treeWidget)
item.setText(0, display_name)
def select_db(self):
# open file dialog, limit to .db files
file_dialog = QtWidgets.QFileDialog()
file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.AnyFile)
file_dialog.setNameFilter("Datenbank (*.db)")
file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.Detail)
if file_dialog.exec():
self.db_name.setText(file_dialog.selectedFiles()[0].split("/")[-1])
self.db_path.setText(
file_dialog.selectedFiles()[0].split(self.db_name.text())[0]
)
def set_save_path(self):
# open file dialog, limit to .db files
file_dialog = QtWidgets.QFileDialog()
file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.Directory)
file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.Detail)
if file_dialog.exec():
self.save_path.setText(file_dialog.selectedFiles()[0])
def return_data(self):
config.database.name = self.db_name.text()
config.database.path = self.db_path.text()
config.save_path = self.save_path.text()
config.default_apps = self.os_apps.isChecked()
return config

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
</TS>

View File

@@ -1,31 +1,30 @@
__all__ = [ __all__ = [
"BookDataUI", "add_bookdata_ui",
"LoginDialog", "edit_bookdata_ui",
"login_ui",
"Mail_Dialog", "Mail_Dialog",
"MailTemplateDialog", "MailTemplateDialog",
"MedienAdder", "medienadder_ui",
"ParsedTitles", "parsed_titles_ui",
"popus_confirm", "popus_confirm",
"ReminderDialog", "reminder_ui",
"Settings",
"About", "About",
"ElsaGenConfirm", "ElsaGenConfirm",
"ElsaAddEntry", "ElsaAddEntry",
"ApparatExtendDialog", "ApparatExtendDialog",
"DocumentPrintDialog",
"Settings",
] ]
from .bookdata import BookDataUI from .bookdata import BookDataUI as edit_bookdata_ui
from .login import LoginDialog from .login import LoginDialog as login_ui
from .mail import Mail_Dialog from .mail import Mail_Dialog
from .mailTemplate import MailTemplateDialog from .mailTemplate import MailTemplateDialog
from .medienadder import MedienAdder from .medienadder import MedienAdder as medienadder_ui
from .parsed_titles import ParsedTitles from .parsed_titles import ParsedTitles as parsed_titles_ui
from .popup_confirm import ConfirmDialog as popus_confirm from .popup_confirm import ConfirmDialog as popus_confirm
from .reminder import ReminderDialog from .reminder import ReminderDialog as reminder_ui
from .about import About from .about import About
from .elsa_gen_confirm import ElsaGenConfirm from .elsa_gen_confirm import ElsaGenConfirm
from .elsa_add_entry import ElsaAddEntry from .elsa_add_entry import ElsaAddEntry
from .app_ext import ApparatExtendDialog from .app_ext import ApparatExtendDialog
from .docuprint import DocumentPrintDialog
from .settings import Settings from .settings import Settings

View File

@@ -1,6 +1,6 @@
from .dialog_sources.Ui_about import Ui_about from .dialog_sources.Ui_about import Ui_about
from PySide6 import QtWidgets from PyQt6 import QtWidgets
import PySide6 from PyQt6.QtCore import PYQT_VERSION_STR
from src import Icon, __version__, __author__ from src import Icon, __version__, __author__
@@ -20,7 +20,7 @@ class About(QtWidgets.QDialog, Ui_about):
data = { data = {
"Version": __version__, "Version": __version__,
"Author": __author__, "Author": __author__,
"PySide6 Version": PySide6.__version__, "PyQt6 Version": PYQT_VERSION_STR,
"License": "MIT License", "License": "MIT License",
"Icons": """Google Material Design Icons (https://fonts.google.com/icons) "Icons": """Google Material Design Icons (https://fonts.google.com/icons)
StableDiffusion (logo) StableDiffusion (logo)

View File

@@ -1,4 +1,4 @@
from PySide6 import QtWidgets from PyQt6 import QtWidgets
from .dialog_sources.Ui_apparat_extend import Ui_Dialog from .dialog_sources.Ui_apparat_extend import Ui_Dialog
from src import Icon from src import Icon

View File

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

View File

@@ -1,5 +1,5 @@
from .dialog_sources.Ui_confirm_extend import Ui_extend_confirm from .dialog_sources.Ui_confirm_extend import Ui_extend_confirm
from PySide6 import QtWidgets from PyQt6 import QtWidgets
class ConfirmExtend(QtWidgets.QDialog, Ui_extend_confirm): class ConfirmExtend(QtWidgets.QDialog, Ui_extend_confirm):

View File

@@ -1,32 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\confirm_extend.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_extend_confirm(object):
def setupUi(self, extend_confirm):
extend_confirm.setObjectName("extend_confirm")
extend_confirm.resize(380, 97)
self.buttonBox = QtWidgets.QDialogButtonBox(parent=extend_confirm)
self.buttonBox.setGeometry(QtCore.QRect(290, 20, 81, 241))
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Vertical)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox")
self.textEdit = QtWidgets.QTextEdit(parent=extend_confirm)
self.textEdit.setGeometry(QtCore.QRect(10, 10, 271, 81))
self.textEdit.setObjectName("textEdit")
self.retranslateUi(extend_confirm)
self.buttonBox.accepted.connect(extend_confirm.accept) # type: ignore
self.buttonBox.rejected.connect(extend_confirm.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(extend_confirm)
def retranslateUi(self, extend_confirm):
_translate = QtCore.QCoreApplication.translate
extend_confirm.setWindowTitle(_translate("extend_confirm", "Dialog"))

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\about.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\about.ui'
# #
# Created by: PySide6 UI code generator 6.6.1 # Created by: PyQt6 UI code generator 6.6.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_about(object): class Ui_about(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\app_status.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\app_status.ui'
# #
# Created by: PySide6 UI code generator 6.6.1 # Created by: PyQt6 UI code generator 6.6.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore from PyQt6 import QtCore
class Ui_Form(object): class Ui_Form(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\apparat_extend.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\apparat_extend.ui'
# #
# Created by: PySide6 UI code generator 6.7.1 # Created by: PyQt6 UI code generator 6.7.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\confirm_extend.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\confirm_extend.ui'
# #
# Created by: PySide6 UI code generator 6.7.1 # Created by: PyQt6 UI code generator 6.7.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtWidgets from PyQt6 import QtCore, QtWidgets
class Ui_extend_confirm(object): class Ui_extend_confirm(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\edit_bookdata.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\edit_bookdata.ui'
# #
# Created by: PySide6 UI code generator 6.6.1 # Created by: PyQt6 UI code generator 6.6.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_add_table_entry.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_add_table_entry.ui'
# #
# Created by: PySide6 UI code generator 6.7.1 # Created by: PyQt6 UI code generator 6.7.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtWidgets from PyQt6 import QtCore, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_generate_citation.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_generate_citation.ui'
# #
# Created by: PySide6 UI code generator 6.6.1 # Created by: PyQt6 UI code generator 6.6.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_generator_confirm.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_generator_confirm.ui'
# #
# Created by: PySide6 UI code generator 6.6.1 # Created by: PyQt6 UI code generator 6.6.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\login.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\login.ui'
# #
# Created by: PySide6 UI code generator 6.6.1 # Created by: PyQt6 UI code generator 6.6.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\mail_preview.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\mail_preview.ui'
# #
# Created by: PySide6 UI code generator 6.7.1 # Created by: PyQt6 UI code generator 6.7.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_eMailPreview(object): class Ui_eMailPreview(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\medianadder.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\medianadder.ui'
# #
# Created by: PySide6 UI code generator 6.7.1 # Created by: PyQt6 UI code generator 6.7.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\newMailTemplateDesigner.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\newMailTemplateDesigner.ui'
# #
# Created by: PySide6 UI code generator 6.6.1 # Created by: PyQt6 UI code generator 6.6.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtWidgets from PyQt6 import QtCore, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\parsed_titles.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\parsed_titles.ui'
# #
# Created by: PySide6 UI code generator 6.6.1 # Created by: PyQt6 UI code generator 6.6.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Form(object): class Ui_Form(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\reminder.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\reminder.ui'
# #
# Created by: PySide6 UI code generator 6.6.1 # Created by: PyQt6 UI code generator 6.6.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtWidgets from PyQt6 import QtCore, QtWidgets
class Ui_Erinnerung(object): class Ui_Erinnerung(object):

View File

@@ -1,12 +1,12 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\settings.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\settings.ui'
# #
# Created by: PySide6 UI code generator 6.7.1 # Created by: PyQt6 UI code generator 6.7.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):

View File

@@ -1,38 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\about.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_about(object):
def setupUi(self, about):
about.setObjectName("about")
about.resize(301, 313)
self.verticalLayout = QtWidgets.QVBoxLayout(about)
self.verticalLayout.setObjectName("verticalLayout")
self.version = QtWidgets.QLabel(parent=about)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
self.version.setFont(font)
self.version.setScaledContents(False)
self.version.setObjectName("version")
self.verticalLayout.addWidget(self.version)
self.description = QtWidgets.QTextEdit(parent=about)
self.description.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.description.setReadOnly(True)
self.description.setObjectName("description")
self.verticalLayout.addWidget(self.description)
self.retranslateUi(about)
QtCore.QMetaObject.connectSlotsByName(about)
def retranslateUi(self, about):
_translate = QtCore.QCoreApplication.translate
about.setWindowTitle(_translate("about", "Dialog"))
self.version.setText(_translate("about", "SemesterapparatsManagement"))

View File

@@ -1,22 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\app_status.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(300, 500)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))

View File

@@ -1,74 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\apparat_extend.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(388, 103)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
Dialog.setSizePolicy(sizePolicy)
Dialog.setMinimumSize(QtCore.QSize(388, 103))
Dialog.setMaximumSize(QtCore.QSize(388, 103))
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
self.buttonBox.setGeometry(QtCore.QRect(290, 30, 81, 241))
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Vertical)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Abort|QtWidgets.QDialogButtonBox.StandardButton.Save)
self.buttonBox.setObjectName("buttonBox")
self.label = QtWidgets.QLabel(parent=Dialog)
self.label.setGeometry(QtCore.QRect(10, 0, 281, 31))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(10)
self.label.setFont(font)
self.label.setObjectName("label")
self.frame = QtWidgets.QFrame(parent=Dialog)
self.frame.setGeometry(QtCore.QRect(10, 30, 241, 41))
self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.frame.setObjectName("frame")
self.line = QtWidgets.QFrame(parent=self.frame)
self.line.setGeometry(QtCore.QRect(120, 0, 3, 61))
self.line.setFrameShape(QtWidgets.QFrame.Shape.VLine)
self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
self.line.setObjectName("line")
self.rad_sommer = QtWidgets.QRadioButton(parent=self.frame)
self.rad_sommer.setGeometry(QtCore.QRect(10, 10, 82, 21))
self.rad_sommer.setObjectName("rad_sommer")
self.rad_winter = QtWidgets.QRadioButton(parent=self.frame)
self.rad_winter.setGeometry(QtCore.QRect(140, 10, 82, 21))
self.rad_winter.setObjectName("rad_winter")
self.sem_year = QtWidgets.QLineEdit(parent=Dialog)
self.sem_year.setGeometry(QtCore.QRect(10, 70, 121, 20))
self.sem_year.setObjectName("sem_year")
self.dauerapp = QtWidgets.QCheckBox(parent=Dialog)
self.dauerapp.setGeometry(QtCore.QRect(150, 70, 111, 21))
self.dauerapp.setObjectName("dauerapp")
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "Bis wann soll der Apparat verlängert werden?"))
self.rad_sommer.setText(_translate("Dialog", "Sommer"))
self.rad_winter.setText(_translate("Dialog", "Winter"))
self.sem_year.setPlaceholderText(_translate("Dialog", "2023"))
self.dauerapp.setText(_translate("Dialog", "Dauerapparat"))

View File

@@ -1,34 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\confirm_extend.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_extend_confirm(object):
def setupUi(self, extend_confirm):
extend_confirm.setObjectName("extend_confirm")
extend_confirm.resize(380, 97)
self.horizontalLayout = QtWidgets.QHBoxLayout(extend_confirm)
self.horizontalLayout.setObjectName("horizontalLayout")
self.textEdit = QtWidgets.QTextEdit(parent=extend_confirm)
self.textEdit.setObjectName("textEdit")
self.horizontalLayout.addWidget(self.textEdit)
self.buttonBox = QtWidgets.QDialogButtonBox(parent=extend_confirm)
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Vertical)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox")
self.horizontalLayout.addWidget(self.buttonBox)
self.retranslateUi(extend_confirm)
self.buttonBox.accepted.connect(extend_confirm.accept) # type: ignore
self.buttonBox.rejected.connect(extend_confirm.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(extend_confirm)
def retranslateUi(self, extend_confirm):
_translate = QtCore.QCoreApplication.translate
extend_confirm.setWindowTitle(_translate("extend_confirm", "Dialog"))

View File

@@ -1,232 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>725</width>
<height>623</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QToolBox" name="toolBox">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="page">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>707</width>
<height>545</height>
</rect>
</property>
<attribute name="label">
<string>Semesterapparatsübersicht</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Mit dem Klick auf Okay wird eine Übersicht aller aktiven Semesterapparate erstellt und an den FollowME Drucker gesendet. Es kann bis zu 5 Minuten dauern, bis das Dokument im Drucker angezeigt wird.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Dokument erstellen und drucken</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>707</width>
<height>545</height>
</rect>
</property>
<attribute name="label">
<string>Semesterapparatsschilder</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Hier kann das Dokument für die Semesterapparatsschilder erstellt werden. Hierfür müssen die entsprechenden Apparate ausgewählt werden. Mithilfe dieser wird das Dokument erstellt.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>Dokument erstellen und drucken</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_load_current_apparats">
<property name="text">
<string>Aktuelle Apparate laden</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="expertMode">
<property name="text">
<string>Expertenmodus</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QTextBrowser" name="textBrowser">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Segoe UI'; font-size:9pt; font-weight:700; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;SELECT&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; prof.lname || ' (' || semesterapparat.name || ')' AS formatted_result&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;from&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; semesterapparat&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; INNER JOIN prof ON semesterapparat.prof_id = prof.id&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;WHERE&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; (erstellsemester = 'SoSe 25'&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; OR erstellsemester = 'WiSe 24/25')&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; and semesterapparat.deletion_status = 0&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="manualCheck">
<property name="text">
<string>Anfragen und anzeigen</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTableWidget" name="tableWidget">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
<bool>true</bool>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string/>
</property>
<property name="textAlignment">
<set>AlignLeading|AlignVCenter</set>
</property>
</column>
<column>
<property name="text">
<string>Name</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -1,142 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\documentprint.ui'
#
# Created by: PySide6 UI code generator 6.9.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(725, 623)
self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
self.verticalLayout.setObjectName("verticalLayout")
self.toolBox = QtWidgets.QToolBox(parent=Dialog)
font = QtGui.QFont()
font.setBold(True)
self.toolBox.setFont(font)
self.toolBox.setObjectName("toolBox")
self.page = QtWidgets.QWidget()
self.page.setGeometry(QtCore.QRect(0, 0, 707, 545))
self.page.setObjectName("page")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.page)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(parent=self.page)
font = QtGui.QFont()
font.setBold(False)
self.label.setFont(font)
self.label.setWordWrap(True)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.pushButton = QtWidgets.QPushButton(parent=self.page)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.toolBox.addItem(self.page, "")
self.page_2 = QtWidgets.QWidget()
self.page_2.setGeometry(QtCore.QRect(0, 0, 707, 545))
self.page_2.setObjectName("page_2")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.page_2)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_2 = QtWidgets.QLabel(parent=self.page_2)
font = QtGui.QFont()
font.setBold(False)
self.label_2.setFont(font)
self.label_2.setWordWrap(True)
self.label_2.setObjectName("label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.verticalLayout_3 = QtWidgets.QVBoxLayout()
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.pushButton_2 = QtWidgets.QPushButton(parent=self.page_2)
self.pushButton_2.setObjectName("pushButton_2")
self.verticalLayout_3.addWidget(self.pushButton_2)
self.btn_load_current_apparats = QtWidgets.QPushButton(parent=self.page_2)
self.btn_load_current_apparats.setObjectName("btn_load_current_apparats")
self.verticalLayout_3.addWidget(self.btn_load_current_apparats)
self.expertMode = QtWidgets.QCheckBox(parent=self.page_2)
self.expertMode.setObjectName("expertMode")
self.verticalLayout_3.addWidget(self.expertMode)
self.horizontalLayout_2.addLayout(self.verticalLayout_3)
self.verticalLayout_2.addLayout(self.horizontalLayout_2)
self.frame = QtWidgets.QFrame(parent=self.page_2)
self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.frame.setObjectName("frame")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame)
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_3.setSpacing(0)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.textBrowser = QtWidgets.QTextBrowser(parent=self.frame)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textBrowser.sizePolicy().hasHeightForWidth())
self.textBrowser.setSizePolicy(sizePolicy)
self.textBrowser.setReadOnly(False)
self.textBrowser.setObjectName("textBrowser")
self.verticalLayout_4.addWidget(self.textBrowser)
self.manualCheck = QtWidgets.QPushButton(parent=self.frame)
self.manualCheck.setObjectName("manualCheck")
self.verticalLayout_4.addWidget(self.manualCheck)
self.horizontalLayout_3.addLayout(self.verticalLayout_4)
self.verticalLayout_2.addWidget(self.frame)
self.tableWidget = QtWidgets.QTableWidget(parent=self.page_2)
font = QtGui.QFont()
font.setBold(False)
self.tableWidget.setFont(font)
self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(2)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
item.setTextAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignVCenter)
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
self.tableWidget.horizontalHeader().setSortIndicatorShown(True)
self.tableWidget.horizontalHeader().setStretchLastSection(True)
self.verticalLayout_2.addWidget(self.tableWidget)
self.toolBox.addItem(self.page_2, "")
self.verticalLayout.addWidget(self.toolBox)
self.retranslateUi(Dialog)
self.toolBox.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "Mit dem Klick auf Okay wird eine Übersicht aller aktiven Semesterapparate erstellt und an den FollowME Drucker gesendet. Es kann bis zu 5 Minuten dauern, bis das Dokument im Drucker angezeigt wird."))
self.pushButton.setText(_translate("Dialog", "Dokument erstellen und drucken"))
self.toolBox.setItemText(self.toolBox.indexOf(self.page), _translate("Dialog", "Semesterapparatsübersicht"))
self.label_2.setText(_translate("Dialog", "Hier kann das Dokument für die Semesterapparatsschilder erstellt werden. Hierfür müssen die entsprechenden Apparate ausgewählt werden. Mithilfe dieser wird das Dokument erstellt."))
self.pushButton_2.setText(_translate("Dialog", "Dokument erstellen und drucken"))
self.btn_load_current_apparats.setText(_translate("Dialog", "Aktuelle Apparate laden"))
self.expertMode.setText(_translate("Dialog", "Expertenmodus"))
self.textBrowser.setHtml(_translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"hr { height: 1px; border-width: 0; }\n"
"li.unchecked::marker { content: \"\\2610\"; }\n"
"li.checked::marker { content: \"\\2612\"; }\n"
"</style></head><body style=\" font-family:\'Segoe UI\'; font-size:9pt; font-weight:700; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">SELECT</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> prof.lname || \' (\' || semesterapparat.name || \')\' AS formatted_result</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">from</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> semesterapparat</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> INNER JOIN prof ON semesterapparat.prof_id = prof.id</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">WHERE</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> (erstellsemester = \'SoSe 25\'</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> OR erstellsemester = \'WiSe 24/25\')</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> and semesterapparat.deletion_status = 0</p></body></html>"))
self.manualCheck.setText(_translate("Dialog", "Anfragen und anzeigen"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("Dialog", "Name"))
self.toolBox.setItemText(self.toolBox.indexOf(self.page_2), _translate("Dialog", "Semesterapparatsschilder"))

View File

@@ -1,117 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\edit_bookdata.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(448, 572)
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
self.buttonBox.setGeometry(QtCore.QRect(260, 530, 161, 32))
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox")
self.gridLayoutWidget = QtWidgets.QWidget(parent=Dialog)
self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 441, 531))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetDefaultConstraint)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.label_10 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label_10.setObjectName("label_10")
self.gridLayout.addWidget(self.label_10, 10, 1, 1, 1)
self.label = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 1, 1, 1)
self.label_9 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label_9.setObjectName("label_9")
self.gridLayout.addWidget(self.label_9, 9, 1, 1, 1)
self.label_8 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label_8.setObjectName("label_8")
self.gridLayout.addWidget(self.label_8, 8, 1, 1, 1)
self.label_12 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label_12.setObjectName("label_12")
self.gridLayout.addWidget(self.label_12, 6, 1, 1, 1)
self.line_edition = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_edition.setObjectName("line_edition")
self.gridLayout.addWidget(self.line_edition, 2, 2, 1, 1)
self.label_3 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 2, 1, 1, 1)
self.label_4 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 3, 1, 1, 1)
self.line_link = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_link.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.ArrowCursor))
self.line_link.setReadOnly(True)
self.line_link.setObjectName("line_link")
self.gridLayout.addWidget(self.line_link, 6, 2, 1, 1)
self.label_5 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 4, 1, 1, 1)
self.label_7 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label_7.setObjectName("label_7")
self.gridLayout.addWidget(self.label_7, 7, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 5, 1, 1, 1)
self.label_2 = QtWidgets.QLabel(parent=self.gridLayoutWidget)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 1, 1, 1, 1)
spacerItem = QtWidgets.QSpacerItem(5, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum)
self.gridLayout.addItem(spacerItem, 8, 0, 1, 1)
self.line_title = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_title.setObjectName("line_title")
self.gridLayout.addWidget(self.line_title, 0, 2, 1, 1)
self.line_signature = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_signature.setObjectName("line_signature")
self.gridLayout.addWidget(self.line_signature, 1, 2, 1, 1)
self.line_author = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_author.setObjectName("line_author")
self.gridLayout.addWidget(self.line_author, 3, 2, 1, 1)
self.line_lang = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_lang.setObjectName("line_lang")
self.gridLayout.addWidget(self.line_lang, 8, 2, 1, 1)
self.line_ppn = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_ppn.setObjectName("line_ppn")
self.gridLayout.addWidget(self.line_ppn, 5, 2, 1, 1)
self.line_isbn = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_isbn.setObjectName("line_isbn")
self.gridLayout.addWidget(self.line_isbn, 7, 2, 1, 1)
self.line_year = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_year.setObjectName("line_year")
self.gridLayout.addWidget(self.line_year, 9, 2, 1, 1)
self.line_pages = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_pages.setObjectName("line_pages")
self.gridLayout.addWidget(self.line_pages, 10, 2, 1, 1)
self.line_publisher = QtWidgets.QLineEdit(parent=self.gridLayoutWidget)
self.line_publisher.setObjectName("line_publisher")
self.gridLayout.addWidget(self.line_publisher, 4, 2, 1, 1)
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label_10.setText(_translate("Dialog", "Seiten"))
self.label.setText(_translate("Dialog", "Titel"))
self.label_9.setText(_translate("Dialog", "Jahr"))
self.label_8.setText(_translate("Dialog", "Sprache"))
self.label_12.setText(_translate("Dialog", "Link"))
self.label_3.setText(_translate("Dialog", "Auflage"))
self.label_4.setText(_translate("Dialog", "Autor"))
self.label_5.setText(_translate("Dialog", "Herausgeber"))
self.label_7.setText(_translate("Dialog", "ISBN(s)"))
self.label_6.setText(_translate("Dialog", "PPN"))
self.label_2.setText(_translate("Dialog", "Signatur"))

View File

@@ -1,411 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_add_table_entry.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(529, 482)
self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
self.verticalLayout.setObjectName("verticalLayout")
self.groupBox = QtWidgets.QGroupBox(parent=Dialog)
self.groupBox.setFlat(True)
self.groupBox.setCheckable(False)
self.groupBox.setObjectName("groupBox")
self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout_4.setObjectName("gridLayout_4")
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.gridLayout_4.addItem(spacerItem, 0, 3, 1, 1)
self.btn_mono = QtWidgets.QRadioButton(parent=self.groupBox)
self.btn_mono.setChecked(False)
self.btn_mono.setObjectName("btn_mono")
self.gridLayout_4.addWidget(self.btn_mono, 0, 0, 1, 1)
self.btn_zs = QtWidgets.QRadioButton(parent=self.groupBox)
self.btn_zs.setObjectName("btn_zs")
self.gridLayout_4.addWidget(self.btn_zs, 0, 2, 1, 1)
self.btn_hg = QtWidgets.QRadioButton(parent=self.groupBox)
self.btn_hg.setObjectName("btn_hg")
self.gridLayout_4.addWidget(self.btn_hg, 0, 1, 1, 1)
self.verticalLayout.addWidget(self.groupBox)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_2 = QtWidgets.QLabel(parent=Dialog)
self.label_2.setObjectName("label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.searchIdent = QtWidgets.QLineEdit(parent=Dialog)
self.searchIdent.setObjectName("searchIdent")
self.horizontalLayout_2.addWidget(self.searchIdent)
self.btn_search = QtWidgets.QPushButton(parent=Dialog)
self.btn_search.setObjectName("btn_search")
self.horizontalLayout_2.addWidget(self.btn_search)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_2.addItem(spacerItem1)
self.make_quote = QtWidgets.QPushButton(parent=Dialog)
self.make_quote.setObjectName("make_quote")
self.horizontalLayout_2.addWidget(self.make_quote)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.stackedWidget = QtWidgets.QStackedWidget(parent=Dialog)
self.stackedWidget.setObjectName("stackedWidget")
self.mono = QtWidgets.QWidget()
self.mono.setObjectName("mono")
self.gridLayout_2 = QtWidgets.QGridLayout(self.mono)
self.gridLayout_2.setObjectName("gridLayout_2")
self.label = QtWidgets.QLabel(parent=self.mono)
self.label.setObjectName("label")
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
self.book_author = QtWidgets.QLineEdit(parent=self.mono)
self.book_author.setObjectName("book_author")
self.gridLayout_2.addWidget(self.book_author, 0, 1, 1, 1)
self.label_3 = QtWidgets.QLabel(parent=self.mono)
self.label_3.setObjectName("label_3")
self.gridLayout_2.addWidget(self.label_3, 1, 0, 1, 1)
self.book_year = QtWidgets.QLineEdit(parent=self.mono)
self.book_year.setObjectName("book_year")
self.gridLayout_2.addWidget(self.book_year, 1, 1, 1, 1)
self.label_4 = QtWidgets.QLabel(parent=self.mono)
self.label_4.setObjectName("label_4")
self.gridLayout_2.addWidget(self.label_4, 2, 0, 1, 1)
self.book_edition = QtWidgets.QLineEdit(parent=self.mono)
self.book_edition.setObjectName("book_edition")
self.gridLayout_2.addWidget(self.book_edition, 2, 1, 1, 1)
self.label_5 = QtWidgets.QLabel(parent=self.mono)
self.label_5.setObjectName("label_5")
self.gridLayout_2.addWidget(self.label_5, 3, 0, 1, 1)
self.book_title = QtWidgets.QLineEdit(parent=self.mono)
self.book_title.setObjectName("book_title")
self.gridLayout_2.addWidget(self.book_title, 3, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(parent=self.mono)
self.label_6.setObjectName("label_6")
self.gridLayout_2.addWidget(self.label_6, 4, 0, 1, 1)
self.book_place = QtWidgets.QLineEdit(parent=self.mono)
self.book_place.setObjectName("book_place")
self.gridLayout_2.addWidget(self.book_place, 4, 1, 1, 1)
self.label_7 = QtWidgets.QLabel(parent=self.mono)
self.label_7.setObjectName("label_7")
self.gridLayout_2.addWidget(self.label_7, 5, 0, 1, 1)
self.book_publisher = QtWidgets.QLineEdit(parent=self.mono)
self.book_publisher.setObjectName("book_publisher")
self.gridLayout_2.addWidget(self.book_publisher, 5, 1, 1, 1)
self.label_8 = QtWidgets.QLabel(parent=self.mono)
self.label_8.setObjectName("label_8")
self.gridLayout_2.addWidget(self.label_8, 6, 0, 1, 1)
self.book_signature = QtWidgets.QLineEdit(parent=self.mono)
self.book_signature.setObjectName("book_signature")
self.gridLayout_2.addWidget(self.book_signature, 6, 1, 1, 1)
self.label_9 = QtWidgets.QLabel(parent=self.mono)
self.label_9.setObjectName("label_9")
self.gridLayout_2.addWidget(self.label_9, 7, 0, 1, 1)
self.book_pages = QtWidgets.QLineEdit(parent=self.mono)
self.book_pages.setObjectName("book_pages")
self.gridLayout_2.addWidget(self.book_pages, 7, 1, 1, 1)
self.page_warn_2 = QtWidgets.QToolButton(parent=self.mono)
self.page_warn_2.setText("")
self.page_warn_2.setAutoRaise(True)
self.page_warn_2.setObjectName("page_warn_2")
self.gridLayout_2.addWidget(self.page_warn_2, 7, 2, 1, 1)
self.label_29 = QtWidgets.QLabel(parent=self.mono)
self.label_29.setObjectName("label_29")
self.gridLayout_2.addWidget(self.label_29, 8, 0, 1, 1)
self.book_isbn = QtWidgets.QLineEdit(parent=self.mono)
self.book_isbn.setObjectName("book_isbn")
self.gridLayout_2.addWidget(self.book_isbn, 8, 1, 1, 1)
self.stackedWidget.addWidget(self.mono)
self.hg = QtWidgets.QWidget()
self.hg.setObjectName("hg")
self.gridLayout_3 = QtWidgets.QGridLayout(self.hg)
self.gridLayout_3.setObjectName("gridLayout_3")
self.hg_editor = QtWidgets.QLineEdit(parent=self.hg)
self.hg_editor.setObjectName("hg_editor")
self.gridLayout_3.addWidget(self.hg_editor, 4, 1, 1, 1)
self.label_26 = QtWidgets.QLabel(parent=self.hg)
self.label_26.setObjectName("label_26")
self.gridLayout_3.addWidget(self.label_26, 7, 0, 1, 1)
self.hg_edition = QtWidgets.QLineEdit(parent=self.hg)
self.hg_edition.setObjectName("hg_edition")
self.gridLayout_3.addWidget(self.hg_edition, 2, 1, 1, 1)
self.label_20 = QtWidgets.QLabel(parent=self.hg)
self.label_20.setObjectName("label_20")
self.gridLayout_3.addWidget(self.label_20, 1, 0, 1, 1)
self.label_24 = QtWidgets.QLabel(parent=self.hg)
self.label_24.setObjectName("label_24")
self.gridLayout_3.addWidget(self.label_24, 3, 0, 1, 1)
self.label_27 = QtWidgets.QLabel(parent=self.hg)
self.label_27.setObjectName("label_27")
self.gridLayout_3.addWidget(self.label_27, 8, 0, 1, 1)
self.label_28 = QtWidgets.QLabel(parent=self.hg)
self.label_28.setObjectName("label_28")
self.gridLayout_3.addWidget(self.label_28, 9, 0, 1, 1)
self.label_23 = QtWidgets.QLabel(parent=self.hg)
self.label_23.setObjectName("label_23")
self.gridLayout_3.addWidget(self.label_23, 5, 0, 1, 1)
self.label_21 = QtWidgets.QLabel(parent=self.hg)
self.label_21.setObjectName("label_21")
self.gridLayout_3.addWidget(self.label_21, 2, 0, 1, 1)
self.hg_pages = QtWidgets.QLineEdit(parent=self.hg)
self.hg_pages.setObjectName("hg_pages")
self.gridLayout_3.addWidget(self.hg_pages, 8, 1, 1, 1)
self.label_19 = QtWidgets.QLabel(parent=self.hg)
self.label_19.setObjectName("label_19")
self.gridLayout_3.addWidget(self.label_19, 0, 0, 1, 1)
self.hg_signature = QtWidgets.QLineEdit(parent=self.hg)
self.hg_signature.setObjectName("hg_signature")
self.gridLayout_3.addWidget(self.hg_signature, 9, 1, 1, 1)
self.label_30 = QtWidgets.QLabel(parent=self.hg)
self.label_30.setObjectName("label_30")
self.gridLayout_3.addWidget(self.label_30, 10, 0, 1, 1)
self.label_25 = QtWidgets.QLabel(parent=self.hg)
self.label_25.setObjectName("label_25")
self.gridLayout_3.addWidget(self.label_25, 6, 0, 1, 1)
self.hg_year = QtWidgets.QLineEdit(parent=self.hg)
self.hg_year.setObjectName("hg_year")
self.gridLayout_3.addWidget(self.hg_year, 1, 1, 1, 1)
self.label_22 = QtWidgets.QLabel(parent=self.hg)
self.label_22.setObjectName("label_22")
self.gridLayout_3.addWidget(self.label_22, 4, 0, 1, 1)
self.hg_title = QtWidgets.QLineEdit(parent=self.hg)
self.hg_title.setObjectName("hg_title")
self.gridLayout_3.addWidget(self.hg_title, 5, 1, 1, 1)
self.hg_chaptertitle = QtWidgets.QLineEdit(parent=self.hg)
self.hg_chaptertitle.setObjectName("hg_chaptertitle")
self.gridLayout_3.addWidget(self.hg_chaptertitle, 3, 1, 1, 1)
self.hg_author = QtWidgets.QLineEdit(parent=self.hg)
self.hg_author.setObjectName("hg_author")
self.gridLayout_3.addWidget(self.hg_author, 0, 1, 1, 1)
self.hg_isbn = QtWidgets.QLineEdit(parent=self.hg)
self.hg_isbn.setObjectName("hg_isbn")
self.gridLayout_3.addWidget(self.hg_isbn, 10, 1, 1, 1)
self.hg_publisher = QtWidgets.QLineEdit(parent=self.hg)
self.hg_publisher.setObjectName("hg_publisher")
self.gridLayout_3.addWidget(self.hg_publisher, 7, 1, 1, 1)
self.hg_place = QtWidgets.QLineEdit(parent=self.hg)
self.hg_place.setObjectName("hg_place")
self.gridLayout_3.addWidget(self.hg_place, 6, 1, 1, 1)
self.page_warn_3 = QtWidgets.QToolButton(parent=self.hg)
self.page_warn_3.setText("")
self.page_warn_3.setAutoRaise(True)
self.page_warn_3.setObjectName("page_warn_3")
self.gridLayout_3.addWidget(self.page_warn_3, 8, 2, 1, 1)
self.stackedWidget.addWidget(self.hg)
self.zs = QtWidgets.QWidget()
self.zs.setObjectName("zs")
self.gridLayout = QtWidgets.QGridLayout(self.zs)
self.gridLayout.setObjectName("gridLayout")
self.label_10 = QtWidgets.QLabel(parent=self.zs)
self.label_10.setObjectName("label_10")
self.gridLayout.addWidget(self.label_10, 0, 0, 1, 1)
self.zs_publisher = QtWidgets.QLineEdit(parent=self.zs)
self.zs_publisher.setObjectName("zs_publisher")
self.gridLayout.addWidget(self.zs_publisher, 6, 1, 1, 1)
self.zs_place = QtWidgets.QLineEdit(parent=self.zs)
self.zs_place.setObjectName("zs_place")
self.gridLayout.addWidget(self.zs_place, 5, 1, 1, 1)
self.label_14 = QtWidgets.QLabel(parent=self.zs)
self.label_14.setObjectName("label_14")
self.gridLayout.addWidget(self.label_14, 4, 0, 1, 1)
self.label_11 = QtWidgets.QLabel(parent=self.zs)
self.label_11.setObjectName("label_11")
self.gridLayout.addWidget(self.label_11, 1, 0, 1, 1)
self.zs_year = QtWidgets.QLineEdit(parent=self.zs)
self.zs_year.setObjectName("zs_year")
self.gridLayout.addWidget(self.zs_year, 1, 1, 1, 1)
self.label_17 = QtWidgets.QLabel(parent=self.zs)
self.label_17.setObjectName("label_17")
self.gridLayout.addWidget(self.label_17, 7, 0, 1, 1)
self.label_16 = QtWidgets.QLabel(parent=self.zs)
self.label_16.setObjectName("label_16")
self.gridLayout.addWidget(self.label_16, 6, 0, 1, 1)
self.zs_issue = QtWidgets.QLineEdit(parent=self.zs)
self.zs_issue.setObjectName("zs_issue")
self.gridLayout.addWidget(self.zs_issue, 2, 1, 1, 1)
self.zs_chapter_title = QtWidgets.QLineEdit(parent=self.zs)
self.zs_chapter_title.setObjectName("zs_chapter_title")
self.gridLayout.addWidget(self.zs_chapter_title, 3, 1, 1, 1)
self.zs_isbn = QtWidgets.QLineEdit(parent=self.zs)
self.zs_isbn.setObjectName("zs_isbn")
self.gridLayout.addWidget(self.zs_isbn, 9, 1, 1, 1)
self.label_12 = QtWidgets.QLabel(parent=self.zs)
self.label_12.setObjectName("label_12")
self.gridLayout.addWidget(self.label_12, 2, 0, 1, 1)
self.label_31 = QtWidgets.QLabel(parent=self.zs)
self.label_31.setObjectName("label_31")
self.gridLayout.addWidget(self.label_31, 9, 0, 1, 1)
self.label_15 = QtWidgets.QLabel(parent=self.zs)
self.label_15.setObjectName("label_15")
self.gridLayout.addWidget(self.label_15, 5, 0, 1, 1)
self.zs_signature = QtWidgets.QLineEdit(parent=self.zs)
self.zs_signature.setObjectName("zs_signature")
self.gridLayout.addWidget(self.zs_signature, 8, 1, 1, 1)
self.zs_pages = QtWidgets.QLineEdit(parent=self.zs)
self.zs_pages.setObjectName("zs_pages")
self.gridLayout.addWidget(self.zs_pages, 7, 1, 1, 1)
self.label_13 = QtWidgets.QLabel(parent=self.zs)
self.label_13.setObjectName("label_13")
self.gridLayout.addWidget(self.label_13, 3, 0, 1, 1)
self.label_18 = QtWidgets.QLabel(parent=self.zs)
self.label_18.setObjectName("label_18")
self.gridLayout.addWidget(self.label_18, 8, 0, 1, 1)
self.zs_author = QtWidgets.QLineEdit(parent=self.zs)
self.zs_author.setObjectName("zs_author")
self.gridLayout.addWidget(self.zs_author, 0, 1, 1, 1)
self.zs_title = QtWidgets.QLineEdit(parent=self.zs)
self.zs_title.setObjectName("zs_title")
self.gridLayout.addWidget(self.zs_title, 4, 1, 1, 1)
self.page_warn = QtWidgets.QToolButton(parent=self.zs)
self.page_warn.setText("")
self.page_warn.setAutoRaise(True)
self.page_warn.setObjectName("page_warn")
self.gridLayout.addWidget(self.page_warn, 7, 2, 1, 1)
self.stackedWidget.addWidget(self.zs)
self.page = QtWidgets.QWidget()
self.page.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight)
self.page.setObjectName("page")
self.gridLayout_5 = QtWidgets.QGridLayout(self.page)
self.gridLayout_5.setObjectName("gridLayout_5")
self.label_32 = QtWidgets.QLabel(parent=self.page)
self.label_32.setObjectName("label_32")
self.gridLayout_5.addWidget(self.label_32, 0, 0, 1, 1)
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.gridLayout_5.addItem(spacerItem2, 7, 0, 1, 1)
self.file_desc_edit = QtWidgets.QTextEdit(parent=self.page)
self.file_desc_edit.setReadOnly(True)
self.file_desc_edit.setObjectName("file_desc_edit")
self.gridLayout_5.addWidget(self.file_desc_edit, 6, 0, 1, 1)
self.label_34 = QtWidgets.QLabel(parent=self.page)
self.label_34.setObjectName("label_34")
self.gridLayout_5.addWidget(self.label_34, 3, 0, 1, 1)
self.filename_edit = QtWidgets.QTextEdit(parent=self.page)
self.filename_edit.setReadOnly(True)
self.filename_edit.setObjectName("filename_edit")
self.gridLayout_5.addWidget(self.filename_edit, 1, 0, 1, 1)
self.label_33 = QtWidgets.QLabel(parent=self.page)
self.label_33.setObjectName("label_33")
self.gridLayout_5.addWidget(self.label_33, 5, 0, 1, 1)
self.ilias_filename = QtWidgets.QTextEdit(parent=self.page)
self.ilias_filename.setReadOnly(True)
self.ilias_filename.setObjectName("ilias_filename")
self.gridLayout_5.addWidget(self.ilias_filename, 4, 0, 1, 1)
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2")
spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout_2.addItem(spacerItem3)
self.copy_filename = QtWidgets.QToolButton(parent=self.page)
self.copy_filename.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight)
self.copy_filename.setAutoFillBackground(False)
self.copy_filename.setObjectName("copy_filename")
self.verticalLayout_2.addWidget(self.copy_filename)
self.filename_edit_label = QtWidgets.QLabel(parent=self.page)
self.filename_edit_label.setText("")
self.filename_edit_label.setObjectName("filename_edit_label")
self.verticalLayout_2.addWidget(self.filename_edit_label)
spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout_2.addItem(spacerItem4)
self.gridLayout_5.addLayout(self.verticalLayout_2, 1, 1, 1, 1)
self.verticalLayout_3 = QtWidgets.QVBoxLayout()
self.verticalLayout_3.setObjectName("verticalLayout_3")
spacerItem5 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout_3.addItem(spacerItem5)
self.copy_ilias_filename = QtWidgets.QToolButton(parent=self.page)
self.copy_ilias_filename.setObjectName("copy_ilias_filename")
self.verticalLayout_3.addWidget(self.copy_ilias_filename)
self.ilias_filename_label = QtWidgets.QLabel(parent=self.page)
self.ilias_filename_label.setText("")
self.ilias_filename_label.setObjectName("ilias_filename_label")
self.verticalLayout_3.addWidget(self.ilias_filename_label)
spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout_3.addItem(spacerItem6)
self.gridLayout_5.addLayout(self.verticalLayout_3, 4, 1, 1, 1)
self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setObjectName("verticalLayout_4")
spacerItem7 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout_4.addItem(spacerItem7)
self.copy_qoute = QtWidgets.QToolButton(parent=self.page)
self.copy_qoute.setObjectName("copy_qoute")
self.verticalLayout_4.addWidget(self.copy_qoute)
self.file_desc_edit_label = QtWidgets.QLabel(parent=self.page)
self.file_desc_edit_label.setText("")
self.file_desc_edit_label.setObjectName("file_desc_edit_label")
self.verticalLayout_4.addWidget(self.file_desc_edit_label)
spacerItem8 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout_4.addItem(spacerItem8)
self.gridLayout_5.addLayout(self.verticalLayout_4, 6, 1, 1, 1)
self.stackedWidget.addWidget(self.page)
self.verticalLayout.addWidget(self.stackedWidget)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Discard|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox")
self.horizontalLayout.addWidget(self.buttonBox)
self.retryButton = QtWidgets.QPushButton(parent=Dialog)
self.retryButton.setObjectName("retryButton")
self.horizontalLayout.addWidget(self.retryButton)
self.verticalLayout.addLayout(self.horizontalLayout)
self.retranslateUi(Dialog)
self.stackedWidget.setCurrentIndex(3)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.groupBox.setTitle(_translate("Dialog", "Medientyp?"))
self.btn_mono.setText(_translate("Dialog", "Monografie"))
self.btn_zs.setText(_translate("Dialog", "Zeitschrift"))
self.btn_hg.setText(_translate("Dialog", "Herausgeberwerk"))
self.label_2.setText(_translate("Dialog", "Identifikator"))
self.btn_search.setText(_translate("Dialog", "Suchen"))
self.make_quote.setToolTip(_translate("Dialog", "Zuerst die Seitenzahl anpassen"))
self.make_quote.setText(_translate("Dialog", "Zitat erstellen"))
self.label.setText(_translate("Dialog", "Autor(en)\n"
" Nachname, Vorname"))
self.book_author.setToolTip(_translate("Dialog", "Bei mehreren Autoren mit ; trennen"))
self.label_3.setText(_translate("Dialog", "Jahr"))
self.label_4.setText(_translate("Dialog", "Auflage"))
self.label_5.setText(_translate("Dialog", "Titel"))
self.label_6.setText(_translate("Dialog", "Ort"))
self.label_7.setText(_translate("Dialog", "Verlag"))
self.label_8.setText(_translate("Dialog", "Signatur"))
self.label_9.setText(_translate("Dialog", "Seiten"))
self.book_pages.setPlaceholderText(_translate("Dialog", "Seitenanzahl des Mediums, zum zitieren ändern!"))
self.label_29.setText(_translate("Dialog", "ISBN"))
self.hg_editor.setToolTip(_translate("Dialog", "Bei mehreren Autoren mit ; trennen"))
self.label_26.setText(_translate("Dialog", "Verlag"))
self.label_20.setText(_translate("Dialog", "Jahr"))
self.label_24.setText(_translate("Dialog", "Beitragstitel"))
self.label_27.setText(_translate("Dialog", "Seiten"))
self.label_28.setText(_translate("Dialog", "Signatur"))
self.label_23.setText(_translate("Dialog", "Titel des Werkes"))
self.label_21.setText(_translate("Dialog", "Auflage"))
self.label_19.setText(_translate("Dialog", "Autor(en)\n"
"Nachname, Vorname"))
self.label_30.setText(_translate("Dialog", "ISBN"))
self.label_25.setText(_translate("Dialog", "Ort"))
self.label_22.setText(_translate("Dialog", "Herausgebername(n)\n"
"Nachname, Vorname"))
self.hg_author.setToolTip(_translate("Dialog", "Bei mehreren Autoren mit ; trennen"))
self.label_10.setText(_translate("Dialog", "Autor(en)\n"
"Nachname, Vorname"))
self.label_14.setText(_translate("Dialog", "Name der Zeitschrift"))
self.label_11.setText(_translate("Dialog", "Jahr"))
self.label_17.setText(_translate("Dialog", "Seiten"))
self.label_16.setText(_translate("Dialog", "Verlag"))
self.label_12.setText(_translate("Dialog", "Heft"))
self.label_31.setText(_translate("Dialog", "ISSN"))
self.label_15.setText(_translate("Dialog", "Ort"))
self.label_13.setText(_translate("Dialog", "Artikeltitel"))
self.label_18.setText(_translate("Dialog", "Signatur"))
self.zs_author.setToolTip(_translate("Dialog", "Bei mehreren Autoren mit ; trennen"))
self.label_32.setText(_translate("Dialog", "Dateiname"))
self.label_34.setText(_translate("Dialog", "ILIAS Name"))
self.label_33.setText(_translate("Dialog", "ILIAS Dateibeschreibung"))
self.copy_filename.setText(_translate("Dialog", "Kopieren"))
self.copy_ilias_filename.setText(_translate("Dialog", "Kopieren"))
self.copy_qoute.setText(_translate("Dialog", "Kopieren"))
self.retryButton.setText(_translate("Dialog", "Wiederholen"))

View File

@@ -1,76 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_generate_citation.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(564, 517)
self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.select_type = QtWidgets.QFrame(parent=Dialog)
self.select_type.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.select_type.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.select_type.setObjectName("select_type")
self.verticalLayout = QtWidgets.QVBoxLayout(self.select_type)
self.verticalLayout.setObjectName("verticalLayout")
self.radio_mono = QtWidgets.QRadioButton(parent=self.select_type)
self.radio_mono.setObjectName("radio_mono")
self.verticalLayout.addWidget(self.radio_mono)
self.radio_zs = QtWidgets.QRadioButton(parent=self.select_type)
self.radio_zs.setObjectName("radio_zs")
self.verticalLayout.addWidget(self.radio_zs)
self.radio_hg = QtWidgets.QRadioButton(parent=self.select_type)
self.radio_hg.setObjectName("radio_hg")
self.verticalLayout.addWidget(self.radio_hg)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout.addItem(spacerItem)
self.verticalLayout_2.addWidget(self.select_type)
self.check = QtWidgets.QGroupBox(parent=Dialog)
font = QtGui.QFont()
font.setBold(True)
self.check.setFont(font)
self.check.setObjectName("check")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.check)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.citation_style_result = QtWidgets.QStackedWidget(parent=self.check)
font = QtGui.QFont()
font.setBold(False)
self.citation_style_result.setFont(font)
self.citation_style_result.setObjectName("citation_style_result")
self.monografie = QtWidgets.QWidget()
self.monografie.setObjectName("monografie")
self.citation_style_result.addWidget(self.monografie)
self.zsaufsatz = QtWidgets.QWidget()
self.zsaufsatz.setObjectName("zsaufsatz")
self.citation_style_result.addWidget(self.zsaufsatz)
self.herausgeberwerk = QtWidgets.QWidget()
self.herausgeberwerk.setObjectName("herausgeberwerk")
self.citation_style_result.addWidget(self.herausgeberwerk)
self.verticalLayout_3.addWidget(self.citation_style_result)
self.pushButton = QtWidgets.QPushButton(parent=self.check)
self.pushButton.setObjectName("pushButton")
self.verticalLayout_3.addWidget(self.pushButton, 0, QtCore.Qt.AlignmentFlag.AlignRight)
self.verticalLayout_2.addWidget(self.check)
self.verticalLayout_2.setStretch(0, 20)
self.verticalLayout_2.setStretch(1, 80)
self.retranslateUi(Dialog)
self.citation_style_result.setCurrentIndex(2)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.radio_mono.setText(_translate("Dialog", "Monografie"))
self.radio_zs.setText(_translate("Dialog", "Zeitschriftenaufsatz"))
self.radio_hg.setText(_translate("Dialog", "Herausgeberwerk"))
self.check.setTitle(_translate("Dialog", "Daten"))
self.pushButton.setText(_translate("Dialog", "Bestätigen"))

View File

@@ -1,120 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\elsa_generator_confirm.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(530, 210)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
Dialog.setSizePolicy(sizePolicy)
Dialog.setMaximumSize(QtCore.QSize(530, 210))
self.horizontalLayout = QtWidgets.QHBoxLayout(Dialog)
self.horizontalLayout.setObjectName("horizontalLayout")
self.groupBox = QtWidgets.QGroupBox(parent=Dialog)
font = QtGui.QFont()
font.setBold(True)
self.groupBox.setFont(font)
self.groupBox.setObjectName("groupBox")
self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.label.setFont(font)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
self.bookauthor = QtWidgets.QLineEdit(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.bookauthor.setFont(font)
self.bookauthor.setObjectName("bookauthor")
self.gridLayout.addWidget(self.bookauthor, 5, 1, 1, 1)
self.book_title = QtWidgets.QLineEdit(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.book_title.setFont(font)
self.book_title.setObjectName("book_title")
self.gridLayout.addWidget(self.book_title, 3, 1, 1, 1)
self.label_5 = QtWidgets.QLabel(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.label_5.setFont(font)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 5, 0, 1, 1)
self.pages = QtWidgets.QLineEdit(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.pages.setFont(font)
self.pages.setObjectName("pages")
self.gridLayout.addWidget(self.pages, 4, 1, 1, 1)
self.label_2 = QtWidgets.QLabel(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
self.label_3 = QtWidgets.QLabel(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 3, 0, 1, 1)
self.label_4 = QtWidgets.QLabel(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1)
self.chapter_title = QtWidgets.QLineEdit(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.chapter_title.setFont(font)
self.chapter_title.setObjectName("chapter_title")
self.gridLayout.addWidget(self.chapter_title, 1, 1, 1, 1)
self.chapter_authors = QtWidgets.QLineEdit(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.chapter_authors.setFont(font)
self.chapter_authors.setObjectName("chapter_authors")
self.gridLayout.addWidget(self.chapter_authors, 2, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(parent=self.groupBox)
font = QtGui.QFont()
font.setBold(False)
self.label_6.setFont(font)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 0, 1, 1, 1)
self.horizontalLayout.addWidget(self.groupBox)
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
self.buttonBox.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight)
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Vertical)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setCenterButtons(False)
self.buttonBox.setObjectName("buttonBox")
self.horizontalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.groupBox.setTitle(_translate("Dialog", "Angaben korrekt?"))
self.label.setText(_translate("Dialog", "Kapiteltitel"))
self.label_5.setText(_translate("Dialog", "Herausgebername"))
self.label_2.setText(_translate("Dialog", "Autor(en)"))
self.label_3.setText(_translate("Dialog", "Buchtitel"))
self.label_4.setText(_translate("Dialog", "Seite(n)"))
self.label_6.setText(_translate("Dialog", "Hier können fehlerhafte / fehlende Daten geändert werden"))

View File

@@ -1,49 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\login.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(218, 190)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/icons/resources/1f510.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
Dialog.setWindowIcon(icon)
self.label = QtWidgets.QLabel(parent=Dialog)
self.label.setGeometry(QtCore.QRect(20, 40, 71, 21))
self.label.setObjectName("label")
self.lineEdit = QtWidgets.QLineEdit(parent=Dialog)
self.lineEdit.setGeometry(QtCore.QRect(80, 40, 113, 21))
self.lineEdit.setObjectName("lineEdit")
self.label_2 = QtWidgets.QLabel(parent=Dialog)
self.label_2.setGeometry(QtCore.QRect(20, 80, 71, 21))
self.label_2.setObjectName("label_2")
self.lineEdit_2 = QtWidgets.QLineEdit(parent=Dialog)
self.lineEdit_2.setGeometry(QtCore.QRect(80, 80, 113, 21))
self.lineEdit_2.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhSensitiveData)
self.lineEdit_2.setClearButtonEnabled(True)
self.lineEdit_2.setObjectName("lineEdit_2")
self.login_button = QtWidgets.QPushButton(parent=Dialog)
self.login_button.setGeometry(QtCore.QRect(30, 140, 76, 32))
self.login_button.setObjectName("login_button")
self.cancel_button = QtWidgets.QPushButton(parent=Dialog)
self.cancel_button.setGeometry(QtCore.QRect(120, 140, 76, 32))
self.cancel_button.setObjectName("cancel_button")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Login"))
self.label.setText(_translate("Dialog", "Username"))
self.label_2.setText(_translate("Dialog", "Password"))
self.login_button.setText(_translate("Dialog", "Login"))
self.cancel_button.setText(_translate("Dialog", "Cancel"))

View File

@@ -1,115 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\mail_preview.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_eMailPreview(object):
def setupUi(self, eMailPreview):
eMailPreview.setObjectName("eMailPreview")
eMailPreview.resize(700, 668)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("c:\\Users\\aky547\\GitHub\\SemesterapparatsManager\\src\\ui\\dialogs\\dialog_sources\\../../../../../../icons/email.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
eMailPreview.setWindowIcon(icon)
self.gridLayout_2 = QtWidgets.QGridLayout(eMailPreview)
self.gridLayout_2.setObjectName("gridLayout_2")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.prof_name = QtWidgets.QLineEdit(parent=eMailPreview)
self.prof_name.setObjectName("prof_name")
self.gridLayout.addWidget(self.prof_name, 2, 2, 1, 1)
self.newTemplate = QtWidgets.QPushButton(parent=eMailPreview)
self.newTemplate.setAutoFillBackground(False)
self.newTemplate.setText("")
self.newTemplate.setIconSize(QtCore.QSize(24, 24))
self.newTemplate.setAutoDefault(True)
self.newTemplate.setDefault(False)
self.newTemplate.setFlat(False)
self.newTemplate.setObjectName("newTemplate")
self.gridLayout.addWidget(self.newTemplate, 0, 3, 1, 1)
self.comboBox = QtWidgets.QComboBox(parent=eMailPreview)
self.comboBox.setObjectName("comboBox")
self.gridLayout.addWidget(self.comboBox, 0, 2, 1, 1)
self.mail_header = QtWidgets.QLineEdit(parent=eMailPreview)
self.mail_header.setObjectName("mail_header")
self.gridLayout.addWidget(self.mail_header, 3, 2, 1, 1)
self.label_6 = QtWidgets.QLabel(parent=eMailPreview)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 4, 0, 1, 1)
self.mail_body = QtWidgets.QTextEdit(parent=eMailPreview)
self.mail_body.setObjectName("mail_body")
self.gridLayout.addWidget(self.mail_body, 5, 2, 1, 1)
self.label_2 = QtWidgets.QLabel(parent=eMailPreview)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
self.mail_name = QtWidgets.QLineEdit(parent=eMailPreview)
self.mail_name.setObjectName("mail_name")
self.gridLayout.addWidget(self.mail_name, 1, 2, 1, 1)
self.label_5 = QtWidgets.QLabel(parent=eMailPreview)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 0, 0, 1, 1)
self.label_4 = QtWidgets.QLabel(parent=eMailPreview)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.gender_male = QtWidgets.QRadioButton(parent=eMailPreview)
self.gender_male.setObjectName("gender_male")
self.horizontalLayout_3.addWidget(self.gender_male)
self.gender_female = QtWidgets.QRadioButton(parent=eMailPreview)
self.gender_female.setObjectName("gender_female")
self.horizontalLayout_3.addWidget(self.gender_female)
self.gender_non = QtWidgets.QRadioButton(parent=eMailPreview)
self.gender_non.setObjectName("gender_non")
self.horizontalLayout_3.addWidget(self.gender_non)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_3.addItem(spacerItem)
self.gridLayout.addLayout(self.horizontalLayout_3, 4, 2, 1, 1)
self.label_3 = QtWidgets.QLabel(parent=eMailPreview)
self.label_3.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignTop)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 5, 0, 1, 1)
self.label = QtWidgets.QLabel(parent=eMailPreview)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_2.addItem(spacerItem1)
self.btn_okay = QtWidgets.QPushButton(parent=eMailPreview)
self.btn_okay.setStatusTip("")
self.btn_okay.setObjectName("btn_okay")
self.horizontalLayout_2.addWidget(self.btn_okay)
self.buttonBox = QtWidgets.QDialogButtonBox(parent=eMailPreview)
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName("buttonBox")
self.horizontalLayout_2.addWidget(self.buttonBox)
self.gridLayout.addLayout(self.horizontalLayout_2, 6, 2, 1, 1)
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
self.retranslateUi(eMailPreview)
self.buttonBox.accepted.connect(eMailPreview.accept) # type: ignore
self.buttonBox.rejected.connect(eMailPreview.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(eMailPreview)
def retranslateUi(self, eMailPreview):
_translate = QtCore.QCoreApplication.translate
eMailPreview.setWindowTitle(_translate("eMailPreview", "eMail Voransicht"))
self.label_6.setText(_translate("eMailPreview", "Anrede"))
self.label_2.setText(_translate("eMailPreview", "Prof"))
self.label_5.setText(_translate("eMailPreview", "Art"))
self.label_4.setText(_translate("eMailPreview", "Betreff"))
self.gender_male.setText(_translate("eMailPreview", "M"))
self.gender_female.setText(_translate("eMailPreview", "W"))
self.gender_non.setText(_translate("eMailPreview", "Divers"))
self.label_3.setText(_translate("eMailPreview", "Mail"))
self.label.setText(_translate("eMailPreview", "eMail"))
self.btn_okay.setWhatsThis(_translate("eMailPreview", "test"))
self.btn_okay.setText(_translate("eMailPreview", "Senden"))

View File

@@ -1,360 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\medianadder.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(620, 481)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/icons/resources/2795.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
Dialog.setWindowIcon(icon)
self.label = QtWidgets.QLabel(parent=Dialog)
self.label.setGeometry(QtCore.QRect(20, 10, 47, 21))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(parent=Dialog)
self.label_2.setGeometry(QtCore.QRect(20, 40, 47, 21))
self.label_2.setObjectName("label_2")
self.comboBox = QtWidgets.QComboBox(parent=Dialog)
self.comboBox.setGeometry(QtCore.QRect(70, 40, 69, 22))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.lineEdit = QtWidgets.QLineEdit(parent=Dialog)
self.lineEdit.setGeometry(QtCore.QRect(70, 10, 113, 20))
self.lineEdit.setObjectName("lineEdit")
self.label_3 = QtWidgets.QLabel(parent=Dialog)
self.label_3.setGeometry(QtCore.QRect(20, 90, 47, 21))
self.label_3.setObjectName("label_3")
self.widget = QtWidgets.QWidget(parent=Dialog)
self.widget.setGeometry(QtCore.QRect(330, 90, 281, 381))
self.widget.setObjectName("widget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.tableWidget = QtWidgets.QTableWidget(parent=self.widget)
self.tableWidget.setEnabled(True)
self.tableWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.tableWidget.setAutoFillBackground(False)
self.tableWidget.setLineWidth(0)
self.tableWidget.setMidLineWidth(0)
self.tableWidget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
self.tableWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
self.tableWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents)
self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
self.tableWidget.setAlternatingRowColors(True)
self.tableWidget.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection)
self.tableWidget.setTextElideMode(QtCore.Qt.TextElideMode.ElideMiddle)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(4)
self.tableWidget.setRowCount(11)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(9, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(10, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(1, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(1, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(1, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(1, 3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(2, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(2, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(2, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(2, 3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(3, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(3, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(3, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(3, 3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(4, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(4, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(4, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(4, 3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(5, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(5, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(5, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(5, 3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(6, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(6, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(6, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(6, 3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(7, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(7, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(7, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(7, 3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(8, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(8, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(8, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(8, 3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(9, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(9, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(9, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(9, 3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(10, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(10, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(10, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(10, 3, item)
self.tableWidget.horizontalHeader().setDefaultSectionSize(45)
self.horizontalLayout.addWidget(self.tableWidget)
self.listWidget = QtWidgets.QListWidget(parent=Dialog)
self.listWidget.setGeometry(QtCore.QRect(10, 110, 281, 321))
self.listWidget.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
self.listWidget.setObjectName("listWidget")
self.label_4 = QtWidgets.QLabel(parent=Dialog)
self.label_4.setGeometry(QtCore.QRect(330, 50, 181, 21))
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(parent=Dialog)
self.label_5.setGeometry(QtCore.QRect(200, 90, 41, 21))
self.label_5.setObjectName("label_5")
self.list_amount = QtWidgets.QLabel(parent=Dialog)
self.list_amount.setGeometry(QtCore.QRect(240, 90, 47, 21))
self.list_amount.setObjectName("list_amount")
self.horizontalLayoutWidget = QtWidgets.QWidget(parent=Dialog)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 440, 160, 31))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.btn_save = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget)
self.btn_save.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.btn_save.setObjectName("btn_save")
self.horizontalLayout_2.addWidget(self.btn_save)
self.btn_cancel = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget)
self.btn_cancel.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.btn_cancel.setObjectName("btn_cancel")
self.horizontalLayout_2.addWidget(self.btn_cancel)
self.check_use_any_book = QtWidgets.QCheckBox(parent=Dialog)
self.check_use_any_book.setGeometry(QtCore.QRect(20, 70, 141, 20))
self.check_use_any_book.setObjectName("check_use_any_book")
self.check_use_exact_signature = QtWidgets.QCheckBox(parent=Dialog)
self.check_use_exact_signature.setGeometry(QtCore.QRect(165, 70, 121, 20))
self.check_use_exact_signature.setObjectName("check_use_exact_signature")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.lineEdit, self.comboBox)
Dialog.setTabOrder(self.comboBox, self.listWidget)
Dialog.setTabOrder(self.listWidget, self.tableWidget)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Medien"))
self.label.setText(_translate("Dialog", "Signatur"))
self.label_2.setText(_translate("Dialog", "Modus"))
self.comboBox.setItemText(0, _translate("Dialog", "ARRAY"))
self.comboBox.setItemText(1, _translate("Dialog", "BibTeX"))
self.comboBox.setItemText(2, _translate("Dialog", "COinS"))
self.comboBox.setItemText(3, _translate("Dialog", "RIS"))
self.lineEdit.setPlaceholderText(_translate("Dialog", "Signatur / ISBN"))
self.label_3.setText(_translate("Dialog", "Queue"))
item = self.tableWidget.verticalHeaderItem(0)
item.setText(_translate("Dialog", "PPN"))
item = self.tableWidget.verticalHeaderItem(1)
item.setText(_translate("Dialog", "Signatur"))
item = self.tableWidget.verticalHeaderItem(2)
item.setText(_translate("Dialog", "Autor"))
item = self.tableWidget.verticalHeaderItem(3)
item.setText(_translate("Dialog", "ISBN"))
item = self.tableWidget.verticalHeaderItem(4)
item.setText(_translate("Dialog", "Jahr"))
item = self.tableWidget.verticalHeaderItem(5)
item.setText(_translate("Dialog", "Auflage"))
item = self.tableWidget.verticalHeaderItem(6)
item.setText(_translate("Dialog", "Sprache"))
item = self.tableWidget.verticalHeaderItem(7)
item.setText(_translate("Dialog", "Herausgeber"))
item = self.tableWidget.verticalHeaderItem(8)
item.setText(_translate("Dialog", "Seiten"))
item = self.tableWidget.verticalHeaderItem(9)
item.setText(_translate("Dialog", "Titel"))
item = self.tableWidget.verticalHeaderItem(10)
item.setText(_translate("Dialog", "Link"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("Dialog", "Array"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("Dialog", "BibTeX"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("Dialog", "COinS"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("Dialog", "RIS"))
__sortingEnabled = self.tableWidget.isSortingEnabled()
self.tableWidget.setSortingEnabled(False)
item = self.tableWidget.item(0, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(0, 1)
item.setText(_translate("Dialog", "0"))
item = self.tableWidget.item(0, 2)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(0, 3)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(1, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(1, 1)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(1, 2)
item.setText(_translate("Dialog", "0"))
item = self.tableWidget.item(1, 3)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(2, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(2, 1)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(2, 2)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(2, 3)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(3, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(3, 1)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(3, 2)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(3, 3)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(4, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(4, 1)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(4, 2)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(4, 3)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(5, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(5, 1)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(5, 2)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(5, 3)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(6, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(6, 1)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(6, 2)
item.setText(_translate("Dialog", "0"))
item = self.tableWidget.item(6, 3)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(7, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(7, 1)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(7, 2)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(7, 3)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(8, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(8, 1)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(8, 2)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(8, 3)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(9, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(9, 1)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(9, 2)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(9, 3)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(10, 0)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(10, 1)
item.setText(_translate("Dialog", "0"))
item = self.tableWidget.item(10, 2)
item.setText(_translate("Dialog", "1"))
item = self.tableWidget.item(10, 3)
item.setText(_translate("Dialog", "1"))
self.tableWidget.setSortingEnabled(__sortingEnabled)
self.label_4.setText(_translate("Dialog", "Belegbare Felder per Anbieter"))
self.label_5.setText(_translate("Dialog", "Anzahl:"))
self.list_amount.setText(_translate("Dialog", "0"))
self.btn_save.setText(_translate("Dialog", "Ok"))
self.btn_cancel.setText(_translate("Dialog", "Abbrechen"))
self.check_use_any_book.setToolTip(_translate("Dialog", "Verwendet ein zufälliges Buch des Datensatzes, nützlich wenn das Buch noch nicht im Apparat ist"))
self.check_use_any_book.setText(_translate("Dialog", "Jedes Buch verwenden"))
self.check_use_exact_signature.setToolTip(_translate("Dialog", "Verwendet die eingegebene Signatur für die Suche von Daten"))
self.check_use_exact_signature.setText(_translate("Dialog", "Exakte Signatur"))

View File

@@ -1,163 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\newMailTemplateDesigner.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(689, 572)
self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.bold = QtWidgets.QPushButton(parent=Dialog)
self.bold.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.bold.setCheckable(True)
self.bold.setObjectName("bold")
self.horizontalLayout_2.addWidget(self.bold)
self.italic = QtWidgets.QPushButton(parent=Dialog)
self.italic.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.italic.setCheckable(True)
self.italic.setObjectName("italic")
self.horizontalLayout_2.addWidget(self.italic)
self.underlined = QtWidgets.QPushButton(parent=Dialog)
self.underlined.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.underlined.setCheckable(True)
self.underlined.setObjectName("underlined")
self.horizontalLayout_2.addWidget(self.underlined)
self.fontBox = QtWidgets.QFontComboBox(parent=Dialog)
self.fontBox.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.fontBox.setObjectName("fontBox")
self.horizontalLayout_2.addWidget(self.fontBox)
self.fontSize = QtWidgets.QComboBox(parent=Dialog)
self.fontSize.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.fontSize.setObjectName("fontSize")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.fontSize.addItem("")
self.horizontalLayout_2.addWidget(self.fontSize)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_2.addItem(spacerItem)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.verticalLayout.addLayout(self.horizontalLayout_4)
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(parent=Dialog)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.placeholder_list = QtWidgets.QComboBox(parent=Dialog)
self.placeholder_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.placeholder_list.setSizeAdjustPolicy(QtWidgets.QComboBox.SizeAdjustPolicy.AdjustToContents)
self.placeholder_list.setObjectName("placeholder_list")
self.placeholder_list.addItem("")
self.placeholder_list.addItem("")
self.placeholder_list.addItem("")
self.placeholder_list.addItem("")
self.placeholder_list.addItem("")
self.placeholder_list.addItem("")
self.gridLayout.addWidget(self.placeholder_list, 1, 0, 1, 1)
self.label_2 = QtWidgets.QLabel(parent=Dialog)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1)
self.lineEdit = QtWidgets.QLineEdit(parent=Dialog)
self.lineEdit.setEnabled(True)
self.lineEdit.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.lineEdit.setFrame(False)
self.lineEdit.setReadOnly(True)
self.lineEdit.setObjectName("lineEdit")
self.gridLayout.addWidget(self.lineEdit, 1, 1, 1, 1)
self.insertPlaceholder = QtWidgets.QPushButton(parent=Dialog)
self.insertPlaceholder.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.insertPlaceholder.setObjectName("insertPlaceholder")
self.gridLayout.addWidget(self.insertPlaceholder, 1, 2, 1, 1)
self.verticalLayout.addLayout(self.gridLayout)
self.label_3 = QtWidgets.QLabel(parent=Dialog)
self.label_3.setObjectName("label_3")
self.verticalLayout.addWidget(self.label_3)
self.subject = QtWidgets.QLineEdit(parent=Dialog)
self.subject.setObjectName("subject")
self.verticalLayout.addWidget(self.subject)
self.templateEdit = QtWidgets.QTextEdit(parent=Dialog)
self.templateEdit.setObjectName("templateEdit")
self.verticalLayout.addWidget(self.templateEdit)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.testTemplate = QtWidgets.QPushButton(parent=Dialog)
self.testTemplate.setObjectName("testTemplate")
self.horizontalLayout_3.addWidget(self.testTemplate)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_3.addItem(spacerItem1)
self.verticalLayout.addLayout(self.horizontalLayout_3)
self.verticalLayout_2.addLayout(self.verticalLayout)
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Discard|QtWidgets.QDialogButtonBox.StandardButton.Save)
self.buttonBox.setObjectName("buttonBox")
self.verticalLayout_2.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
self.fontSize.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.subject, self.templateEdit)
Dialog.setTabOrder(self.templateEdit, self.testTemplate)
Dialog.setTabOrder(self.testTemplate, self.insertPlaceholder)
Dialog.setTabOrder(self.insertPlaceholder, self.lineEdit)
Dialog.setTabOrder(self.lineEdit, self.fontSize)
Dialog.setTabOrder(self.fontSize, self.placeholder_list)
Dialog.setTabOrder(self.placeholder_list, self.fontBox)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.bold.setText(_translate("Dialog", "Fett"))
self.italic.setText(_translate("Dialog", "Kursiv"))
self.underlined.setText(_translate("Dialog", "Unterstrichen"))
self.fontSize.setItemText(0, _translate("Dialog", "8"))
self.fontSize.setItemText(1, _translate("Dialog", "9"))
self.fontSize.setItemText(2, _translate("Dialog", "11"))
self.fontSize.setItemText(3, _translate("Dialog", "12"))
self.fontSize.setItemText(4, _translate("Dialog", "14"))
self.fontSize.setItemText(5, _translate("Dialog", "16"))
self.fontSize.setItemText(6, _translate("Dialog", "18"))
self.fontSize.setItemText(7, _translate("Dialog", "20"))
self.fontSize.setItemText(8, _translate("Dialog", "22"))
self.fontSize.setItemText(9, _translate("Dialog", "24"))
self.fontSize.setItemText(10, _translate("Dialog", "26"))
self.fontSize.setItemText(11, _translate("Dialog", "28"))
self.fontSize.setItemText(12, _translate("Dialog", "36"))
self.fontSize.setItemText(13, _translate("Dialog", "48"))
self.fontSize.setItemText(14, _translate("Dialog", "76"))
self.label.setText(_translate("Dialog", "Platzhalter"))
self.placeholder_list.setItemText(0, _translate("Dialog", "«Anrede»"))
self.placeholder_list.setItemText(1, _translate("Dialog", "«ApparatsName»"))
self.placeholder_list.setItemText(2, _translate("Dialog", "«ApparatsFach»"))
self.placeholder_list.setItemText(3, _translate("Dialog", "«ApparatsNummer»"))
self.placeholder_list.setItemText(4, _translate("Dialog", "«DozentName»"))
self.placeholder_list.setItemText(5, _translate("Dialog", "«Signatur»"))
self.label_2.setText(_translate("Dialog", "Beschreibung"))
self.insertPlaceholder.setText(_translate("Dialog", "An aktiver Position einfügen"))
self.label_3.setText(_translate("Dialog", "Betreff"))
self.testTemplate.setText(_translate("Dialog", "Template testen"))

View File

@@ -1,81 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\parsed_titles.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(402, 316)
self.frame = QtWidgets.QFrame(parent=Form)
self.frame.setGeometry(QtCore.QRect(10, 10, 381, 41))
self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.frame.setObjectName("frame")
self.horizontalLayoutWidget = QtWidgets.QWidget(parent=self.frame)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 381, 41))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(parent=self.horizontalLayoutWidget)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.count = QtWidgets.QLabel(parent=self.horizontalLayoutWidget)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.count.setFont(font)
self.count.setTextFormat(QtCore.Qt.TextFormat.PlainText)
self.count.setObjectName("count")
self.horizontalLayout.addWidget(self.count)
self.label_2 = QtWidgets.QLabel(parent=self.horizontalLayoutWidget)
self.label_2.setObjectName("label_2")
self.horizontalLayout.addWidget(self.label_2)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.frame_2 = QtWidgets.QFrame(parent=Form)
self.frame_2.setGeometry(QtCore.QRect(10, 80, 381, 201))
self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.frame_2.setObjectName("frame_2")
self.horizontalLayoutWidget_2 = QtWidgets.QWidget(parent=self.frame_2)
self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 10, 381, 191))
self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.listWidget = QtWidgets.QListWidget(parent=self.horizontalLayoutWidget_2)
self.listWidget.setObjectName("listWidget")
self.horizontalLayout_2.addWidget(self.listWidget)
self.listWidget_done = QtWidgets.QListWidget(parent=self.horizontalLayoutWidget_2)
self.listWidget_done.setObjectName("listWidget_done")
self.horizontalLayout_2.addWidget(self.listWidget_done)
self.progressBar = QtWidgets.QProgressBar(parent=Form)
self.progressBar.setGeometry(QtCore.QRect(10, 60, 381, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Form)
self.buttonBox.setGeometry(QtCore.QRect(230, 290, 156, 23))
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox")
self.toolButton = QtWidgets.QToolButton(parent=Form)
self.toolButton.setGeometry(QtCore.QRect(20, 290, 25, 19))
self.toolButton.setObjectName("toolButton")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "Es wurden"))
self.count.setText(_translate("Form", "0"))
self.label_2.setText(_translate("Form", "Signaturen gefunden."))
self.toolButton.setText(_translate("Form", "..."))

View File

@@ -1,43 +0,0 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\reminder.ui'
#
# Created by: PySide6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Erinnerung(object):
def setupUi(self, Erinnerung):
Erinnerung.setObjectName("Erinnerung")
Erinnerung.resize(358, 308)
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Erinnerung)
self.buttonBox.setGeometry(QtCore.QRect(190, 270, 161, 32))
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox")
self.message_box = QtWidgets.QTextEdit(parent=Erinnerung)
self.message_box.setGeometry(QtCore.QRect(10, 60, 341, 201))
self.message_box.setObjectName("message_box")
self.label = QtWidgets.QLabel(parent=Erinnerung)
self.label.setGeometry(QtCore.QRect(10, 30, 61, 21))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(parent=Erinnerung)
self.label_2.setGeometry(QtCore.QRect(120, 30, 81, 21))
self.label_2.setObjectName("label_2")
self.dateEdit = QtWidgets.QDateEdit(parent=Erinnerung)
self.dateEdit.setGeometry(QtCore.QRect(210, 30, 141, 22))
self.dateEdit.setObjectName("dateEdit")
self.retranslateUi(Erinnerung)
self.buttonBox.accepted.connect(Erinnerung.accept) # type: ignore
self.buttonBox.rejected.connect(Erinnerung.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Erinnerung)
def retranslateUi(self, Erinnerung):
_translate = QtCore.QCoreApplication.translate
Erinnerung.setWindowTitle(_translate("Erinnerung", "Dialog"))
self.label.setText(_translate("Erinnerung", "Nachricht:"))
self.label_2.setText(_translate("Erinnerung", "Erinnerung am:"))

View File

@@ -1,206 +1,188 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\settings.ui' # Form implementation generated from reading ui file '/home/alexander/GitHub/SemesterapparatsManager/src/ui/dialogs/dialog_sources/settings.ui'
# #
# Created by: PySide6 UI code generator 6.9.0 # Created by: PyQt6 UI code generator 6.6.1
# #
# WARNING: Any manual changes made to this file will be lost when pyuic6 is # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):
def setupUi(self, Dialog): def setupUi(self, Dialog):
Dialog.setObjectName("Dialog") # Dialog.setObjectName("Dialog")
Dialog.setWindowModality(QtCore.Qt.WindowModality.NonModal) Dialog.resize(743, 576)
Dialog.resize(651, 679)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding) self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
sizePolicy.setHorizontalStretch(0) self.buttonBox.setGeometry(QtCore.QRect(120, 540, 621, 32))
sizePolicy.setVerticalStretch(0) self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth()) self.buttonBox.setStandardButtons(
Dialog.setSizePolicy(sizePolicy) QtWidgets.QDialogButtonBox.StandardButton.Cancel
self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) | QtWidgets.QDialogButtonBox.StandardButton.Ok
self.verticalLayout.setObjectName("verticalLayout") )
self.toolBox = QtWidgets.QToolBox(parent=Dialog) self.buttonBox.setObjectName("buttonBox")
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding) self.frame = QtWidgets.QFrame(parent=Dialog)
sizePolicy.setHorizontalStretch(0) self.frame.setGeometry(QtCore.QRect(0, 0, 741, 541))
sizePolicy.setVerticalStretch(0) self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
sizePolicy.setHeightForWidth(self.toolBox.sizePolicy().hasHeightForWidth()) self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.toolBox.setSizePolicy(sizePolicy) self.frame.setObjectName("frame")
self.toolBox.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone) self.label_2 = QtWidgets.QLabel(parent=self.frame)
self.toolBox.setObjectName("toolBox") self.label_2.setGeometry(QtCore.QRect(10, 20, 161, 21))
self.page_1 = QtWidgets.QWidget() self.label_2.setObjectName("label_2")
self.page_1.setGeometry(QtCore.QRect(0, 0, 633, 511)) self.formLayoutWidget = QtWidgets.QWidget(parent=self.frame)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding) self.formLayoutWidget.setGeometry(QtCore.QRect(10, 40, 361, 491))
sizePolicy.setHorizontalStretch(0) self.formLayoutWidget.setObjectName("formLayoutWidget")
sizePolicy.setVerticalStretch(0) self.gridLayout = QtWidgets.QGridLayout(self.formLayoutWidget)
sizePolicy.setHeightForWidth(self.page_1.sizePolicy().hasHeightForWidth()) self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.page_1.setSizePolicy(sizePolicy) self.gridLayout.setObjectName("gridLayout")
self.page_1.setObjectName("page_1") self.tb_select_db = QtWidgets.QToolButton(parent=self.formLayoutWidget)
self.gridLayout_3 = QtWidgets.QGridLayout(self.page_1) self.tb_select_db.setObjectName("tb_select_db")
self.gridLayout_3.setObjectName("gridLayout_3") self.gridLayout.addWidget(self.tb_select_db, 0, 2, 1, 1)
self.db_name = QtWidgets.QLineEdit(parent=self.page_1) self.db_path = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
self.db_name.setObjectName("db_name")
self.gridLayout_3.addWidget(self.db_name, 0, 1, 1, 1)
self.label_5 = QtWidgets.QLabel(parent=self.page_1)
self.label_5.setObjectName("label_5")
self.gridLayout_3.addWidget(self.label_5, 0, 0, 1, 1)
self.db_path = QtWidgets.QLineEdit(parent=self.page_1)
self.db_path.setEnabled(False) self.db_path.setEnabled(False)
self.db_path.setObjectName("db_path") self.db_path.setObjectName("db_path")
self.gridLayout_3.addWidget(self.db_path, 1, 1, 1, 1) self.gridLayout.addWidget(self.db_path, 1, 1, 1, 1)
self.label_12 = QtWidgets.QLabel(parent=self.page_1) self.label_3 = QtWidgets.QLabel(parent=self.formLayoutWidget)
self.label_12.setObjectName("label_12")
self.gridLayout_3.addWidget(self.label_12, 2, 0, 1, 1)
self.label_11 = QtWidgets.QLabel(parent=self.page_1)
self.label_11.setObjectName("label_11")
self.gridLayout_3.addWidget(self.label_11, 1, 0, 1, 1)
self.tb_set_save_path = QtWidgets.QToolButton(parent=self.page_1)
self.tb_set_save_path.setObjectName("tb_set_save_path")
self.gridLayout_3.addWidget(self.tb_set_save_path, 2, 2, 1, 1)
self.tb_select_db = QtWidgets.QToolButton(parent=self.page_1)
self.tb_select_db.setObjectName("tb_select_db")
self.gridLayout_3.addWidget(self.tb_select_db, 0, 2, 1, 1)
self.save_path = QtWidgets.QLineEdit(parent=self.page_1)
self.save_path.setObjectName("save_path")
self.gridLayout_3.addWidget(self.save_path, 2, 1, 1, 1)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.gridLayout_3.addItem(spacerItem, 3, 1, 1, 1)
self.toolBox.addItem(self.page_1, "")
self.page_2 = QtWidgets.QWidget()
self.page_2.setGeometry(QtCore.QRect(0, 0, 633, 511))
self.page_2.setObjectName("page_2")
self.gridLayout = QtWidgets.QGridLayout(self.page_2)
self.gridLayout.setObjectName("gridLayout")
self.zotero_library_type = QtWidgets.QLineEdit(parent=self.page_2)
self.zotero_library_type.setObjectName("zotero_library_type")
self.gridLayout.addWidget(self.zotero_library_type, 2, 2, 1, 1)
self.zotero_library_id = QtWidgets.QLineEdit(parent=self.page_2)
self.zotero_library_id.setObjectName("zotero_library_id")
self.gridLayout.addWidget(self.zotero_library_id, 1, 2, 1, 1)
self.label_4 = QtWidgets.QLabel(parent=self.page_2)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 2, 0, 1, 1)
self.label_3 = QtWidgets.QLabel(parent=self.page_2)
self.label_3.setObjectName("label_3") self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.gridLayout.addWidget(self.label_3, 0, 0, 1, 1)
self.zotero_api_key = QtWidgets.QLineEdit(parent=self.page_2) self.db_name = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
self.zotero_api_key.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhHiddenText|QtCore.Qt.InputMethodHint.ImhSensitiveData) self.db_name.setObjectName("db_name")
self.zotero_api_key.setObjectName("zotero_api_key") self.gridLayout.addWidget(self.db_name, 0, 1, 1, 1)
self.gridLayout.addWidget(self.zotero_api_key, 0, 2, 1, 1) self.label_4 = QtWidgets.QLabel(parent=self.formLayoutWidget)
self.label_2 = QtWidgets.QLabel(parent=self.page_2) self.label_4.setObjectName("label_4")
self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_4, 1, 0, 1, 1)
self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.save_path = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
self.toggle_api_visibility = QtWidgets.QToolButton(parent=self.page_2) self.save_path.setObjectName("save_path")
self.toggle_api_visibility.setText("") self.gridLayout.addWidget(self.save_path, 2, 1, 1, 1)
self.toggle_api_visibility.setObjectName("toggle_api_visibility") self.tb_set_save_path = QtWidgets.QToolButton(parent=self.formLayoutWidget)
self.gridLayout.addWidget(self.toggle_api_visibility, 0, 3, 1, 1) self.tb_set_save_path.setObjectName("tb_set_save_path")
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) self.gridLayout.addWidget(self.tb_set_save_path, 2, 2, 1, 1)
self.gridLayout.addItem(spacerItem1, 3, 2, 1, 1) spacerItem = QtWidgets.QSpacerItem(
self.toolBox.addItem(self.page_2, "") 20,
self.page_3 = QtWidgets.QWidget() 40,
self.page_3.setGeometry(QtCore.QRect(0, 0, 633, 511)) QtWidgets.QSizePolicy.Policy.Minimum,
self.page_3.setObjectName("page_3") QtWidgets.QSizePolicy.Policy.Expanding,
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.page_3) )
self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.gridLayout.addItem(spacerItem, 3, 1, 1, 1)
self.email_settings = QtWidgets.QTabWidget(parent=self.page_3) self.label_5 = QtWidgets.QLabel(parent=self.formLayoutWidget)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 2, 0, 1, 1)
self.email_settings = QtWidgets.QTabWidget(parent=self.frame)
self.email_settings.setGeometry(QtCore.QRect(390, 40, 341, 491))
self.email_settings.setObjectName("email_settings") self.email_settings.setObjectName("email_settings")
self.email_settingsPage1_2 = QtWidgets.QWidget() self.email_settingsPage1_2 = QtWidgets.QWidget()
self.email_settingsPage1_2.setObjectName("email_settingsPage1_2") self.email_settingsPage1_2.setObjectName("email_settingsPage1_2")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.email_settingsPage1_2) self.formLayoutWidget_2 = QtWidgets.QWidget(parent=self.email_settingsPage1_2)
self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.formLayoutWidget_2.setGeometry(QtCore.QRect(10, 30, 321, 381))
self.gridLayout_2 = QtWidgets.QGridLayout() self.formLayoutWidget_2.setObjectName("formLayoutWidget_2")
self.gridLayout_2 = QtWidgets.QGridLayout(self.formLayoutWidget_2)
self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
self.gridLayout_2.setObjectName("gridLayout_2") self.gridLayout_2.setObjectName("gridLayout_2")
self.use_username_smtp_login = QtWidgets.QCheckBox(parent=self.email_settingsPage1_2) self.smtp_address = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
self.use_username_smtp_login.setTristate(False)
self.use_username_smtp_login.setObjectName("use_username_smtp_login")
self.gridLayout_2.addWidget(self.use_username_smtp_login, 4, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_6.setObjectName("label_6")
self.gridLayout_2.addWidget(self.label_6, 1, 0, 1, 1)
self.smtp_port = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.smtp_port.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhDigitsOnly|QtCore.Qt.InputMethodHint.ImhPreferNumbers)
self.smtp_port.setClearButtonEnabled(True)
self.smtp_port.setObjectName("smtp_port")
self.gridLayout_2.addWidget(self.smtp_port, 1, 1, 1, 1)
self.label_7 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_7.setObjectName("label_7")
self.gridLayout_2.addWidget(self.label_7, 2, 0, 1, 1)
self.sender_email = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.sender_email.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhEmailCharactersOnly)
self.sender_email.setClearButtonEnabled(True)
self.sender_email.setObjectName("sender_email")
self.gridLayout_2.addWidget(self.sender_email, 2, 1, 1, 1)
self.mail_username = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.mail_username.setClearButtonEnabled(True)
self.mail_username.setObjectName("mail_username")
self.gridLayout_2.addWidget(self.mail_username, 3, 1, 1, 1)
self.label_9 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_9.setText("")
self.label_9.setObjectName("label_9")
self.gridLayout_2.addWidget(self.label_9, 7, 0, 1, 1)
self.password = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.password.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhHiddenText|QtCore.Qt.InputMethodHint.ImhSensitiveData)
self.password.setClearButtonEnabled(True)
self.password.setObjectName("password")
self.gridLayout_2.addWidget(self.password, 5, 1, 1, 1)
self.smtp_address = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.smtp_address.setClearButtonEnabled(True) self.smtp_address.setClearButtonEnabled(True)
self.smtp_address.setObjectName("smtp_address") self.smtp_address.setObjectName("smtp_address")
self.gridLayout_2.addWidget(self.smtp_address, 0, 1, 1, 1) self.gridLayout_2.addWidget(self.smtp_address, 0, 1, 1, 1)
self.label = QtWidgets.QLabel(parent=self.email_settingsPage1_2) self.label_8 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
self.label.setObjectName("label") self.label_8.setObjectName("label_8")
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1) self.gridLayout_2.addWidget(self.label_8, 3, 0, 1, 1)
self.label_10 = QtWidgets.QLabel(parent=self.email_settingsPage1_2) self.use_username_smtp_login = QtWidgets.QCheckBox(
parent=self.formLayoutWidget_2
)
self.use_username_smtp_login.setTristate(False)
self.use_username_smtp_login.setObjectName("use_username_smtp_login")
self.gridLayout_2.addWidget(self.use_username_smtp_login, 4, 1, 1, 1)
self.mail_username = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
self.mail_username.setClearButtonEnabled(True)
self.mail_username.setObjectName("mail_username")
self.gridLayout_2.addWidget(self.mail_username, 3, 1, 1, 1)
self.smtp_port = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
self.smtp_port.setInputMethodHints(
QtCore.Qt.InputMethodHint.ImhDigitsOnly
| QtCore.Qt.InputMethodHint.ImhPreferNumbers
)
self.smtp_port.setClearButtonEnabled(True)
self.smtp_port.setObjectName("smtp_port")
self.gridLayout_2.addWidget(self.smtp_port, 1, 1, 1, 1)
self.label_10 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
self.label_10.setObjectName("label_10") self.label_10.setObjectName("label_10")
self.gridLayout_2.addWidget(self.label_10, 5, 0, 1, 1) self.gridLayout_2.addWidget(self.label_10, 5, 0, 1, 1)
self.togglePassword = QtWidgets.QPushButton(parent=self.email_settingsPage1_2) self.label_7 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
self.togglePassword.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.label_7.setObjectName("label_7")
self.gridLayout_2.addWidget(self.label_7, 2, 0, 1, 1)
self.label_9 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
self.label_9.setText("")
self.label_9.setObjectName("label_9")
self.gridLayout_2.addWidget(self.label_9, 6, 0, 1, 1)
self.sender_email = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
self.sender_email.setInputMethodHints(
QtCore.Qt.InputMethodHint.ImhEmailCharactersOnly
)
self.sender_email.setClearButtonEnabled(True)
self.sender_email.setObjectName("sender_email")
self.gridLayout_2.addWidget(self.sender_email, 2, 1, 1, 1)
self.label = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
self.label.setObjectName("label")
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
self.password = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
self.password.setInputMethodHints(
QtCore.Qt.InputMethodHint.ImhHiddenText
| QtCore.Qt.InputMethodHint.ImhSensitiveData
)
self.password.setClearButtonEnabled(True)
self.password.setObjectName("password")
self.gridLayout_2.addWidget(self.password, 5, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
self.label_6.setObjectName("label_6")
self.gridLayout_2.addWidget(self.label_6, 1, 0, 1, 1)
self.togglePassword = QtWidgets.QPushButton(parent=self.formLayoutWidget_2)
self.togglePassword.setText("") self.togglePassword.setText("")
self.togglePassword.setObjectName("togglePassword") self.togglePassword.setObjectName("togglePassword")
self.gridLayout_2.addWidget(self.togglePassword, 5, 2, 1, 1) self.gridLayout_2.addWidget(self.togglePassword, 5, 2, 1, 1)
self.label_8 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_8.setObjectName("label_8")
self.gridLayout_2.addWidget(self.label_8, 3, 0, 1, 1)
self.label_13 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_13.setObjectName("label_13")
self.gridLayout_2.addWidget(self.label_13, 6, 0, 1, 1)
self.printermail = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.printermail.setObjectName("printermail")
self.gridLayout_2.addWidget(self.printermail, 6, 1, 1, 1)
self.horizontalLayout_4.addLayout(self.gridLayout_2)
self.email_settings.addTab(self.email_settingsPage1_2, "") self.email_settings.addTab(self.email_settingsPage1_2, "")
self.email_settingsPage2_2 = QtWidgets.QWidget() self.email_settingsPage2_2 = QtWidgets.QWidget()
self.email_settingsPage2_2.setObjectName("email_settingsPage2_2") self.email_settingsPage2_2.setObjectName("email_settingsPage2_2")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.email_settingsPage2_2) self.verticalLayoutWidget = QtWidgets.QWidget(parent=self.email_settingsPage2_2)
self.verticalLayout_3.setObjectName("verticalLayout_3") self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 401, 71))
self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout_2.setObjectName("verticalLayout_2") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.horizontalLayout_3.setObjectName("horizontalLayout_3")
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) spacerItem1 = QtWidgets.QSpacerItem(
self.horizontalLayout_3.addItem(spacerItem2) 40,
self.bold = QtWidgets.QPushButton(parent=self.email_settingsPage2_2) 20,
QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum,
)
self.horizontalLayout_3.addItem(spacerItem1)
self.bold = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
self.bold.setCheckable(True) self.bold.setCheckable(True)
self.bold.setObjectName("bold") self.bold.setObjectName("bold")
self.horizontalLayout_3.addWidget(self.bold) self.horizontalLayout_3.addWidget(self.bold)
self.italic = QtWidgets.QPushButton(parent=self.email_settingsPage2_2) self.italic = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
self.italic.setCheckable(True) self.italic.setCheckable(True)
self.italic.setObjectName("italic") self.italic.setObjectName("italic")
self.horizontalLayout_3.addWidget(self.italic) self.horizontalLayout_3.addWidget(self.italic)
self.underscore = QtWidgets.QPushButton(parent=self.email_settingsPage2_2) self.underscore = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
self.underscore.setCheckable(True) self.underscore.setCheckable(True)
self.underscore.setObjectName("underscore") self.underscore.setObjectName("underscore")
self.horizontalLayout_3.addWidget(self.underscore) self.horizontalLayout_3.addWidget(self.underscore)
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) spacerItem2 = QtWidgets.QSpacerItem(
self.horizontalLayout_3.addItem(spacerItem3) 40,
self.verticalLayout_2.addLayout(self.horizontalLayout_3) 20,
QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum,
)
self.horizontalLayout_3.addItem(spacerItem2)
self.verticalLayout.addLayout(self.horizontalLayout_3)
self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout") self.horizontalLayout.setObjectName("horizontalLayout")
self.fontComboBox = QtWidgets.QFontComboBox(parent=self.email_settingsPage2_2) self.fontComboBox = QtWidgets.QFontComboBox(parent=self.verticalLayoutWidget)
self.fontComboBox.setObjectName("fontComboBox") self.fontComboBox.setObjectName("fontComboBox")
self.horizontalLayout.addWidget(self.fontComboBox) self.horizontalLayout.addWidget(self.fontComboBox)
self.font_size = QtWidgets.QComboBox(parent=self.email_settingsPage2_2) self.font_size = QtWidgets.QComboBox(parent=self.verticalLayoutWidget)
self.font_size.setObjectName("font_size") self.font_size.setObjectName("font_size")
self.font_size.addItem("") self.font_size.addItem("")
self.font_size.addItem("") self.font_size.addItem("")
@@ -218,104 +200,76 @@ class Ui_Dialog(object):
self.font_size.addItem("") self.font_size.addItem("")
self.font_size.addItem("") self.font_size.addItem("")
self.horizontalLayout.addWidget(self.font_size) self.horizontalLayout.addWidget(self.font_size)
spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) spacerItem3 = QtWidgets.QSpacerItem(
self.horizontalLayout.addItem(spacerItem4) 40,
self.verticalLayout_2.addLayout(self.horizontalLayout) 20,
self.verticalLayout_3.addLayout(self.verticalLayout_2) QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum,
)
self.horizontalLayout.addItem(spacerItem3)
self.verticalLayout.addLayout(self.horizontalLayout)
self.editSignature = QtWidgets.QTextEdit(parent=self.email_settingsPage2_2) self.editSignature = QtWidgets.QTextEdit(parent=self.email_settingsPage2_2)
self.editSignature.setGeometry(QtCore.QRect(10, 80, 321, 301))
self.editSignature.setObjectName("editSignature") self.editSignature.setObjectName("editSignature")
self.verticalLayout_3.addWidget(self.editSignature)
self.debug = QtWidgets.QPushButton(parent=self.email_settingsPage2_2) self.debug = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
self.debug.setGeometry(QtCore.QRect(30, 430, 75, 24))
self.debug.setObjectName("debug") self.debug.setObjectName("debug")
self.verticalLayout_3.addWidget(self.debug)
self.email_settings.addTab(self.email_settingsPage2_2, "") self.email_settings.addTab(self.email_settingsPage2_2, "")
self.horizontalLayout_2.addWidget(self.email_settings) self.label_3.setBuddy(self.db_name)
self.toolBox.addItem(self.page_3, "") self.label_4.setBuddy(self.db_path)
self.page_4 = QtWidgets.QWidget() self.label_5.setBuddy(self.save_path)
self.page_4.setGeometry(QtCore.QRect(0, 0, 633, 511))
self.page_4.setObjectName("page_4")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.page_4)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.groupBox = QtWidgets.QGroupBox(parent=self.page_4)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
self.groupBox.setFont(font)
self.groupBox.setObjectName("groupBox")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.scrollArea_3 = QtWidgets.QScrollArea(parent=self.groupBox)
self.scrollArea_3.setWidgetResizable(True)
self.scrollArea_3.setObjectName("scrollArea_3")
self.scrollAreaWidgetContents_3 = QtWidgets.QWidget()
self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 593, 201))
self.scrollAreaWidgetContents_3.setObjectName("scrollAreaWidgetContents_3")
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents_3)
self.verticalLayout_7.setObjectName("verticalLayout_7")
self.gridLayout_4 = QtWidgets.QGridLayout()
self.gridLayout_4.setObjectName("gridLayout_4")
self.verticalLayout_7.addLayout(self.gridLayout_4)
self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3)
self.verticalLayout_5.addWidget(self.scrollArea_3)
self.verticalLayout_4.addWidget(self.groupBox)
self.scrollArea_2 = QtWidgets.QScrollArea(parent=self.page_4)
self.scrollArea_2.setWidgetResizable(True)
self.scrollArea_2.setObjectName("scrollArea_2")
self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 613, 241))
self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents_2)
self.verticalLayout_6.setObjectName("verticalLayout_6")
self.vertical_icons = QtWidgets.QVBoxLayout()
self.vertical_icons.setObjectName("vertical_icons")
self.verticalLayout_6.addLayout(self.vertical_icons)
self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2)
self.verticalLayout_4.addWidget(self.scrollArea_2)
self.toolBox.addItem(self.page_4, "")
self.verticalLayout.addWidget(self.toolBox)
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox")
self.verticalLayout.addWidget(self.buttonBox)
self.label_5.setBuddy(self.db_name)
self.label_12.setBuddy(self.save_path)
self.label_11.setBuddy(self.db_path)
self.retranslateUi(Dialog) self.retranslateUi(Dialog)
self.toolBox.setCurrentIndex(2)
self.email_settings.setCurrentIndex(0) self.email_settings.setCurrentIndex(0)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.db_name, self.db_path)
Dialog.setTabOrder(self.db_path, self.save_path)
def retranslateUi(self, Dialog): def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog")) Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.db_name.setText(_translate("Dialog", "sap.db")) self.label_2.setText(_translate("Dialog", "Allgemeine Einstellungen"))
self.label_5.setToolTip(_translate("Dialog", "<html><head/><body><p>Name der Datenbank, welche verwendet werden soll. <span style=\" font-weight:600;\">Muss</span> auf .db enden</p></body></html>"))
self.label_5.setText(_translate("Dialog", "Datenbankname"))
self.label_12.setToolTip(_translate("Dialog", "Pfad, an dem heruntergeladene Dateien gespeichert werden sollen"))
self.label_12.setText(_translate("Dialog", "Temporäre Dateien"))
self.label_11.setText(_translate("Dialog", "Datenbankpfad"))
self.tb_set_save_path.setText(_translate("Dialog", "..."))
self.tb_select_db.setText(_translate("Dialog", "...")) self.tb_select_db.setText(_translate("Dialog", "..."))
self.toolBox.setItemText(self.toolBox.indexOf(self.page_1), _translate("Dialog", "Datenbank")) self.label_3.setToolTip(
self.label_4.setText(_translate("Dialog", "Bibliothekstyp")) _translate(
self.label_3.setText(_translate("Dialog", "Bibliotheks-ID")) "Dialog",
self.label_2.setText(_translate("Dialog", "API Key")) '<html><head/><body><p>Name der Datenbank, welche verwendet werden soll. <span style=" font-weight:600;">Muss</span> auf .db enden</p></body></html>',
self.toolBox.setItemText(self.toolBox.indexOf(self.page_2), _translate("Dialog", "Zotero")) )
self.use_username_smtp_login.setStatusTip(_translate("Dialog", "Anklicken, wenn Nutzername benötigt wird, um sich beim Server anzumelden")) )
self.use_username_smtp_login.setText(_translate("Dialog", "Nutzername zum\n" self.label_3.setText(_translate("Dialog", "Datenbankname"))
" Anmelden verwenden")) self.db_name.setText(_translate("Dialog", "sap.db"))
self.label_6.setText(_translate("Dialog", "Port")) self.label_4.setText(_translate("Dialog", "Datenbankpfad"))
self.label_7.setText(_translate("Dialog", "Sender-eMail")) self.tb_set_save_path.setText(_translate("Dialog", "..."))
self.mail_username.setStatusTip(_translate("Dialog", "Kürzel, von der Hochschule vergeben, bsp: Aky547")) self.label_5.setToolTip(
self.label.setText(_translate("Dialog", "SMTP-Server")) _translate(
self.label_10.setText(_translate("Dialog", "Passwort")) "Dialog",
"Pfad, an dem heruntergeladene Dateien gespeichert werden sollen",
)
)
self.label_5.setText(_translate("Dialog", "Temporäre Dateien"))
self.label_8.setText(_translate("Dialog", "Nutzername")) self.label_8.setText(_translate("Dialog", "Nutzername"))
self.label_13.setText(_translate("Dialog", "Printmail")) self.use_username_smtp_login.setStatusTip(
self.email_settings.setTabText(self.email_settings.indexOf(self.email_settingsPage1_2), _translate("Dialog", "Allgemeines")) _translate(
"Dialog",
"Anklicken, wenn Nutzername benötigt wird, um sich beim Server anzumelden",
)
)
self.use_username_smtp_login.setText(
_translate("Dialog", "Nutzername zum\n Anmelden verwenden")
)
self.mail_username.setStatusTip(
_translate("Dialog", "Kürzel, von der Hochschule vergeben, bsp: Aky547")
)
self.label_10.setText(_translate("Dialog", "Passwort"))
self.label_7.setText(_translate("Dialog", "Sender-eMail"))
self.label.setText(_translate("Dialog", "SMTP-Server"))
self.label_6.setText(_translate("Dialog", "Port"))
self.email_settings.setTabText(
self.email_settings.indexOf(self.email_settingsPage1_2),
_translate("Dialog", "Allgemeines"),
)
self.bold.setText(_translate("Dialog", "Fett")) self.bold.setText(_translate("Dialog", "Fett"))
self.italic.setText(_translate("Dialog", "Kursiv")) self.italic.setText(_translate("Dialog", "Kursiv"))
self.underscore.setText(_translate("Dialog", "Unterstrichen")) self.underscore.setText(_translate("Dialog", "Unterstrichen"))
@@ -335,7 +289,7 @@ class Ui_Dialog(object):
self.font_size.setItemText(13, _translate("Dialog", "48")) self.font_size.setItemText(13, _translate("Dialog", "48"))
self.font_size.setItemText(14, _translate("Dialog", "72")) self.font_size.setItemText(14, _translate("Dialog", "72"))
self.debug.setText(_translate("Dialog", "Debug")) self.debug.setText(_translate("Dialog", "Debug"))
self.email_settings.setTabText(self.email_settings.indexOf(self.email_settingsPage2_2), _translate("Dialog", "Signatur")) self.email_settings.setTabText(
self.toolBox.setItemText(self.toolBox.indexOf(self.page_3), _translate("Dialog", "e-Mail")) self.email_settings.indexOf(self.email_settingsPage2_2),
self.groupBox.setTitle(_translate("Dialog", "Farben")) _translate("Dialog", "Signatur"),
self.toolBox.setItemText(self.toolBox.indexOf(self.page_4), _translate("Dialog", "Icons")) )

View File

@@ -1,153 +0,0 @@
from .dialog_sources.documentprint_ui import Ui_Dialog
from PySide6 import QtWidgets, QtCore
from src import Icon
from src.utils.richtext import SemapSchilder, SemesterDocument
from src.backend import Semester, Database
from natsort import natsorted
class DocumentPrintDialog(QtWidgets.QDialog, Ui_Dialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.setWindowIcon(Icon("print").icon)
self.frame.hide()
self.semester = Semester()
self.db = Database()
self.insert_table_data()
self.expertMode.clicked.connect(self.enable_expert_mode)
# Ensure the signal is connected only once
try:
self.pushButton_2.clicked.disconnect()
except TypeError:
pass # Signal was not connected before
self.pushButton_2.clicked.connect(self.on_pushButton_2_clicked)
try:
self.pushButton.clicked.disconnect()
except TypeError:
pass
self.pushButton.clicked.connect(self.on_pushButton_clicked)
try:
self.btn_load_current_apparats.clicked.disconnect()
except TypeError:
pass
self.btn_load_current_apparats.clicked.connect(self.load_current_clicked)
try:
self.manualCheck.clicked.disconnect()
except TypeError:
pass
self.manualCheck.clicked.connect(self.manual_request)
def manual_request(self):
self.tableWidget.setRowCount(0)
request_text = self.textBrowser.toPlainText()
data = self.db.query_db(request_text)
apparats: list[str] = []
if not data:
self.tableWidget.setRowCount(0)
return
for row in data:
apparats.append(f"{row[0]}")
self.tableWidget.setHorizontalHeaderLabels(["", "Semesterapparat"])
self.tableWidget.setColumnWidth(0, 50)
for entry in apparats:
# insert the entry, column 1 should be a checkbox, column 2 the data
self.tableWidget.insertRow(0)
self.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem(""))
checkbox = QtWidgets.QCheckBox()
self.tableWidget.setCellWidget(0, 0, checkbox)
self.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(entry))
# align row 0 column 0 to center
def load_current_clicked(self):
entries = self.get_valid_apparats_for_signs()
self.tableWidget.setHorizontalHeaderLabels(["", "Semesterapparat"])
self.tableWidget.setColumnWidth(0, 50)
self.tableWidget.setRowCount(0)
for entry in entries:
# insert the entry, column 1 should be a checkbox, column 2 the data
self.tableWidget.insertRow(0)
self.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem(""))
checkbox = QtWidgets.QCheckBox()
self.tableWidget.setCellWidget(0, 0, checkbox)
self.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(entry))
def enable_expert_mode(self):
# if self.exportMode.
if self.expertMode.isChecked():
self.frame.show()
self.expertMode.setText("Expertenmodus deaktivieren")
else:
self.frame.hide()
self.expertMode.setText("Expertenmodus aktivieren")
def on_pushButton_2_clicked(self):
# get the checked items from the table
checked_items = []
for i in range(self.tableWidget.rowCount()):
checkbox = self.tableWidget.cellWidget(i, 0)
if isinstance(checkbox, QtWidgets.QCheckBox) and checkbox.isChecked():
item = self.tableWidget.item(i, 1)
if item is not None:
checked_items.append(item.text())
document = SemapSchilder(checked_items)
document.send
def on_pushButton_clicked(self):
apparats: list[tuple[int, str]] = []
apps = self.db.getAllAparats(0)
apps = natsorted(apps, key=lambda x: x[4], reverse=True)
for app in apps:
prof = self.db.getProfById(app[2])
data = (app[4], f"{prof.lastname} ({app[1]})")
apparats.append(data)
SemesterDocument(
semester=self.semester.value,
filename="Semesterapparat",
full=True,
apparats=apparats,
)
def insert_table_data(self):
entries = self.get_valid_apparats_for_signs()
self.tableWidget.setHorizontalHeaderLabels(["", "Semesterapparat"])
self.tableWidget.setColumnWidth(0, 50)
for entry in entries:
# insert the entry, column 1 should be a checkbox, column 2 the data
self.tableWidget.insertRow(0)
self.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem(""))
checkbox = QtWidgets.QCheckBox()
self.tableWidget.setCellWidget(0, 0, checkbox)
self.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(entry))
# align row 0 column 0 to center
def get_valid_apparats_for_signs(self):
this_sem = self.db.query_db(
query="SELECT prof.lname || ' (' || semesterapparat.name || ')' AS formatted_result from semesterapparat INNER JOIN prof ON semesterapparat.prof_id = prof.id WHERE (erstellsemester = ? OR erstellsemester = ?) AND semesterapparat.deletion_status=0",
args=(str(self.semester.value), str(self.semester.previous)),
)
apparats: list[str] = []
for row in this_sem:
apparats.append(f"{row[0]}")
return apparats
def launch():
app = QtWidgets.QApplication([])
dialog = DocumentPrintDialog()
dialog.show()
app.exec()

View File

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

View File

@@ -1,5 +1,5 @@
from .dialog_sources.Ui_elsa_generate_citation import Ui_Dialog from .dialog_sources.Ui_elsa_generate_citation import Ui_Dialog
from PySide6 import QtWidgets from PyQt6 import QtWidgets
class ElsaCitation(QtWidgets.QDialog, Ui_Dialog): class ElsaCitation(QtWidgets.QDialog, Ui_Dialog):

View File

@@ -1,5 +1,5 @@
from .dialog_sources.Ui_elsa_generator_confirm import Ui_Dialog from .dialog_sources.Ui_elsa_generator_confirm import Ui_Dialog
from PySide6 import QtWidgets from PyQt6 import QtWidgets
class ElsaGenConfirm(QtWidgets.QDialog, Ui_Dialog): class ElsaGenConfirm(QtWidgets.QDialog, Ui_Dialog):

View File

@@ -1,51 +0,0 @@
# Form implementation generated from reading ui file 'ui/dialogs/extend_apparat.ui'
#
# Created by: PySide6 UI code generator 6.3.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PySide6 import QtCore, QtGui, QtWidgets
class Ui_Frame(object):
def setupUi(self, Frame):
Frame.setObjectName("Frame")
Frame.resize(317, 126)
self.label = QtWidgets.QLabel(Frame)
self.label.setGeometry(QtCore.QRect(60, 20, 231, 16))
self.label.setObjectName("label")
self.buttonBox = QtWidgets.QDialogButtonBox(Frame)
self.buttonBox.setGeometry(QtCore.QRect(90, 90, 156, 23))
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox")
self.sem_winter = QtWidgets.QRadioButton(Frame)
self.sem_winter.setGeometry(QtCore.QRect(60, 40, 82, 17))
self.sem_winter.setObjectName("sem_winter")
self.sem_sommer = QtWidgets.QRadioButton(Frame)
self.sem_sommer.setGeometry(QtCore.QRect(60, 60, 82, 17))
self.sem_sommer.setObjectName("sem_sommer")
self.sem_year = QtWidgets.QLineEdit(Frame)
self.sem_year.setGeometry(QtCore.QRect(160, 50, 113, 20))
self.sem_year.setObjectName("sem_year")
self.retranslateUi(Frame)
QtCore.QMetaObject.connectSlotsByName(Frame)
def retranslateUi(self, Frame):
_translate = QtCore.QCoreApplication.translate
Frame.setWindowTitle(_translate("Frame", "Frame"))
self.label.setText(_translate("Frame", "Bis wann soll der Apparat verlängert werden?"))
self.sem_winter.setText(_translate("Frame", "Winter"))
self.sem_sommer.setText(_translate("Frame", "Sommer"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Frame = QtWidgets.QFrame()
ui = Ui_Frame()
ui.setupUi(Frame)
Frame.show()
sys.exit(app.exec())

View File

@@ -1,4 +1,4 @@
from PySide6 import QtWidgets from PyQt6 import QtWidgets
from src.logic.webrequest import BibTextTransformer, WebRequest from src.logic.webrequest import BibTextTransformer, WebRequest

View File

@@ -1,18 +1,12 @@
import hashlib import hashlib
import sys
import loguru from PyQt6 import QtCore, QtWidgets
from PySide6 import QtCore, QtWidgets
from src import LOG_DIR, Icon from src import Icon, logger
from src.backend.admin_console import AdminCommands
from src.backend.database import Database from src.backend.database import Database
from .dialog_sources.login_ui import Ui_Dialog from .dialog_sources.Ui_login import Ui_Dialog
log = loguru.logger
log.remove()
log.add(sys.stdout, level="INFO")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
class LoginDialog(Ui_Dialog): class LoginDialog(Ui_Dialog):
@@ -50,7 +44,6 @@ class LoginDialog(Ui_Dialog):
self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
self.lineEdit_2.setClearButtonEnabled(True) self.lineEdit_2.setClearButtonEnabled(True)
self.lineEdit_2.setObjectName("lineEdit_2") self.lineEdit_2.setObjectName("lineEdit_2")
log.info("Calling database")
self.db = Database() self.db = Database()
self.retranslateUi(Dialog) self.retranslateUi(Dialog)
@@ -75,8 +68,6 @@ class LoginDialog(Ui_Dialog):
hashed_password = hashlib.sha256(password.encode()).hexdigest() hashed_password = hashlib.sha256(password.encode()).hexdigest()
if len(self.db.getUsers()) == 0: if len(self.db.getUsers()) == 0:
from src.backend.admin_console import AdminCommands
AdminCommands().create_admin() AdminCommands().create_admin()
self.lresult = 1 # Indicate successful login self.lresult = 1 # Indicate successful login
self.lusername = username self.lusername = username
@@ -84,20 +75,20 @@ class LoginDialog(Ui_Dialog):
if self.db.login(username, hashed_password): if self.db.login(username, hashed_password):
self.lresult = 1 # Indicate successful login self.lresult = 1 # Indicate successful login
self.lusername = username self.lusername = username
log.success(f"User {username} logged in.") logger.success(f"User {username} logged in.")
self.dialog.accept() self.dialog.accept()
else: else:
# Credentials are invalid, display a warning # Credentials are invalid, display a warning
if username == "" or password == "": if username == "" or password == "":
log.warning("Invalid username or password. Login failed.") logger.warning("Invalid username or password. Login failed.")
warning_dialog = QtWidgets.QMessageBox() warning_dialog = QtWidgets.QMessageBox()
warning_dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) warning_dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
warning_dialog.setText("Please enter a username and password.") warning_dialog.setText("Please enter a username and password.")
warning_dialog.setWindowTitle("Login Failed") warning_dialog.setWindowTitle("Login Failed")
warning_dialog.exec() warning_dialog.exec()
else: else:
log.warning("Invalid username or password. Login failed.") logger.warning("Invalid username or password. Login failed.")
warning_dialog = QtWidgets.QMessageBox() warning_dialog = QtWidgets.QMessageBox()
warning_dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) warning_dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
warning_dialog.setText( warning_dialog.setText(

Some files were not shown because too many files have changed in this diff Show More