Compare commits
92 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f4d548d91a | |||
| 18b787dcad | |||
| 8d94abfb1a | |||
| 83e6446b16 | |||
| 88b6e8fc6a | |||
| d4eae2b71e | |||
| 7c756c2f21 | |||
| 5951081efa | |||
| 2e3845b568 | |||
| 290395d38d | |||
| 6d8051e4e6 | |||
| 42dc945ab6 | |||
| 9b0bf3663b | |||
| 981fee5d7f | |||
| 3d15609536 | |||
| a6d9498b39 | |||
| 30228fd267 | |||
| cd255696f0 | |||
| 5eccbebef7 | |||
| bc061dcbc6 | |||
| 7e0e26619f | |||
| edd57011e0 | |||
| 5f6af18ca9 | |||
| 612020e495 | |||
| 08b23f01f8 | |||
| 4bc7901c93 | |||
| c06ff40fd6 | |||
| 3d164898bf | |||
| 86849b67f5 | |||
| 7eb55c21d0 | |||
| c3d9daa1b0 | |||
| fdab4e5caa | |||
| dbad7165bc | |||
| 2eceb07c0b | |||
| 3fbb8bbd52 | |||
| 9684229fc2 | |||
| a7b82ee3be | |||
| 771062ab7f | |||
| b874656eba | |||
| abe17d8c57 | |||
| d02a8a271f | |||
| e29b630405 | |||
| bb4c4c4003 | |||
| b1d523f574 | |||
| c77bdbc3de | |||
| 8036a7cb3c | |||
| 72fb775257 | |||
| 85b696f089 | |||
| ac7c7ad60c | |||
| da5fb285c8 | |||
| 3bfc7a2672 | |||
| 55d172b9a5 | |||
| 2785314e7c | |||
| 139396081b | |||
| f1c58699b0 | |||
| 6f670aa1c4 | |||
| ef78d9ff0d | |||
| 0c53778f99 | |||
| 0fdc904d2d | |||
| f7c499ea6e | |||
| 4a3a95623a | |||
| 0c8ecb2054 | |||
| 99b9f50784 | |||
| 8f90247e98 | |||
| d71de1bd1a | |||
| 5ac3509548 | |||
| c364a38649 | |||
| 468e8674ab | |||
| f7ea6f5d34 | |||
| 20d07f5775 | |||
| 8c68655f9f | |||
| 424411b077 | |||
| e6bbc469b1 | |||
| 98ac7377ac | |||
| 5923bfd7ff | |||
| 7abe3d8cc0 | |||
| b4c6169649 | |||
| 8b83b8c305 | |||
| 3d2be0fd47 | |||
| bbeb9cf701 | |||
| eb0b7a1fec | |||
| 80b96865e7 | |||
| 0867b1fce8 | |||
| da0e9e0725 | |||
| f0148d8855 | |||
| 9cc08e2d91 | |||
| e91898137c | |||
| 921a84304f | |||
| 6ff7a70d11 | |||
| ac32b86b17 | |||
| dbefd2049f | |||
| 50dd03aee7 |
@@ -1,22 +0,0 @@
|
||||
[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"
|
||||
59
.gitea/workflows/release.yml
Normal file
59
.gitea/workflows/release.yml
Normal file
@@ -0,0 +1,59 @@
|
||||
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
|
||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -226,5 +226,8 @@ output
|
||||
|
||||
config.yaml
|
||||
**/tempCodeRunnerFile.py
|
||||
uv.lock
|
||||
uv.lock
|
||||
|
||||
logs/
|
||||
*.pdf
|
||||
*.docx
|
||||
test.py
|
||||
|
||||
28
README.md
28
README.md
@@ -1,3 +1,27 @@
|
||||
# Semesterapparate
|
||||
# SemesterapparatsManager
|
||||
|
||||
this repo will be used to create a GUI application to manage the semesterapparate of the PH Freiburg.
|
||||
SemesterapparatsManager is a graphical tool for managing semester apparatuses in the University of Education Freiburg. It allows the users to manage the semester apparatuses in a user-friendly way. It's functions include management of physical and digital semester apparatuses, as well as creating the citations for the digital files of the digital semester apparatuses. For that it uses Zotero, an open source reference management software. The semester apparatuses are stored in a SQLite database, which is created and managed by the SemesterapparatsManager. The SemesterapparatsManager is written in Python and uses the PyQt6 library for the graphical user interface
|
||||
|
||||
|
||||
## Features
|
||||
- Manage physical semester apparatuses
|
||||
- Add semester apparatuses
|
||||
- Edit semester apparatuses
|
||||
- Delete semester apparatuses
|
||||
- Extend semester apparatuses
|
||||
- Notify professors about semester apparatuses creation or deletion
|
||||
- Add messages to all semester apparatuses, or an individual semester apparatus
|
||||
- Manage digital semester apparatuses
|
||||
- Use text parsing to extract information from the submitted form and create the scans
|
||||
- if a book is used multiple parts of a book are used, it can be split into the parts
|
||||
- Create the matching citations for the files
|
||||
- Statistics and Search
|
||||
- Search semester apparatuses by various criteria
|
||||
- Show statistics about the semester apparatuses creation and deletion
|
||||
- Edit user data
|
||||
|
||||
|
||||
## Images
|
||||
|
||||

|
||||

|
||||
@@ -1,4 +0,0 @@
|
||||
from src.ui.userInterface import launch_gui as UI
|
||||
|
||||
if __name__ == "__main__":
|
||||
UI() #:des
|
||||
@@ -1,69 +0,0 @@
|
||||
{
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
31
build.py
Normal file
31
build.py
Normal file
@@ -0,0 +1,31 @@
|
||||
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.")
|
||||
57
config/base_config.yaml
Normal file
57
config/base_config.yaml
Normal file
@@ -0,0 +1,57 @@
|
||||
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
|
||||
@@ -1,8 +1,19 @@
|
||||
from typing import Optional
|
||||
from typing import Optional, Any, Union
|
||||
from dataclasses import dataclass
|
||||
from omegaconf import OmegaConf, DictConfig
|
||||
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
|
||||
class Zotero:
|
||||
@@ -10,25 +21,29 @@ class Zotero:
|
||||
library_id: str
|
||||
library_type: str
|
||||
|
||||
def getattr(self, name):
|
||||
def getattr(self, name: str):
|
||||
return getattr(self, name)
|
||||
|
||||
def _setattr(self, name, value):
|
||||
def _setattr(self, name: str, value: Any):
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
@dataclass
|
||||
class Database:
|
||||
name: str
|
||||
path: str
|
||||
temp: str
|
||||
|
||||
def getattr(self, name):
|
||||
path: Union[str, Path, None]
|
||||
temp: Union[str, Path, None]
|
||||
def getattr(self, name: str):
|
||||
return getattr(self, name)
|
||||
|
||||
def _setattr(self, name, value):
|
||||
def _setattr(self, name: str, value: Any):
|
||||
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
|
||||
class Mail:
|
||||
@@ -37,6 +52,7 @@ class Mail:
|
||||
sender: str
|
||||
password: str
|
||||
use_user_name: bool
|
||||
printer_mail: str
|
||||
user_name: str
|
||||
signature: str | None = None
|
||||
empty_signature = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
@@ -58,13 +74,13 @@ class Mail:
|
||||
<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>"""
|
||||
|
||||
def getattr(self, name):
|
||||
def getattr(self, name: str):
|
||||
return getattr(self, name)
|
||||
|
||||
def _setattr(self, name, value):
|
||||
def _setattr(self, name: str, value: Any):
|
||||
setattr(self, name, value)
|
||||
|
||||
def setValue(self, **kwargs):
|
||||
def setValue(self, **kwargs: Any):
|
||||
for key, value in kwargs.items():
|
||||
if hasattr(self, key):
|
||||
setattr(self, key, value)
|
||||
@@ -78,7 +94,7 @@ class Icons:
|
||||
self._colors = None
|
||||
self._icons = None
|
||||
|
||||
def assign(self, key, value):
|
||||
def assign(self, key: str, value: Any):
|
||||
setattr(self, key, value)
|
||||
|
||||
@property
|
||||
@@ -86,7 +102,7 @@ class Icons:
|
||||
return self._path
|
||||
|
||||
@path.setter
|
||||
def path(self, value):
|
||||
def path(self, value: Any):
|
||||
self._path = value
|
||||
|
||||
@property
|
||||
@@ -94,7 +110,7 @@ class Icons:
|
||||
return self._colors
|
||||
|
||||
@colors.setter
|
||||
def colors(self, value):
|
||||
def colors(self, value: Any):
|
||||
self._colors = value
|
||||
|
||||
@property
|
||||
@@ -102,10 +118,10 @@ class Icons:
|
||||
return self._icons
|
||||
|
||||
@icons.setter
|
||||
def icons(self, value):
|
||||
def icons(self, value: Any):
|
||||
self._icons = value
|
||||
|
||||
def get(self, name):
|
||||
def get(self, name: str):
|
||||
return self.icons.get(name)
|
||||
|
||||
|
||||
@@ -120,7 +136,7 @@ class Config:
|
||||
"""
|
||||
|
||||
_config: Optional[DictConfig] = None
|
||||
|
||||
config_exists: bool = True
|
||||
def __init__(self, config_path: str):
|
||||
"""
|
||||
Loads the configuration file and stores it for future access.
|
||||
@@ -132,10 +148,22 @@ class Config:
|
||||
FileNotFoundError: Configuration file not found
|
||||
"""
|
||||
if not os.path.exists(config_path):
|
||||
raise FileNotFoundError(f"Configuration file not found: {config_path}")
|
||||
# copy base config file to the given 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_path = config_path
|
||||
|
||||
@property
|
||||
def exists(self) -> bool:
|
||||
return self.config_exists
|
||||
|
||||
def save(self):
|
||||
"""
|
||||
Saves the current configuration to the file.
|
||||
@@ -145,16 +173,22 @@ class Config:
|
||||
"""
|
||||
OmegaConf.save(self._config, self.config_path)
|
||||
|
||||
def reload(self):
|
||||
"""
|
||||
Reloads the configuration from the file.
|
||||
"""
|
||||
self._config = OmegaConf.load(self.config_path)
|
||||
|
||||
@property
|
||||
def zotero(self):
|
||||
return Zotero(**self._config.zotero)
|
||||
|
||||
@property
|
||||
def zotero_attr(self, name):
|
||||
def zotero_attr(self, name: str):
|
||||
return getattr(self.zotero, name)
|
||||
|
||||
@zotero_attr.setter
|
||||
def zotero_attr(self, name, value):
|
||||
def zotero_attr(self, name: str, value: Any):
|
||||
self.zotero._setattr(name, value)
|
||||
|
||||
@property
|
||||
@@ -162,30 +196,37 @@ class Config:
|
||||
return Database(**self._config.database)
|
||||
|
||||
@property
|
||||
def database_attr(self, name):
|
||||
def database_attr(self, name: str):
|
||||
return getattr(self.database, name)
|
||||
|
||||
@database_attr.setter
|
||||
def database_attr(self, name, value):
|
||||
def database_attr(self, name: str, value: Any):
|
||||
self.database._setattr(name, value)
|
||||
|
||||
@property
|
||||
def openAI(self):
|
||||
return OpenAI(**self._config.openAI)
|
||||
|
||||
@property
|
||||
def mail(self):
|
||||
return Mail(**self._config.mail)
|
||||
|
||||
def mail_attr(self, name):
|
||||
def mail_attr(self, name: str):
|
||||
return getattr(self.mail, name)
|
||||
|
||||
def set_mail_attr(self, name, value):
|
||||
def set_mail_attr(self, name: str, value: Any):
|
||||
OmegaConf.update(self._config, f"mail.{name}", value)
|
||||
|
||||
def set_database_attr(self, name, value):
|
||||
def set_database_attr(self, name: str, value: Any):
|
||||
OmegaConf.update(self._config, f"database.{name}", value)
|
||||
|
||||
def set_zotero_attr(self, name, value):
|
||||
def set_zotero_attr(self, name: str, value: Any):
|
||||
OmegaConf.update(self._config, f"zotero.{name}", value)
|
||||
|
||||
def set_icon_attr(self, name, value):
|
||||
def set_openai_attr(self, name: str, value: Any):
|
||||
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)
|
||||
|
||||
@property
|
||||
|
||||
BIN
docs/images/statistics.png
Normal file
BIN
docs/images/statistics.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
1
icons/db_search.svg
Normal file
1
icons/db_search.svg
Normal file
@@ -0,0 +1 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 992 B |
BIN
icons/logo.ico
BIN
icons/logo.ico
Binary file not shown.
|
Before Width: | Height: | Size: 264 KiB After Width: | Height: | Size: 264 KiB |
1
icons/print.svg
Normal file
1
icons/print.svg
Normal file
@@ -0,0 +1 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 482 B |
33
mail.py
33
mail.py
@@ -1,33 +0,0 @@
|
||||
|
||||
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,
|
||||
)
|
||||
@@ -0,0 +1,54 @@
|
||||
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>
|
||||
@@ -0,0 +1,18 @@
|
||||
Subject: Information zur Auflösung des Semesterapparates {AppNr} - {Appname}
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/html; charset="UTF-8"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
</head>
|
||||
<body style=" font-family:'Segoe UI'; font-size:9pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">{greeting}</p>
|
||||
<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>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ihr Semesterapparat "{Appname} ({AppNr})" wurde wie besprochen aufgelöst. </p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die Medien sind von nun an wieder in den Regalen zu finden.</p>
|
||||
<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>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><pre class="moz-signature" cols="72">-- </p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">{signature}</p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></pre></p></body></html>
|
||||
17
main.py
17
main.py
@@ -1,4 +1,19 @@
|
||||
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
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
UI()
|
||||
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()
|
||||
@@ -1,10 +1,11 @@
|
||||
[project]
|
||||
name = "semesterapparatsmanager"
|
||||
version = "0.1.0"
|
||||
version = "1.0.0"
|
||||
description = "Add your description here"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12"
|
||||
dependencies = [
|
||||
"appdirs>=1.4.4",
|
||||
"beautifulsoup4>=4.12.3",
|
||||
"bump-my-version>=0.29.0",
|
||||
"chardet>=5.2.0",
|
||||
@@ -17,10 +18,11 @@ dependencies = [
|
||||
"mkdocs-material-extensions>=1.3.1",
|
||||
"natsort>=8.4.0",
|
||||
"omegaconf>=2.3.0",
|
||||
"openai>=1.79.0",
|
||||
"pandas>=2.2.3",
|
||||
"playwright>=1.49.1",
|
||||
"pyqt6>=6.8.0",
|
||||
"pyqtgraph>=0.13.7",
|
||||
"pyramid>=2.0.2",
|
||||
"pyside6>=6.9.1",
|
||||
"python-docx>=1.1.2",
|
||||
"pyzotero>=1.6.4",
|
||||
"ratelimit>=2.2.1",
|
||||
@@ -33,3 +35,29 @@ dev = [
|
||||
"icecream>=2.1.4",
|
||||
"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"
|
||||
|
||||
@@ -1,27 +1,34 @@
|
||||
import sys
|
||||
from config import Config
|
||||
import os
|
||||
from loguru import logger as log
|
||||
from datetime import datetime
|
||||
|
||||
settings = Config("config/config.yaml")
|
||||
from .utils.icon import Icon
|
||||
|
||||
__version__ = "0.2.1"
|
||||
__version__ = "1.0.0"
|
||||
__author__ = "Alexander Kirchner"
|
||||
__all__ = ["__version__", "__author__", "Icon", "settings"]
|
||||
|
||||
import os
|
||||
|
||||
from appdirs import AppDirs
|
||||
|
||||
from config import Config
|
||||
|
||||
|
||||
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
|
||||
|
||||
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="1 week", enqueue=True)
|
||||
log.add(
|
||||
f"logs/{datetime.now().strftime('%Y-%m-%d')}.log",
|
||||
rotation="1 day",
|
||||
compression="zip",
|
||||
)
|
||||
|
||||
# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO")
|
||||
logger.add(sys.stdout)
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
from .database import Database
|
||||
from .semester import Semester
|
||||
from .database import Database
|
||||
from .admin_console import AdminCommands
|
||||
from .thread_bookgrabber import BookGrabber
|
||||
from .threads_availchecker import AvailChecker
|
||||
from .threads_autoadder import AutoAdder
|
||||
from .documentation_thread import DocumentationThread
|
||||
from .documentation_thread import DocumentationThread
|
||||
from .create_file import recreateFile, recreateElsaFile
|
||||
|
||||
@@ -2,6 +2,14 @@ import hashlib
|
||||
import random
|
||||
|
||||
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
|
||||
@@ -9,9 +17,14 @@ from .database import Database
|
||||
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."""
|
||||
|
||||
def __init__(self):
|
||||
"""Defaulf Constructor for the AdminCommands class."""
|
||||
self.db = Database()
|
||||
def __init__(self, db_path=None):
|
||||
"""Default Constructor for the AdminCommands class."""
|
||||
if db_path is None:
|
||||
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]:
|
||||
"""Create a hashed password and a salt for the password.
|
||||
@@ -44,6 +57,20 @@ class AdminCommands:
|
||||
hashed_password = self.hash_password("admin")
|
||||
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:
|
||||
"""Hash a password using SHA256.
|
||||
|
||||
|
||||
@@ -4,10 +4,18 @@ from pathlib import Path
|
||||
|
||||
from src.backend.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")
|
||||
|
||||
|
||||
db = Database()
|
||||
|
||||
|
||||
def recreateFile(name, app_id, filetype, open=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.
|
||||
|
||||
@@ -24,6 +32,7 @@ def recreateFile(name, app_id, filetype, open=True) -> Path:
|
||||
"""
|
||||
path = db.recreateFile(name, app_id, filetype=filetype)
|
||||
path = Path(path)
|
||||
log.info(f"File created: {path}")
|
||||
if open:
|
||||
if os.getenv("OS") == "Windows_NT":
|
||||
path = path.resolve()
|
||||
|
||||
@@ -1,17 +1,23 @@
|
||||
import datetime
|
||||
import json
|
||||
import os
|
||||
import sqlite3 as sql
|
||||
import sys
|
||||
import tempfile
|
||||
from dataclasses import asdict
|
||||
from pathlib import Path
|
||||
from src import settings
|
||||
from string import ascii_lowercase as lower
|
||||
from string import digits, punctuation
|
||||
from typing import Any, List, Optional, Tuple, Union
|
||||
import datetime
|
||||
from src import logger
|
||||
|
||||
import loguru
|
||||
|
||||
from src import LOG_DIR, settings, DATABASE_DIR
|
||||
from src.backend.db import (
|
||||
CREATE_ELSA_FILES_TABLE,
|
||||
CREATE_ELSA_MEDIA_TABLE,
|
||||
CREATE_ELSA_TABLE,
|
||||
CREATE_TABLE_APPARAT,
|
||||
CREATE_TABLE_APPKONTOS,
|
||||
CREATE_TABLE_FILES,
|
||||
CREATE_TABLE_MEDIA,
|
||||
CREATE_TABLE_MESSAGES,
|
||||
@@ -20,11 +26,17 @@ from src.backend.db import (
|
||||
CREATE_TABLE_USER,
|
||||
)
|
||||
from src.errors import AppPresentError, NoResultError
|
||||
from src.logic import ApparatData, BookData, Prof, Apparat, ELSA
|
||||
from src.logic import ELSA, Apparat, ApparatData, BookData, Prof
|
||||
from src.logic.constants import SEMAP_MEDIA_ACCOUNTS
|
||||
from src.utils import create_blob, dump_pickle, load_pickle
|
||||
from src.utils.blob import create_blob
|
||||
|
||||
from .semester import Semester
|
||||
from string import ascii_lowercase as lower, digits, punctuation
|
||||
|
||||
log = loguru.logger
|
||||
log.remove()
|
||||
log.add(sys.stdout, level="INFO")
|
||||
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
|
||||
|
||||
|
||||
|
||||
ascii_lowercase = lower + digits + punctuation
|
||||
@@ -32,12 +44,11 @@ ascii_lowercase = lower + digits + punctuation
|
||||
|
||||
# get the line that called the function
|
||||
class Database:
|
||||
database = settings.database
|
||||
"""
|
||||
Initialize the database and create the tables if they do not exist.
|
||||
"""
|
||||
|
||||
def __init__(self, db_path: str = None):
|
||||
def __init__(self, db_path: Union[Path, None] = None):
|
||||
"""
|
||||
Default constructor for the database class
|
||||
|
||||
@@ -45,23 +56,41 @@ class Database:
|
||||
db_path (str, optional): Optional Path for testing / specific purposes. Defaults to None.
|
||||
"""
|
||||
if db_path is None:
|
||||
self.db_path = self.database.path + self.database.name
|
||||
self.db_path = self.db_path.replace("~", str(Path.home()))
|
||||
if settings.database.path is not None:
|
||||
self.db_path = Path(
|
||||
settings.database.path.expanduser(), settings.database.name
|
||||
)
|
||||
else:
|
||||
self.db_path = None
|
||||
|
||||
# self.db_path = self.db_path.replace("~", str(Path.home()))
|
||||
else:
|
||||
self.db_path = db_path
|
||||
self.checkDatabaseStatus()
|
||||
log.debug(f"Database path: {self.db_path}")
|
||||
self.db_initialized = False
|
||||
|
||||
def initializeDatabase(self):
|
||||
if not self.db_initialized:
|
||||
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):
|
||||
path = self.database.path
|
||||
path = path.replace("~", str(Path.home()))
|
||||
# print(path)
|
||||
path = os.path.abspath(path)
|
||||
path = settings.database.path
|
||||
if path is None:
|
||||
path = Path(DATABASE_DIR)
|
||||
# path = path.replace("~", str(Path.home()))
|
||||
# path = os.path.abspath(path)
|
||||
if not os.path.exists(path):
|
||||
# create path
|
||||
# print(path)
|
||||
# log.debug(path)
|
||||
os.makedirs(path)
|
||||
if self.get_db_contents() == []:
|
||||
logger.critical("Database does not exist, creating tables")
|
||||
log.critical("Database does not exist, creating tables")
|
||||
log.critical(f"Path: {path}")
|
||||
self.create_tables()
|
||||
self.insertSubjects()
|
||||
|
||||
@@ -124,7 +153,6 @@ class Database:
|
||||
cursor.execute(CREATE_TABLE_APPARAT)
|
||||
cursor.execute(CREATE_TABLE_MESSAGES)
|
||||
cursor.execute(CREATE_TABLE_MEDIA)
|
||||
cursor.execute(CREATE_TABLE_APPKONTOS)
|
||||
cursor.execute(CREATE_TABLE_FILES)
|
||||
cursor.execute(CREATE_TABLE_PROF)
|
||||
cursor.execute(CREATE_TABLE_USER)
|
||||
@@ -145,15 +173,18 @@ class Database:
|
||||
"""
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
logger.debug(f"Inserting {params} into database with query {query}")
|
||||
log.debug(f"Inserting {params} into database with query {query}")
|
||||
cursor.execute(query, params)
|
||||
conn.commit()
|
||||
self.close_connection(conn)
|
||||
|
||||
@logger.catch
|
||||
@log.catch
|
||||
def query_db(
|
||||
self, query: str, args: Tuple = (), one: bool = False
|
||||
) -> Union[Tuple, List[Tuple]]:
|
||||
self,
|
||||
query: str,
|
||||
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.
|
||||
|
||||
@@ -168,6 +199,7 @@ class Database:
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
logs_query = query
|
||||
|
||||
logs_args = args
|
||||
if "fileblob" in query:
|
||||
# set fileblob arg in logger to "too long"
|
||||
@@ -181,14 +213,15 @@ class Database:
|
||||
# log_message = f"Querying database with query {query}"
|
||||
if "INTO user" in query:
|
||||
log_message = f"Querying database with query {query}"
|
||||
logger.debug(log_message)
|
||||
# log.debug(f"DB Query: {log_message}")
|
||||
log.debug(log_message)
|
||||
try:
|
||||
cursor.execute(query, args)
|
||||
rv = cursor.fetchall()
|
||||
conn.commit()
|
||||
self.close_connection(conn)
|
||||
except sql.OperationalError as e:
|
||||
logger.error(f"Error in query: {e}")
|
||||
log.error(f"Error in query: {e}")
|
||||
return None
|
||||
return (rv[0] if rv else None) if one else rv
|
||||
|
||||
@@ -204,6 +237,7 @@ class Database:
|
||||
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.
|
||||
"""
|
||||
log.info(f"Adding book {bookdata.signature} to database")
|
||||
if app_id is None or prof_id is None:
|
||||
raise ValueError("Apparate ID or Prof ID is None")
|
||||
conn = self.connect()
|
||||
@@ -211,22 +245,26 @@ class Database:
|
||||
t_query = (
|
||||
f"SELECT bookdata FROM media WHERE app_id={app_id} AND prof_id={prof_id}"
|
||||
)
|
||||
logger.debug(t_query)
|
||||
# # print(t_query)
|
||||
log.debug(t_query)
|
||||
# # log.debug(t_query)
|
||||
result = cursor.execute(t_query).fetchall()
|
||||
result = [load_pickle(i[0]) for i in result]
|
||||
result = [BookData().from_string(i[0]) for i in result]
|
||||
if bookdata in result:
|
||||
# print("Bookdata already in database")
|
||||
# log.debug("Bookdata already in database")
|
||||
# check if the book was deleted in the apparat
|
||||
query = (
|
||||
"SELECT deleted FROM media WHERE app_id=? AND prof_id=? AND bookdata=?"
|
||||
)
|
||||
params = (app_id, prof_id, dump_pickle(bookdata))
|
||||
params = (app_id, prof_id, json.dumps(asdict(bookdata), ensure_ascii=False))
|
||||
result = cursor.execute(query, params).fetchone()
|
||||
if result[0] == 1:
|
||||
# print("Book was deleted, updating bookdata")
|
||||
# log.debug("Book was deleted, updating bookdata")
|
||||
query = "UPDATE media SET deleted=0 WHERE app_id=? AND prof_id=? AND bookdata=?"
|
||||
params = (app_id, prof_id, dump_pickle(bookdata))
|
||||
params = (
|
||||
app_id,
|
||||
prof_id,
|
||||
json.dumps(asdict(bookdata), ensure_ascii=False),
|
||||
)
|
||||
cursor.execute(query, params)
|
||||
conn.commit()
|
||||
return
|
||||
@@ -234,11 +272,11 @@ class Database:
|
||||
query = (
|
||||
"INSERT INTO media (bookdata, app_id, prof_id,deleted) VALUES (?, ?, ?,?)"
|
||||
)
|
||||
converted = dump_pickle(bookdata)
|
||||
converted = json.dumps(asdict(bookdata), ensure_ascii=False)
|
||||
params = (converted, app_id, prof_id, 0)
|
||||
cursor.execute(query, params)
|
||||
logMessage = f"Added book with signature {bookdata.signature} to database, data: {converted}"
|
||||
logger.info(logMessage)
|
||||
log.info(logMessage)
|
||||
conn.commit()
|
||||
self.close_connection(conn)
|
||||
|
||||
@@ -260,7 +298,7 @@ class Database:
|
||||
"SELECT bookdata, id FROM media WHERE app_id=? AND prof_id=?",
|
||||
(app_id, prof_id),
|
||||
)
|
||||
books = [(load_pickle(i[0]), i[1]) for i in result]
|
||||
books = [(BookData().from_string(i[0]), i[1]) for i in result]
|
||||
book = [i for i in books if i[0].signature == signature][0][1]
|
||||
return book
|
||||
|
||||
@@ -281,7 +319,7 @@ class Database:
|
||||
result = self.query_db(
|
||||
"SELECT bookdata FROM media WHERE app_id=? AND prof_id=?", (app_id, prof_id)
|
||||
)
|
||||
books: list[BookData] = [load_pickle(i[0]) for i in result]
|
||||
books: list[BookData] = [BookData().from_string(i[0]) for i in result]
|
||||
book = [i for i in books if i.signature == signature][0]
|
||||
return book
|
||||
|
||||
@@ -307,7 +345,7 @@ class Database:
|
||||
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")
|
||||
# logger.debug(rdata, len(rdata))
|
||||
# log.debug(rdata, len(rdata))
|
||||
mode = 0
|
||||
if len(data) == 1:
|
||||
if "signature" in data.keys():
|
||||
@@ -320,7 +358,7 @@ class Database:
|
||||
return None
|
||||
ret = []
|
||||
for book in rdata:
|
||||
bookdata = load_pickle(book[1])
|
||||
bookdata = BookData().from_string(book[1])
|
||||
app_id = book[2]
|
||||
prof_id = book[3]
|
||||
if mode == 1:
|
||||
@@ -335,7 +373,7 @@ class Database:
|
||||
and data["title"] in bookdata.title
|
||||
):
|
||||
ret.append((bookdata, app_id, prof_id))
|
||||
# logger.debug(ret)
|
||||
# log.debug(ret)
|
||||
return ret
|
||||
|
||||
def setAvailability(self, book_id: str, available: str):
|
||||
@@ -379,15 +417,15 @@ class Database:
|
||||
Returns:
|
||||
BookData: The metadata of the book wrapped in a BookData object
|
||||
"""
|
||||
return load_pickle(
|
||||
return BookData().from_string(
|
||||
self.query_db(
|
||||
"SELECT bookdata FROM media WHERE id=?", (book_id,), one=True
|
||||
)[0]
|
||||
)
|
||||
|
||||
def getBooks(
|
||||
self, app_id: Union[str, int], prof_id: Union[str, int], deleted=0
|
||||
) -> list[dict[int, BookData, int]]:
|
||||
self, app_id: Union[str, int], prof_id: Union[str, int], deleted: int = 0
|
||||
) -> list[dict[str, Union[BookData, int]]]:
|
||||
"""
|
||||
Get the Books based on the apparat id and the professor id
|
||||
|
||||
@@ -406,14 +444,14 @@ class Database:
|
||||
if qdata is None:
|
||||
return []
|
||||
for result_a in qdata:
|
||||
data = {"id": int, "bookdata": BookData, "available": int}
|
||||
data: dict[str, Any] = {"id": int, "bookdata": BookData, "available": int}
|
||||
data["id"] = result_a[0]
|
||||
data["bookdata"] = load_pickle(result_a[1])
|
||||
data["bookdata"] = BookData().from_string(result_a[1])
|
||||
data["available"] = result_a[2]
|
||||
ret_result.append(data)
|
||||
return ret_result
|
||||
|
||||
def updateBookdata(self, book_id, bookdata: BookData):
|
||||
def updateBookdata(self, book_id: int, bookdata: BookData):
|
||||
"""
|
||||
Update the bookdata in the database
|
||||
|
||||
@@ -422,10 +460,10 @@ class Database:
|
||||
bookdata (BookData): The new metadata of the book
|
||||
"""
|
||||
query = "UPDATE media SET bookdata= ? WHERE id=?"
|
||||
book = dump_pickle(bookdata)
|
||||
book = bookdata.to_dict
|
||||
self.query_db(query, (book, book_id))
|
||||
|
||||
def deleteBook(self, book_id):
|
||||
def deleteBook(self, book_id: int):
|
||||
"""
|
||||
Delete a book from the database
|
||||
|
||||
@@ -435,7 +473,7 @@ class Database:
|
||||
self.query_db("UPDATE media SET deleted=1 WHERE id=?", (book_id,))
|
||||
|
||||
# File Interactions
|
||||
def getBlob(self, filename, app_id: Union[str, int]):
|
||||
def getBlob(self, filename: str, app_id: Union[str, int]) -> bytes:
|
||||
"""
|
||||
Get a blob from the database
|
||||
|
||||
@@ -487,16 +525,14 @@ class Database:
|
||||
str: The filename of the recreated file
|
||||
"""
|
||||
blob = self.getBlob(filename, app_id)
|
||||
tempdir = self.database.tempdir
|
||||
tempdir = tempdir.replace("~", str(Path.home()))
|
||||
tempdir_path = Path(tempdir)
|
||||
if not os.path.exists(tempdir_path):
|
||||
os.mkdir(tempdir_path)
|
||||
tempdir = settings.database.temp.expanduser()
|
||||
if not tempdir.exists():
|
||||
tempdir.mkdir(parents=True, exist_ok=True)
|
||||
file = tempfile.NamedTemporaryFile(
|
||||
delete=False, dir=tempdir_path, mode="wb", suffix=f".{filetype}"
|
||||
)
|
||||
file.write(blob)
|
||||
# print("file created")
|
||||
# log.debug("file created")
|
||||
return file.name
|
||||
|
||||
def getFiles(self, app_id: Union[str, int], prof_id: int) -> list[tuple]:
|
||||
@@ -524,7 +560,7 @@ class Database:
|
||||
return [i[0] for i in data]
|
||||
|
||||
def insertSubjects(self):
|
||||
# print("Inserting subjects")
|
||||
# log.debug("Inserting subjects")
|
||||
subjects = [
|
||||
"Biologie",
|
||||
"Chemie",
|
||||
@@ -567,25 +603,28 @@ class Database:
|
||||
return self.query_db("SELECT * FROM subjects")
|
||||
|
||||
# Messages
|
||||
def addMessage(self, message: dict, user: str, app_id: Union[str, int]):
|
||||
def addMessage(
|
||||
self, messages: list[dict[str, Any]], user: str, app_id: Union[str, int]
|
||||
):
|
||||
"""add a Message to the database
|
||||
|
||||
Args:
|
||||
message (dict): the message to be added
|
||||
user (str): the user who added the message
|
||||
messages (list[dict[str, Any]]): the messages to be added
|
||||
user (str): the user who added the messages
|
||||
app_id (Union[str,int]): the id of the apparat
|
||||
"""
|
||||
|
||||
def __getUserId(user):
|
||||
def __getUserId(user: str):
|
||||
return self.query_db(
|
||||
"SELECT id FROM user WHERE username=?", (user,), one=True
|
||||
)[0]
|
||||
|
||||
user_id = __getUserId(user)
|
||||
self.query_db(
|
||||
"INSERT INTO messages (message, user_id, remind_at,appnr) VALUES (?,?,?,?)",
|
||||
(message["message"], user_id, message["remind_at"], app_id),
|
||||
)
|
||||
for message in messages:
|
||||
self.query_db(
|
||||
"INSERT INTO messages (message, user_id, remind_at,appnr) VALUES (?,?,?,?)",
|
||||
(message["message"], user_id, message["remind_at"], app_id),
|
||||
)
|
||||
|
||||
def getAllMessages(self) -> list[dict[str, str, str, str]]:
|
||||
"""Get all the messages in the database
|
||||
@@ -594,7 +633,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
|
||||
"""
|
||||
|
||||
def __get_user_name(user_id):
|
||||
def __get_user_name(user_id: int):
|
||||
return self.query_db(
|
||||
"SELECT username FROM user WHERE id=?", (user_id,), one=True
|
||||
)[0]
|
||||
@@ -612,17 +651,17 @@ class Database:
|
||||
]
|
||||
return ret
|
||||
|
||||
def getMessages(self, date: str) -> list[dict[str, str, str, str]]:
|
||||
def getMessages(self, date: str) -> list[dict[str, str]]:
|
||||
"""Get all the messages for a specific date
|
||||
|
||||
Args:
|
||||
date (str): a date.datetime object formatted as a string in the format "YYYY-MM-DD"
|
||||
|
||||
Returns:
|
||||
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]]: 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):
|
||||
def __get_user_name(user_id: int):
|
||||
return self.query_db(
|
||||
"SELECT username FROM user WHERE id=?", (user_id,), one=True
|
||||
)[0]
|
||||
@@ -634,13 +673,13 @@ class Database:
|
||||
]
|
||||
return ret
|
||||
|
||||
def deleteMessage(self, message_id):
|
||||
def deleteMessage(self, message_id: int):
|
||||
"""Delete a message from the database
|
||||
|
||||
Args:
|
||||
message_id (str): the id of the message
|
||||
"""
|
||||
logger.debug(f"Deleting message with id {message_id}")
|
||||
log.debug(f"Deleting message with id {message_id}")
|
||||
self.query_db("DELETE FROM messages WHERE id=?", (message_id,))
|
||||
|
||||
# Prof data
|
||||
@@ -676,7 +715,9 @@ class Database:
|
||||
)[0]
|
||||
return f"{title} " if title is not None else ""
|
||||
|
||||
def getSpecificProfData(self, prof_id: Union[str, int], fields: List[str]) -> tuple:
|
||||
def getSpecificProfData(
|
||||
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
|
||||
|
||||
Args:
|
||||
@@ -693,6 +734,18 @@ class Database:
|
||||
query += " FROM prof WHERE id=?"
|
||||
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):
|
||||
"""Get mail, telephone number and title of a professor based on the name
|
||||
|
||||
@@ -733,7 +786,7 @@ class Database:
|
||||
return [Prof().from_tuple(prof) for prof in profs]
|
||||
|
||||
# Apparat
|
||||
def getAllAparats(self, deleted=0) -> list[tuple]:
|
||||
def getAllAparats(self, deleted: int = 0) -> list[Apparat]:
|
||||
"""Get all the apparats in the database
|
||||
|
||||
Args:
|
||||
@@ -742,9 +795,13 @@ class Database:
|
||||
Returns:
|
||||
list[tuple]: a list of tuples containing the apparats
|
||||
"""
|
||||
return self.query_db(
|
||||
apparats = self.query_db(
|
||||
"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:
|
||||
"""Get the Apparat data based on the apparat number and the name
|
||||
@@ -795,7 +852,7 @@ class Database:
|
||||
)
|
||||
numbers = [i[0] for i in numbers]
|
||||
numbers.sort()
|
||||
logger.info(f"Currently used apparat numbers: {numbers}")
|
||||
log.info(f"Currently used apparat numbers: {numbers}")
|
||||
return numbers
|
||||
|
||||
def setNewSemesterDate(self, app_id: Union[str, int], newDate, dauerapp=False):
|
||||
@@ -816,7 +873,7 @@ class Database:
|
||||
)
|
||||
else:
|
||||
self.query_db(
|
||||
"UPDATE semesterapparat SET verlängerung_bis=?, verlängerung_am=? WHERE appnr=?",
|
||||
"UPDATE semesterapparat SET verlängerung_bis=?, verlängert_am=? WHERE appnr=?",
|
||||
(newDate, today, app_id),
|
||||
)
|
||||
|
||||
@@ -849,26 +906,26 @@ class Database:
|
||||
Returns:
|
||||
Optional[int]: the id of the apparat
|
||||
"""
|
||||
logger.debug(apparat)
|
||||
log.debug(apparat)
|
||||
app = apparat.apparat
|
||||
prof = apparat.prof
|
||||
present_prof = self.getProfByName(prof.name())
|
||||
prof_id = present_prof.id
|
||||
logger.debug(present_prof)
|
||||
log.debug(present_prof)
|
||||
|
||||
app_id = self.getApparatId(app.name)
|
||||
if app_id:
|
||||
return AppPresentError(app_id)
|
||||
if not prof_id:
|
||||
logger.debug("prof id not present, creating prof with data", prof)
|
||||
log.debug("prof id not present, creating prof with data", prof)
|
||||
prof_id = self.createProf(prof)
|
||||
logger.debug(prof_id)
|
||||
log.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]}')"
|
||||
logger.debug(query)
|
||||
log.debug(query)
|
||||
self.query_db(query)
|
||||
return None
|
||||
|
||||
def getApparatsByProf(self, prof_id: Union[str, int]) -> list[tuple]:
|
||||
def getApparatsByProf(self, prof_id: Union[str, int]) -> list[Apparat]:
|
||||
"""Get all apparats based on the professor id
|
||||
|
||||
Args:
|
||||
@@ -882,7 +939,7 @@ class Database:
|
||||
)
|
||||
ret = []
|
||||
for i in data:
|
||||
print(i)
|
||||
log.debug(i)
|
||||
ret.append(Apparat().from_tuple(i))
|
||||
return ret
|
||||
|
||||
@@ -964,11 +1021,15 @@ class Database:
|
||||
app_id (Union[str, int]): the id of the apparat
|
||||
semester (str): the semester the apparat should be deleted from
|
||||
"""
|
||||
logger.info(f"Deleting apparat with id {app_id} in semester {semester}")
|
||||
log.info(f"Deleting apparat with id {app_id} in semester {semester}")
|
||||
self.query_db(
|
||||
"UPDATE semesterapparat SET deletion_status=1, deleted_date=? WHERE appnr=?",
|
||||
(semester, app_id),
|
||||
)
|
||||
self.query_db(
|
||||
"UPDATE media SET deleted=1 WHERE app_id=?",
|
||||
(app_id,),
|
||||
)
|
||||
|
||||
def isEternal(self, id):
|
||||
"""check if the apparat is eternal (dauerapparat)
|
||||
@@ -993,11 +1054,14 @@ class Database:
|
||||
Returns:
|
||||
str: the name of the apparat
|
||||
"""
|
||||
return self.query_db(
|
||||
result = self.query_db(
|
||||
"SELECT name FROM semesterapparat WHERE appnr=? AND prof_id=?",
|
||||
(app_id, prof_id),
|
||||
one=True,
|
||||
)[0]
|
||||
)
|
||||
if result:
|
||||
return result[0]
|
||||
return None
|
||||
|
||||
def updateApparat(self, apparat_data: ApparatData):
|
||||
"""Update an apparat in the database
|
||||
@@ -1015,7 +1079,7 @@ class Database:
|
||||
apparat_data.apparat.apparat_id_adis,
|
||||
apparat_data.apparat.appnr,
|
||||
)
|
||||
logger.debug(f"Updating apparat with query {query} and params {params}")
|
||||
log.debug(f"Updating apparat with query {query} and params {params}")
|
||||
self.query_db(query, params)
|
||||
|
||||
def checkApparatExists(self, app_name: str):
|
||||
@@ -1067,7 +1131,7 @@ class Database:
|
||||
Returns:
|
||||
list: the result of the query
|
||||
"""
|
||||
logger.debug(f"Query: {query}")
|
||||
log.debug(f"Query: {query}")
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
result = cursor.execute(query).fetchall()
|
||||
@@ -1080,7 +1144,7 @@ class Database:
|
||||
result_a = tuple(result_a)
|
||||
result[result.index(orig_value)] = result_a
|
||||
self.close_connection(conn)
|
||||
logger.debug(f"Query result: {result}")
|
||||
log.debug(f"Query result: {result}")
|
||||
return result
|
||||
|
||||
if "deletable" in kwargs.keys():
|
||||
@@ -1095,9 +1159,9 @@ class Database:
|
||||
kwargs["dauer"] = kwargs["dauer"].replace("Ja", "1").replace("Nein", "0")
|
||||
query = "SELECT * FROM semesterapparat WHERE "
|
||||
for key, value in kwargs.items() if kwargs.items() is not None else {}:
|
||||
# print(key, value)
|
||||
# log.debug(key, value)
|
||||
query += f"{key}='{value}' AND "
|
||||
# print(query)
|
||||
# log.debug(query)
|
||||
# remove deletesemester part from normal query, as this will be added to the database upon deleting the apparat
|
||||
if "deletesemester" in kwargs.keys():
|
||||
query = query.replace(
|
||||
@@ -1113,24 +1177,24 @@ class Database:
|
||||
query = query.replace(
|
||||
f"endsemester='{kwargs['endsemester']}' AND ", "xyz"
|
||||
)
|
||||
# print("replaced")
|
||||
# log.debug("replaced")
|
||||
query = query.replace(
|
||||
"xyz",
|
||||
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
|
||||
logger.info(f"Query before: {query}")
|
||||
log.info(f"Query before: {query}")
|
||||
query = query.strip()
|
||||
query = query[:-4]
|
||||
logger.info(f"Query after: {query}")
|
||||
log.info(f"Query after: {query}")
|
||||
# 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] != "'":
|
||||
query = query[:-1]
|
||||
query = query.strip()
|
||||
|
||||
# print(query)
|
||||
# log.debug(query)
|
||||
res = __query(query)
|
||||
# print(res)
|
||||
# log.debug(res)
|
||||
return res
|
||||
|
||||
# Admin data
|
||||
@@ -1153,10 +1217,13 @@ class Database:
|
||||
Returns:
|
||||
bool: True if the login was successful, False if not
|
||||
"""
|
||||
salt = self.query_db(
|
||||
"SELECT salt FROM user WHERE username=?", (user,), one=True
|
||||
)[0]
|
||||
if salt is None:
|
||||
try:
|
||||
salt = self.query_db(
|
||||
"SELECT salt FROM user WHERE username=?", (user,), one=True
|
||||
)[0]
|
||||
if salt is None:
|
||||
return False
|
||||
except TypeError:
|
||||
return False
|
||||
hashed_password = salt + hashed_password
|
||||
password = self.query_db(
|
||||
@@ -1183,7 +1250,7 @@ class Database:
|
||||
"UPDATE user SET password=? WHERE username=?", (new_password, user)
|
||||
)
|
||||
|
||||
def getRole(self, user):
|
||||
def getRole(self, user: str) -> str:
|
||||
"""get the role of the user
|
||||
|
||||
Args:
|
||||
@@ -1232,6 +1299,13 @@ class Database:
|
||||
"INSERT OR IGNORE INTO user (username, password, role, salt) VALUES (?,?,?,?)",
|
||||
(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):
|
||||
"""delete an unser
|
||||
@@ -1299,15 +1373,15 @@ class Database:
|
||||
"""
|
||||
return self.query_db("SELECT titel, fname,lname,mail,telnr,fullname FROM prof")
|
||||
|
||||
def restoreApparat(self, app_id: Union[str, int]):
|
||||
def restoreApparat(self, app_id: Union[str, int], app_name: str):
|
||||
"""restore an apparat from the database
|
||||
|
||||
Args:
|
||||
app_id (Union[str, int]): the id of the apparat
|
||||
"""
|
||||
return self.query_db(
|
||||
"UPDATE semesterapparat SET deletion_status=0, deleted_date=NULL WHERE appnr=?",
|
||||
(app_id,),
|
||||
"UPDATE semesterapparat SET deletion_status=0, deleted_date=NULL WHERE appnr=? and name=?",
|
||||
(app_id, app_name),
|
||||
)
|
||||
|
||||
# ELSA
|
||||
@@ -1418,17 +1492,16 @@ class Database:
|
||||
blob = self.query_db(
|
||||
"SELECT fileblob FROM elsa_files WHERE filename=?", (filename,), one=True
|
||||
)[0]
|
||||
# print(blob)
|
||||
tempdir = self.database.tempdir
|
||||
tempdir = tempdir.replace("~", str(Path.home()))
|
||||
tempdir_path = Path(tempdir)
|
||||
if not os.path.exists(tempdir_path):
|
||||
os.mkdir(tempdir_path)
|
||||
# log.debug(blob)
|
||||
tempdir = settings.database.temp.expanduser()
|
||||
if not tempdir.exists():
|
||||
tempdir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
file = tempfile.NamedTemporaryFile(
|
||||
delete=False, dir=tempdir_path, mode="wb", suffix=f".{filetype}"
|
||||
)
|
||||
file.write(blob)
|
||||
# print("file created")
|
||||
# log.debug("file created")
|
||||
return file.name
|
||||
|
||||
def getElsaApparats(self) -> ELSA:
|
||||
@@ -1437,9 +1510,11 @@ class Database:
|
||||
Returns:
|
||||
list[tuple]: a list of tuples containing the ELSA apparats
|
||||
"""
|
||||
return self.query_db("SELECT * FROM elsa")
|
||||
return self.query_db(
|
||||
"SELECT * FROM elsa ORDER BY substr(date, 7, 4) || '-' || substr(date, 4, 2) || '-' || substr(date, 1, 2)"
|
||||
)
|
||||
|
||||
def getElsaId(self, prof_id, semester, date):
|
||||
def getElsaId(self, prof_id: int, semester: str, date: str) -> int:
|
||||
"""get the id of an ELSA apparat based on the professor, semester and date
|
||||
|
||||
Args:
|
||||
@@ -1476,7 +1551,7 @@ class Database:
|
||||
###
|
||||
|
||||
def createProf(self, profdata: Prof):
|
||||
logger.debug(profdata)
|
||||
log.debug(profdata)
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
fname = profdata.firstname
|
||||
@@ -1487,7 +1562,7 @@ class Database:
|
||||
title = profdata.title
|
||||
|
||||
query = f"INSERT INTO prof (fname, lname, fullname, mail, telnr,titel) VALUES ('{fname}','{lname}','{fullname}','{mail}','{telnr}','{title}')"
|
||||
logger.debug(query)
|
||||
log.debug(query)
|
||||
cursor.execute(query)
|
||||
|
||||
conn.commit()
|
||||
@@ -1510,7 +1585,7 @@ class Database:
|
||||
else:
|
||||
return []
|
||||
|
||||
def getProfId(self, profdata: dict | Prof):
|
||||
def getProfId(self, profdata: dict[str, Any] | Prof):
|
||||
"""Get the prof ID based on the profdata
|
||||
|
||||
Args:
|
||||
@@ -1521,9 +1596,7 @@ class Database:
|
||||
"""
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
if isinstance(profdata, Prof):
|
||||
fullname = profdata.name()
|
||||
else:
|
||||
if isinstance(profdata, dict):
|
||||
name = profdata["profname"]
|
||||
if "," in name:
|
||||
fname = name.split(", ")[1].strip()
|
||||
@@ -1531,8 +1604,10 @@ class Database:
|
||||
fullname = f"{lname} {fname}"
|
||||
else:
|
||||
fullname = profdata["profname"]
|
||||
else:
|
||||
fullname = profdata.name()
|
||||
query = f"SELECT id FROM prof WHERE fullname = '{fullname}'"
|
||||
logger.debug(query)
|
||||
log.debug(query)
|
||||
|
||||
cursor.execute(query)
|
||||
result = cursor.fetchone()
|
||||
@@ -1550,7 +1625,7 @@ class Database:
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
query = f"SELECT * FROM prof WHERE fullname = '{fullname}'"
|
||||
logger.debug(query)
|
||||
log.debug(query)
|
||||
|
||||
result = cursor.execute(query).fetchone()
|
||||
if result:
|
||||
@@ -1558,7 +1633,7 @@ class Database:
|
||||
else:
|
||||
return Prof()
|
||||
|
||||
def getProfIDByApparat(self, apprarat_id):
|
||||
def getProfIDByApparat(self, apprarat_id: int) -> Optional[int]:
|
||||
"""Get the prof id based on the semesterapparat id from the database
|
||||
|
||||
Args:
|
||||
@@ -1571,12 +1646,12 @@ class Database:
|
||||
query = f"SELECT prof_id from semesterapparat WHERE appnr = '{apprarat_id}' and deletion_status = 0"
|
||||
data = self.query_db(query)
|
||||
if data:
|
||||
logger.info("Prof ID: " + str(data[0][0]))
|
||||
log.info("Prof ID: " + str(data[0][0]))
|
||||
return data[0][0]
|
||||
else:
|
||||
return None
|
||||
|
||||
def copyBookToApparat(self, book_id, apparat):
|
||||
def copyBookToApparat(self, book_id: int, apparat: int):
|
||||
# get book data
|
||||
new_apparat_id = apparat
|
||||
new_prof_id = self.getProfIDByApparat(new_apparat_id)
|
||||
@@ -1597,7 +1672,7 @@ class Database:
|
||||
connection.commit()
|
||||
connection.close()
|
||||
|
||||
def moveBookToApparat(self, book_id, appratat):
|
||||
def moveBookToApparat(self, book_id: int, appratat: int):
|
||||
"""Move the book to the new apparat
|
||||
|
||||
Args:
|
||||
@@ -1612,10 +1687,18 @@ class Database:
|
||||
connection.commit()
|
||||
connection.close()
|
||||
|
||||
def getApparatNameByAppNr(self, appnr):
|
||||
def getApparatNameByAppNr(self, appnr: int):
|
||||
query = f"SELECT name FROM semesterapparat WHERE appnr = '{appnr}' and deletion_status = 0"
|
||||
data = self.query_db(query)
|
||||
if data:
|
||||
return data[0][0]
|
||||
else:
|
||||
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
|
||||
@@ -12,12 +12,12 @@ CREATE_TABLE_APPARAT = """CREATE TABLE semesterapparat (
|
||||
deleted_date TEXT,
|
||||
apparat_id_adis INTEGER,
|
||||
prof_id_adis INTEGER,
|
||||
konto INTEGER REFERENCES app_kontos (id),
|
||||
konto INTEGER,
|
||||
FOREIGN KEY (prof_id) REFERENCES prof (id)
|
||||
)"""
|
||||
CREATE_TABLE_MEDIA = """CREATE TABLE media (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||
bookdata BLOB,
|
||||
bookdata TEXT,
|
||||
app_id INTEGER,
|
||||
prof_id INTEGER,
|
||||
deleted INTEGER DEFAULT (0),
|
||||
@@ -26,13 +26,7 @@ CREATE_TABLE_MEDIA = """CREATE TABLE media (
|
||||
FOREIGN KEY (prof_id) REFERENCES prof (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 (
|
||||
id INTEGER PRIMARY KEY,
|
||||
filename TEXT,
|
||||
|
||||
@@ -9,10 +9,7 @@ def delete_temp_contents():
|
||||
"""
|
||||
delete_temp_contents deletes the contents of the temp directory.
|
||||
"""
|
||||
path = database.temp
|
||||
path = path.replace("~", str(Path.home()))
|
||||
path = Path(path)
|
||||
path = path.resolve()
|
||||
path = database.temp.expanduser()
|
||||
for root, dirs, files in os.walk(path):
|
||||
for file in files:
|
||||
os.remove(os.path.join(root, file))
|
||||
|
||||
@@ -1,11 +1,23 @@
|
||||
from PyQt6.QtCore import QThread
|
||||
from src.utils.documentation import run_mkdocs
|
||||
from PySide6.QtCore import QThread, Slot
|
||||
from src.utils.documentation import website, QuietHandler
|
||||
from wsgiref.simple_server import make_server
|
||||
|
||||
|
||||
class DocumentationThread(QThread):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._server = None # store server so we can shut it down
|
||||
|
||||
def run(self):
|
||||
# launch_documentation()
|
||||
run_mkdocs()
|
||||
self._server = make_server(
|
||||
"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()
|
||||
@@ -1,128 +1,242 @@
|
||||
"""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
|
||||
from src import logger
|
||||
import re
|
||||
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:
|
||||
logger.debug("Semester class loaded")
|
||||
"""Represents a German university semester (WiSe or SoSe)."""
|
||||
|
||||
_year: int | None = str(datetime.datetime.now().year)[2:]
|
||||
_semester: str | None = None
|
||||
# ------------------------------------------------------------------
|
||||
# Class‑level defaults – will be *copied* to each instance and then
|
||||
# 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
|
||||
value: str = None
|
||||
value: str | None = None # Human‑readable label, e.g. "WiSe 23/24"
|
||||
|
||||
def __post_init__(self):
|
||||
if isinstance(self._year, str):
|
||||
self._year = int(self._year)
|
||||
# ------------------------------------------------------------------
|
||||
# Construction helpers
|
||||
# ------------------------------------------------------------------
|
||||
def __init__(
|
||||
self,
|
||||
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:
|
||||
self._year = datetime.datetime.now().year[2:]
|
||||
self._year = int(str(datetime.datetime.now().year)[2:])
|
||||
if self._month is None:
|
||||
self._month = datetime.datetime.now().month
|
||||
if self._semester is None:
|
||||
self.generateSemester()
|
||||
self.computeValue()
|
||||
self._generate_semester_from_month()
|
||||
self._compute_value()
|
||||
|
||||
def __str__(self):
|
||||
return self.value
|
||||
# ------------------------------------------------------------------
|
||||
# Dunder helpers
|
||||
# ------------------------------------------------------------------
|
||||
def __str__(self) -> str: # noqa: D401 – keep original name
|
||||
return self.value or "<invalid Semester>"
|
||||
|
||||
def generateSemester(self):
|
||||
if self._month < 4 or self._month < 9:
|
||||
self._semester = "WiSe"
|
||||
else:
|
||||
self._semester = "SoSe"
|
||||
def __repr__(self) -> str: # Helpful for debugging lists
|
||||
return f"Semester({self._year!r}, {self._semester!r})"
|
||||
|
||||
@logger.catch
|
||||
def computeValue(self):
|
||||
# year is only last two digits
|
||||
# ------------------------------------------------------------------
|
||||
# Internal helpers
|
||||
# ------------------------------------------------------------------
|
||||
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:
|
||||
"""Human‑readable semester label – e.g. ``WiSe 23/24`` or ``SoSe 24``."""
|
||||
year = self._year
|
||||
if self._semester == "WiSe":
|
||||
if self._month < 4:
|
||||
valueyear = str(year - 1) + "/" + str(year)
|
||||
else:
|
||||
valueyear = str(year)
|
||||
self.value = f"{self._semester} {valueyear}"
|
||||
next_year = (year + 1) % 100 # wrap 99 → 0
|
||||
self.value = f"WiSe {year}/{next_year}"
|
||||
else: # SoSe
|
||||
self.value = f"SoSe {year}"
|
||||
|
||||
@logger.catch
|
||||
def offset(self, value: int) -> str:
|
||||
"""Generate a new Semester object by offsetting the current semester by a given value
|
||||
# ------------------------------------------------------------------
|
||||
# Public API
|
||||
# ------------------------------------------------------------------
|
||||
def offset(self, value: int) -> "Semester":
|
||||
"""Return a new :class:`Semester` *value* steps away.
|
||||
|
||||
Args:
|
||||
value (int): The value by which the semester should be offset
|
||||
The algorithm maps every semester to a monotonically increasing
|
||||
*linear index* so that simple addition suffices:
|
||||
|
||||
Returns:
|
||||
str: the new semester value
|
||||
``index = year * 2 + (0 if SoSe else 1)``.
|
||||
"""
|
||||
assert isinstance(value, int), "Value must be an integer"
|
||||
if not isinstance(value, int):
|
||||
raise TypeError("value must be an int (number of semesters to jump)")
|
||||
if value == 0:
|
||||
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)
|
||||
return Semester(self._year, self._semester)
|
||||
|
||||
def isPastSemester(self, semester) -> bool:
|
||||
"""Checks if the current Semester is a past Semester compared to the given Semester
|
||||
current_idx = self._year * 2 + (0 if self._semester == "SoSe" else 1)
|
||||
target_idx = current_idx + value
|
||||
if target_idx < 0:
|
||||
raise ValueError("offset would result in a negative year – not supported")
|
||||
|
||||
Args:
|
||||
semester (str): The semester to compare to
|
||||
new_year, semester_bit = divmod(target_idx, 2)
|
||||
new_semester = "SoSe" if semester_bit == 0 else "WiSe"
|
||||
return Semester(new_year, new_semester)
|
||||
|
||||
Returns:
|
||||
bool: True if the current semester is in the past, False otherwise
|
||||
"""
|
||||
if self.year < semester.year:
|
||||
# ------------------------------------------------------------------
|
||||
# Comparison helpers
|
||||
# ------------------------------------------------------------------
|
||||
def isPastSemester(self, other: "Semester") -> bool:
|
||||
if self.year < other.year:
|
||||
return True
|
||||
if self.year == semester.year:
|
||||
if self.semester == "WiSe" and semester.semester == "SoSe":
|
||||
return True
|
||||
if self.year == other.year:
|
||||
return (
|
||||
self.semester == "WiSe" and other.semester == "SoSe"
|
||||
) # WiSe before next SoSe
|
||||
return False
|
||||
|
||||
def isFutureSemester(self, semester: "Semester") -> bool:
|
||||
"""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:
|
||||
def isFutureSemester(self, other: "Semester") -> bool:
|
||||
if self.year > other.year:
|
||||
return True
|
||||
if self.year == semester.year:
|
||||
if self.semester == "SoSe" and semester.semester == "WiSe":
|
||||
return True
|
||||
if self.year == other.year:
|
||||
return (
|
||||
self.semester == "SoSe" and other.semester == "WiSe"
|
||||
) # SoSe after WiSe of same year
|
||||
return False
|
||||
|
||||
def from_string(self, val):
|
||||
self.value = val
|
||||
self._year = int(val[-2:])
|
||||
self._semester = val[:4]
|
||||
return self
|
||||
def isMatch(self, other: "Semester") -> bool:
|
||||
return self.year == other.year and self.semester == other.semester
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Convenience properties
|
||||
# ------------------------------------------------------------------
|
||||
@property
|
||||
def next(self):
|
||||
def next(self) -> "Semester":
|
||||
return self.offset(1)
|
||||
|
||||
@property
|
||||
def previous(self):
|
||||
def previous(self) -> "Semester":
|
||||
return self.offset(-1)
|
||||
|
||||
@property
|
||||
def year(self):
|
||||
def year(self) -> int:
|
||||
return self._year
|
||||
|
||||
@property
|
||||
def semester(self):
|
||||
def semester(self) -> str:
|
||||
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 human‑readable semester label and return a :class:`Semester`.
|
||||
|
||||
Accepted formats (case‑insensitive)::
|
||||
|
||||
"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 self‑test -------------------------
|
||||
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))
|
||||
|
||||
@@ -1,55 +1,66 @@
|
||||
import sqlite3
|
||||
|
||||
from PyQt6.QtCore import QThread
|
||||
from PyQt6.QtCore import pyqtSignal as Signal
|
||||
from PySide6.QtCore import QThread
|
||||
from PySide6.QtCore import Signal
|
||||
from src.backend import Database
|
||||
|
||||
from src.logic.webrequest import BibTextTransformer, WebRequest
|
||||
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")
|
||||
log.add(sys.stdout, level="INFO")
|
||||
|
||||
|
||||
class BookGrabber(QThread):
|
||||
updateSignal = Signal(int, int)
|
||||
done = Signal()
|
||||
|
||||
def __init__(self, appnr):
|
||||
def __init__(self):
|
||||
super(BookGrabber, self).__init__(parent=None)
|
||||
self.is_Running = True
|
||||
logger.info("Starting worker thread")
|
||||
self.data = None
|
||||
log.info("Starting worker thread")
|
||||
self.data = []
|
||||
self.app_id = None
|
||||
self.prof_id = None
|
||||
self.mode = None
|
||||
self.book_id = None
|
||||
self.use_any = False
|
||||
self.use_exact = False
|
||||
self.appnr = appnr
|
||||
self.app_id = None
|
||||
self.tstate = (self.app_id, self.prof_id, self.mode, self.data)
|
||||
self.request = WebRequest()
|
||||
|
||||
def add_values(self, app_id, prof_id, mode, data, any_book=False, exact=False):
|
||||
def add_values(
|
||||
self, app_id: int, prof_id: int, mode: str, data, any_book=False, exact=False
|
||||
):
|
||||
self.app_id = app_id
|
||||
self.prof_id = prof_id
|
||||
self.mode = mode
|
||||
self.data = data
|
||||
self.data: list[str] = data
|
||||
self.use_any = any_book
|
||||
self.use_exact = exact
|
||||
logger.info(f"Working on {len(self.data)} entries")
|
||||
log.info(f"Working on {len(self.data)} entries")
|
||||
self.tstate = (self.app_id, self.prof_id, self.mode, self.data)
|
||||
logger.debug("State: " + str(self.tstate))
|
||||
# print(self.tstate)
|
||||
log.debug("State: " + str(self.tstate))
|
||||
self.request.set_apparat(self.app_id)
|
||||
# log.debug(self.tstate)
|
||||
|
||||
def run(self):
|
||||
self.db = Database()
|
||||
item = 0
|
||||
iterdata = self.data
|
||||
# print(iterdata)
|
||||
if self.prof_id is None:
|
||||
self.prof_id = self.db.getProfNameByApparat(self.app_id)
|
||||
for entry in iterdata:
|
||||
# print(entry)
|
||||
signature = str(entry)
|
||||
logger.info("Processing entry: " + signature)
|
||||
# log.debug(iterdata)
|
||||
|
||||
webdata = WebRequest().set_apparat(self.appnr).get_ppn(entry)
|
||||
for entry in iterdata:
|
||||
# log.debug(entry)
|
||||
log.info("Processing entry: {}", entry)
|
||||
|
||||
webdata = self.request.get_ppn(entry)
|
||||
if self.use_any:
|
||||
webdata = webdata.use_any_book
|
||||
webdata = webdata.get_data()
|
||||
@@ -58,12 +69,12 @@ class BookGrabber(QThread):
|
||||
continue
|
||||
|
||||
bd = BibTextTransformer(self.mode)
|
||||
print(webdata)
|
||||
log.debug(webdata)
|
||||
if self.mode == "ARRAY":
|
||||
if self.use_exact:
|
||||
bd = bd.use_signature(entry)
|
||||
bd = bd.get_data(webdata).return_data()
|
||||
print(bd)
|
||||
log.debug(bd)
|
||||
if bd is None:
|
||||
# bd = BookData
|
||||
continue
|
||||
@@ -76,25 +87,29 @@ class BookGrabber(QThread):
|
||||
self.db.addBookToDatabase(bd, self.app_id, self.prof_id)
|
||||
# get latest book id
|
||||
self.book_id = self.db.getLastBookId()
|
||||
logger.info("Added book to database")
|
||||
log.info("Added book to database")
|
||||
state = 0
|
||||
for result in transformer.RDS_DATA:
|
||||
# print(result.RDS_LOCATION)
|
||||
# log.debug(result.RDS_LOCATION)
|
||||
if str(self.app_id) in result.RDS_LOCATION:
|
||||
state = 1
|
||||
break
|
||||
|
||||
logger.info(f"State of {signature}: {state}")
|
||||
# print("updating availability of " + str(self.book_id) + " to " + str(state))
|
||||
log.info(f"State of {entry}: {state}")
|
||||
log.debug(
|
||||
"updating availability of " + str(self.book_id) + " to " + str(state)
|
||||
)
|
||||
try:
|
||||
self.db.setAvailability(self.book_id, state)
|
||||
except sqlite3.OperationalError as e:
|
||||
logger.error(f"Failed to update availability: {e}")
|
||||
log.debug("Added book to database")
|
||||
except Exception as e:
|
||||
log.error(f"Failed to update availability: {e}")
|
||||
log.debug("Failed to update availability: " + str(e))
|
||||
|
||||
# time.sleep(5)
|
||||
item += 1
|
||||
self.updateSignal.emit(item, len(self.data))
|
||||
logger.info("Worker thread finished")
|
||||
log.info("Worker thread finished")
|
||||
# self.done.emit()
|
||||
self.quit()
|
||||
|
||||
@@ -102,87 +117,89 @@ class BookGrabber(QThread):
|
||||
self.is_Running = False
|
||||
|
||||
|
||||
# class BookGrabber(object):
|
||||
# updateSignal = Signal(int, int)
|
||||
# done = Signal()
|
||||
class BookGrabberTest(QThread):
|
||||
updateSignal = Signal(int, int)
|
||||
done = Signal()
|
||||
|
||||
# def __init__(self, app_id, prof_id, mode, data, parent=None):
|
||||
# super(BookGrabber, self).__init__(parent=None)
|
||||
# self.is_Running = True
|
||||
# logger = MyLogger("Worker")
|
||||
# logger.info("Starting worker thread")
|
||||
# self.data = data
|
||||
# logger.info(f"Working on {len(self.data)} entries")
|
||||
# self.app_id = app_id
|
||||
# self.prof_id = prof_id
|
||||
# self.mode = mode
|
||||
# self.book_id = None
|
||||
# self.state = (self.app_id, self.prof_id, self.mode, self.data)
|
||||
# # print(self.state)
|
||||
# logger.info("state: " + str(self.state))
|
||||
# # time.sleep(2)
|
||||
def __init__(self, appnr: int):
|
||||
super(BookGrabberTest, self).__init__(parent=None)
|
||||
self.is_Running = True
|
||||
log.info("Starting worker thread")
|
||||
self.data = None
|
||||
self.app_id = None
|
||||
self.prof_id = None
|
||||
self.mode = None
|
||||
self.book_id = None
|
||||
self.use_any = False
|
||||
self.use_exact = False
|
||||
self.app_id = appnr
|
||||
self.tstate = (self.app_id, self.prof_id, self.mode, self.data)
|
||||
self.results = []
|
||||
|
||||
# def resetValues(self):
|
||||
# self.app_id = None
|
||||
# self.prof_id = None
|
||||
# self.mode = None
|
||||
# self.data = None
|
||||
# self.book_id = None
|
||||
def add_values(
|
||||
self, app_id: int, prof_id: int, mode: str, data, any_book=False, exact=False
|
||||
):
|
||||
self.app_id = app_id
|
||||
self.prof_id = prof_id
|
||||
self.mode = mode
|
||||
self.data = data
|
||||
self.use_any = any_book
|
||||
self.use_exact = exact
|
||||
log.info(f"Working on {len(self.data)} entries")
|
||||
self.tstate = (self.app_id, self.prof_id, self.mode, self.data)
|
||||
log.debug("State: " + str(self.tstate))
|
||||
# log.debug(self.tstate)
|
||||
|
||||
# def run(self):
|
||||
# while self.is_Running:
|
||||
# self.db = Database()
|
||||
# item = 0
|
||||
# iterdata = self.data
|
||||
# # print(iterdata)
|
||||
# for entry in iterdata:
|
||||
# # print(entry)
|
||||
# signature = str(entry)
|
||||
# logger.info("Processing entry: " + signature)
|
||||
def run(self):
|
||||
item = 0
|
||||
iterdata = self.data
|
||||
# log.debug(iterdata)
|
||||
for entry in iterdata:
|
||||
# log.debug(entry)
|
||||
signature = str(entry)
|
||||
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
|
||||
# self.db.addBookToDatabase(bd, self.app_id, self.prof_id)
|
||||
# # get latest book id
|
||||
# self.book_id = self.db.getLastBookId()
|
||||
# logger.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
|
||||
# # logger.debug(sign, loc)
|
||||
# # logger.debug(rds_item)
|
||||
# if self.app_id in sign or self.app_id in loc:
|
||||
# state = 1
|
||||
# break
|
||||
webdata = WebRequest().set_apparat(self.app_id).get_ppn(entry)
|
||||
if self.use_any:
|
||||
webdata = webdata.use_any_book
|
||||
webdata = webdata.get_data()
|
||||
|
||||
# logger.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:
|
||||
# logger.error(f"Failed to update availability: {e}")
|
||||
if webdata == "error":
|
||||
continue
|
||||
|
||||
# # time.sleep(5)
|
||||
# item += 1
|
||||
# self.updateSignal.emit(item, len(self.data))
|
||||
# logger.info("Worker thread finished")
|
||||
# # self.done.emit()
|
||||
# self.stop()
|
||||
# if not self.is_Running:
|
||||
# break
|
||||
bd = BibTextTransformer(self.mode)
|
||||
if self.mode == "ARRAY":
|
||||
if self.use_exact:
|
||||
bd = bd.use_signature(entry)
|
||||
bd = bd.get_data(webdata).return_data()
|
||||
if bd is None:
|
||||
# bd = BookData
|
||||
continue
|
||||
bd.signature = entry
|
||||
transformer = (
|
||||
BibTextTransformer("RDS").get_data(webdata).return_data("rds_data")
|
||||
)
|
||||
|
||||
# def stop(self):
|
||||
# self.is_Running = False
|
||||
# confirm lock is acquired
|
||||
# get latest book id
|
||||
log.info("Added book to database")
|
||||
state = 0
|
||||
for result in transformer.RDS_DATA:
|
||||
# log.debug(result.RDS_LOCATION)
|
||||
if str(self.app_id) in result.RDS_LOCATION:
|
||||
state = 1
|
||||
break
|
||||
|
||||
log.info(f"State of {signature}: {state}")
|
||||
# log.debug("updating availability of " + str(self.book_id) + " to " + str(state))
|
||||
self.results.append(bd)
|
||||
|
||||
# time.sleep(5)
|
||||
item += 1
|
||||
self.updateSignal.emit(item, len(self.data))
|
||||
log.info("Worker thread finished")
|
||||
# self.done.emit()
|
||||
self.quit()
|
||||
|
||||
def stop(self):
|
||||
self.is_Running = False
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
import time
|
||||
|
||||
# from icecream import ic
|
||||
from PyQt6.QtCore import QThread
|
||||
from PyQt6.QtCore import pyqtSignal as Signal
|
||||
from PySide6.QtCore import QThread
|
||||
from PySide6.QtCore import Signal as Signal
|
||||
|
||||
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
|
||||
@@ -28,7 +35,7 @@ class AutoAdder(QThread):
|
||||
def run(self):
|
||||
self.db = Database()
|
||||
# show the dialog, start the thread to gather data and dynamically update progressbar and listwidget
|
||||
logger.info("Starting worker thread")
|
||||
log.info("Starting worker thread")
|
||||
item = 0
|
||||
for entry in self.data:
|
||||
try:
|
||||
@@ -40,11 +47,11 @@ class AutoAdder(QThread):
|
||||
|
||||
except Exception as e:
|
||||
# print(e)
|
||||
logger.exception(
|
||||
log.exception(
|
||||
f"The query failed with message {e} for signature {entry}"
|
||||
)
|
||||
continue
|
||||
if item == len(self.data):
|
||||
logger.info("Worker thread finished")
|
||||
log.info("Worker thread finished")
|
||||
# teminate thread
|
||||
self.finished.emit()
|
||||
|
||||
@@ -1,14 +1,22 @@
|
||||
import time
|
||||
|
||||
# from icecream import ic
|
||||
from PyQt6.QtCore import QThread
|
||||
from PyQt6.QtCore import pyqtSignal as Signal
|
||||
from PySide6.QtCore import QThread
|
||||
from PySide6.QtCore import Signal as Signal
|
||||
|
||||
from src.backend.database import Database
|
||||
|
||||
from src import LOG_DIR
|
||||
from src.logic.webrequest import BibTextTransformer, WebRequest
|
||||
|
||||
# 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):
|
||||
@@ -21,8 +29,8 @@ class AvailChecker(QThread):
|
||||
if links is None:
|
||||
links = []
|
||||
super().__init__(parent)
|
||||
logger.info("Starting worker thread")
|
||||
logger.info(
|
||||
log.info("Starting worker thread")
|
||||
log.info(
|
||||
"Checking availability for "
|
||||
+ str(links)
|
||||
+ " with appnumber "
|
||||
@@ -32,7 +40,7 @@ class AvailChecker(QThread):
|
||||
self.links = links
|
||||
self.appnumber = appnumber
|
||||
self.books = books
|
||||
logger.info(
|
||||
log.info(
|
||||
f"Started worker with appnumber: {self.appnumber} and links: {self.links} and {len(self.books)} books..."
|
||||
)
|
||||
time.sleep(2)
|
||||
@@ -42,7 +50,7 @@ class AvailChecker(QThread):
|
||||
state = 0
|
||||
count = 0
|
||||
for link in self.links:
|
||||
logger.info("Processing entry: " + str(link))
|
||||
log.info("Processing entry: " + str(link))
|
||||
data = WebRequest().set_apparat(self.appnumber).get_ppn(link).get_data()
|
||||
transformer = BibTextTransformer("RDS")
|
||||
rds = transformer.get_data(data).return_data("rds_availability")
|
||||
@@ -59,14 +67,14 @@ class AvailChecker(QThread):
|
||||
if book["bookdata"].signature == link:
|
||||
book_id = book["id"]
|
||||
break
|
||||
logger.info(f"State of {link}: " + str(state))
|
||||
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)
|
||||
|
||||
logger.info("Worker thread finished")
|
||||
log.info("Worker thread finished")
|
||||
# teminate thread
|
||||
|
||||
self.quit()
|
||||
|
||||
@@ -2,5 +2,5 @@ from .dataclass import ApparatData, BookData, Prof, Apparat, ELSA
|
||||
from .c_sort import custom_sort, sort_semesters_list
|
||||
from .constants import APP_NRS, PROF_TITLES, SEMAP_MEDIA_ACCOUNTS
|
||||
from .csvparser import csv_to_list
|
||||
from .wordparser import elsa_word_to_csv, word_docx_to_csv
|
||||
from .wordparser import elsa_word_to_csv, word_docx_to_csv, word_to_semap, SemapDocument
|
||||
from .zotero import ZoteroController
|
||||
|
||||
@@ -1,38 +1,38 @@
|
||||
import re
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
from enum import Enum
|
||||
|
||||
import json
|
||||
from typing import Union, Any, Optional
|
||||
|
||||
@dataclass
|
||||
class Prof:
|
||||
id: int = None
|
||||
_title: str = None
|
||||
firstname: str = None
|
||||
lastname: str = None
|
||||
fullname: str = None
|
||||
mail: str = None
|
||||
telnr: str = None
|
||||
id: Optional[int] = None
|
||||
_title: Optional[str] = None
|
||||
firstname: Optional[str] = None
|
||||
lastname: Optional[str] = None
|
||||
fullname: Optional[str] = None
|
||||
mail: Optional[str] = None
|
||||
telnr: Optional[str] = None
|
||||
|
||||
# add function that sets the data based on a dict
|
||||
def from_dict(self, data: dict):
|
||||
def from_dict(self, data: dict[str, Union[str, int]]):
|
||||
for key, value in data.items():
|
||||
if hasattr(self, key):
|
||||
setattr(self, key, value)
|
||||
return self
|
||||
|
||||
@property
|
||||
def title(self):
|
||||
def title(self) -> str:
|
||||
if self._title is None or self._title == "None":
|
||||
return ""
|
||||
return self._title
|
||||
|
||||
@title.setter
|
||||
def title(self, value):
|
||||
def title(self, value: str):
|
||||
self._title = value
|
||||
|
||||
# add function that sets the data from a tuple
|
||||
def from_tuple(self, data: tuple):
|
||||
def from_tuple(self, data: tuple[Union[str, int], ...]):
|
||||
setattr(self, "id", data[0])
|
||||
setattr(self, "_title", data[1])
|
||||
setattr(self, "firstname", data[2])
|
||||
@@ -42,7 +42,7 @@ class Prof:
|
||||
setattr(self, "telnr", data[6])
|
||||
return self
|
||||
|
||||
def name(self, comma=False):
|
||||
def name(self, comma: bool = False) -> Optional[str]:
|
||||
if self.firstname is None and self.lastname is None:
|
||||
if "," in self.fullname:
|
||||
self.firstname = self.fullname.split(",")[1].strip()
|
||||
@@ -62,9 +62,9 @@ class BookData:
|
||||
signature: str | None = None
|
||||
edition: str | None = None
|
||||
link: str | None = None
|
||||
isbn: str | list | None = field(default_factory=list)
|
||||
isbn: Union[str, list[str], None] = field(default_factory=list)
|
||||
author: str | None = None
|
||||
language: str | list | None = field(default_factory=list)
|
||||
language: Union[str, list[str], None] = field(default_factory=list)
|
||||
publisher: str | None = None
|
||||
place: str | None = None
|
||||
year: str | None = None
|
||||
@@ -73,35 +73,33 @@ class BookData:
|
||||
in_apparat: bool | None = False
|
||||
adis_idn: str | None = None
|
||||
|
||||
def from_dict(self, data: dict):
|
||||
def from_dict(self, data: dict) -> "BookData":
|
||||
for key, value in data.items():
|
||||
setattr(self, key, value)
|
||||
return self
|
||||
|
||||
def to_dict(self):
|
||||
return self.__dict__
|
||||
@property
|
||||
def to_dict(self) -> str:
|
||||
"""Convert the dataclass to a dictionary."""
|
||||
return json.dumps(self.__dict__, ensure_ascii=False)
|
||||
|
||||
def from_dataclass(self, dataclass):
|
||||
def from_dataclass(self, dataclass: Optional[Any]) -> None:
|
||||
if dataclass is None:
|
||||
return
|
||||
for key, value in dataclass.__dict__.items():
|
||||
setattr(self, key, value)
|
||||
|
||||
def from_string(self, data: str):
|
||||
if not data.startswith("BookData"):
|
||||
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
|
||||
def from_string(self, data: str) -> "BookData":
|
||||
ndata = json.loads(data)
|
||||
return BookData(**ndata)
|
||||
|
||||
|
||||
@dataclass
|
||||
class MailData:
|
||||
subject: str | None = None
|
||||
body: str | None = None
|
||||
mailto: str | None = None
|
||||
prof: str | None = None
|
||||
subject: Optional[str] = None
|
||||
body: Optional[str] = None
|
||||
mailto: Optional[str] = None
|
||||
prof: Optional[str] = None
|
||||
|
||||
|
||||
class Subjects(Enum):
|
||||
@@ -131,15 +129,15 @@ class Subjects(Enum):
|
||||
ECONOMICS = (24, "Wirtschaftslehre")
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
def id(self) -> int:
|
||||
return self.value[0]
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
def name(self) -> str:
|
||||
return self.value[1]
|
||||
|
||||
@classmethod
|
||||
def get_index(cls, name):
|
||||
def get_index(cls, name: str) -> Optional[int]:
|
||||
for i in cls:
|
||||
if i.name == name:
|
||||
return i.id - 1
|
||||
@@ -162,7 +160,7 @@ class Apparat:
|
||||
prof_id_adis: str | None = None
|
||||
konto: int | None = None
|
||||
|
||||
def from_tuple(self, data: tuple):
|
||||
def from_tuple(self, data: tuple[Any, ...]) -> "Apparat":
|
||||
self.id = data[0]
|
||||
self.name = data[1]
|
||||
self.prof_id = data[2]
|
||||
@@ -180,7 +178,7 @@ class Apparat:
|
||||
return self
|
||||
|
||||
@property
|
||||
def get_semester(self):
|
||||
def get_semester(self) -> Optional[str]:
|
||||
if self.extend_until is not None:
|
||||
return self.extend_until
|
||||
else:
|
||||
@@ -194,7 +192,7 @@ class ELSA:
|
||||
semester: str | None = None
|
||||
prof_id: int | None = None
|
||||
|
||||
def from_tuple(self, data):
|
||||
def from_tuple(self, data: tuple[Any, ...]) -> "ELSA":
|
||||
self.id = data[0]
|
||||
self.date = data[1]
|
||||
self.semester = data[2]
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
from docx import Document
|
||||
|
||||
data = {}
|
||||
wordDoc = Document("files/Semesterapparat - Anmeldung.docx")
|
||||
paragraphs = wordDoc.tables
|
||||
for table in paragraphs:
|
||||
for column in table.columns:
|
||||
cellcount = 0
|
||||
for _cell in column.cells:
|
||||
if cellcount < 12:
|
||||
cellcount += 1
|
||||
# print(f"cell:{cell.text}")
|
||||
|
||||
# # print(f'paragraphs[{i}]: {paragraphs[i]}')
|
||||
# data[i] = paragraphs[i]
|
||||
|
||||
# for i in range(0, len(paragraphs)):
|
||||
# for i in range(2, len(paragraphs)):
|
||||
# data[i] = paragraphs[i]
|
||||
|
||||
# print(data)
|
||||
|
||||
# for table in wordDoc.tables:
|
||||
# for row in table.rows:
|
||||
# # print('---')
|
||||
# for cell in row.cells:
|
||||
# # print(f'cell:{cell.text}')
|
||||
@@ -1,10 +0,0 @@
|
||||
import tabula
|
||||
|
||||
file = "files/Semesterapparat - Anmeldung.pdf"
|
||||
|
||||
|
||||
def extract_book_data(file):
|
||||
tabula.read_pdf(file, pages="all", encoding="utf-8", multiple_tables=True)
|
||||
tabula.convert_into(file, file.replace(".pdf"), output_format="csv", pages="all")
|
||||
with open("files/Semesterapparat - Anmeldung.csv", "r") as f:
|
||||
f.read()
|
||||
@@ -1,92 +0,0 @@
|
||||
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 +0,0 @@
|
||||
|
||||
53
src/logic/openai.py
Normal file
53
src/logic/openai.py
Normal file
@@ -0,0 +1,53 @@
|
||||
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
|
||||
@@ -1,194 +0,0 @@
|
||||
import os
|
||||
|
||||
# from icecream import ic
|
||||
from omegaconf import OmegaConf
|
||||
from PyQt6 import QtWidgets
|
||||
from PyQt6.QtCore import QThread
|
||||
from PyQt6.QtCore import pyqtSignal as Signal
|
||||
|
||||
from src.backend.database import Database
|
||||
from src.logic.log import MyLogger
|
||||
from src.logic.webrequest import BibTextTransformer, WebRequest
|
||||
|
||||
# from src.transformers import RDS_AVAIL_DATA
|
||||
from src.ui.dialogs.Ui_mail_preview import Ui_eMailPreview
|
||||
|
||||
config = OmegaConf.load("config.yaml")
|
||||
|
||||
|
||||
class BackgroundChecker(QThread):
|
||||
"""Check all apparats for available Books"""
|
||||
|
||||
pass
|
||||
|
||||
|
||||
class MockAvailCheck:
|
||||
def __init__(
|
||||
self, links: list = None, appnumber: int = None, parent=None, books=list[dict]
|
||||
):
|
||||
if links is None:
|
||||
links = []
|
||||
super().__init__(parent)
|
||||
self.logger = MyLogger("MockAvailChecker")
|
||||
self.logger.log_info("Starting worker thread")
|
||||
self.logger.log_info(
|
||||
"Checking availability for "
|
||||
+ str(links)
|
||||
+ " with appnumber "
|
||||
+ str(appnumber)
|
||||
+ "..."
|
||||
)
|
||||
self.links = links
|
||||
self.appnumber = appnumber
|
||||
self.books = books
|
||||
|
||||
def run(self):
|
||||
self.db = Database()
|
||||
state = 0
|
||||
count = 0
|
||||
result = []
|
||||
for link in self.links:
|
||||
self.logger.log_info("Processing entry: " + str(link))
|
||||
data = WebRequest().get_ppn(link).get_data()
|
||||
transformer = BibTextTransformer("RDS")
|
||||
rds = transformer.get_data(data).return_data("rds_availability")
|
||||
|
||||
for item in rds.items:
|
||||
sign = item.superlocation
|
||||
loc = item.location
|
||||
# ic(item.location, item.superlocation)
|
||||
if self.appnumber in sign or self.appnumber in loc:
|
||||
state = 1
|
||||
book_id = None
|
||||
for book in self.books:
|
||||
if book["bookdata"].signature == link:
|
||||
book_id = book["id"]
|
||||
break
|
||||
self.logger.log_info(f"State of {link}: " + str(state))
|
||||
print(
|
||||
"lock acquired, updating availability of "
|
||||
+ str(book_id)
|
||||
+ " to "
|
||||
+ str(state)
|
||||
)
|
||||
result.append((item.callnumber, state))
|
||||
count += 1
|
||||
return result
|
||||
|
||||
self.logger.log_info("Worker thread finished")
|
||||
# teminate thread
|
||||
|
||||
|
||||
class Mailer(Ui_eMailPreview):
|
||||
updateSignal = Signal(int)
|
||||
|
||||
def __init__(self, data=None, parent=None):
|
||||
super(QThread).__init__()
|
||||
super(Ui_eMailPreview).__init__()
|
||||
|
||||
self.logger = MyLogger("Mailer")
|
||||
self.data = data
|
||||
self.appid = data["app_id"]
|
||||
self.appname = data["app_name"]
|
||||
self.subject = data["app_subject"]
|
||||
self.profname = data["prof_name"]
|
||||
self.mail_data = ""
|
||||
self.prof_mail = data["prof_mail"]
|
||||
self.dialog = QtWidgets.QDialog()
|
||||
self.comboBox.currentIndexChanged.connect(self.set_mail)
|
||||
self.prof_name.setText(self.prof_name)
|
||||
self.mail_name.setText(self.prof_mail)
|
||||
self.load_mail_templates()
|
||||
self.gender_female.clicked.connect(self.set_mail)
|
||||
self.gender_male.clicked.connect(self.set_mail)
|
||||
self.gender_non.clicked.connect(self.set_mail)
|
||||
self.buttonBox.accepted.connect(self.createAndSendMail)
|
||||
|
||||
def load_mail_templates(self):
|
||||
# print("loading mail templates")
|
||||
mail_templates = os.listdir("mail_vorlagen")
|
||||
for template in mail_templates:
|
||||
self.comboBox.addItem(template)
|
||||
|
||||
def get_greeting(self):
|
||||
if self.gender_male.isChecked():
|
||||
return "Sehr geehrter Herr"
|
||||
elif self.gender_female.isChecked():
|
||||
return "Sehr geehrte Frau"
|
||||
elif self.gender_non.isChecked():
|
||||
return "Guten Tag"
|
||||
|
||||
def set_mail(self):
|
||||
email_template = self.comboBox.currentText()
|
||||
if email_template == "":
|
||||
return
|
||||
with open(f"mail_vorlagen/{email_template}", "r", encoding="utf-8") as f:
|
||||
mail_template = f.read()
|
||||
email_header = email_template.split(".eml")[0]
|
||||
if "{AppNr}" in email_template:
|
||||
email_header = email_template.split(".eml")[0]
|
||||
email_header = email_header.format(AppNr=self.appid, AppName=self.appname)
|
||||
self.mail_header.setText(email_header)
|
||||
self.mail_data = mail_template.split("<html>")[0]
|
||||
mail_html = mail_template.split("<html>")[1]
|
||||
mail_html = "<html>" + mail_html
|
||||
Appname = self.appname
|
||||
mail_html = mail_html.format(
|
||||
Profname=self.prof_name.text().split(" ")[-1],
|
||||
Appname=Appname,
|
||||
AppNr=self.appid,
|
||||
AppSubject=self.subject,
|
||||
greeting=self.get_greeting(),
|
||||
)
|
||||
|
||||
self.mail_body.setHtml(mail_html)
|
||||
|
||||
def createAndSendMail(self):
|
||||
import smtplib
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
|
||||
smtp_server = config["mail"]["smtp_server"]
|
||||
port: int = config["mail"]["port"]
|
||||
sender_email = config["mail"]["sender"]
|
||||
password = config["mail"]["password"]
|
||||
message = MIMEMultipart()
|
||||
message["From"] = sender_email
|
||||
message["To"] = self.prof_mail
|
||||
message["Subject"] = self.mail_header.text()
|
||||
mail_body = self.mail_body.toHtml()
|
||||
message.attach(MIMEText(mail_body, "html"))
|
||||
mail = message.as_string()
|
||||
|
||||
server = smtplib.SMTP_SSL(smtp_server, port)
|
||||
# server.starttls()
|
||||
# server.auth(mechanism="PLAIN")
|
||||
if config["mail"]["use_user_name"] == 1:
|
||||
# print(config["mail"]["user_name"])
|
||||
server.login(config["mail"]["user_name"], password)
|
||||
else:
|
||||
server.login(sender_email, password)
|
||||
server.sendmail(sender_email, self.prof_mail, mail)
|
||||
# print("Mail sent")
|
||||
# end active process
|
||||
server.quit()
|
||||
|
||||
|
||||
class MailThread(QThread):
|
||||
updateSignal = Signal(int)
|
||||
|
||||
def __init__(self, data=None, parent=None):
|
||||
super(QThread).__init__()
|
||||
super(MailThread).__init__()
|
||||
self.logger = MyLogger("MailThread")
|
||||
self.data = data
|
||||
|
||||
def show_ui(self):
|
||||
self.mailer = Mailer()
|
||||
self.mailer.__init__()
|
||||
self.mailer.dialog.exec_()
|
||||
self.mailer.dialog.show()
|
||||
|
||||
def run(self):
|
||||
self.show_ui()
|
||||
self.updateSignal.emit(1)
|
||||
@@ -1,266 +0,0 @@
|
||||
import sqlite3
|
||||
import time
|
||||
|
||||
from PyQt6.QtCore import QThread, pyqtSignal
|
||||
|
||||
from src.backend.database import Database
|
||||
from src.logic.log import MyLogger
|
||||
from src.logic.webrequest import BibTextTransformer, WebRequest
|
||||
|
||||
# from icecream import ic
|
||||
|
||||
|
||||
class BookGrabber(QThread):
|
||||
updateSignal = pyqtSignal(int, int)
|
||||
|
||||
def __init__(self, filename):
|
||||
super(BookGrabber, self).__init__(parent=None)
|
||||
self.is_Running = True
|
||||
self.logger = MyLogger("Worker")
|
||||
self.logger.log_info("Starting worker thread")
|
||||
self.data, self.app_id, self.prof_id, self.mode = self.readFile(filename)
|
||||
|
||||
self.book_id = None
|
||||
time.sleep(2)
|
||||
|
||||
def readFile(self, filename):
|
||||
with open(filename, "r") as file:
|
||||
data = file.readlines()
|
||||
app_id = data[0].strip()
|
||||
prof_id = data[1].strip()
|
||||
mode = data[2].strip()
|
||||
data = data[3:]
|
||||
return data, app_id, prof_id, mode
|
||||
|
||||
# def resetValues(self):
|
||||
# self.app_id = None
|
||||
# self.prof_id = None
|
||||
# self.mode = None
|
||||
# self.data = None
|
||||
# self.book_id = None
|
||||
|
||||
def run(self):
|
||||
while self.is_Running:
|
||||
self.db = Database()
|
||||
item = 0
|
||||
iterdata = self.data
|
||||
print(iterdata)
|
||||
for entry in iterdata:
|
||||
signature = str(entry)
|
||||
self.logger.log_info("Processing entry: " + signature)
|
||||
|
||||
webdata = WebRequest().get_ppn(entry).get_data()
|
||||
if webdata == "error":
|
||||
continue
|
||||
bd = BibTextTransformer(self.mode).get_data(webdata).return_data()
|
||||
transformer = BibTextTransformer("RDS")
|
||||
rds = transformer.get_data(webdata).return_data("rds_availability")
|
||||
bd.signature = entry
|
||||
# confirm lock is acquired
|
||||
print("lock acquired, adding book to database")
|
||||
self.db.addBookToDatabase(bd, self.app_id, self.prof_id)
|
||||
# get latest book id
|
||||
self.book_id = self.db.getLastBookId()
|
||||
self.logger.log_info("Added book to database")
|
||||
state = 0
|
||||
print(len(rds.items))
|
||||
for rds_item in rds.items:
|
||||
sign = rds_item.superlocation
|
||||
loc = rds_item.location
|
||||
# ic(sign, loc)
|
||||
# ic(rds_item)
|
||||
if self.app_id in sign or self.app_id in loc:
|
||||
state = 1
|
||||
break
|
||||
|
||||
# for book in self.books:
|
||||
# if book["bookdata"].signature == entry:
|
||||
# book_id = book["id"]
|
||||
# break
|
||||
self.logger.log_info(f"State of {signature}: {state}")
|
||||
print(
|
||||
"updating availability of "
|
||||
+ str(self.book_id)
|
||||
+ " to "
|
||||
+ str(state)
|
||||
)
|
||||
try:
|
||||
self.db.setAvailability(self.book_id, state)
|
||||
except sqlite3.OperationalError as e:
|
||||
self.logger.log_error(f"Failed to update availability: {e}")
|
||||
|
||||
# time.sleep(5)
|
||||
item += 1
|
||||
self.updateSignal.emit(item, len(self.data))
|
||||
self.logger.log_info("Worker thread finished")
|
||||
self.stop()
|
||||
if not self.is_Running:
|
||||
break
|
||||
|
||||
def stop(self):
|
||||
self.is_Running = False
|
||||
|
||||
|
||||
class AvailChecker(QThread):
|
||||
updateSignal = pyqtSignal(str, int)
|
||||
updateProgress = pyqtSignal(int, int)
|
||||
|
||||
def __init__(
|
||||
self, links: list = None, appnumber: int = None, parent=None, books=list[dict]
|
||||
):
|
||||
if links is None:
|
||||
links = []
|
||||
super().__init__(parent)
|
||||
self.logger = MyLogger("AvailChecker")
|
||||
self.logger.log_info("Starting worker thread")
|
||||
self.logger.log_info(
|
||||
"Checking availability for "
|
||||
+ str(links)
|
||||
+ " with appnumber "
|
||||
+ str(appnumber)
|
||||
+ "..."
|
||||
)
|
||||
self.links = links
|
||||
self.appnumber = appnumber
|
||||
self.books = books
|
||||
self.logger.log_info(
|
||||
f"Started worker with appnumber: {self.appnumber} and links: {self.links} and {len(self.books)} books..."
|
||||
)
|
||||
time.sleep(2)
|
||||
|
||||
def run(self):
|
||||
self.db = Database()
|
||||
state = 0
|
||||
count = 0
|
||||
for link in self.links:
|
||||
self.logger.log_info("Processing entry: " + str(link))
|
||||
data = WebRequest().get_ppn(link).get_data()
|
||||
transformer = BibTextTransformer("RDS")
|
||||
rds = transformer.get_data(data).return_data("rds_availability")
|
||||
|
||||
book_id = None
|
||||
for item in rds.items:
|
||||
sign = item.superlocation
|
||||
loc = item.location
|
||||
# print(item.location)
|
||||
if self.appnumber in sign or self.appnumber in loc:
|
||||
state = 1
|
||||
break
|
||||
for book in self.books:
|
||||
if book["bookdata"].signature == link:
|
||||
book_id = book["id"]
|
||||
break
|
||||
self.logger.log_info(f"State of {link}: " + str(state))
|
||||
print("Updating availability of " + str(book_id) + " to " + str(state))
|
||||
self.db.setAvailability(book_id, state)
|
||||
count += 1
|
||||
self.updateProgress.emit(count, len(self.links))
|
||||
self.updateSignal.emit(item.callnumber, state)
|
||||
|
||||
self.logger.log_info("Worker thread finished")
|
||||
# teminate thread
|
||||
|
||||
self.quit()
|
||||
|
||||
|
||||
class AutoAdder(QThread):
|
||||
updateSignal = pyqtSignal(int)
|
||||
|
||||
setTextSignal = pyqtSignal(int)
|
||||
progress = pyqtSignal(int)
|
||||
|
||||
def __init__(self, data=None, app_id=None, prof_id=None, parent=None):
|
||||
super().__init__(parent)
|
||||
self.logger = MyLogger("AutoAdder")
|
||||
self.data = data
|
||||
self.app_id = app_id
|
||||
self.prof_id = prof_id
|
||||
|
||||
print("Launched AutoAdder")
|
||||
print(self.data, self.app_id, self.prof_id)
|
||||
|
||||
def run(self):
|
||||
self.db = Database()
|
||||
# show the dialog, start the thread to gather data and dynamically update progressbar and listwidget
|
||||
self.logger.log_info("Starting worker thread")
|
||||
item = 0
|
||||
for entry in self.data:
|
||||
try:
|
||||
# webdata = WebRequest().get_ppn(entry).get_data()
|
||||
# bd = BibTextTransformer("ARRAY").get_data(webdata).return_data()
|
||||
# bd.signature = entry
|
||||
self.updateSignal.emit(item)
|
||||
self.setTextSignal.emit(entry)
|
||||
# qsleep
|
||||
item += 1
|
||||
self.progress.emit(item)
|
||||
print(item, len(self.data))
|
||||
time.sleep(1)
|
||||
|
||||
except Exception as e:
|
||||
print(e)
|
||||
self.logger.log_exception(
|
||||
f"The query failed with message {e} for signature {entry}"
|
||||
)
|
||||
continue
|
||||
if item == len(self.data):
|
||||
self.logger.log_info("Worker thread finished")
|
||||
# teminate thread
|
||||
self.finished.emit()
|
||||
|
||||
|
||||
class MockAvailCheck:
|
||||
def __init__(
|
||||
self, links: list = None, appnumber: int = None, parent=None, books=list[dict]
|
||||
):
|
||||
if links is None:
|
||||
links = []
|
||||
super().__init__(parent)
|
||||
self.logger = MyLogger("MockAvailChecker")
|
||||
self.logger.log_info("Starting worker thread")
|
||||
self.logger.log_info(
|
||||
"Checking availability for "
|
||||
+ str(links)
|
||||
+ " with appnumber "
|
||||
+ str(appnumber)
|
||||
+ "..."
|
||||
)
|
||||
self.links = links
|
||||
self.appnumber = appnumber
|
||||
self.books = books
|
||||
|
||||
def run(self):
|
||||
self.db = Database()
|
||||
state = 0
|
||||
count = 0
|
||||
result = []
|
||||
for link in self.links:
|
||||
self.logger.log_info("Processing entry: " + str(link))
|
||||
data = WebRequest().get_ppn(link).get_data()
|
||||
transformer = BibTextTransformer("RDS")
|
||||
rds = transformer.get_data(data).return_data("rds_availability")
|
||||
|
||||
for item in rds.items:
|
||||
sign = item.superlocation
|
||||
loc = item.location
|
||||
# ic(item.location, item.superlocation)
|
||||
if self.appnumber in sign or self.appnumber in loc:
|
||||
state = 1
|
||||
book_id = None
|
||||
for book in self.books:
|
||||
if book["bookdata"].signature == link:
|
||||
book_id = book["id"]
|
||||
break
|
||||
self.logger.log_info(f"State of {link}: " + str(state))
|
||||
print(
|
||||
"lock acquired, updating availability of "
|
||||
+ str(book_id)
|
||||
+ " to "
|
||||
+ str(state)
|
||||
)
|
||||
result.append((item.callnumber, state))
|
||||
count += 1
|
||||
return result
|
||||
|
||||
self.logger.log_info("Worker thread finished")
|
||||
# teminate thread
|
||||
@@ -1,13 +1,24 @@
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
from src import logger
|
||||
|
||||
|
||||
# import sleep_and_retry decorator to retry requests
|
||||
from ratelimit import limits, sleep_and_retry
|
||||
|
||||
from typing import Union, Any, Optional
|
||||
from src.logic.dataclass import BookData
|
||||
|
||||
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/{}/"
|
||||
@@ -38,23 +49,23 @@ class WebRequest:
|
||||
self.ppn = None
|
||||
self.data = None
|
||||
self.timeout = 5
|
||||
logger.info("Initialized WebRequest")
|
||||
log.info("Initialized WebRequest")
|
||||
|
||||
@property
|
||||
def use_any_book(self):
|
||||
"""use any book that matches the search term"""
|
||||
self.use_any = True
|
||||
logger.info("Using any book")
|
||||
log.info("Using any book")
|
||||
return self
|
||||
|
||||
def set_apparat(self, apparat):
|
||||
def set_apparat(self, apparat: int):
|
||||
self.apparat = apparat
|
||||
if int(self.apparat) < 10:
|
||||
self.apparat = f"0{self.apparat}"
|
||||
logger.info(f"Set apparat to {self.apparat}")
|
||||
log.info(f"Set apparat to {self.apparat}")
|
||||
return self
|
||||
|
||||
def get_ppn(self, signature):
|
||||
def get_ppn(self, signature: str):
|
||||
self.signature = signature
|
||||
if "+" in signature:
|
||||
signature = signature.replace("+", "%2B")
|
||||
@@ -65,15 +76,15 @@ class WebRequest:
|
||||
|
||||
@sleep_and_retry
|
||||
@limits(calls=RATE_LIMIT, period=RATE_PERIOD)
|
||||
def search_book(self, searchterm: str):
|
||||
def search_book(self, searchterm: str) -> str:
|
||||
response = requests.get(PPN_URL.format(searchterm), timeout=self.timeout)
|
||||
return response.text
|
||||
|
||||
def get_book_links(self, searchterm: str):
|
||||
response = self.search_book(searchterm)
|
||||
def get_book_links(self, searchterm: str) -> list[str]:
|
||||
response: str = self.search_book(searchterm) # type:ignore
|
||||
soup = BeautifulSoup(response, "html.parser")
|
||||
links = soup.find_all("a", class_="title getFull")
|
||||
res = []
|
||||
res: list[str] = []
|
||||
for link in links:
|
||||
res.append(BASE + link["href"])
|
||||
return res
|
||||
@@ -85,13 +96,15 @@ class WebRequest:
|
||||
response = requests.get(link, timeout=self.timeout)
|
||||
return response.text
|
||||
except requests.exceptions.RequestException as e:
|
||||
logger.error(f"Request failed: {e}")
|
||||
log.error(f"Request failed: {e}")
|
||||
return None
|
||||
|
||||
def get_data(self):
|
||||
def get_data(self) -> Union[list[str], None]:
|
||||
links = self.get_book_links(self.ppn)
|
||||
log.debug(f"Links: {links}")
|
||||
return_data: list[str] = []
|
||||
for link in links:
|
||||
result = self.search(link)
|
||||
result: str = self.search(link) # type:ignore
|
||||
# in result search for class col-xs-12 rds-dl RDS_LOCATION
|
||||
# if found, return text of href
|
||||
soup = BeautifulSoup(result, "html.parser")
|
||||
@@ -101,18 +114,18 @@ class WebRequest:
|
||||
item_location = location.find(
|
||||
"div", class_="col-xs-12 col-md-7 col-lg-8 rds-dl-panel"
|
||||
).text.strip()
|
||||
log.debug(f"Item location: {item_location}")
|
||||
if self.use_any:
|
||||
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
|
||||
else:
|
||||
logger.error("No <pre> tag found")
|
||||
log.error("No <pre> tag found")
|
||||
raise ValueError("No <pre> tag found")
|
||||
if f"Semesterapparat-{self.apparat}" in item_location:
|
||||
elif f"Semesterapparat-{self.apparat}" in item_location:
|
||||
pre_tag = soup.find_all("pre")
|
||||
return_data = []
|
||||
if pre_tag:
|
||||
@@ -121,8 +134,15 @@ class WebRequest:
|
||||
return_data.append(data)
|
||||
return return_data
|
||||
else:
|
||||
logger.error("No <pre> tag found")
|
||||
log.error("No <pre> tag found")
|
||||
return return_data
|
||||
else:
|
||||
log.error(
|
||||
f"Signature {self.signature} not found in {item_location}"
|
||||
)
|
||||
# return_data = []
|
||||
|
||||
return return_data
|
||||
|
||||
def get_data_elsa(self):
|
||||
links = self.get_book_links(self.ppn)
|
||||
@@ -142,7 +162,7 @@ class WebRequest:
|
||||
return_data.append(data)
|
||||
return return_data
|
||||
else:
|
||||
logger.error("No <pre> tag found")
|
||||
log.error("No <pre> tag found")
|
||||
return return_data
|
||||
|
||||
|
||||
@@ -160,7 +180,7 @@ class BibTextTransformer:
|
||||
self.field = None
|
||||
self.signature = None
|
||||
if mode not in self.valid_modes:
|
||||
logger.error(f"Mode {mode} not valid")
|
||||
log.error(f"Mode {mode} not valid")
|
||||
raise ValueError(f"Mode {mode} not valid")
|
||||
self.data = None
|
||||
# self.bookdata = BookData(**self.data)
|
||||
@@ -170,7 +190,7 @@ class BibTextTransformer:
|
||||
self.signature = signature
|
||||
return self
|
||||
|
||||
def get_data(self, data: list):
|
||||
def get_data(self, data: Union[list[str]] = None) -> "BibTextTransformer":
|
||||
RIS_IDENT = "TY -"
|
||||
ARRAY_IDENT = "[kid]"
|
||||
COinS_IDENT = "ctx_ver"
|
||||
@@ -203,7 +223,15 @@ class BibTextTransformer:
|
||||
self.data = line
|
||||
return self
|
||||
|
||||
def return_data(self, option=None) -> BookData:
|
||||
def return_data(
|
||||
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.
|
||||
|
||||
Args:
|
||||
@@ -225,7 +253,7 @@ class BibTextTransformer:
|
||||
return RISData().transform(self.data)
|
||||
case "RDS":
|
||||
return RDSData().transform(self.data).return_data(option)
|
||||
case None:
|
||||
case _:
|
||||
return None
|
||||
|
||||
# if self.mode == "ARRAY":
|
||||
@@ -242,7 +270,7 @@ class BibTextTransformer:
|
||||
|
||||
def cover(isbn):
|
||||
test_url = f"https://www.buchhandel.de/cover/{isbn}/{isbn}-cover-m.jpg"
|
||||
# print(test_url)
|
||||
# log.debug(test_url)
|
||||
data = requests.get(test_url, stream=True)
|
||||
return data.content
|
||||
|
||||
@@ -252,8 +280,8 @@ def get_content(soup, css_class):
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# print("main")
|
||||
# log.debug("main")
|
||||
link = "CU 8500 K64"
|
||||
data = WebRequest(71).get_ppn(link).get_data()
|
||||
bib = BibTextTransformer("ARRAY").get_data().return_data()
|
||||
print(bib)
|
||||
log.debug(bib)
|
||||
|
||||
@@ -1,22 +1,148 @@
|
||||
import sys
|
||||
import zipfile
|
||||
from dataclasses import dataclass
|
||||
from typing import Any, Union
|
||||
|
||||
import loguru
|
||||
import pandas as pd
|
||||
from bs4 import BeautifulSoup
|
||||
from docx import Document
|
||||
|
||||
from src import LOG_DIR
|
||||
from src.backend import Semester
|
||||
from src.logic.openai import name_tester, run_shortener, semester_converter
|
||||
|
||||
log = loguru.logger
|
||||
log.remove()
|
||||
log.add(sys.stdout, level="INFO")
|
||||
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
|
||||
|
||||
|
||||
|
||||
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
|
||||
|
||||
|
||||
def word_docx_to_csv(path) -> pd.DataFrame:
|
||||
@dataclass
|
||||
class Book:
|
||||
author: str = None
|
||||
year: str = None
|
||||
edition: str = None
|
||||
title: str = None
|
||||
location: str = None
|
||||
publisher: str = None
|
||||
signature: str = None
|
||||
internal_notes: str = None
|
||||
|
||||
@property
|
||||
def has_signature(self) -> bool:
|
||||
return self.signature is not None and self.signature != ""
|
||||
|
||||
@property
|
||||
def is_empty(self) -> bool:
|
||||
return all(
|
||||
[
|
||||
self.author == "",
|
||||
self.year == "",
|
||||
self.edition == "",
|
||||
self.title == "",
|
||||
self.location == "",
|
||||
self.publisher == "",
|
||||
self.signature == "",
|
||||
self.internal_notes == "",
|
||||
]
|
||||
)
|
||||
|
||||
def from_dict(self, data: dict[str, Any]):
|
||||
for key, value in data.items():
|
||||
value = value.strip()
|
||||
if value == "\u2002\u2002\u2002\u2002\u2002":
|
||||
value = ""
|
||||
|
||||
if key == "Autorenname(n):Nachname, Vorname":
|
||||
self.author = value
|
||||
elif key == "Jahr/Auflage":
|
||||
self.year = value.split("/")[0] if "/" in value else value
|
||||
self.edition = value.split("/")[1] if "/" in value else ""
|
||||
elif key == "Titel":
|
||||
self.title = value
|
||||
elif key == "Ort und Verlag":
|
||||
self.location = value.split(",")[0] if "," in value else value
|
||||
self.publisher = value.split(",")[1] if "," in value else ""
|
||||
elif key == "Standnummer":
|
||||
self.signature = value.strip()
|
||||
elif key == "Interne Vermerke":
|
||||
self.internal_notes = value
|
||||
|
||||
|
||||
@dataclass
|
||||
class SemapDocument:
|
||||
subject: str = None
|
||||
phoneNumber: int = None
|
||||
mail: str = None
|
||||
title: str = None
|
||||
title_suggestions: list[str] = None
|
||||
semester: Union[str, Semester] = 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
|
||||
def renameSemester(self) -> None:
|
||||
if ", Dauer" in self.semester:
|
||||
self.semester = self.semester.split(",")[0]
|
||||
self.eternal = True
|
||||
self.semester = Semester().from_string(self.semester)
|
||||
else:
|
||||
log.warning("Semester {} is not valid", self.semester)
|
||||
self.semester = Semester().from_string(semester_converter(self.semester))
|
||||
|
||||
@property
|
||||
def signatures(self) -> list[str]:
|
||||
if self.books is not None:
|
||||
return [book.signature for book in self.books if book.has_signature]
|
||||
return []
|
||||
|
||||
|
||||
def word_docx_to_csv(path: str) -> list[pd.DataFrame]:
|
||||
doc = Document(path)
|
||||
tables = doc.tables
|
||||
|
||||
m_data = []
|
||||
for table in tables:
|
||||
data = []
|
||||
for row in table.rows:
|
||||
row_data = []
|
||||
row_data: list[Any] = []
|
||||
for cell in row.cells:
|
||||
text = cell.text
|
||||
|
||||
text = text.replace("\n", "")
|
||||
row_data.append(text)
|
||||
if text == "Ihr Fach:":
|
||||
row_data.append(get_fach(path))
|
||||
data.append(row_data)
|
||||
df = pd.DataFrame(data)
|
||||
df.columns = df.iloc[0]
|
||||
@@ -24,8 +150,25 @@ def word_docx_to_csv(path) -> pd.DataFrame:
|
||||
|
||||
m_data.append(df)
|
||||
|
||||
df = m_data[2]
|
||||
return df
|
||||
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():
|
||||
@@ -87,7 +230,7 @@ def tuple_to_dict(tlist: tuple, type: str) -> dict:
|
||||
return ret
|
||||
|
||||
|
||||
def elsa_word_to_csv(path):
|
||||
def elsa_word_to_csv(path: str):
|
||||
doc = Document(path)
|
||||
# # print all lines in doc
|
||||
doctype = [para.text for para in doc.paragraphs if para.text != ""][-1]
|
||||
@@ -98,18 +241,18 @@ def elsa_word_to_csv(path):
|
||||
}
|
||||
tables = doc.tables
|
||||
|
||||
m_data = []
|
||||
m_data: list[pd.DataFrame] = []
|
||||
for table in tables:
|
||||
data = []
|
||||
data: list[list[str]] = []
|
||||
for row in table.rows:
|
||||
row_data = []
|
||||
row_data: list[str] = []
|
||||
for cell in row.cells:
|
||||
text = cell.text
|
||||
text = text.replace("\n", "")
|
||||
text = text.replace("\u2002", "")
|
||||
row_data.append(text)
|
||||
data.append(row_data)
|
||||
df = pd.DataFrame(data)
|
||||
df = pd.DataFrame(data)
|
||||
df.columns = df.iloc[0]
|
||||
df = df.iloc[1:]
|
||||
m_data.append(df)
|
||||
@@ -118,10 +261,55 @@ def elsa_word_to_csv(path):
|
||||
data = [
|
||||
row for row in df.itertuples(index=False, name=None) if row != tuples[doctype]
|
||||
]
|
||||
# print(data)
|
||||
# log.debug(data)
|
||||
return tuple_to_dict(data, doctype), doctype
|
||||
|
||||
|
||||
def word_to_semap(word_path: str) -> SemapDocument:
|
||||
log.info("Parsing Word Document {}", word_path)
|
||||
semap = SemapDocument()
|
||||
df = word_docx_to_csv(word_path)
|
||||
apparatdata = df[0]
|
||||
apparatdata = apparatdata.to_dict()
|
||||
keys = list(apparatdata.keys())
|
||||
print(apparatdata, keys)
|
||||
|
||||
appdata = {keys[i]: keys[i + 1] for i in range(0, len(keys) - 1, 2)}
|
||||
semap.phoneNumber = appdata["Telefon:"]
|
||||
semap.subject = appdata["Ihr Fach:"]
|
||||
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 = apparatdata.to_dict()
|
||||
keys = list(apparatdata.keys())
|
||||
appdata = {keys[i]: keys[i + 1] for i in range(0, len(keys), 2)}
|
||||
semap.title = appdata["Veranstaltung:"]
|
||||
semap.semester = appdata["Semester:"]
|
||||
semap.renameSemester
|
||||
semap.nameSetter
|
||||
|
||||
books = df[2]
|
||||
booklist = []
|
||||
for i in range(len(books)):
|
||||
if books.iloc[i].isnull().all():
|
||||
continue
|
||||
data = books.iloc[i].to_dict()
|
||||
book = Book()
|
||||
book.from_dict(data)
|
||||
if book.is_empty:
|
||||
continue
|
||||
elif not book.has_signature:
|
||||
continue
|
||||
else:
|
||||
booklist.append(book)
|
||||
log.info("Found {} books", len(booklist))
|
||||
semap.books = booklist
|
||||
return semap
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
else_df = elsa_word_to_csv("C:/Users/aky547/Desktop/Antrag ELSA Schweitzer.docx")
|
||||
# print(else_df)
|
||||
else_df = elsa_word_to_csv(
|
||||
"C:/Users/aky547/Desktop/ELSA_Bestellung Scann Der Westen und der Rest.docx"
|
||||
)
|
||||
print(else_df)
|
||||
|
||||
@@ -160,6 +160,8 @@ class ZoteroController:
|
||||
zoterocfg = settings.zotero
|
||||
|
||||
def __init__(self):
|
||||
if self.zoterocfg.library_id is None:
|
||||
return
|
||||
self.zot = zotero.Zotero(
|
||||
self.zoterocfg.library_id,
|
||||
self.zoterocfg.library_type,
|
||||
|
||||
@@ -6,9 +6,15 @@ from dataclasses import dataclass
|
||||
from dataclasses import field as dataclass_field
|
||||
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()
|
||||
log.add(sys.stdout, level="INFO")
|
||||
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
|
||||
|
||||
|
||||
###Pydatnic models
|
||||
@@ -131,8 +137,8 @@ class ARRAYData:
|
||||
return data
|
||||
|
||||
except Exception:
|
||||
# # print(f"ARRAYData.transform failed, {source}, {search}")
|
||||
logger.exception(f"ARRAYData.transform failed, no string {search}")
|
||||
# # log.debug(f"ARRAYData.transform failed, {source}, {search}")
|
||||
log.exception(f"ARRAYData.transform failed, no string {search}")
|
||||
return ""
|
||||
|
||||
def _get_list_entry(source: str, search: str, entry: str) -> str:
|
||||
@@ -509,4 +515,4 @@ if __name__ == "__main__":
|
||||
|
||||
ret = RDSData().transform(data)
|
||||
data = ret.return_data("rds_availability")
|
||||
# print(data)
|
||||
# log.debug(data)
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
# 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"))
|
||||
@@ -1,6 +1,6 @@
|
||||
import pathlib
|
||||
|
||||
from .Ui_semesterapparat_ui import Ui_MainWindow as Ui_Semesterapparat
|
||||
from .semesterapparat_ui_ui import Ui_MainWindow as Ui_Semesterapparat
|
||||
|
||||
# from .dialogs import (
|
||||
# ApparatExtendDialog,
|
||||
|
||||
157
src/ui/dialogs/Ui_edit_bookdata.py
Normal file
157
src/ui/dialogs/Ui_edit_bookdata.py
Normal file
@@ -0,0 +1,157 @@
|
||||
# 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(),
|
||||
)
|
||||
109
src/ui/dialogs/Ui_fileparser.py
Normal file
109
src/ui/dialogs/Ui_fileparser.py
Normal file
@@ -0,0 +1,109 @@
|
||||
# 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()
|
||||
112
src/ui/dialogs/Ui_login.py
Normal file
112
src/ui/dialogs/Ui_login.py
Normal file
@@ -0,0 +1,112 @@
|
||||
# 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())
|
||||
183
src/ui/dialogs/Ui_mail_preview.py
Normal file
183
src/ui/dialogs/Ui_mail_preview.py
Normal file
@@ -0,0 +1,183 @@
|
||||
# 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()
|
||||
240
src/ui/dialogs/Ui_medianadder.py
Normal file
240
src/ui/dialogs/Ui_medianadder.py
Normal file
@@ -0,0 +1,240 @@
|
||||
# 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()))
|
||||
4
src/ui/dialogs/Ui_medianadder.ts
Normal file
4
src/ui/dialogs/Ui_medianadder.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1">
|
||||
</TS>
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file '/home/alexander/GitHub/Semesterapparate/ui/dialogs/new_subject.ui'
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\new_subject.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.5.3
|
||||
# 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 PyQt6 import QtCore, QtWidgets
|
||||
from PySide6 import QtCore, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
@@ -17,56 +17,47 @@ class Ui_Dialog(object):
|
||||
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout()
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.label = QtWidgets.QLabel(parent=Dialog)
|
||||
self.label = QtWidgets.QLabel(Dialog)
|
||||
self.label.setObjectName("label")
|
||||
self.verticalLayout.addWidget(self.label)
|
||||
self.gridLayout = QtWidgets.QGridLayout()
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
spacerItem = QtWidgets.QSpacerItem(
|
||||
40,
|
||||
20,
|
||||
QtWidgets.QSizePolicy.Policy.Expanding,
|
||||
QtWidgets.QSizePolicy.Policy.Minimum,
|
||||
)
|
||||
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
|
||||
self.gridLayout.addItem(spacerItem, 0, 1, 1, 1)
|
||||
self.checkBox = QtWidgets.QCheckBox(parent=Dialog)
|
||||
self.checkBox = QtWidgets.QCheckBox(Dialog)
|
||||
self.checkBox.setObjectName("checkBox")
|
||||
self.gridLayout.addWidget(self.checkBox, 0, 0, 1, 1)
|
||||
self.verticalLayout.addLayout(self.gridLayout)
|
||||
self.verticalLayout_2.addLayout(self.verticalLayout)
|
||||
self.frame = QtWidgets.QFrame(parent=Dialog)
|
||||
self.frame = QtWidgets.QFrame(Dialog)
|
||||
self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
|
||||
self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
|
||||
self.frame.setObjectName("frame")
|
||||
self.label_2 = QtWidgets.QLabel(parent=self.frame)
|
||||
self.label_2 = QtWidgets.QLabel(self.frame)
|
||||
self.label_2.setGeometry(QtCore.QRect(0, 10, 141, 16))
|
||||
self.label_2.setObjectName("label_2")
|
||||
self.lineEdit = QtWidgets.QLineEdit(parent=self.frame)
|
||||
self.lineEdit = QtWidgets.QLineEdit(self.frame)
|
||||
self.lineEdit.setGeometry(QtCore.QRect(0, 30, 141, 20))
|
||||
self.lineEdit.setObjectName("lineEdit")
|
||||
self.verticalLayout_2.addWidget(self.frame)
|
||||
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
|
||||
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
|
||||
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
|
||||
self.buttonBox.setStandardButtons(
|
||||
QtWidgets.QDialogButtonBox.StandardButton.Cancel
|
||||
| QtWidgets.QDialogButtonBox.StandardButton.Ok
|
||||
)
|
||||
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
|
||||
self.buttonBox.setObjectName("buttonBox")
|
||||
self.verticalLayout_2.addWidget(self.buttonBox)
|
||||
self.frame.setVisible(False)
|
||||
self.checkBox.stateChanged.connect(lambda: self.frame.setVisible(self.checkBox.isChecked()))
|
||||
|
||||
self.retranslateUi(Dialog)
|
||||
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
|
||||
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
|
||||
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",
|
||||
"Das eingegebene Fach wurde nicht in der Datenbank gefunden. Soll es angelegt werden?",
|
||||
)
|
||||
)
|
||||
self.label.setText(_translate("Dialog", "Das eingegebene Fach wurde nicht in der Datenbank gefunden. Soll es angelegt werden?"))
|
||||
self.checkBox.setText(_translate("Dialog", "Ja"))
|
||||
self.label_2.setText(_translate("Dialog", "Name des Neuen Faches:"))
|
||||
def return_state(self):
|
||||
return self.lineEdit.text()
|
||||
158
src/ui/dialogs/Ui_parsed_titles.py
Normal file
158
src/ui/dialogs/Ui_parsed_titles.py
Normal file
@@ -0,0 +1,158 @@
|
||||
# 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)
|
||||
52
src/ui/dialogs/Ui_reminder.py
Normal file
52
src/ui/dialogs/Ui_reminder.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# 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"),
|
||||
}
|
||||
202
src/ui/dialogs/Ui_settings.py
Normal file
202
src/ui/dialogs/Ui_settings.py
Normal file
@@ -0,0 +1,202 @@
|
||||
# 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
|
||||
4
src/ui/dialogs/Ui_settings.ts
Normal file
4
src/ui/dialogs/Ui_settings.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1">
|
||||
</TS>
|
||||
@@ -1,30 +1,31 @@
|
||||
__all__ = [
|
||||
"add_bookdata_ui",
|
||||
"edit_bookdata_ui",
|
||||
"login_ui",
|
||||
"BookDataUI",
|
||||
"LoginDialog",
|
||||
"Mail_Dialog",
|
||||
"MailTemplateDialog",
|
||||
"medienadder_ui",
|
||||
"parsed_titles_ui",
|
||||
"MedienAdder",
|
||||
"ParsedTitles",
|
||||
"popus_confirm",
|
||||
"reminder_ui",
|
||||
"Settings",
|
||||
"ReminderDialog",
|
||||
"About",
|
||||
"ElsaGenConfirm",
|
||||
"ElsaAddEntry",
|
||||
"ApparatExtendDialog",
|
||||
"DocumentPrintDialog",
|
||||
"Settings",
|
||||
]
|
||||
from .bookdata import BookDataUI as edit_bookdata_ui
|
||||
from .login import LoginDialog as login_ui
|
||||
from .bookdata import BookDataUI
|
||||
from .login import LoginDialog
|
||||
from .mail import Mail_Dialog
|
||||
from .mailTemplate import MailTemplateDialog
|
||||
from .medienadder import MedienAdder as medienadder_ui
|
||||
from .parsed_titles import ParsedTitles as parsed_titles_ui
|
||||
from .medienadder import MedienAdder
|
||||
from .parsed_titles import ParsedTitles
|
||||
from .popup_confirm import ConfirmDialog as popus_confirm
|
||||
from .reminder import ReminderDialog as reminder_ui
|
||||
from .reminder import ReminderDialog
|
||||
from .about import About
|
||||
from .elsa_gen_confirm import ElsaGenConfirm
|
||||
from .elsa_add_entry import ElsaAddEntry
|
||||
from .app_ext import ApparatExtendDialog
|
||||
from .docuprint import DocumentPrintDialog
|
||||
|
||||
from .settings import Settings
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from .dialog_sources.Ui_about import Ui_about
|
||||
from PyQt6 import QtWidgets
|
||||
from PyQt6.QtCore import PYQT_VERSION_STR
|
||||
from PySide6 import QtWidgets
|
||||
import PySide6
|
||||
from src import Icon, __version__, __author__
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ class About(QtWidgets.QDialog, Ui_about):
|
||||
data = {
|
||||
"Version": __version__,
|
||||
"Author": __author__,
|
||||
"PyQt6 Version": PYQT_VERSION_STR,
|
||||
"PySide6 Version": PySide6.__version__,
|
||||
"License": "MIT License",
|
||||
"Icons": """Google Material Design Icons (https://fonts.google.com/icons)
|
||||
StableDiffusion (logo)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from PyQt6 import QtWidgets
|
||||
from PySide6 import QtWidgets
|
||||
from .dialog_sources.Ui_apparat_extend import Ui_Dialog
|
||||
from src import Icon
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from PyQt6 import QtWidgets
|
||||
from PySide6 import QtWidgets
|
||||
|
||||
from src.logic.dataclass import BookData
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from .dialog_sources.Ui_confirm_extend import Ui_extend_confirm
|
||||
from PyQt6 import QtWidgets
|
||||
from PySide6 import QtWidgets
|
||||
|
||||
|
||||
class ConfirmExtend(QtWidgets.QDialog, Ui_extend_confirm):
|
||||
|
||||
32
src/ui/dialogs/confirm_extend_ui.py
Normal file
32
src/ui/dialogs/confirm_extend_ui.py
Normal file
@@ -0,0 +1,32 @@
|
||||
# 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"))
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\about.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.6.1
|
||||
# Created by: PySide6 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, QtGui, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_about(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\app_status.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.6.1
|
||||
# Created by: PySide6 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
|
||||
from PySide6 import QtCore
|
||||
|
||||
|
||||
class Ui_Form(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\apparat_extend.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.7.1
|
||||
# Created by: PySide6 UI code generator 6.7.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, QtGui, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\confirm_extend.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.7.1
|
||||
# Created by: PySide6 UI code generator 6.7.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
|
||||
from PySide6 import QtCore, QtWidgets
|
||||
|
||||
|
||||
class Ui_extend_confirm(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\edit_bookdata.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.6.1
|
||||
# Created by: PySide6 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, QtGui, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
|
||||
@@ -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'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.7.1
|
||||
# Created by: PySide6 UI code generator 6.7.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
|
||||
from PySide6 import QtCore, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
|
||||
@@ -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'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.6.1
|
||||
# Created by: PySide6 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, QtGui, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
|
||||
@@ -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'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.6.1
|
||||
# Created by: PySide6 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, QtGui, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\login.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.6.1
|
||||
# Created by: PySide6 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, QtGui, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\mail_preview.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.7.1
|
||||
# Created by: PySide6 UI code generator 6.7.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, QtGui, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_eMailPreview(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\medianadder.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.7.1
|
||||
# Created by: PySide6 UI code generator 6.7.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, QtGui, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\newMailTemplateDesigner.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.6.1
|
||||
# Created by: PySide6 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
|
||||
from PySide6 import QtCore, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\parsed_titles.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.6.1
|
||||
# Created by: PySide6 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, QtGui, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Form(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\reminder.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.6.1
|
||||
# Created by: PySide6 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
|
||||
from PySide6 import QtCore, QtWidgets
|
||||
|
||||
|
||||
class Ui_Erinnerung(object):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\settings.ui'
|
||||
#
|
||||
# Created by: PyQt6 UI code generator 6.7.1
|
||||
# Created by: PySide6 UI code generator 6.7.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, QtGui, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
@@ -14,10 +14,7 @@ class Ui_Dialog(object):
|
||||
Dialog.setObjectName("Dialog")
|
||||
Dialog.setWindowModality(QtCore.Qt.WindowModality.NonModal)
|
||||
Dialog.resize(651, 679)
|
||||
sizePolicy = QtWidgets.QSizePolicy(
|
||||
QtWidgets.QSizePolicy.Policy.MinimumExpanding,
|
||||
QtWidgets.QSizePolicy.Policy.MinimumExpanding,
|
||||
)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
|
||||
@@ -25,10 +22,7 @@ class Ui_Dialog(object):
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.toolBox = QtWidgets.QToolBox(parent=Dialog)
|
||||
sizePolicy = QtWidgets.QSizePolicy(
|
||||
QtWidgets.QSizePolicy.Policy.MinimumExpanding,
|
||||
QtWidgets.QSizePolicy.Policy.MinimumExpanding,
|
||||
)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.toolBox.sizePolicy().hasHeightForWidth())
|
||||
@@ -37,10 +31,7 @@ class Ui_Dialog(object):
|
||||
self.toolBox.setObjectName("toolBox")
|
||||
self.page_1 = QtWidgets.QWidget()
|
||||
self.page_1.setGeometry(QtCore.QRect(0, 0, 633, 511))
|
||||
sizePolicy = QtWidgets.QSizePolicy(
|
||||
QtWidgets.QSizePolicy.Policy.MinimumExpanding,
|
||||
QtWidgets.QSizePolicy.Policy.MinimumExpanding,
|
||||
)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.page_1.sizePolicy().hasHeightForWidth())
|
||||
@@ -73,12 +64,7 @@ class Ui_Dialog(object):
|
||||
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,
|
||||
)
|
||||
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()
|
||||
@@ -99,10 +85,7 @@ class Ui_Dialog(object):
|
||||
self.label_3.setObjectName("label_3")
|
||||
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
|
||||
self.zotero_api_key = QtWidgets.QLineEdit(parent=self.page_2)
|
||||
self.zotero_api_key.setInputMethodHints(
|
||||
QtCore.Qt.InputMethodHint.ImhHiddenText
|
||||
| QtCore.Qt.InputMethodHint.ImhSensitiveData
|
||||
)
|
||||
self.zotero_api_key.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhHiddenText|QtCore.Qt.InputMethodHint.ImhSensitiveData)
|
||||
self.zotero_api_key.setObjectName("zotero_api_key")
|
||||
self.gridLayout.addWidget(self.zotero_api_key, 0, 2, 1, 1)
|
||||
self.label_2 = QtWidgets.QLabel(parent=self.page_2)
|
||||
@@ -112,12 +95,7 @@ class Ui_Dialog(object):
|
||||
self.toggle_api_visibility.setText("")
|
||||
self.toggle_api_visibility.setObjectName("toggle_api_visibility")
|
||||
self.gridLayout.addWidget(self.toggle_api_visibility, 0, 3, 1, 1)
|
||||
spacerItem1 = QtWidgets.QSpacerItem(
|
||||
20,
|
||||
40,
|
||||
QtWidgets.QSizePolicy.Policy.Minimum,
|
||||
QtWidgets.QSizePolicy.Policy.Expanding,
|
||||
)
|
||||
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
|
||||
self.gridLayout.addItem(spacerItem1, 3, 2, 1, 1)
|
||||
self.toolBox.addItem(self.page_2, "")
|
||||
self.page_3 = QtWidgets.QWidget()
|
||||
@@ -133,67 +111,63 @@ class Ui_Dialog(object):
|
||||
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
|
||||
self.gridLayout_2 = QtWidgets.QGridLayout()
|
||||
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||
self.smtp_address = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
|
||||
self.smtp_address.setClearButtonEnabled(True)
|
||||
self.smtp_address.setObjectName("smtp_address")
|
||||
self.gridLayout_2.addWidget(self.smtp_address, 0, 1, 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.use_username_smtp_login = QtWidgets.QCheckBox(
|
||||
parent=self.email_settingsPage1_2
|
||||
)
|
||||
self.use_username_smtp_login = QtWidgets.QCheckBox(parent=self.email_settingsPage1_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.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_10 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
|
||||
self.label_10.setObjectName("label_10")
|
||||
self.gridLayout_2.addWidget(self.label_10, 5, 0, 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.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, 6, 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.label = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
|
||||
self.label.setObjectName("label")
|
||||
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
|
||||
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.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.email_settingsPage1_2)
|
||||
self.label_6.setObjectName("label_6")
|
||||
self.gridLayout_2.addWidget(self.label_6, 1, 0, 1, 1)
|
||||
self.smtp_address = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
|
||||
self.smtp_address.setClearButtonEnabled(True)
|
||||
self.smtp_address.setObjectName("smtp_address")
|
||||
self.gridLayout_2.addWidget(self.smtp_address, 0, 1, 1, 1)
|
||||
self.label = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
|
||||
self.label.setObjectName("label")
|
||||
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
|
||||
self.label_10 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
|
||||
self.label_10.setObjectName("label_10")
|
||||
self.gridLayout_2.addWidget(self.label_10, 5, 0, 1, 1)
|
||||
self.togglePassword = QtWidgets.QPushButton(parent=self.email_settingsPage1_2)
|
||||
self.togglePassword.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
|
||||
self.togglePassword.setText("")
|
||||
self.togglePassword.setObjectName("togglePassword")
|
||||
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_settingsPage2_2 = QtWidgets.QWidget()
|
||||
@@ -204,12 +178,7 @@ class Ui_Dialog(object):
|
||||
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
||||
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
|
||||
spacerItem2 = QtWidgets.QSpacerItem(
|
||||
40,
|
||||
20,
|
||||
QtWidgets.QSizePolicy.Policy.Expanding,
|
||||
QtWidgets.QSizePolicy.Policy.Minimum,
|
||||
)
|
||||
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
|
||||
self.horizontalLayout_3.addItem(spacerItem2)
|
||||
self.bold = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
|
||||
self.bold.setCheckable(True)
|
||||
@@ -223,12 +192,7 @@ class Ui_Dialog(object):
|
||||
self.underscore.setCheckable(True)
|
||||
self.underscore.setObjectName("underscore")
|
||||
self.horizontalLayout_3.addWidget(self.underscore)
|
||||
spacerItem3 = QtWidgets.QSpacerItem(
|
||||
40,
|
||||
20,
|
||||
QtWidgets.QSizePolicy.Policy.Expanding,
|
||||
QtWidgets.QSizePolicy.Policy.Minimum,
|
||||
)
|
||||
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
|
||||
self.horizontalLayout_3.addItem(spacerItem3)
|
||||
self.verticalLayout_2.addLayout(self.horizontalLayout_3)
|
||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
||||
@@ -254,12 +218,7 @@ class Ui_Dialog(object):
|
||||
self.font_size.addItem("")
|
||||
self.font_size.addItem("")
|
||||
self.horizontalLayout.addWidget(self.font_size)
|
||||
spacerItem4 = QtWidgets.QSpacerItem(
|
||||
40,
|
||||
20,
|
||||
QtWidgets.QSizePolicy.Policy.Expanding,
|
||||
QtWidgets.QSizePolicy.Policy.Minimum,
|
||||
)
|
||||
spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
|
||||
self.horizontalLayout.addItem(spacerItem4)
|
||||
self.verticalLayout_2.addLayout(self.horizontalLayout)
|
||||
self.verticalLayout_3.addLayout(self.verticalLayout_2)
|
||||
@@ -316,10 +275,7 @@ class Ui_Dialog(object):
|
||||
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.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)
|
||||
@@ -327,63 +283,39 @@ class Ui_Dialog(object):
|
||||
self.label_11.setBuddy(self.db_path)
|
||||
|
||||
self.retranslateUi(Dialog)
|
||||
self.toolBox.setCurrentIndex(3)
|
||||
self.toolBox.setCurrentIndex(2)
|
||||
self.email_settings.setCurrentIndex(0)
|
||||
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
|
||||
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
|
||||
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.db_name.setText(_translate("Dialog", "sap.db"))
|
||||
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.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.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.toolBox.setItemText(
|
||||
self.toolBox.indexOf(self.page_1), _translate("Dialog", "Datenbank")
|
||||
)
|
||||
self.toolBox.setItemText(self.toolBox.indexOf(self.page_1), _translate("Dialog", "Datenbank"))
|
||||
self.label_4.setText(_translate("Dialog", "Bibliothekstyp"))
|
||||
self.label_3.setText(_translate("Dialog", "Bibliotheks-ID"))
|
||||
self.label_2.setText(_translate("Dialog", "API Key"))
|
||||
self.toolBox.setItemText(
|
||||
self.toolBox.indexOf(self.page_2), _translate("Dialog", "Zotero")
|
||||
)
|
||||
self.label_8.setText(_translate("Dialog", "Nutzername"))
|
||||
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 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.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"
|
||||
" Anmelden verwenden"))
|
||||
self.label_6.setText(_translate("Dialog", "Port"))
|
||||
self.email_settings.setTabText(
|
||||
self.email_settings.indexOf(self.email_settingsPage1_2),
|
||||
_translate("Dialog", "Allgemeines"),
|
||||
)
|
||||
self.label_7.setText(_translate("Dialog", "Sender-eMail"))
|
||||
self.mail_username.setStatusTip(_translate("Dialog", "Kürzel, von der Hochschule vergeben, bsp: Aky547"))
|
||||
self.label.setText(_translate("Dialog", "SMTP-Server"))
|
||||
self.label_10.setText(_translate("Dialog", "Passwort"))
|
||||
self.label_8.setText(_translate("Dialog", "Nutzername"))
|
||||
self.label_13.setText(_translate("Dialog", "Printmail"))
|
||||
self.email_settings.setTabText(self.email_settings.indexOf(self.email_settingsPage1_2), _translate("Dialog", "Allgemeines"))
|
||||
self.bold.setText(_translate("Dialog", "Fett"))
|
||||
self.italic.setText(_translate("Dialog", "Kursiv"))
|
||||
self.underscore.setText(_translate("Dialog", "Unterstrichen"))
|
||||
@@ -403,14 +335,7 @@ class Ui_Dialog(object):
|
||||
self.font_size.setItemText(13, _translate("Dialog", "48"))
|
||||
self.font_size.setItemText(14, _translate("Dialog", "72"))
|
||||
self.debug.setText(_translate("Dialog", "Debug"))
|
||||
self.email_settings.setTabText(
|
||||
self.email_settings.indexOf(self.email_settingsPage2_2),
|
||||
_translate("Dialog", "Signatur"),
|
||||
)
|
||||
self.toolBox.setItemText(
|
||||
self.toolBox.indexOf(self.page_3), _translate("Dialog", "e-Mail")
|
||||
)
|
||||
self.email_settings.setTabText(self.email_settings.indexOf(self.email_settingsPage2_2), _translate("Dialog", "Signatur"))
|
||||
self.toolBox.setItemText(self.toolBox.indexOf(self.page_3), _translate("Dialog", "e-Mail"))
|
||||
self.groupBox.setTitle(_translate("Dialog", "Farben"))
|
||||
self.toolBox.setItemText(
|
||||
self.toolBox.indexOf(self.page_4), _translate("Dialog", "Icons")
|
||||
)
|
||||
self.toolBox.setItemText(self.toolBox.indexOf(self.page_4), _translate("Dialog", "Icons"))
|
||||
|
||||
38
src/ui/dialogs/dialog_sources/about_ui.py
Normal file
38
src/ui/dialogs/dialog_sources/about_ui.py
Normal file
@@ -0,0 +1,38 @@
|
||||
# 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"))
|
||||
22
src/ui/dialogs/dialog_sources/app_status_ui.py
Normal file
22
src/ui/dialogs/dialog_sources/app_status_ui.py
Normal file
@@ -0,0 +1,22 @@
|
||||
# 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"))
|
||||
74
src/ui/dialogs/dialog_sources/apparat_extend_ui.py
Normal file
74
src/ui/dialogs/dialog_sources/apparat_extend_ui.py
Normal file
@@ -0,0 +1,74 @@
|
||||
# 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"))
|
||||
34
src/ui/dialogs/dialog_sources/confirm_extend_ui.py
Normal file
34
src/ui/dialogs/dialog_sources/confirm_extend_ui.py
Normal file
@@ -0,0 +1,34 @@
|
||||
# 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"))
|
||||
232
src/ui/dialogs/dialog_sources/documentprint.ui
Normal file
232
src/ui/dialogs/dialog_sources/documentprint.ui
Normal file
@@ -0,0 +1,232 @@
|
||||
<?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><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Segoe UI'; font-size:9pt; font-weight:700; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SELECT</p>
|
||||
<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>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">from</p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> semesterapparat</p>
|
||||
<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>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">WHERE</p>
|
||||
<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>
|
||||
<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>
|
||||
<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></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>
|
||||
142
src/ui/dialogs/dialog_sources/documentprint_ui.py
Normal file
142
src/ui/dialogs/dialog_sources/documentprint_ui.py
Normal file
@@ -0,0 +1,142 @@
|
||||
# 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"))
|
||||
117
src/ui/dialogs/dialog_sources/edit_bookdata_ui.py
Normal file
117
src/ui/dialogs/dialog_sources/edit_bookdata_ui.py
Normal file
@@ -0,0 +1,117 @@
|
||||
# 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"))
|
||||
411
src/ui/dialogs/dialog_sources/elsa_add_table_entry_ui.py
Normal file
411
src/ui/dialogs/dialog_sources/elsa_add_table_entry_ui.py
Normal file
@@ -0,0 +1,411 @@
|
||||
# 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"))
|
||||
76
src/ui/dialogs/dialog_sources/elsa_generate_citation_ui.py
Normal file
76
src/ui/dialogs/dialog_sources/elsa_generate_citation_ui.py
Normal file
@@ -0,0 +1,76 @@
|
||||
# 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"))
|
||||
120
src/ui/dialogs/dialog_sources/elsa_generator_confirm_ui.py
Normal file
120
src/ui/dialogs/dialog_sources/elsa_generator_confirm_ui.py
Normal file
@@ -0,0 +1,120 @@
|
||||
# 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"))
|
||||
49
src/ui/dialogs/dialog_sources/login_ui.py
Normal file
49
src/ui/dialogs/dialog_sources/login_ui.py
Normal file
@@ -0,0 +1,49 @@
|
||||
# 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"))
|
||||
115
src/ui/dialogs/dialog_sources/mail_preview_ui.py
Normal file
115
src/ui/dialogs/dialog_sources/mail_preview_ui.py
Normal file
@@ -0,0 +1,115 @@
|
||||
# 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"))
|
||||
360
src/ui/dialogs/dialog_sources/medianadder_ui.py
Normal file
360
src/ui/dialogs/dialog_sources/medianadder_ui.py
Normal file
@@ -0,0 +1,360 @@
|
||||
# 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"))
|
||||
163
src/ui/dialogs/dialog_sources/newMailTemplateDesigner_ui.py
Normal file
163
src/ui/dialogs/dialog_sources/newMailTemplateDesigner_ui.py
Normal file
@@ -0,0 +1,163 @@
|
||||
# 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"))
|
||||
81
src/ui/dialogs/dialog_sources/parsed_titles_ui.py
Normal file
81
src/ui/dialogs/dialog_sources/parsed_titles_ui.py
Normal file
@@ -0,0 +1,81 @@
|
||||
# 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", "..."))
|
||||
43
src/ui/dialogs/dialog_sources/reminder_ui.py
Normal file
43
src/ui/dialogs/dialog_sources/reminder_ui.py
Normal file
@@ -0,0 +1,43 @@
|
||||
# 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:"))
|
||||
@@ -35,7 +35,7 @@
|
||||
<set>Qt::ImhNone</set>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>3</number>
|
||||
<number>2</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="page_1">
|
||||
<property name="geometry">
|
||||
@@ -232,20 +232,6 @@
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="smtp_address">
|
||||
<property name="clearButtonEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Nutzername</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QCheckBox" name="use_username_smtp_login">
|
||||
<property name="statusTip">
|
||||
@@ -260,13 +246,10 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="mail_username">
|
||||
<property name="statusTip">
|
||||
<string>Kürzel, von der Hochschule vergeben, bsp: Aky547</string>
|
||||
</property>
|
||||
<property name="clearButtonEnabled">
|
||||
<bool>true</bool>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Port</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -280,13 +263,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_10">
|
||||
<property name="text">
|
||||
<string>Passwort</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
@@ -294,13 +270,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="sender_email">
|
||||
<property name="inputMethodHints">
|
||||
@@ -311,10 +280,20 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="mail_username">
|
||||
<property name="statusTip">
|
||||
<string>Kürzel, von der Hochschule vergeben, bsp: Aky547</string>
|
||||
</property>
|
||||
<property name="clearButtonEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>SMTP-Server</string>
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -328,10 +307,24 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="smtp_address">
|
||||
<property name="clearButtonEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Port</string>
|
||||
<string>SMTP-Server</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_10">
|
||||
<property name="text">
|
||||
<string>Passwort</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -345,6 +338,23 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Nutzername</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="label_13">
|
||||
<property name="text">
|
||||
<string>Printmail</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QLineEdit" name="printermail"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
|
||||
@@ -1,188 +1,206 @@
|
||||
# Form implementation generated from reading ui file '/home/alexander/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: PyQt6 UI code generator 6.6.1
|
||||
# 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 PyQt6 import QtCore, QtWidgets
|
||||
from PySide6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_Dialog(object):
|
||||
def setupUi(self, Dialog):
|
||||
# Dialog.setObjectName("Dialog")
|
||||
Dialog.resize(743, 576)
|
||||
|
||||
self.buttonBox = QtWidgets.QDialogButtonBox(parent=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(parent=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_2 = QtWidgets.QLabel(parent=self.frame)
|
||||
self.label_2.setGeometry(QtCore.QRect(10, 20, 161, 21))
|
||||
self.label_2.setObjectName("label_2")
|
||||
self.formLayoutWidget = QtWidgets.QWidget(parent=self.frame)
|
||||
self.formLayoutWidget.setGeometry(QtCore.QRect(10, 40, 361, 491))
|
||||
self.formLayoutWidget.setObjectName("formLayoutWidget")
|
||||
self.gridLayout = QtWidgets.QGridLayout(self.formLayoutWidget)
|
||||
self.gridLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
self.tb_select_db = QtWidgets.QToolButton(parent=self.formLayoutWidget)
|
||||
self.tb_select_db.setObjectName("tb_select_db")
|
||||
self.gridLayout.addWidget(self.tb_select_db, 0, 2, 1, 1)
|
||||
self.db_path = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
|
||||
Dialog.setObjectName("Dialog")
|
||||
Dialog.setWindowModality(QtCore.Qt.WindowModality.NonModal)
|
||||
Dialog.resize(651, 679)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
|
||||
Dialog.setSizePolicy(sizePolicy)
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.toolBox = QtWidgets.QToolBox(parent=Dialog)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.toolBox.sizePolicy().hasHeightForWidth())
|
||||
self.toolBox.setSizePolicy(sizePolicy)
|
||||
self.toolBox.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone)
|
||||
self.toolBox.setObjectName("toolBox")
|
||||
self.page_1 = QtWidgets.QWidget()
|
||||
self.page_1.setGeometry(QtCore.QRect(0, 0, 633, 511))
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.page_1.sizePolicy().hasHeightForWidth())
|
||||
self.page_1.setSizePolicy(sizePolicy)
|
||||
self.page_1.setObjectName("page_1")
|
||||
self.gridLayout_3 = QtWidgets.QGridLayout(self.page_1)
|
||||
self.gridLayout_3.setObjectName("gridLayout_3")
|
||||
self.db_name = QtWidgets.QLineEdit(parent=self.page_1)
|
||||
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.setObjectName("db_path")
|
||||
self.gridLayout.addWidget(self.db_path, 1, 1, 1, 1)
|
||||
self.label_3 = QtWidgets.QLabel(parent=self.formLayoutWidget)
|
||||
self.label_3.setObjectName("label_3")
|
||||
self.gridLayout.addWidget(self.label_3, 0, 0, 1, 1)
|
||||
self.db_name = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
|
||||
self.db_name.setObjectName("db_name")
|
||||
self.gridLayout.addWidget(self.db_name, 0, 1, 1, 1)
|
||||
self.label_4 = QtWidgets.QLabel(parent=self.formLayoutWidget)
|
||||
self.label_4.setObjectName("label_4")
|
||||
self.gridLayout.addWidget(self.label_4, 1, 0, 1, 1)
|
||||
self.save_path = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
|
||||
self.save_path.setObjectName("save_path")
|
||||
self.gridLayout.addWidget(self.save_path, 2, 1, 1, 1)
|
||||
self.tb_set_save_path = QtWidgets.QToolButton(parent=self.formLayoutWidget)
|
||||
self.gridLayout_3.addWidget(self.db_path, 1, 1, 1, 1)
|
||||
self.label_12 = QtWidgets.QLabel(parent=self.page_1)
|
||||
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.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.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.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.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
|
||||
self.zotero_api_key = QtWidgets.QLineEdit(parent=self.page_2)
|
||||
self.zotero_api_key.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhHiddenText|QtCore.Qt.InputMethodHint.ImhSensitiveData)
|
||||
self.zotero_api_key.setObjectName("zotero_api_key")
|
||||
self.gridLayout.addWidget(self.zotero_api_key, 0, 2, 1, 1)
|
||||
self.label_2 = QtWidgets.QLabel(parent=self.page_2)
|
||||
self.label_2.setObjectName("label_2")
|
||||
self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
|
||||
self.toggle_api_visibility = QtWidgets.QToolButton(parent=self.page_2)
|
||||
self.toggle_api_visibility.setText("")
|
||||
self.toggle_api_visibility.setObjectName("toggle_api_visibility")
|
||||
self.gridLayout.addWidget(self.toggle_api_visibility, 0, 3, 1, 1)
|
||||
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
|
||||
self.gridLayout.addItem(spacerItem1, 3, 2, 1, 1)
|
||||
self.toolBox.addItem(self.page_2, "")
|
||||
self.page_3 = QtWidgets.QWidget()
|
||||
self.page_3.setGeometry(QtCore.QRect(0, 0, 633, 511))
|
||||
self.page_3.setObjectName("page_3")
|
||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.page_3)
|
||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||
self.email_settings = QtWidgets.QTabWidget(parent=self.page_3)
|
||||
self.email_settings.setObjectName("email_settings")
|
||||
self.email_settingsPage1_2 = QtWidgets.QWidget()
|
||||
self.email_settingsPage1_2.setObjectName("email_settingsPage1_2")
|
||||
self.formLayoutWidget_2 = QtWidgets.QWidget(parent=self.email_settingsPage1_2)
|
||||
self.formLayoutWidget_2.setGeometry(QtCore.QRect(10, 30, 321, 381))
|
||||
self.formLayoutWidget_2.setObjectName("formLayoutWidget_2")
|
||||
self.gridLayout_2 = QtWidgets.QGridLayout(self.formLayoutWidget_2)
|
||||
self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
|
||||
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.email_settingsPage1_2)
|
||||
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
|
||||
self.gridLayout_2 = QtWidgets.QGridLayout()
|
||||
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||
self.smtp_address = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
|
||||
self.smtp_address.setClearButtonEnabled(True)
|
||||
self.smtp_address.setObjectName("smtp_address")
|
||||
self.gridLayout_2.addWidget(self.smtp_address, 0, 1, 1, 1)
|
||||
self.label_8 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
|
||||
self.label_8.setObjectName("label_8")
|
||||
self.gridLayout_2.addWidget(self.label_8, 3, 0, 1, 1)
|
||||
self.use_username_smtp_login = QtWidgets.QCheckBox(
|
||||
parent=self.formLayoutWidget_2
|
||||
)
|
||||
self.use_username_smtp_login = QtWidgets.QCheckBox(parent=self.email_settingsPage1_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.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_10 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
|
||||
self.label_10.setObjectName("label_10")
|
||||
self.gridLayout_2.addWidget(self.label_10, 5, 0, 1, 1)
|
||||
self.label_7 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
|
||||
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.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 = 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.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.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.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.smtp_address = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
|
||||
self.smtp_address.setClearButtonEnabled(True)
|
||||
self.smtp_address.setObjectName("smtp_address")
|
||||
self.gridLayout_2.addWidget(self.smtp_address, 0, 1, 1, 1)
|
||||
self.label = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
|
||||
self.label.setObjectName("label")
|
||||
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
|
||||
self.label_10 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
|
||||
self.label_10.setObjectName("label_10")
|
||||
self.gridLayout_2.addWidget(self.label_10, 5, 0, 1, 1)
|
||||
self.togglePassword = QtWidgets.QPushButton(parent=self.email_settingsPage1_2)
|
||||
self.togglePassword.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
|
||||
self.togglePassword.setText("")
|
||||
self.togglePassword.setObjectName("togglePassword")
|
||||
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_settingsPage2_2 = QtWidgets.QWidget()
|
||||
self.email_settingsPage2_2.setObjectName("email_settingsPage2_2")
|
||||
self.verticalLayoutWidget = QtWidgets.QWidget(parent=self.email_settingsPage2_2)
|
||||
self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 401, 71))
|
||||
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
|
||||
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.email_settingsPage2_2)
|
||||
self.verticalLayout_3.setObjectName("verticalLayout_3")
|
||||
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
|
||||
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
||||
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
|
||||
spacerItem1 = QtWidgets.QSpacerItem(
|
||||
40,
|
||||
20,
|
||||
QtWidgets.QSizePolicy.Policy.Expanding,
|
||||
QtWidgets.QSizePolicy.Policy.Minimum,
|
||||
)
|
||||
self.horizontalLayout_3.addItem(spacerItem1)
|
||||
self.bold = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
|
||||
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
|
||||
self.horizontalLayout_3.addItem(spacerItem2)
|
||||
self.bold = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
|
||||
self.bold.setCheckable(True)
|
||||
self.bold.setObjectName("bold")
|
||||
self.horizontalLayout_3.addWidget(self.bold)
|
||||
self.italic = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
|
||||
self.italic = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
|
||||
self.italic.setCheckable(True)
|
||||
self.italic.setObjectName("italic")
|
||||
self.horizontalLayout_3.addWidget(self.italic)
|
||||
self.underscore = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
|
||||
self.underscore = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
|
||||
self.underscore.setCheckable(True)
|
||||
self.underscore.setObjectName("underscore")
|
||||
self.horizontalLayout_3.addWidget(self.underscore)
|
||||
spacerItem2 = QtWidgets.QSpacerItem(
|
||||
40,
|
||||
20,
|
||||
QtWidgets.QSizePolicy.Policy.Expanding,
|
||||
QtWidgets.QSizePolicy.Policy.Minimum,
|
||||
)
|
||||
self.horizontalLayout_3.addItem(spacerItem2)
|
||||
self.verticalLayout.addLayout(self.horizontalLayout_3)
|
||||
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
|
||||
self.horizontalLayout_3.addItem(spacerItem3)
|
||||
self.verticalLayout_2.addLayout(self.horizontalLayout_3)
|
||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
self.fontComboBox = QtWidgets.QFontComboBox(parent=self.verticalLayoutWidget)
|
||||
self.fontComboBox = QtWidgets.QFontComboBox(parent=self.email_settingsPage2_2)
|
||||
self.fontComboBox.setObjectName("fontComboBox")
|
||||
self.horizontalLayout.addWidget(self.fontComboBox)
|
||||
self.font_size = QtWidgets.QComboBox(parent=self.verticalLayoutWidget)
|
||||
self.font_size = QtWidgets.QComboBox(parent=self.email_settingsPage2_2)
|
||||
self.font_size.setObjectName("font_size")
|
||||
self.font_size.addItem("")
|
||||
self.font_size.addItem("")
|
||||
@@ -200,76 +218,104 @@ class Ui_Dialog(object):
|
||||
self.font_size.addItem("")
|
||||
self.font_size.addItem("")
|
||||
self.horizontalLayout.addWidget(self.font_size)
|
||||
spacerItem3 = QtWidgets.QSpacerItem(
|
||||
40,
|
||||
20,
|
||||
QtWidgets.QSizePolicy.Policy.Expanding,
|
||||
QtWidgets.QSizePolicy.Policy.Minimum,
|
||||
)
|
||||
self.horizontalLayout.addItem(spacerItem3)
|
||||
self.verticalLayout.addLayout(self.horizontalLayout)
|
||||
spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
|
||||
self.horizontalLayout.addItem(spacerItem4)
|
||||
self.verticalLayout_2.addLayout(self.horizontalLayout)
|
||||
self.verticalLayout_3.addLayout(self.verticalLayout_2)
|
||||
self.editSignature = QtWidgets.QTextEdit(parent=self.email_settingsPage2_2)
|
||||
self.editSignature.setGeometry(QtCore.QRect(10, 80, 321, 301))
|
||||
self.editSignature.setObjectName("editSignature")
|
||||
self.verticalLayout_3.addWidget(self.editSignature)
|
||||
self.debug = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
|
||||
self.debug.setGeometry(QtCore.QRect(30, 430, 75, 24))
|
||||
self.debug.setObjectName("debug")
|
||||
self.verticalLayout_3.addWidget(self.debug)
|
||||
self.email_settings.addTab(self.email_settingsPage2_2, "")
|
||||
self.label_3.setBuddy(self.db_name)
|
||||
self.label_4.setBuddy(self.db_path)
|
||||
self.label_5.setBuddy(self.save_path)
|
||||
self.horizontalLayout_2.addWidget(self.email_settings)
|
||||
self.toolBox.addItem(self.page_3, "")
|
||||
self.page_4 = QtWidgets.QWidget()
|
||||
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.toolBox.setCurrentIndex(2)
|
||||
self.email_settings.setCurrentIndex(0)
|
||||
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
|
||||
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
|
||||
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)
|
||||
|
||||
def retranslateUi(self, Dialog):
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
|
||||
self.label_2.setText(_translate("Dialog", "Allgemeine Einstellungen"))
|
||||
self.tb_select_db.setText(_translate("Dialog", "..."))
|
||||
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.db_name.setText(_translate("Dialog", "sap.db"))
|
||||
self.label_4.setText(_translate("Dialog", "Datenbankpfad"))
|
||||
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.label_5.setToolTip(
|
||||
_translate(
|
||||
"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.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 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.tb_select_db.setText(_translate("Dialog", "..."))
|
||||
self.toolBox.setItemText(self.toolBox.indexOf(self.page_1), _translate("Dialog", "Datenbank"))
|
||||
self.label_4.setText(_translate("Dialog", "Bibliothekstyp"))
|
||||
self.label_3.setText(_translate("Dialog", "Bibliotheks-ID"))
|
||||
self.label_2.setText(_translate("Dialog", "API Key"))
|
||||
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"
|
||||
" Anmelden verwenden"))
|
||||
self.label_6.setText(_translate("Dialog", "Port"))
|
||||
self.email_settings.setTabText(
|
||||
self.email_settings.indexOf(self.email_settingsPage1_2),
|
||||
_translate("Dialog", "Allgemeines"),
|
||||
)
|
||||
self.label_7.setText(_translate("Dialog", "Sender-eMail"))
|
||||
self.mail_username.setStatusTip(_translate("Dialog", "Kürzel, von der Hochschule vergeben, bsp: Aky547"))
|
||||
self.label.setText(_translate("Dialog", "SMTP-Server"))
|
||||
self.label_10.setText(_translate("Dialog", "Passwort"))
|
||||
self.label_8.setText(_translate("Dialog", "Nutzername"))
|
||||
self.label_13.setText(_translate("Dialog", "Printmail"))
|
||||
self.email_settings.setTabText(self.email_settings.indexOf(self.email_settingsPage1_2), _translate("Dialog", "Allgemeines"))
|
||||
self.bold.setText(_translate("Dialog", "Fett"))
|
||||
self.italic.setText(_translate("Dialog", "Kursiv"))
|
||||
self.underscore.setText(_translate("Dialog", "Unterstrichen"))
|
||||
@@ -289,7 +335,7 @@ class Ui_Dialog(object):
|
||||
self.font_size.setItemText(13, _translate("Dialog", "48"))
|
||||
self.font_size.setItemText(14, _translate("Dialog", "72"))
|
||||
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.email_settings.indexOf(self.email_settingsPage2_2), _translate("Dialog", "Signatur"))
|
||||
self.toolBox.setItemText(self.toolBox.indexOf(self.page_3), _translate("Dialog", "e-Mail"))
|
||||
self.groupBox.setTitle(_translate("Dialog", "Farben"))
|
||||
self.toolBox.setItemText(self.toolBox.indexOf(self.page_4), _translate("Dialog", "Icons"))
|
||||
|
||||
153
src/ui/dialogs/docuprint.py
Normal file
153
src/ui/dialogs/docuprint.py
Normal file
@@ -0,0 +1,153 @@
|
||||
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()
|
||||
@@ -1,7 +1,7 @@
|
||||
from .dialog_sources.Ui_elsa_add_table_entry import Ui_Dialog
|
||||
from src.logic.webrequest import WebRequest, BibTextTransformer
|
||||
from src import Icon
|
||||
from PyQt6 import QtWidgets
|
||||
from PySide6 import QtWidgets
|
||||
from src.transformers.transformers import DictToTable
|
||||
from src.logic.zotero import ZoteroController
|
||||
|
||||
@@ -118,7 +118,7 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
|
||||
if table["type"] == "zs":
|
||||
book = zot.createBook(table["isbn"])
|
||||
res_key = zot.createJournalArticle(book, table)
|
||||
logger.debug(book)
|
||||
log.debug(book)
|
||||
a_lastname = table["section_author"].split(";")[0].strip().split(",")[0]
|
||||
a_firstname = table["section_author"].split(";")[0].strip().split(",")[1]
|
||||
author = f"{a_lastname}, {a_firstname[0]}"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from .dialog_sources.Ui_elsa_generate_citation import Ui_Dialog
|
||||
from PyQt6 import QtWidgets
|
||||
from PySide6 import QtWidgets
|
||||
|
||||
|
||||
class ElsaCitation(QtWidgets.QDialog, Ui_Dialog):
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user