diff --git a/.bumpversion.toml b/.bumpversion.toml deleted file mode 100644 index 0f4922f..0000000 --- a/.bumpversion.toml +++ /dev/null @@ -1,22 +0,0 @@ -[tool.bumpversion] -current_version = "0.2.1" -parse = "(?P\\d+)\\.(?P\\d+)\\.(?P\\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" diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 897dc99..892b841 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -42,16 +42,6 @@ jobs: 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<> $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 - - name: Add release notes id: add_release_notes run: | @@ -62,14 +52,7 @@ jobs: if: ${{ github.event.inputs.github_release == 'true' }} uses: softprops/action-gh-release@v1 with: - tag_name: ${{ github.sha }} - release_name: Release ${{ github.sha }} - body: ${{ env.RELEASE_NOTES }} - draft: false - prerelease: false - env: - GITHUB_TOKEN: ${{ secrets.TOKEN }} - GITHUB_REPOSITORY: ${{ github.repository }} + tag_name: release_name: Release ${{ github.sha }} body: ${{ env.RELEASE_NOTES }} draft: false diff --git a/.gitignore b/.gitignore index 5e87da1..b9f6528 100644 --- a/.gitignore +++ b/.gitignore @@ -229,4 +229,5 @@ config.yaml logs/ *.pdf -*.docx \ No newline at end of file +*.docx +test.py diff --git a/.version b/.version new file mode 100644 index 0000000..7dff5b8 --- /dev/null +++ b/.version @@ -0,0 +1 @@ +0.2.1 \ No newline at end of file diff --git a/build.py b/build.py new file mode 100644 index 0000000..b80b545 --- /dev/null +++ b/build.py @@ -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.") \ No newline at end of file diff --git a/config/base_config.yaml b/config/base_config.yaml new file mode 100644 index 0000000..9c07673 --- /dev/null +++ b/config/base_config.yaml @@ -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 diff --git a/config/config.py b/config/config.py index 8619b2a..0eb5564 100644 --- a/config/config.py +++ b/config/config.py @@ -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: @@ -59,13 +74,13 @@ class Mail:


""" - 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) @@ -79,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 @@ -87,7 +102,7 @@ class Icons: return self._path @path.setter - def path(self, value): + def path(self, value: Any): self._path = value @property @@ -95,7 +110,7 @@ class Icons: return self._colors @colors.setter - def colors(self, value): + def colors(self, value: Any): self._colors = value @property @@ -103,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) @@ -121,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. @@ -133,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. @@ -146,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 @@ -163,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 diff --git a/icons/logo.ico b/icons/logo.ico index 4dfec92..89ad115 100644 Binary files a/icons/logo.ico and b/icons/logo.ico differ diff --git a/mail.py b/mail.py deleted file mode 100644 index 1f19755..0000000 --- a/mail.py +++ /dev/null @@ -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, - ) diff --git a/main.py b/main.py index 328ce8b..4066d3d 100644 --- a/main.py +++ b/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() \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index de369ce..2a9433a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,11 @@ [project] name = "semesterapparatsmanager" -version = "0.1.0" +version = "0.2.1" 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 = "0.2.1" +parse = "(?P\\d+)\\.(?P\\d+)\\.(?P\\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" diff --git a/src/__init__.py b/src/__init__.py index 2661405..daeaf7a 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,16 +1,33 @@ -__all__ = ["__version__", "__author__", "Icon", "settings"] -from config import Config -import os - - -settings = Config("config/config.yaml") -if not os.path.exists(settings.database.temp): - os.mkdir(settings.database.temp) -from .utils.icon import Icon - __version__ = "0.2.1" __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") diff --git a/src/backend/admin_console.py b/src/backend/admin_console.py index fee467b..38b45f5 100644 --- a/src/backend/admin_console.py +++ b/src/backend/admin_console.py @@ -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. diff --git a/src/backend/create_file.py b/src/backend/create_file.py index b19e1e0..ce1e2b9 100644 --- a/src/backend/create_file.py +++ b/src/backend/create_file.py @@ -6,11 +6,11 @@ from src.backend.database import Database import loguru import sys - +from src import LOG_DIR log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") db = Database() diff --git a/src/backend/database.py b/src/backend/database.py index 645d023..eb5c31a 100644 --- a/src/backend/database.py +++ b/src/backend/database.py @@ -1,12 +1,18 @@ -import os -import sqlite3 as sql -import tempfile -from pathlib import Path -from src import settings -from typing import Any, List, Optional, Tuple, Union import datetime import json +import os +import sqlite3 as sql +import sys +import tempfile from dataclasses import asdict +from pathlib import Path +from string import ascii_lowercase as lower +from string import digits, punctuation +from typing import Any, List, Optional, Tuple, Union + +import loguru + +from src import LOG_DIR, settings, DATABASE_DIR from src.backend.db import ( CREATE_ELSA_FILES_TABLE, CREATE_ELSA_MEDIA_TABLE, @@ -20,17 +26,16 @@ 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.blob import create_blob + from .semester import Semester -from string import ascii_lowercase as lower, digits, punctuation -import loguru -import sys log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") @@ -39,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 @@ -52,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())) - log.debug(self.db_path) + 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())) - 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 # log.debug(path) os.makedirs(path) if self.get_db_contents() == []: log.critical("Database does not exist, creating tables") + log.critical(f"Path: {path}") self.create_tables() self.insertSubjects() @@ -503,11 +525,9 @@ class Database: str: The filename of the recreated file """ blob = self.getBlob(filename, app_id) - tempdir = self.database.temp - 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}" ) @@ -1197,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( @@ -1276,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 @@ -1463,11 +1493,10 @@ class Database: "SELECT fileblob FROM elsa_files WHERE filename=?", (filename,), one=True )[0] # log.debug(blob) - tempdir = self.database.temp - 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}" ) diff --git a/src/backend/delete_temp_contents.py b/src/backend/delete_temp_contents.py index c4fbfc5..21f393c 100644 --- a/src/backend/delete_temp_contents.py +++ b/src/backend/delete_temp_contents.py @@ -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)) diff --git a/src/backend/documentation_thread.py b/src/backend/documentation_thread.py index 14d9e15..57cffcb 100644 --- a/src/backend/documentation_thread.py +++ b/src/backend/documentation_thread.py @@ -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() \ No newline at end of file diff --git a/src/backend/semester.py b/src/backend/semester.py index d2fb51e..0f24a9e 100644 --- a/src/backend/semester.py +++ b/src/backend/semester.py @@ -1,146 +1,242 @@ -import datetime +"""Semester helper class +A small utility around the *German* academic calendar that distinguishes +between *Wintersemester* (WiSe) and *Sommersemester* (SoSe). + +Key points +---------- +* A **`Semester`** is identified by a *term* ("SoSe" or "WiSe") and the last two + digits of the calendar year in which the term *starts*. +* Formatting **never** pads the year with a leading zero – so ``6`` stays ``6``. +* ``offset(n)`` and the static ``generate_missing`` reliably walk the timeline + one semester at a time with correct year transitions: + + SoSe 6 → **WiSe 6/7** → SoSe 7 → WiSe 7/8 → … +""" + +from __future__ import annotations +import datetime +import re from dataclasses import dataclass import loguru import sys - +from src import LOG_DIR log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") -@dataclass +# @dataclass class Semester: - log.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 - log.debug( - f"Initialized Semester class with values: month: {_month}, semester: {_semester}, year {_year}" - ) + 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 "" - def generateSemester(self): - if self._month <= 3 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})" - @log.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 - valueyear = str(year) if self._semester == "WiSe": - if self._month < 4: - valueyear = str(year - 1) + "/" + str(year) - else: - valueyear = str(year) + "/" + str(year + 1) - 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}" - @log.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: str): - if " " in val: - values = val.split(" ") - if len(values) != 2: - raise ValueError("Invalid semester format") - self._semester = values[0] - if len(values[1]) == 4: - self._year = int(values[1][2:]) - # self._year = int(values[1]) - self.computeValue() - 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 " → SoSe of year YY + "WiSe /" → Winter term starting in YY + "WiSe " → 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)) diff --git a/src/backend/thread_bookgrabber.py b/src/backend/thread_bookgrabber.py index 5d5ab49..02fef02 100644 --- a/src/backend/thread_bookgrabber.py +++ b/src/backend/thread_bookgrabber.py @@ -1,19 +1,19 @@ -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) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +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) +log.add(sys.stdout, level="INFO") class BookGrabber(QThread): diff --git a/src/backend/threads_autoadder.py b/src/backend/threads_autoadder.py index 2ceec0e..b793ae6 100644 --- a/src/backend/threads_autoadder.py +++ b/src/backend/threads_autoadder.py @@ -1,17 +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) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +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 diff --git a/src/backend/threads_availchecker.py b/src/backend/threads_availchecker.py index 5aebb4f..3fbf819 100644 --- a/src/backend/threads_availchecker.py +++ b/src/backend/threads_availchecker.py @@ -1,11 +1,11 @@ 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 @@ -14,8 +14,8 @@ import sys log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") diff --git a/src/logic/get_msword_content.py b/src/logic/get_msword_content.py deleted file mode 100644 index 9e508cc..0000000 --- a/src/logic/get_msword_content.py +++ /dev/null @@ -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}') diff --git a/src/logic/get_pdf_content.py b/src/logic/get_pdf_content.py deleted file mode 100644 index 1b0213d..0000000 --- a/src/logic/get_pdf_content.py +++ /dev/null @@ -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() diff --git a/src/logic/mail.py b/src/logic/mail.py deleted file mode 100644 index 8b13789..0000000 --- a/src/logic/mail.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/logic/openai.py b/src/logic/openai.py new file mode 100644 index 0000000..4fda61d --- /dev/null +++ b/src/logic/openai.py @@ -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 \ No newline at end of file diff --git a/src/logic/threads.py b/src/logic/threads.py deleted file mode 100644 index 76d83b7..0000000 --- a/src/logic/threads.py +++ /dev/null @@ -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("")[0] - mail_html = mail_template.split("")[1] - mail_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) diff --git a/src/logic/threads_copy.py b/src/logic/threads_copy.py deleted file mode 100644 index e1e9452..0000000 --- a/src/logic/threads_copy.py +++ /dev/null @@ -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 diff --git a/src/logic/webrequest.py b/src/logic/webrequest.py index 5626ccf..19505d1 100644 --- a/src/logic/webrequest.py +++ b/src/logic/webrequest.py @@ -11,10 +11,11 @@ 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) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +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") diff --git a/src/logic/wordparser.py b/src/logic/wordparser.py index c0ad35a..e3741c9 100644 --- a/src/logic/wordparser.py +++ b/src/logic/wordparser.py @@ -1,16 +1,21 @@ -import pandas as pd -from docx import Document +import sys +import zipfile from dataclasses import dataclass -from src.backend import Semester -from typing import Union, Any +from typing import Any, Union import loguru -import sys +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) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") @@ -75,12 +80,37 @@ class SemapDocument: 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: @@ -88,8 +118,8 @@ class SemapDocument: self.eternal = True self.semester = Semester().from_string(self.semester) else: - logger.warning("Semester {} is not valid", self.semester) - self.semester = None + log.warning("Semester {} is not valid", self.semester) + self.semester = Semester().from_string(semester_converter(self.semester)) @property def signatures(self) -> list[str]: @@ -105,11 +135,14 @@ def word_docx_to_csv(path: str) -> list[pd.DataFrame]: 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] @@ -117,11 +150,27 @@ def word_docx_to_csv(path: str) -> list[pd.DataFrame]: m_data.append(df) - # for df[0, 1]: merge i and i+1 as key, value - 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: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(): return { "work_author": None, @@ -222,10 +271,10 @@ def word_to_semap(word_path: str) -> 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), 2)} + 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:"] @@ -238,6 +287,8 @@ def word_to_semap(word_path: str) -> SemapDocument: semap.title = appdata["Veranstaltung:"] semap.semester = appdata["Semester:"] semap.renameSemester + semap.nameSetter + books = df[2] booklist = [] for i in range(len(books)): @@ -254,7 +305,6 @@ def word_to_semap(word_path: str) -> SemapDocument: booklist.append(book) log.info("Found {} books", len(booklist)) semap.books = booklist - return semap diff --git a/src/logic/zotero.py b/src/logic/zotero.py index dfbe905..14860e0 100644 --- a/src/logic/zotero.py +++ b/src/logic/zotero.py @@ -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, diff --git a/src/transformers/transformers.py b/src/transformers/transformers.py index 98d5758..a7ef88a 100644 --- a/src/transformers/transformers.py +++ b/src/transformers/transformers.py @@ -6,15 +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) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") ###Pydatnic models diff --git a/src/ui/dialogs/Ui_edit_bookdata.py b/src/ui/dialogs/Ui_edit_bookdata.py index 728cd17..eba44e0 100644 --- a/src/ui/dialogs/Ui_edit_bookdata.py +++ b/src/ui/dialogs/Ui_edit_bookdata.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\edit_bookdata.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from src.logic.dataclass import BookData diff --git a/src/ui/dialogs/Ui_fileparser.py b/src/ui/dialogs/Ui_fileparser.py index 05459bd..da869db 100644 --- a/src/ui/dialogs/Ui_fileparser.py +++ b/src/ui/dialogs/Ui_fileparser.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\fileparser.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from src.logic.webrequest import BibTextTransformer, WebRequest @@ -61,7 +61,7 @@ class Ui_Dialog(object): self.listWidget.setObjectName("listWidget") self.signatures = [] self.returned = [] - # self.data_gathering_complete = QtCore.pyqtSignal() + # self.data_gathering_complete = QtCore.Signal() self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) diff --git a/src/ui/dialogs/Ui_login.py b/src/ui/dialogs/Ui_login.py index 3e570af..7e807ac 100644 --- a/src/ui/dialogs/Ui_login.py +++ b/src/ui/dialogs/Ui_login.py @@ -1,6 +1,6 @@ # Form implementation generated from reading ui file '/home/alexander/GitHub/Semesterapparate/ui/dialogs/login.ui' # -# Created by: PyQt6 UI code generator 6.5.3 +# 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. @@ -8,7 +8,7 @@ import hashlib -from PyQt6 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets from src.backend.database import Database from src.backend.admin_console import AdminCommands diff --git a/src/ui/dialogs/Ui_mail_preview.py b/src/ui/dialogs/Ui_mail_preview.py index 4b95e50..32ed57d 100644 --- a/src/ui/dialogs/Ui_mail_preview.py +++ b/src/ui/dialogs/Ui_mail_preview.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\mail_preview.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets import subprocess import tempfile import os diff --git a/src/ui/dialogs/Ui_medianadder.py b/src/ui/dialogs/Ui_medianadder.py index 3578bab..a1c46b0 100644 --- a/src/ui/dialogs/Ui_medianadder.py +++ b/src/ui/dialogs/Ui_medianadder.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\medianadder.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/Ui_new_subject.py b/src/ui/dialogs/Ui_new_subject.py index 213eb1c..db6ebde 100644 --- a/src/ui/dialogs/Ui_new_subject.py +++ b/src/ui/dialogs/Ui_new_subject.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\new_subject.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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): diff --git a/src/ui/dialogs/Ui_parsed_titles.py b/src/ui/dialogs/Ui_parsed_titles.py index 786c176..b05ad32 100644 --- a/src/ui/dialogs/Ui_parsed_titles.py +++ b/src/ui/dialogs/Ui_parsed_titles.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\parsed_titles.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from src.logic.log import MyLogger from src.logic.threads import AutoAdder diff --git a/src/ui/dialogs/Ui_reminder.py b/src/ui/dialogs/Ui_reminder.py index f4dbc8f..283e509 100644 --- a/src/ui/dialogs/Ui_reminder.py +++ b/src/ui/dialogs/Ui_reminder.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\reminder.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/Ui_settings.py b/src/ui/dialogs/Ui_settings.py index bc50dfe..36c39f2 100644 --- a/src/ui/dialogs/Ui_settings.py +++ b/src/ui/dialogs/Ui_settings.py @@ -1,13 +1,13 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\Semesterapparate\ui\dialogs\settings.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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 PyQt6 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets config = OmegaConf.load("config.yaml") diff --git a/src/ui/dialogs/about.py b/src/ui/dialogs/about.py index 6a6ba29..972495e 100644 --- a/src/ui/dialogs/about.py +++ b/src/ui/dialogs/about.py @@ -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) diff --git a/src/ui/dialogs/app_ext.py b/src/ui/dialogs/app_ext.py index 9cb0516..8db924f 100644 --- a/src/ui/dialogs/app_ext.py +++ b/src/ui/dialogs/app_ext.py @@ -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 diff --git a/src/ui/dialogs/bookdata.py b/src/ui/dialogs/bookdata.py index 60bc5ed..9561604 100644 --- a/src/ui/dialogs/bookdata.py +++ b/src/ui/dialogs/bookdata.py @@ -1,4 +1,4 @@ -from PyQt6 import QtWidgets +from PySide6 import QtWidgets from src.logic.dataclass import BookData diff --git a/src/ui/dialogs/confirm_extend.py b/src/ui/dialogs/confirm_extend.py index 2be36ea..3363bd5 100644 --- a/src/ui/dialogs/confirm_extend.py +++ b/src/ui/dialogs/confirm_extend.py @@ -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): diff --git a/src/ui/dialogs/confirm_extend_ui.py b/src/ui/dialogs/confirm_extend_ui.py index 5c7a0ed..cc2674e 100644 --- a/src/ui/dialogs/confirm_extend_ui.py +++ b/src/ui/dialogs/confirm_extend_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\confirm_extend.ui' # -# Created by: PyQt6 UI code generator 6.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_extend_confirm(object): diff --git a/src/ui/dialogs/dialog_sources/Ui_about.py b/src/ui/dialogs/dialog_sources/Ui_about.py index e151ec1..6434828 100644 --- a/src/ui/dialogs/dialog_sources/Ui_about.py +++ b/src/ui/dialogs/dialog_sources/Ui_about.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_app_status.py b/src/ui/dialogs/dialog_sources/Ui_app_status.py index a927c1b..7dcc51b 100644 --- a/src/ui/dialogs/dialog_sources/Ui_app_status.py +++ b/src/ui/dialogs/dialog_sources/Ui_app_status.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_apparat_extend.py b/src/ui/dialogs/dialog_sources/Ui_apparat_extend.py index 62b28d7..828d1a8 100644 --- a/src/ui/dialogs/dialog_sources/Ui_apparat_extend.py +++ b/src/ui/dialogs/dialog_sources/Ui_apparat_extend.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_confirm_extend.py b/src/ui/dialogs/dialog_sources/Ui_confirm_extend.py index 13f44e4..72ef74f 100644 --- a/src/ui/dialogs/dialog_sources/Ui_confirm_extend.py +++ b/src/ui/dialogs/dialog_sources/Ui_confirm_extend.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_edit_bookdata.py b/src/ui/dialogs/dialog_sources/Ui_edit_bookdata.py index 97f0fd3..381cd43 100644 --- a/src/ui/dialogs/dialog_sources/Ui_edit_bookdata.py +++ b/src/ui/dialogs/dialog_sources/Ui_edit_bookdata.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_elsa_add_table_entry.py b/src/ui/dialogs/dialog_sources/Ui_elsa_add_table_entry.py index a608e77..a393508 100644 --- a/src/ui/dialogs/dialog_sources/Ui_elsa_add_table_entry.py +++ b/src/ui/dialogs/dialog_sources/Ui_elsa_add_table_entry.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_elsa_generate_citation.py b/src/ui/dialogs/dialog_sources/Ui_elsa_generate_citation.py index f3c7390..43944f4 100644 --- a/src/ui/dialogs/dialog_sources/Ui_elsa_generate_citation.py +++ b/src/ui/dialogs/dialog_sources/Ui_elsa_generate_citation.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_elsa_generator_confirm.py b/src/ui/dialogs/dialog_sources/Ui_elsa_generator_confirm.py index c9980a6..c56c6f3 100644 --- a/src/ui/dialogs/dialog_sources/Ui_elsa_generator_confirm.py +++ b/src/ui/dialogs/dialog_sources/Ui_elsa_generator_confirm.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_login.py b/src/ui/dialogs/dialog_sources/Ui_login.py index ff7dcd0..deb1a62 100644 --- a/src/ui/dialogs/dialog_sources/Ui_login.py +++ b/src/ui/dialogs/dialog_sources/Ui_login.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_mail_preview.py b/src/ui/dialogs/dialog_sources/Ui_mail_preview.py index 333103c..e852ebf 100644 --- a/src/ui/dialogs/dialog_sources/Ui_mail_preview.py +++ b/src/ui/dialogs/dialog_sources/Ui_mail_preview.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_medianadder.py b/src/ui/dialogs/dialog_sources/Ui_medianadder.py index 44a884d..db20569 100644 --- a/src/ui/dialogs/dialog_sources/Ui_medianadder.py +++ b/src/ui/dialogs/dialog_sources/Ui_medianadder.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_newMailTemplateDesigner.py b/src/ui/dialogs/dialog_sources/Ui_newMailTemplateDesigner.py index df436d4..ee2e682 100644 --- a/src/ui/dialogs/dialog_sources/Ui_newMailTemplateDesigner.py +++ b/src/ui/dialogs/dialog_sources/Ui_newMailTemplateDesigner.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_parsed_titles.py b/src/ui/dialogs/dialog_sources/Ui_parsed_titles.py index b18b94a..bf60db7 100644 --- a/src/ui/dialogs/dialog_sources/Ui_parsed_titles.py +++ b/src/ui/dialogs/dialog_sources/Ui_parsed_titles.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_reminder.py b/src/ui/dialogs/dialog_sources/Ui_reminder.py index 45cc18c..5f62089 100644 --- a/src/ui/dialogs/dialog_sources/Ui_reminder.py +++ b/src/ui/dialogs/dialog_sources/Ui_reminder.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/Ui_settings.py b/src/ui/dialogs/dialog_sources/Ui_settings.py index 8ee3c85..f6cdc11 100644 --- a/src/ui/dialogs/dialog_sources/Ui_settings.py +++ b/src/ui/dialogs/dialog_sources/Ui_settings.py @@ -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): diff --git a/src/ui/dialogs/dialog_sources/about_ui.py b/src/ui/dialogs/dialog_sources/about_ui.py index 1a7c657..4713898 100644 --- a/src/ui/dialogs/dialog_sources/about_ui.py +++ b/src/ui/dialogs/dialog_sources/about_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_about(object): diff --git a/src/ui/dialogs/dialog_sources/app_status_ui.py b/src/ui/dialogs/dialog_sources/app_status_ui.py index 423eb50..d845f0e 100644 --- a/src/ui/dialogs/dialog_sources/app_status_ui.py +++ b/src/ui/dialogs/dialog_sources/app_status_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Form(object): diff --git a/src/ui/dialogs/dialog_sources/apparat_extend_ui.py b/src/ui/dialogs/dialog_sources/apparat_extend_ui.py index a9a9a81..c197967 100644 --- a/src/ui/dialogs/dialog_sources/apparat_extend_ui.py +++ b/src/ui/dialogs/dialog_sources/apparat_extend_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/dialog_sources/confirm_extend_ui.py b/src/ui/dialogs/dialog_sources/confirm_extend_ui.py index 1fe54b9..bef4a6b 100644 --- a/src/ui/dialogs/dialog_sources/confirm_extend_ui.py +++ b/src/ui/dialogs/dialog_sources/confirm_extend_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_extend_confirm(object): diff --git a/src/ui/dialogs/dialog_sources/documentprint_ui.py b/src/ui/dialogs/dialog_sources/documentprint_ui.py index 030e9c5..aa7e341 100644 --- a/src/ui/dialogs/dialog_sources/documentprint_ui.py +++ b/src/ui/dialogs/dialog_sources/documentprint_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\documentprint.ui' # -# Created by: PyQt6 UI code generator 6.9.0 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/dialog_sources/edit_bookdata_ui.py b/src/ui/dialogs/dialog_sources/edit_bookdata_ui.py index 89e4ce0..be8db53 100644 --- a/src/ui/dialogs/dialog_sources/edit_bookdata_ui.py +++ b/src/ui/dialogs/dialog_sources/edit_bookdata_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/dialog_sources/elsa_add_table_entry_ui.py b/src/ui/dialogs/dialog_sources/elsa_add_table_entry_ui.py index de48dbb..3a77b77 100644 --- a/src/ui/dialogs/dialog_sources/elsa_add_table_entry_ui.py +++ b/src/ui/dialogs/dialog_sources/elsa_add_table_entry_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/dialog_sources/elsa_generate_citation_ui.py b/src/ui/dialogs/dialog_sources/elsa_generate_citation_ui.py index dbed3f6..2315132 100644 --- a/src/ui/dialogs/dialog_sources/elsa_generate_citation_ui.py +++ b/src/ui/dialogs/dialog_sources/elsa_generate_citation_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/dialog_sources/elsa_generator_confirm_ui.py b/src/ui/dialogs/dialog_sources/elsa_generator_confirm_ui.py index fcd4a4b..9c38f0f 100644 --- a/src/ui/dialogs/dialog_sources/elsa_generator_confirm_ui.py +++ b/src/ui/dialogs/dialog_sources/elsa_generator_confirm_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/dialog_sources/login_ui.py b/src/ui/dialogs/dialog_sources/login_ui.py index c3ee6d5..2a2c72b 100644 --- a/src/ui/dialogs/dialog_sources/login_ui.py +++ b/src/ui/dialogs/dialog_sources/login_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/dialog_sources/mail_preview_ui.py b/src/ui/dialogs/dialog_sources/mail_preview_ui.py index 37109b2..a7ce30d 100644 --- a/src/ui/dialogs/dialog_sources/mail_preview_ui.py +++ b/src/ui/dialogs/dialog_sources/mail_preview_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_eMailPreview(object): diff --git a/src/ui/dialogs/dialog_sources/medianadder_ui.py b/src/ui/dialogs/dialog_sources/medianadder_ui.py index adf8edd..52e90ac 100644 --- a/src/ui/dialogs/dialog_sources/medianadder_ui.py +++ b/src/ui/dialogs/dialog_sources/medianadder_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/dialog_sources/newMailTemplateDesigner_ui.py b/src/ui/dialogs/dialog_sources/newMailTemplateDesigner_ui.py index 4ad337a..0892c34 100644 --- a/src/ui/dialogs/dialog_sources/newMailTemplateDesigner_ui.py +++ b/src/ui/dialogs/dialog_sources/newMailTemplateDesigner_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/dialog_sources/parsed_titles_ui.py b/src/ui/dialogs/dialog_sources/parsed_titles_ui.py index c99e92d..5d5cadf 100644 --- a/src/ui/dialogs/dialog_sources/parsed_titles_ui.py +++ b/src/ui/dialogs/dialog_sources/parsed_titles_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Form(object): diff --git a/src/ui/dialogs/dialog_sources/reminder_ui.py b/src/ui/dialogs/dialog_sources/reminder_ui.py index 6ae8f4a..25b7bf8 100644 --- a/src/ui/dialogs/dialog_sources/reminder_ui.py +++ b/src/ui/dialogs/dialog_sources/reminder_ui.py @@ -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.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Erinnerung(object): diff --git a/src/ui/dialogs/dialog_sources/settings_ui.py b/src/ui/dialogs/dialog_sources/settings_ui.py index 92015d7..0ac4637 100644 --- a/src/ui/dialogs/dialog_sources/settings_ui.py +++ b/src/ui/dialogs/dialog_sources/settings_ui.py @@ -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.9.0 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/dialogs/docuprint.py b/src/ui/dialogs/docuprint.py index 4556ebd..3f87c1c 100644 --- a/src/ui/dialogs/docuprint.py +++ b/src/ui/dialogs/docuprint.py @@ -1,5 +1,5 @@ from .dialog_sources.documentprint_ui import Ui_Dialog -from PyQt6 import QtWidgets, QtCore +from PySide6 import QtWidgets, QtCore from src import Icon from src.utils.richtext import SemapSchilder, SemesterDocument diff --git a/src/ui/dialogs/elsa_add_entry.py b/src/ui/dialogs/elsa_add_entry.py index 597718e..c15a0ab 100644 --- a/src/ui/dialogs/elsa_add_entry.py +++ b/src/ui/dialogs/elsa_add_entry.py @@ -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 diff --git a/src/ui/dialogs/elsa_citation.py b/src/ui/dialogs/elsa_citation.py index eae7288..8a7c2e0 100644 --- a/src/ui/dialogs/elsa_citation.py +++ b/src/ui/dialogs/elsa_citation.py @@ -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): diff --git a/src/ui/dialogs/elsa_gen_confirm.py b/src/ui/dialogs/elsa_gen_confirm.py index b56a20a..8b15842 100644 --- a/src/ui/dialogs/elsa_gen_confirm.py +++ b/src/ui/dialogs/elsa_gen_confirm.py @@ -1,5 +1,5 @@ from .dialog_sources.Ui_elsa_generator_confirm import Ui_Dialog -from PyQt6 import QtWidgets +from PySide6 import QtWidgets class ElsaGenConfirm(QtWidgets.QDialog, Ui_Dialog): diff --git a/src/ui/dialogs/ext_app.py b/src/ui/dialogs/ext_app.py index 5ff330d..425067e 100644 --- a/src/ui/dialogs/ext_app.py +++ b/src/ui/dialogs/ext_app.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'ui/dialogs/extend_apparat.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Frame(object): diff --git a/src/ui/dialogs/fileparser.py b/src/ui/dialogs/fileparser.py index c049429..c0c29cd 100644 --- a/src/ui/dialogs/fileparser.py +++ b/src/ui/dialogs/fileparser.py @@ -1,4 +1,4 @@ -from PyQt6 import QtWidgets +from PySide6 import QtWidgets from src.logic.webrequest import BibTextTransformer, WebRequest diff --git a/src/ui/dialogs/login.py b/src/ui/dialogs/login.py index e1e563e..cc8fa34 100644 --- a/src/ui/dialogs/login.py +++ b/src/ui/dialogs/login.py @@ -1,20 +1,18 @@ import hashlib +import sys -from PyQt6 import QtCore, QtWidgets +import loguru +from PySide6 import QtCore, QtWidgets - -from src.backend.admin_console import AdminCommands +from src import LOG_DIR, Icon from src.backend.database import Database from .dialog_sources.login_ui import Ui_Dialog -import sys -import loguru -from src import Icon log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") class LoginDialog(Ui_Dialog): @@ -52,6 +50,7 @@ class LoginDialog(Ui_Dialog): self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) self.lineEdit_2.setClearButtonEnabled(True) self.lineEdit_2.setObjectName("lineEdit_2") + log.info("Calling database") self.db = Database() self.retranslateUi(Dialog) @@ -76,6 +75,8 @@ class LoginDialog(Ui_Dialog): hashed_password = hashlib.sha256(password.encode()).hexdigest() if len(self.db.getUsers()) == 0: + from src.backend.admin_console import AdminCommands + AdminCommands().create_admin() self.lresult = 1 # Indicate successful login self.lusername = username @@ -89,14 +90,14 @@ class LoginDialog(Ui_Dialog): else: # Credentials are invalid, display a warning if username == "" or password == "": - logger.warning("Invalid username or password. Login failed.") + log.warning("Invalid username or password. Login failed.") 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: - logger.warning("Invalid username or password. Login failed.") + log.warning("Invalid username or password. Login failed.") warning_dialog = QtWidgets.QMessageBox() warning_dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) warning_dialog.setText( diff --git a/src/ui/dialogs/mail.py b/src/ui/dialogs/mail.py index d7e0362..833233a 100644 --- a/src/ui/dialogs/mail.py +++ b/src/ui/dialogs/mail.py @@ -1,7 +1,7 @@ import os import sys -from PyQt6 import QtWidgets +from PySide6 import QtWidgets from src import Icon, settings as config @@ -10,11 +10,11 @@ from .dialog_sources.Ui_mail_preview import Ui_eMailPreview as MailPreviewDialog from .mailTemplate import MailTemplateDialog import loguru import sys - +from src import LOG_DIR log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") diff --git a/src/ui/dialogs/mailTemplate.py b/src/ui/dialogs/mailTemplate.py index 9c55b7c..c8aae04 100644 --- a/src/ui/dialogs/mailTemplate.py +++ b/src/ui/dialogs/mailTemplate.py @@ -1,6 +1,6 @@ import os -from PyQt6 import QtGui, QtWidgets, QtCore +from PySide6 import QtGui, QtWidgets, QtCore from src import Icon @@ -22,7 +22,7 @@ logger.add(sys.stdout) class MailTemplateDialog(QtWidgets.QDialog, NewMailTemplateDesignerDialog): - updateSignal = QtCore.pyqtSignal() + updateSignal = QtCore.Signal() def __init__(self, parent=None) -> None: super().__init__(parent) diff --git a/src/ui/dialogs/mail_preview.py b/src/ui/dialogs/mail_preview.py index e4a6560..7d8dd36 100644 --- a/src/ui/dialogs/mail_preview.py +++ b/src/ui/dialogs/mail_preview.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'ui\dialogs\mail_preview.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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): diff --git a/src/ui/dialogs/mail_preview_ui.py b/src/ui/dialogs/mail_preview_ui.py index 473a6de..da6b448 100644 --- a/src/ui/dialogs/mail_preview_ui.py +++ b/src/ui/dialogs/mail_preview_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\mail_preview.ui' # -# Created by: PyQt6 UI code generator 6.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_eMailPreview(object): diff --git a/src/ui/dialogs/medienadder.py b/src/ui/dialogs/medienadder.py index 1f00c71..ecdeac6 100644 --- a/src/ui/dialogs/medienadder.py +++ b/src/ui/dialogs/medienadder.py @@ -1,4 +1,4 @@ -from PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from .dialog_sources.medianadder_ui import Ui_Dialog from src import Icon diff --git a/src/ui/dialogs/parsed_titles.py b/src/ui/dialogs/parsed_titles.py index 1142fe2..d5ba73b 100644 --- a/src/ui/dialogs/parsed_titles.py +++ b/src/ui/dialogs/parsed_titles.py @@ -1,4 +1,4 @@ -from PyQt6 import QtWidgets +from PySide6 import QtWidgets from src.backend import AutoAdder @@ -6,11 +6,11 @@ from src.backend import AutoAdder from .dialog_sources.parsed_titles_ui import Ui_Form import loguru import sys - +from src import LOG_DIR log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") class ParsedTitles(QtWidgets.QWidget, Ui_Form): def __init__(self, parent=None): diff --git a/src/ui/dialogs/parsed_titles_ui.py b/src/ui/dialogs/parsed_titles_ui.py index 7f643c8..59f38d2 100644 --- a/src/ui/dialogs/parsed_titles_ui.py +++ b/src/ui/dialogs/parsed_titles_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\parsed_titles.ui' # -# Created by: PyQt6 UI code generator 6.9.0 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Form(object): diff --git a/src/ui/dialogs/popup_confirm.py b/src/ui/dialogs/popup_confirm.py index 6f47a8f..8b7f19c 100644 --- a/src/ui/dialogs/popup_confirm.py +++ b/src/ui/dialogs/popup_confirm.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'ui\dialogs\confirm_extend.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# 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 QtWidgets +from PySide6 import QtWidgets from src import Icon diff --git a/src/ui/dialogs/reminder.py b/src/ui/dialogs/reminder.py index 54ec66e..f92e8b3 100644 --- a/src/ui/dialogs/reminder.py +++ b/src/ui/dialogs/reminder.py @@ -1,4 +1,4 @@ -from PyQt6 import QtWidgets +from PySide6 import QtWidgets from .dialog_sources.reminder_ui import Ui_Erinnerung as Ui_Dialog from src import Icon diff --git a/src/ui/dialogs/settings.py b/src/ui/dialogs/settings.py index 5211a1b..df918d0 100644 --- a/src/ui/dialogs/settings.py +++ b/src/ui/dialogs/settings.py @@ -1,14 +1,15 @@ -from PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from src import Icon, settings from .dialog_sources.settings_ui import Ui_Dialog as _settings from src.ui.widgets.iconLine import IconWidget import loguru import sys +from src import LOG_DIR log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") @@ -80,8 +81,8 @@ class Settings(QtWidgets.QDialog, _settings): def load_config(self): self.db_name.setText(settings.database.name) - self.db_path.setText(settings.database.path) - self.save_path.setText(settings.database.temp) + self.db_path.setText(str(settings.database.path.expanduser())) + self.save_path.setText(str(settings.database.temp.expanduser())) self.smtp_address.setText(settings.mail.smtp_server) self.smtp_port.setText(str(settings.mail.port)) self.sender_email.setText(settings.mail.sender) diff --git a/src/ui/extensions/ValidatorButton.py b/src/ui/extensions/ValidatorButton.py index 85fa7b8..bbdecb5 100644 --- a/src/ui/extensions/ValidatorButton.py +++ b/src/ui/extensions/ValidatorButton.py @@ -1,4 +1,4 @@ -from PyQt6 import QtWidgets +from PySide6 import QtWidgets class ValidatorButton(QtWidgets.QToolButton): diff --git a/src/ui/semesterapparat_ui.ui b/src/ui/semesterapparat_ui.ui index d5a9c70..9831acd 100644 --- a/src/ui/semesterapparat_ui.ui +++ b/src/ui/semesterapparat_ui.ui @@ -1923,8 +1923,8 @@ Einige Angaben müssen ggf angepasst werden Help - + @@ -1956,17 +1956,6 @@ Einige Angaben müssen ggf angepasst werden true - - - Dokumentation (online) - - - F1 - - - Qt::ApplicationShortcut - - About @@ -1975,9 +1964,9 @@ Einige Angaben müssen ggf angepasst werden QAction::AboutRole - + - Dokumentation (lokal) + Dokumentation F1 @@ -2009,8 +1998,6 @@ Einige Angaben müssen ggf angepasst werden automation_add_selected_books saveandcreate - - - + diff --git a/src/ui/semesterapparat_ui_ui.py b/src/ui/semesterapparat_ui_ui.py index 4c0af77..0b27766 100644 --- a/src/ui/semesterapparat_ui_ui.py +++ b/src/ui/semesterapparat_ui_ui.py @@ -1,845 +1,785 @@ -# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\semesterapparat_ui.ui' -# -# Created by: PyQt6 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. +# -*- coding: utf-8 -*- +################################################################################ +## Form generated from reading UI file 'semesterapparat_ui.ui' +## +## Created by: Qt User Interface Compiler version 6.9.1 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ -from PyQt6 import QtCore, QtGui, QtWidgets - +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient, + QCursor, QFont, QFontDatabase, QGradient, + QIcon, QImage, QKeySequence, QLinearGradient, + QPainter, QPalette, QPixmap, QRadialGradient, + QTransform) +from PySide6.QtWidgets import (QAbstractItemView, QAbstractScrollArea, QApplication, QCheckBox, + QComboBox, QFormLayout, QFrame, QGridLayout, + QGroupBox, QHBoxLayout, QHeaderView, QLabel, + QLineEdit, QMainWindow, QMenu, QMenuBar, + QPushButton, QSizePolicy, QSpacerItem, QStatusBar, + QTabWidget, QTableWidget, QTableWidgetItem, QToolButton, + QVBoxLayout, QWidget) class Ui_MainWindow(object): def setupUi(self, MainWindow): - MainWindow.setObjectName("MainWindow") - MainWindow.setWindowModality(QtCore.Qt.WindowModality.WindowModal) + if not MainWindow.objectName(): + MainWindow.setObjectName(u"MainWindow") + MainWindow.setWindowModality(Qt.WindowModal) MainWindow.setEnabled(True) MainWindow.resize(1590, 800) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) - MainWindow.setMinimumSize(QtCore.QSize(1278, 800)) - MainWindow.setMaximumSize(QtCore.QSize(1590, 800)) - MainWindow.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap("c:\\Users\\aky547\\GitHub\\SemesterapparatsManager\\src\\ui\\../../../../../../icons/logo.ico"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + MainWindow.setMinimumSize(QSize(1278, 800)) + MainWindow.setMaximumSize(QSize(1590, 800)) + MainWindow.setContextMenuPolicy(Qt.NoContextMenu) + icon = QIcon() + icon.addFile(u"../../../../../../icons/logo.ico", QSize(), QIcon.Mode.Normal, QIcon.State.Off) MainWindow.setWindowIcon(icon) - MainWindow.setStatusTip("") - self.centralwidget = QtWidgets.QWidget(parent=MainWindow) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) + self.actionBeenden = QAction(MainWindow) + self.actionBeenden.setObjectName(u"actionBeenden") + self.actionBeenden.setMenuRole(QAction.QuitRole) + self.actionBeenden.setShortcutVisibleInContextMenu(True) + self.actionEinstellungen = QAction(MainWindow) + self.actionEinstellungen.setObjectName(u"actionEinstellungen") + self.actionEinstellungen.setShortcutVisibleInContextMenu(True) + self.actionAbout = QAction(MainWindow) + self.actionAbout.setObjectName(u"actionAbout") + self.actionAbout.setMenuRole(QAction.AboutRole) + self.actionDokumentation = QAction(MainWindow) + self.actionDokumentation.setObjectName(u"actionDokumentation") + self.centralwidget = QWidget(MainWindow) + self.centralwidget.setObjectName(u"centralwidget") sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) self.centralwidget.setSizePolicy(sizePolicy) - self.centralwidget.setObjectName("centralwidget") - self.verticalLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget) - self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 1271, 751)) - self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") - self.mainLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayoutWidget = QWidget(self.centralwidget) + self.verticalLayoutWidget.setObjectName(u"verticalLayoutWidget") + self.verticalLayoutWidget.setGeometry(QRect(0, 0, 1271, 751)) + self.mainLayout = QVBoxLayout(self.verticalLayoutWidget) + self.mainLayout.setObjectName(u"mainLayout") self.mainLayout.setContentsMargins(0, 0, 0, 0) - self.mainLayout.setObjectName("mainLayout") - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.gridLayout = QtWidgets.QGridLayout() - self.gridLayout.setObjectName("gridLayout") - self.tabWidget = QtWidgets.QTabWidget(parent=self.verticalLayoutWidget) - self.tabWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.tabWidget.setObjectName("tabWidget") - self.createApparat = QtWidgets.QWidget() - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.createApparat.sizePolicy().hasHeightForWidth()) - self.createApparat.setSizePolicy(sizePolicy) - self.createApparat.setObjectName("createApparat") - self.horizontalLayoutWidget_2 = QtWidgets.QWidget(parent=self.createApparat) - self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 1261, 163)) - self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2") - self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2) + self.horizontalLayout = QHBoxLayout() + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.gridLayout = QGridLayout() + self.gridLayout.setObjectName(u"gridLayout") + self.tabWidget = QTabWidget(self.verticalLayoutWidget) + self.tabWidget.setObjectName(u"tabWidget") + self.tabWidget.setFocusPolicy(Qt.NoFocus) + self.createApparat = QWidget() + self.createApparat.setObjectName(u"createApparat") + sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred) + sizePolicy1.setHorizontalStretch(0) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth(self.createApparat.sizePolicy().hasHeightForWidth()) + self.createApparat.setSizePolicy(sizePolicy1) + self.horizontalLayoutWidget_2 = QWidget(self.createApparat) + self.horizontalLayoutWidget_2.setObjectName(u"horizontalLayoutWidget_2") + self.horizontalLayoutWidget_2.setGeometry(QRect(0, 0, 1261, 163)) + self.horizontalLayout_2 = QHBoxLayout(self.horizontalLayoutWidget_2) + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.formLayout = QtWidgets.QFormLayout() - self.formLayout.setObjectName("formLayout") - self.verticalLayout_2 = QtWidgets.QVBoxLayout() - self.verticalLayout_2.setObjectName("verticalLayout_2") - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) - self.verticalLayout_2.addItem(spacerItem) - self.create_document = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) - self.create_document.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.create_document.setObjectName("create_document") + self.formLayout = QFormLayout() + self.formLayout.setObjectName(u"formLayout") + self.verticalLayout_2 = QVBoxLayout() + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_2.addItem(self.verticalSpacer) + + self.create_document = QPushButton(self.horizontalLayoutWidget_2) + self.create_document.setObjectName(u"create_document") + self.create_document.setFocusPolicy(Qt.NoFocus) + self.verticalLayout_2.addWidget(self.create_document) - self.create_new_app = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) - self.create_new_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.create_new_app.setObjectName("create_new_app") + + self.create_new_app = QPushButton(self.horizontalLayoutWidget_2) + self.create_new_app.setObjectName(u"create_new_app") + self.create_new_app.setFocusPolicy(Qt.NoFocus) + self.verticalLayout_2.addWidget(self.create_new_app) - self.cancel_active_selection = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) + + self.cancel_active_selection = QPushButton(self.horizontalLayoutWidget_2) + self.cancel_active_selection.setObjectName(u"cancel_active_selection") self.cancel_active_selection.setEnabled(False) - self.cancel_active_selection.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.cancel_active_selection.setObjectName("cancel_active_selection") + self.cancel_active_selection.setFocusPolicy(Qt.NoFocus) + self.verticalLayout_2.addWidget(self.cancel_active_selection) - spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) - self.verticalLayout_2.addItem(spacerItem1) - self.formLayout.setLayout(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.verticalLayout_2) - self.tableWidget_apparate = QtWidgets.QTableWidget(parent=self.horizontalLayoutWidget_2) - self.tableWidget_apparate.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.tableWidget_apparate.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) - self.tableWidget_apparate.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + + self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_2.addItem(self.verticalSpacer_2) + + + self.formLayout.setLayout(1, QFormLayout.ItemRole.LabelRole, self.verticalLayout_2) + + self.tableWidget_apparate = QTableWidget(self.horizontalLayoutWidget_2) + if (self.tableWidget_apparate.columnCount() < 6): + self.tableWidget_apparate.setColumnCount(6) + __qtablewidgetitem = QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(0, __qtablewidgetitem) + __qtablewidgetitem1 = QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(1, __qtablewidgetitem1) + __qtablewidgetitem2 = QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(2, __qtablewidgetitem2) + __qtablewidgetitem3 = QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(3, __qtablewidgetitem3) + __qtablewidgetitem4 = QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(4, __qtablewidgetitem4) + __qtablewidgetitem5 = QTableWidgetItem() + self.tableWidget_apparate.setHorizontalHeaderItem(5, __qtablewidgetitem5) + self.tableWidget_apparate.setObjectName(u"tableWidget_apparate") + self.tableWidget_apparate.setFocusPolicy(Qt.NoFocus) + self.tableWidget_apparate.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) + self.tableWidget_apparate.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tableWidget_apparate.setAlternatingRowColors(True) - self.tableWidget_apparate.setTextElideMode(QtCore.Qt.TextElideMode.ElideMiddle) - self.tableWidget_apparate.setObjectName("tableWidget_apparate") - self.tableWidget_apparate.setColumnCount(6) - self.tableWidget_apparate.setRowCount(0) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparate.setHorizontalHeaderItem(0, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparate.setHorizontalHeaderItem(1, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparate.setHorizontalHeaderItem(2, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparate.setHorizontalHeaderItem(3, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparate.setHorizontalHeaderItem(4, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparate.setHorizontalHeaderItem(5, item) + self.tableWidget_apparate.setTextElideMode(Qt.ElideMiddle) + self.tableWidget_apparate.setSortingEnabled(False) self.tableWidget_apparate.horizontalHeader().setCascadingSectionResizes(True) - self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.tableWidget_apparate) + + self.formLayout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.tableWidget_apparate) + + self.horizontalLayout_2.addLayout(self.formLayout) - self.line = QtWidgets.QFrame(parent=self.createApparat) - self.line.setGeometry(QtCore.QRect(0, 160, 1261, 21)) - self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine) - self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line.setObjectName("line") - self.gridLayoutWidget_2 = QtWidgets.QWidget(parent=self.createApparat) + + self.line = QFrame(self.createApparat) + self.line.setObjectName(u"line") + self.line.setGeometry(QRect(0, 160, 1261, 21)) + self.line.setFrameShape(QFrame.Shape.HLine) + self.line.setFrameShadow(QFrame.Shadow.Sunken) + self.gridLayoutWidget_2 = QWidget(self.createApparat) + self.gridLayoutWidget_2.setObjectName(u"gridLayoutWidget_2") self.gridLayoutWidget_2.setEnabled(True) - self.gridLayoutWidget_2.setGeometry(QtCore.QRect(0, 180, 1261, 511)) - self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2") - self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2) + self.gridLayoutWidget_2.setGeometry(QRect(0, 180, 1261, 511)) + self.gridLayout_2 = QGridLayout(self.gridLayoutWidget_2) + self.gridLayout_2.setObjectName(u"gridLayout_2") self.gridLayout_2.setContentsMargins(0, 0, 0, 0) - self.gridLayout_2.setObjectName("gridLayout_2") - self.horizontalLayout_5 = QtWidgets.QHBoxLayout() - self.horizontalLayout_5.setObjectName("horizontalLayout_5") - spacerItem2 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_5.addItem(spacerItem2) - self.chkbx_show_del_media = QtWidgets.QCheckBox(parent=self.gridLayoutWidget_2) - self.chkbx_show_del_media.setObjectName("chkbx_show_del_media") + self.horizontalLayout_5 = QHBoxLayout() + self.horizontalLayout_5.setObjectName(u"horizontalLayout_5") + self.horizontalSpacer = QSpacerItem(20, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_5.addItem(self.horizontalSpacer) + + self.chkbx_show_del_media = QCheckBox(self.gridLayoutWidget_2) + self.chkbx_show_del_media.setObjectName(u"chkbx_show_del_media") + self.horizontalLayout_5.addWidget(self.chkbx_show_del_media) - spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_5.addItem(spacerItem3) - self.btn_reserve = QtWidgets.QPushButton(parent=self.gridLayoutWidget_2) - self.btn_reserve.setObjectName("btn_reserve") + + self.horizontalSpacer_3 = QSpacerItem(40, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_5.addItem(self.horizontalSpacer_3) + + self.btn_reserve = QPushButton(self.gridLayoutWidget_2) + self.btn_reserve.setObjectName(u"btn_reserve") + self.horizontalLayout_5.addWidget(self.btn_reserve) - self.add_layout = QtWidgets.QHBoxLayout() - self.add_layout.setObjectName("add_layout") - self.label_info = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) - self.label_info.setObjectName("label_info") + + self.add_layout = QHBoxLayout() + self.add_layout.setObjectName(u"add_layout") + self.label_info = QLabel(self.gridLayoutWidget_2) + self.label_info.setObjectName(u"label_info") + self.add_layout.addWidget(self.label_info) - self.line_2 = QtWidgets.QFrame(parent=self.gridLayoutWidget_2) - self.line_2.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line_2.setObjectName("line_2") + + self.line_2 = QFrame(self.gridLayoutWidget_2) + self.line_2.setObjectName(u"line_2") + self.line_2.setFrameShape(QFrame.Shape.VLine) + self.line_2.setFrameShadow(QFrame.Shadow.Sunken) + self.add_layout.addWidget(self.line_2) - self.progress_label = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) - self.progress_label.setObjectName("progress_label") + + self.progress_label = QLabel(self.gridLayoutWidget_2) + self.progress_label.setObjectName(u"progress_label") + self.add_layout.addWidget(self.progress_label) + + self.horizontalLayout_5.addLayout(self.add_layout) - spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_5.addItem(spacerItem4) - self.avail_layout = QtWidgets.QHBoxLayout() - self.avail_layout.setObjectName("avail_layout") + + self.horizontalSpacer_4 = QSpacerItem(40, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_5.addItem(self.horizontalSpacer_4) + + self.avail_layout = QHBoxLayout() + self.avail_layout.setObjectName(u"avail_layout") + self.horizontalLayout_5.addLayout(self.avail_layout) - self.label_20 = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) - self.label_20.setObjectName("label_20") + + self.label_20 = QLabel(self.gridLayoutWidget_2) + self.label_20.setObjectName(u"label_20") + self.horizontalLayout_5.addWidget(self.label_20) - self.line_3 = QtWidgets.QFrame(parent=self.gridLayoutWidget_2) - self.line_3.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line_3.setObjectName("line_3") + + self.line_3 = QFrame(self.gridLayoutWidget_2) + self.line_3.setObjectName(u"line_3") + self.line_3.setFrameShape(QFrame.Shape.VLine) + self.line_3.setFrameShadow(QFrame.Shadow.Sunken) + self.horizontalLayout_5.addWidget(self.line_3) - self.avail_status = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) - self.avail_status.setObjectName("avail_status") + + self.avail_status = QLabel(self.gridLayoutWidget_2) + self.avail_status.setObjectName(u"avail_status") + self.horizontalLayout_5.addWidget(self.avail_status) - self.automation_add_selected_books = QtWidgets.QPushButton(parent=self.gridLayoutWidget_2) - self.automation_add_selected_books.setObjectName("automation_add_selected_books") + + self.automation_add_selected_books = QPushButton(self.gridLayoutWidget_2) + self.automation_add_selected_books.setObjectName(u"automation_add_selected_books") + self.horizontalLayout_5.addWidget(self.automation_add_selected_books) - spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_5.addItem(spacerItem5) + + self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_5.addItem(self.horizontalSpacer_2) + + self.gridLayout_2.addLayout(self.horizontalLayout_5, 4, 0, 1, 1) - self.tableWidget_apparat_media = QtWidgets.QTableWidget(parent=self.gridLayoutWidget_2) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.tableWidget_apparat_media.sizePolicy().hasHeightForWidth()) - self.tableWidget_apparat_media.setSizePolicy(sizePolicy) - self.tableWidget_apparat_media.setMinimumSize(QtCore.QSize(1259, 0)) - self.tableWidget_apparat_media.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.tableWidget_apparat_media.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu) - self.tableWidget_apparat_media.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) - self.tableWidget_apparat_media.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + + self.tableWidget_apparat_media = QTableWidget(self.gridLayoutWidget_2) + if (self.tableWidget_apparat_media.columnCount() < 7): + self.tableWidget_apparat_media.setColumnCount(7) + __qtablewidgetitem6 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(0, __qtablewidgetitem6) + __qtablewidgetitem7 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(1, __qtablewidgetitem7) + __qtablewidgetitem8 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(2, __qtablewidgetitem8) + __qtablewidgetitem9 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(3, __qtablewidgetitem9) + __qtablewidgetitem10 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(4, __qtablewidgetitem10) + __qtablewidgetitem11 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(5, __qtablewidgetitem11) + __qtablewidgetitem12 = QTableWidgetItem() + self.tableWidget_apparat_media.setHorizontalHeaderItem(6, __qtablewidgetitem12) + self.tableWidget_apparat_media.setObjectName(u"tableWidget_apparat_media") + sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.tableWidget_apparat_media.sizePolicy().hasHeightForWidth()) + self.tableWidget_apparat_media.setSizePolicy(sizePolicy2) + self.tableWidget_apparat_media.setMinimumSize(QSize(1259, 0)) + self.tableWidget_apparat_media.setFocusPolicy(Qt.NoFocus) + self.tableWidget_apparat_media.setContextMenuPolicy(Qt.CustomContextMenu) + self.tableWidget_apparat_media.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) + self.tableWidget_apparat_media.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tableWidget_apparat_media.setAlternatingRowColors(True) - self.tableWidget_apparat_media.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) - self.tableWidget_apparat_media.setObjectName("tableWidget_apparat_media") - self.tableWidget_apparat_media.setColumnCount(7) - self.tableWidget_apparat_media.setRowCount(0) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparat_media.setHorizontalHeaderItem(0, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparat_media.setHorizontalHeaderItem(1, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparat_media.setHorizontalHeaderItem(2, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparat_media.setHorizontalHeaderItem(3, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparat_media.setHorizontalHeaderItem(4, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparat_media.setHorizontalHeaderItem(5, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidget_apparat_media.setHorizontalHeaderItem(6, item) + self.tableWidget_apparat_media.setSelectionBehavior(QAbstractItemView.SelectRows) + self.tableWidget_apparat_media.setSortingEnabled(True) self.tableWidget_apparat_media.horizontalHeader().setCascadingSectionResizes(True) + self.gridLayout_2.addWidget(self.tableWidget_apparat_media, 9, 0, 1, 1) - self.label = QtWidgets.QLabel(parent=self.gridLayoutWidget_2) - font = QtGui.QFont() + + self.label = QLabel(self.gridLayoutWidget_2) + self.label.setObjectName(u"label") + font = QFont() font.setPointSize(11) font.setBold(True) self.label.setFont(font) - self.label.setObjectName("label") + self.gridLayout_2.addWidget(self.label, 2, 0, 1, 1) - self.app_group_box = QtWidgets.QGroupBox(parent=self.gridLayoutWidget_2) + + self.app_group_box = QGroupBox(self.gridLayoutWidget_2) + self.app_group_box.setObjectName(u"app_group_box") self.app_group_box.setEnabled(True) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.app_group_box.sizePolicy().hasHeightForWidth()) - self.app_group_box.setSizePolicy(sizePolicy) - self.app_group_box.setMinimumSize(QtCore.QSize(0, 210)) - font = QtGui.QFont() - font.setPointSize(12) - font.setBold(True) - self.app_group_box.setFont(font) - self.app_group_box.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.app_group_box.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignVCenter) + sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) + sizePolicy3.setHorizontalStretch(0) + sizePolicy3.setVerticalStretch(0) + sizePolicy3.setHeightForWidth(self.app_group_box.sizePolicy().hasHeightForWidth()) + self.app_group_box.setSizePolicy(sizePolicy3) + self.app_group_box.setMinimumSize(QSize(0, 210)) + font1 = QFont() + font1.setPointSize(12) + font1.setBold(True) + self.app_group_box.setFont(font1) + self.app_group_box.setFocusPolicy(Qt.NoFocus) + self.app_group_box.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) self.app_group_box.setCheckable(False) - self.app_group_box.setObjectName("app_group_box") - self.document_list = QtWidgets.QTableWidget(parent=self.app_group_box) - self.document_list.setGeometry(QtCore.QRect(780, 20, 321, 181)) - font = QtGui.QFont() - font.setPointSize(10) - font.setBold(False) - font.setKerning(False) - self.document_list.setFont(font) - self.document_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.document_list = QTableWidget(self.app_group_box) + if (self.document_list.columnCount() < 4): + self.document_list.setColumnCount(4) + font2 = QFont() + font2.setFamilies([u"Arial"]) + font2.setPointSize(8) + __qtablewidgetitem13 = QTableWidgetItem() + __qtablewidgetitem13.setFont(font2); + self.document_list.setHorizontalHeaderItem(0, __qtablewidgetitem13) + __qtablewidgetitem14 = QTableWidgetItem() + __qtablewidgetitem14.setFont(font2); + self.document_list.setHorizontalHeaderItem(1, __qtablewidgetitem14) + __qtablewidgetitem15 = QTableWidgetItem() + __qtablewidgetitem15.setFont(font2); + self.document_list.setHorizontalHeaderItem(2, __qtablewidgetitem15) + __qtablewidgetitem16 = QTableWidgetItem() + self.document_list.setHorizontalHeaderItem(3, __qtablewidgetitem16) + self.document_list.setObjectName(u"document_list") + self.document_list.setGeometry(QRect(780, 20, 321, 181)) + font3 = QFont() + font3.setPointSize(10) + font3.setBold(False) + font3.setKerning(False) + self.document_list.setFont(font3) + self.document_list.setFocusPolicy(Qt.NoFocus) self.document_list.setAcceptDrops(True) - self.document_list.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) - self.document_list.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) + self.document_list.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.document_list.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.document_list.setDragEnabled(True) - self.document_list.setDragDropMode(QtWidgets.QAbstractItemView.DragDropMode.DragOnly) - self.document_list.setDefaultDropAction(QtCore.Qt.DropAction.LinkAction) - self.document_list.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) - self.document_list.setObjectName("document_list") - self.document_list.setColumnCount(4) - self.document_list.setRowCount(0) - item = QtWidgets.QTableWidgetItem() - font = QtGui.QFont() - font.setFamily("Arial") - font.setPointSize(8) - item.setFont(font) - self.document_list.setHorizontalHeaderItem(0, item) - item = QtWidgets.QTableWidgetItem() - font = QtGui.QFont() - font.setFamily("Arial") - font.setPointSize(8) - item.setFont(font) - self.document_list.setHorizontalHeaderItem(1, item) - item = QtWidgets.QTableWidgetItem() - font = QtGui.QFont() - font.setFamily("Arial") - font.setPointSize(8) - item.setFont(font) - self.document_list.setHorizontalHeaderItem(2, item) - item = QtWidgets.QTableWidgetItem() - self.document_list.setHorizontalHeaderItem(3, item) + self.document_list.setDragDropMode(QAbstractItemView.DragOnly) + self.document_list.setDefaultDropAction(Qt.LinkAction) + self.document_list.setSelectionMode(QAbstractItemView.SingleSelection) self.document_list.horizontalHeader().setDefaultSectionSize(107) - self.appname_mand = QtWidgets.QLabel(parent=self.app_group_box) - self.appname_mand.setGeometry(QtCore.QRect(330, 50, 16, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.appname_mand.setFont(font) - self.appname_mand.setObjectName("appname_mand") - self.profname_mand = QtWidgets.QLabel(parent=self.app_group_box) - self.profname_mand.setGeometry(QtCore.QRect(110, 110, 16, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.profname_mand.setFont(font) - self.profname_mand.setObjectName("profname_mand") - self.prof_title = QtWidgets.QLineEdit(parent=self.app_group_box) - self.prof_title.setGeometry(QtCore.QRect(120, 80, 71, 20)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.prof_title.setFont(font) - self.prof_title.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus) - self.prof_title.setObjectName("prof_title") - self.fach_mand = QtWidgets.QLabel(parent=self.app_group_box) - self.fach_mand.setGeometry(QtCore.QRect(510, 50, 47, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.fach_mand.setFont(font) - self.fach_mand.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.fach_mand.setObjectName("fach_mand") - self.btn_apparat_apply = QtWidgets.QPushButton(parent=self.app_group_box) - self.btn_apparat_apply.setGeometry(QtCore.QRect(360, 150, 75, 23)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.btn_apparat_apply.setFont(font) - self.btn_apparat_apply.setObjectName("btn_apparat_apply") - self.label_9 = QtWidgets.QLabel(parent=self.app_group_box) - self.label_9.setGeometry(QtCore.QRect(20, 160, 71, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.label_9.setFont(font) - self.label_9.setObjectName("label_9") - self.gridLayoutWidget_5 = QtWidgets.QWidget(parent=self.app_group_box) - self.gridLayoutWidget_5.setGeometry(QtCore.QRect(520, 30, 241, 61)) - self.gridLayoutWidget_5.setObjectName("gridLayoutWidget_5") - self.gridLayout_6 = QtWidgets.QGridLayout(self.gridLayoutWidget_5) + self.appname_mand = QLabel(self.app_group_box) + self.appname_mand.setObjectName(u"appname_mand") + self.appname_mand.setGeometry(QRect(330, 50, 16, 21)) + font4 = QFont() + font4.setPointSize(9) + font4.setBold(False) + self.appname_mand.setFont(font4) + self.profname_mand = QLabel(self.app_group_box) + self.profname_mand.setObjectName(u"profname_mand") + self.profname_mand.setGeometry(QRect(110, 110, 16, 21)) + self.profname_mand.setFont(font4) + self.prof_title = QLineEdit(self.app_group_box) + self.prof_title.setObjectName(u"prof_title") + self.prof_title.setGeometry(QRect(120, 80, 71, 20)) + self.prof_title.setFont(font4) + self.prof_title.setFocusPolicy(Qt.ClickFocus) + self.fach_mand = QLabel(self.app_group_box) + self.fach_mand.setObjectName(u"fach_mand") + self.fach_mand.setGeometry(QRect(510, 50, 47, 21)) + self.fach_mand.setFont(font4) + self.fach_mand.setFocusPolicy(Qt.NoFocus) + self.btn_apparat_apply = QPushButton(self.app_group_box) + self.btn_apparat_apply.setObjectName(u"btn_apparat_apply") + self.btn_apparat_apply.setGeometry(QRect(360, 150, 75, 23)) + self.btn_apparat_apply.setFont(font4) + self.label_9 = QLabel(self.app_group_box) + self.label_9.setObjectName(u"label_9") + self.label_9.setGeometry(QRect(20, 160, 71, 21)) + self.label_9.setFont(font4) + self.gridLayoutWidget_5 = QWidget(self.app_group_box) + self.gridLayoutWidget_5.setObjectName(u"gridLayoutWidget_5") + self.gridLayoutWidget_5.setGeometry(QRect(520, 30, 241, 61)) + self.gridLayout_6 = QGridLayout(self.gridLayoutWidget_5) + self.gridLayout_6.setObjectName(u"gridLayout_6") self.gridLayout_6.setContentsMargins(0, 0, 0, 0) - self.gridLayout_6.setObjectName("gridLayout_6") - self.app_fach = QtWidgets.QComboBox(parent=self.gridLayoutWidget_5) - self.app_fach.setMaximumSize(QtCore.QSize(16777215, 25)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.app_fach.setFont(font) + self.app_fach = QComboBox(self.gridLayoutWidget_5) + self.app_fach.setObjectName(u"app_fach") + self.app_fach.setMaximumSize(QSize(16777215, 25)) + self.app_fach.setFont(font4) self.app_fach.setEditable(True) - self.app_fach.setObjectName("app_fach") + self.gridLayout_6.addWidget(self.app_fach, 0, 1, 1, 1) - spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.gridLayout_6.addItem(spacerItem6, 0, 3, 1, 1) - self.valid_check_app_fach = QtWidgets.QToolButton(parent=self.gridLayoutWidget_5) - self.valid_check_app_fach.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.valid_check_app_fach.setText("") + + self.horizontalSpacer_7 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.gridLayout_6.addItem(self.horizontalSpacer_7, 0, 3, 1, 1) + + self.valid_check_app_fach = QToolButton(self.gridLayoutWidget_5) + self.valid_check_app_fach.setObjectName(u"valid_check_app_fach") + self.valid_check_app_fach.setFocusPolicy(Qt.NoFocus) self.valid_check_app_fach.setAutoRaise(True) - self.valid_check_app_fach.setArrowType(QtCore.Qt.ArrowType.NoArrow) - self.valid_check_app_fach.setObjectName("valid_check_app_fach") + self.valid_check_app_fach.setArrowType(Qt.NoArrow) + self.gridLayout_6.addWidget(self.valid_check_app_fach, 0, 2, 1, 1) - self._mand = QtWidgets.QLabel(parent=self.app_group_box) - self._mand.setGeometry(QtCore.QRect(330, 90, 16, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self._mand.setFont(font) - self._mand.setObjectName("_mand") - self.prof_tel_nr = QtWidgets.QLineEdit(parent=self.app_group_box) - self.prof_tel_nr.setGeometry(QtCore.QRect(120, 160, 121, 20)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.prof_tel_nr.setFont(font) - self.prof_tel_nr.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone) - self.prof_tel_nr.setPlaceholderText("") - self.prof_tel_nr.setObjectName("prof_tel_nr") - self.check_eternal_app = QtWidgets.QCheckBox(parent=self.app_group_box) + + self._mand = QLabel(self.app_group_box) + self._mand.setObjectName(u"_mand") + self._mand.setGeometry(QRect(330, 90, 16, 21)) + self._mand.setFont(font4) + self.prof_tel_nr = QLineEdit(self.app_group_box) + self.prof_tel_nr.setObjectName(u"prof_tel_nr") + self.prof_tel_nr.setGeometry(QRect(120, 160, 121, 20)) + self.prof_tel_nr.setFont(font4) + self.prof_tel_nr.setInputMethodHints(Qt.ImhNone) + self.check_eternal_app = QCheckBox(self.app_group_box) + self.check_eternal_app.setObjectName(u"check_eternal_app") self.check_eternal_app.setEnabled(False) - self.check_eternal_app.setGeometry(QtCore.QRect(340, 120, 101, 17)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.check_eternal_app.setFont(font) - self.check_eternal_app.setObjectName("check_eternal_app") - self.sem_sommer = QtWidgets.QCheckBox(parent=self.app_group_box) - self.sem_sommer.setGeometry(QtCore.QRect(340, 100, 82, 17)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.sem_sommer.setFont(font) - self.sem_sommer.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) - self.sem_sommer.setObjectName("sem_sommer") - self.drpdwn_prof_name = QtWidgets.QComboBox(parent=self.app_group_box) - self.drpdwn_prof_name.setGeometry(QtCore.QRect(120, 110, 121, 22)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.drpdwn_prof_name.setFont(font) - self.drpdwn_prof_name.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) - self.drpdwn_prof_name.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone) + self.check_eternal_app.setGeometry(QRect(340, 120, 101, 17)) + self.check_eternal_app.setFont(font4) + self.sem_sommer = QCheckBox(self.app_group_box) + self.sem_sommer.setObjectName(u"sem_sommer") + self.sem_sommer.setGeometry(QRect(340, 100, 82, 17)) + self.sem_sommer.setFont(font4) + self.sem_sommer.setFocusPolicy(Qt.StrongFocus) + self.drpdwn_prof_name = QComboBox(self.app_group_box) + self.drpdwn_prof_name.setObjectName(u"drpdwn_prof_name") + self.drpdwn_prof_name.setGeometry(QRect(120, 110, 121, 22)) + self.drpdwn_prof_name.setFont(font4) + self.drpdwn_prof_name.setFocusPolicy(Qt.StrongFocus) + self.drpdwn_prof_name.setInputMethodHints(Qt.ImhNone) self.drpdwn_prof_name.setEditable(True) - self.drpdwn_prof_name.setInsertPolicy(QtWidgets.QComboBox.InsertPolicy.InsertAlphabetically) - self.drpdwn_prof_name.setPlaceholderText("") + self.drpdwn_prof_name.setInsertPolicy(QComboBox.InsertAlphabetically) self.drpdwn_prof_name.setFrame(True) - self.drpdwn_prof_name.setObjectName("drpdwn_prof_name") - self.mail_mand = QtWidgets.QLabel(parent=self.app_group_box) - self.mail_mand.setGeometry(QtCore.QRect(110, 140, 47, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.mail_mand.setFont(font) - self.mail_mand.setObjectName("mail_mand") - self.label_3 = QtWidgets.QLabel(parent=self.app_group_box) - self.label_3.setGeometry(QtCore.QRect(20, 80, 61, 20)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.label_3.setFont(font) - self.label_3.setObjectName("label_3") - self.label_2 = QtWidgets.QLabel(parent=self.app_group_box) - self.label_2.setGeometry(QtCore.QRect(20, 50, 101, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.label_2.setFont(font) - self.label_2.setObjectName("label_2") - self.label_8 = QtWidgets.QLabel(parent=self.app_group_box) - self.label_8.setGeometry(QtCore.QRect(20, 140, 71, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.label_8.setFont(font) - self.label_8.setObjectName("label_8") - self.label_10 = QtWidgets.QLabel(parent=self.app_group_box) - self.label_10.setGeometry(QtCore.QRect(480, 50, 51, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.label_10.setFont(font) - self.label_10.setObjectName("label_10") - self.prof_mail = QtWidgets.QLineEdit(parent=self.app_group_box) - self.prof_mail.setGeometry(QtCore.QRect(120, 140, 121, 20)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.prof_mail.setFont(font) - self.prof_mail.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhEmailCharactersOnly) + self.mail_mand = QLabel(self.app_group_box) + self.mail_mand.setObjectName(u"mail_mand") + self.mail_mand.setGeometry(QRect(110, 140, 47, 21)) + self.mail_mand.setFont(font4) + self.label_3 = QLabel(self.app_group_box) + self.label_3.setObjectName(u"label_3") + self.label_3.setGeometry(QRect(20, 80, 61, 20)) + self.label_3.setFont(font4) + self.label_2 = QLabel(self.app_group_box) + self.label_2.setObjectName(u"label_2") + self.label_2.setGeometry(QRect(20, 50, 101, 21)) + self.label_2.setFont(font4) + self.label_8 = QLabel(self.app_group_box) + self.label_8.setObjectName(u"label_8") + self.label_8.setGeometry(QRect(20, 140, 71, 21)) + self.label_8.setFont(font4) + self.label_10 = QLabel(self.app_group_box) + self.label_10.setObjectName(u"label_10") + self.label_10.setGeometry(QRect(480, 50, 51, 21)) + self.label_10.setFont(font4) + self.prof_mail = QLineEdit(self.app_group_box) + self.prof_mail.setObjectName(u"prof_mail") + self.prof_mail.setGeometry(QRect(120, 140, 121, 20)) + self.prof_mail.setFont(font4) + self.prof_mail.setInputMethodHints(Qt.ImhEmailCharactersOnly) self.prof_mail.setMaxLength(200) - self.prof_mail.setPlaceholderText("") - self.prof_mail.setObjectName("prof_mail") - self.formLayoutWidget_2 = QtWidgets.QWidget(parent=self.app_group_box) - self.formLayoutWidget_2.setGeometry(QtCore.QRect(560, 100, 211, 99)) - self.formLayoutWidget_2.setObjectName("formLayoutWidget_2") - self.formLayout_3 = QtWidgets.QFormLayout(self.formLayoutWidget_2) + self.formLayoutWidget_2 = QWidget(self.app_group_box) + self.formLayoutWidget_2.setObjectName(u"formLayoutWidget_2") + self.formLayoutWidget_2.setGeometry(QRect(560, 100, 211, 99)) + self.formLayout_3 = QFormLayout(self.formLayoutWidget_2) + self.formLayout_3.setObjectName(u"formLayout_3") self.formLayout_3.setContentsMargins(0, 0, 0, 0) - self.formLayout_3.setObjectName("formLayout_3") - self.label_12 = QtWidgets.QLabel(parent=self.formLayoutWidget_2) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.label_12.setFont(font) - self.label_12.setObjectName("label_12") - self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_12) - self.prof_id_adis = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.prof_id_adis.setFont(font) - self.prof_id_adis.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhPreferNumbers) - self.prof_id_adis.setText("") - self.prof_id_adis.setObjectName("prof_id_adis") - self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.prof_id_adis) - self.label_13 = QtWidgets.QLabel(parent=self.formLayoutWidget_2) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.label_13.setFont(font) - self.label_13.setObjectName("label_13") - self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_13) - self.apparat_id_adis = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.apparat_id_adis.setFont(font) - self.apparat_id_adis.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhPreferNumbers) - self.apparat_id_adis.setObjectName("apparat_id_adis") - self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.apparat_id_adis) - self.sem_year = QtWidgets.QLineEdit(parent=self.app_group_box) - self.sem_year.setGeometry(QtCore.QRect(410, 90, 113, 20)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.sem_year.setFont(font) - self.sem_year.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.label_12 = QLabel(self.formLayoutWidget_2) + self.label_12.setObjectName(u"label_12") + self.label_12.setFont(font4) + + self.formLayout_3.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label_12) + + self.prof_id_adis = QLineEdit(self.formLayoutWidget_2) + self.prof_id_adis.setObjectName(u"prof_id_adis") + self.prof_id_adis.setFont(font4) + self.prof_id_adis.setInputMethodHints(Qt.ImhPreferNumbers) + + self.formLayout_3.setWidget(0, QFormLayout.ItemRole.FieldRole, self.prof_id_adis) + + self.label_13 = QLabel(self.formLayoutWidget_2) + self.label_13.setObjectName(u"label_13") + self.label_13.setFont(font4) + + self.formLayout_3.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_13) + + self.apparat_id_adis = QLineEdit(self.formLayoutWidget_2) + self.apparat_id_adis.setObjectName(u"apparat_id_adis") + self.apparat_id_adis.setFont(font4) + self.apparat_id_adis.setInputMethodHints(Qt.ImhPreferNumbers) + + self.formLayout_3.setWidget(1, QFormLayout.ItemRole.FieldRole, self.apparat_id_adis) + + self.sem_year = QLineEdit(self.app_group_box) + self.sem_year.setObjectName(u"sem_year") + self.sem_year.setGeometry(QRect(410, 90, 113, 20)) + self.sem_year.setFont(font4) + self.sem_year.setFocusPolicy(Qt.StrongFocus) self.sem_year.setMaxLength(5) - self.sem_year.setObjectName("sem_year") - self.check_send_mail = QtWidgets.QCheckBox(parent=self.app_group_box) - self.check_send_mail.setGeometry(QtCore.QRect(450, 150, 91, 24)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.check_send_mail.setFont(font) - self.check_send_mail.setObjectName("check_send_mail") - self.sem_winter = QtWidgets.QCheckBox(parent=self.app_group_box) - self.sem_winter.setGeometry(QtCore.QRect(340, 80, 82, 17)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.sem_winter.setFont(font) - self.sem_winter.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) - self.sem_winter.setObjectName("sem_winter") - self.label_4 = QtWidgets.QLabel(parent=self.app_group_box) - self.label_4.setGeometry(QtCore.QRect(20, 110, 71, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.label_4.setFont(font) - self.label_4.setObjectName("label_4") - self.telnr_mand = QtWidgets.QLabel(parent=self.app_group_box) - self.telnr_mand.setGeometry(QtCore.QRect(110, 160, 47, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.telnr_mand.setFont(font) - self.telnr_mand.setObjectName("telnr_mand") - self.btn_apparat_save = QtWidgets.QPushButton(parent=self.app_group_box) - self.btn_apparat_save.setGeometry(QtCore.QRect(270, 150, 75, 23)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.btn_apparat_save.setFont(font) - self.btn_apparat_save.setStatusTip("") - self.btn_apparat_save.setObjectName("btn_apparat_save") - self.label_5 = QtWidgets.QLabel(parent=self.app_group_box) - self.label_5.setGeometry(QtCore.QRect(250, 50, 91, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.label_5.setFont(font) - self.label_5.setObjectName("label_5") - self.app_name = QtWidgets.QLineEdit(parent=self.app_group_box) - self.app_name.setGeometry(QtCore.QRect(340, 50, 113, 20)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.app_name.setFont(font) - self.app_name.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) - self.app_name.setObjectName("app_name") - self.drpdwn_app_nr = QtWidgets.QComboBox(parent=self.app_group_box) - self.drpdwn_app_nr.setGeometry(QtCore.QRect(120, 50, 69, 22)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.drpdwn_app_nr.setFont(font) - self.drpdwn_app_nr.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone) + self.check_send_mail = QCheckBox(self.app_group_box) + self.check_send_mail.setObjectName(u"check_send_mail") + self.check_send_mail.setGeometry(QRect(450, 150, 91, 24)) + self.check_send_mail.setFont(font4) + self.sem_winter = QCheckBox(self.app_group_box) + self.sem_winter.setObjectName(u"sem_winter") + self.sem_winter.setGeometry(QRect(340, 80, 82, 17)) + self.sem_winter.setFont(font4) + self.sem_winter.setFocusPolicy(Qt.StrongFocus) + self.label_4 = QLabel(self.app_group_box) + self.label_4.setObjectName(u"label_4") + self.label_4.setGeometry(QRect(20, 110, 71, 21)) + self.label_4.setFont(font4) + self.telnr_mand = QLabel(self.app_group_box) + self.telnr_mand.setObjectName(u"telnr_mand") + self.telnr_mand.setGeometry(QRect(110, 160, 47, 21)) + self.telnr_mand.setFont(font4) + self.btn_apparat_save = QPushButton(self.app_group_box) + self.btn_apparat_save.setObjectName(u"btn_apparat_save") + self.btn_apparat_save.setGeometry(QRect(270, 150, 75, 23)) + self.btn_apparat_save.setFont(font4) + self.label_5 = QLabel(self.app_group_box) + self.label_5.setObjectName(u"label_5") + self.label_5.setGeometry(QRect(250, 50, 91, 21)) + self.label_5.setFont(font4) + self.app_name = QLineEdit(self.app_group_box) + self.app_name.setObjectName(u"app_name") + self.app_name.setGeometry(QRect(340, 50, 113, 20)) + self.app_name.setFont(font4) + self.app_name.setFocusPolicy(Qt.StrongFocus) + self.drpdwn_app_nr = QComboBox(self.app_group_box) + self.drpdwn_app_nr.setObjectName(u"drpdwn_app_nr") + self.drpdwn_app_nr.setGeometry(QRect(120, 50, 69, 22)) + self.drpdwn_app_nr.setFont(font4) + self.drpdwn_app_nr.setInputMethodHints(Qt.ImhNone) self.drpdwn_app_nr.setEditable(True) - self.drpdwn_app_nr.setObjectName("drpdwn_app_nr") - self.label_6 = QtWidgets.QLabel(parent=self.app_group_box) - self.label_6.setGeometry(QtCore.QRect(270, 90, 61, 21)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.label_6.setFont(font) - self.label_6.setObjectName("label_6") - self.valid_check_profname = QtWidgets.QToolButton(parent=self.app_group_box) - self.valid_check_profname.setGeometry(QtCore.QRect(240, 110, 23, 22)) - self.valid_check_profname.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.valid_check_profname.setText("") + self.label_6 = QLabel(self.app_group_box) + self.label_6.setObjectName(u"label_6") + self.label_6.setGeometry(QRect(270, 90, 61, 21)) + self.label_6.setFont(font4) + self.valid_check_profname = QToolButton(self.app_group_box) + self.valid_check_profname.setObjectName(u"valid_check_profname") + self.valid_check_profname.setGeometry(QRect(240, 110, 23, 22)) + self.valid_check_profname.setFocusPolicy(Qt.NoFocus) self.valid_check_profname.setAutoRaise(True) - self.valid_check_profname.setArrowType(QtCore.Qt.ArrowType.NoArrow) - self.valid_check_profname.setObjectName("valid_check_profname") - self.valid_check_appname = QtWidgets.QToolButton(parent=self.app_group_box) - self.valid_check_appname.setGeometry(QtCore.QRect(450, 50, 22, 22)) - self.valid_check_appname.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.valid_check_appname.setText("") + self.valid_check_profname.setArrowType(Qt.NoArrow) + self.valid_check_appname = QToolButton(self.app_group_box) + self.valid_check_appname.setObjectName(u"valid_check_appname") + self.valid_check_appname.setGeometry(QRect(450, 50, 22, 22)) + self.valid_check_appname.setFocusPolicy(Qt.NoFocus) self.valid_check_appname.setAutoRaise(True) - self.valid_check_appname.setObjectName("valid_check_appname") - self.valid_check_semester = QtWidgets.QToolButton(parent=self.app_group_box) - self.valid_check_semester.setGeometry(QtCore.QRect(520, 90, 22, 22)) - self.valid_check_semester.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.valid_check_semester.setText("") + self.valid_check_semester = QToolButton(self.app_group_box) + self.valid_check_semester.setObjectName(u"valid_check_semester") + self.valid_check_semester.setGeometry(QRect(520, 90, 22, 22)) + self.valid_check_semester.setFocusPolicy(Qt.NoFocus) self.valid_check_semester.setAutoRaise(True) - self.valid_check_semester.setObjectName("valid_check_semester") - self.valid_check_mail = QtWidgets.QToolButton(parent=self.app_group_box) - self.valid_check_mail.setGeometry(QtCore.QRect(240, 140, 22, 22)) - self.valid_check_mail.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.valid_check_mail.setText("") + self.valid_check_mail = QToolButton(self.app_group_box) + self.valid_check_mail.setObjectName(u"valid_check_mail") + self.valid_check_mail.setGeometry(QRect(240, 140, 22, 22)) + self.valid_check_mail.setFocusPolicy(Qt.NoFocus) self.valid_check_mail.setAutoRaise(True) - self.valid_check_mail.setObjectName("valid_check_mail") - self.valid_check_telnr = QtWidgets.QToolButton(parent=self.app_group_box) - self.valid_check_telnr.setGeometry(QtCore.QRect(240, 160, 22, 22)) - self.valid_check_telnr.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.valid_check_telnr.setText("") + self.valid_check_telnr = QToolButton(self.app_group_box) + self.valid_check_telnr.setObjectName(u"valid_check_telnr") + self.valid_check_telnr.setGeometry(QRect(240, 160, 22, 22)) + self.valid_check_telnr.setFocusPolicy(Qt.NoFocus) self.valid_check_telnr.setAutoRaise(True) - self.valid_check_telnr.setObjectName("valid_check_telnr") - self.saveandcreate = QtWidgets.QPushButton(parent=self.app_group_box) + self.saveandcreate = QPushButton(self.app_group_box) + self.saveandcreate.setObjectName(u"saveandcreate") self.saveandcreate.setEnabled(False) - self.saveandcreate.setGeometry(QtCore.QRect(270, 180, 161, 24)) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.saveandcreate.setFont(font) - self.saveandcreate.setObjectName("saveandcreate") - self.verticalLayoutWidget_3 = QtWidgets.QWidget(parent=self.app_group_box) - self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(1110, 17, 131, 181)) - self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3") - self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3) + self.saveandcreate.setGeometry(QRect(270, 180, 161, 24)) + self.saveandcreate.setFont(font4) + self.verticalLayoutWidget_3 = QWidget(self.app_group_box) + self.verticalLayoutWidget_3.setObjectName(u"verticalLayoutWidget_3") + self.verticalLayoutWidget_3.setGeometry(QRect(1110, 17, 131, 181)) + self.verticalLayout_8 = QVBoxLayout(self.verticalLayoutWidget_3) + self.verticalLayout_8.setObjectName(u"verticalLayout_8") self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) - self.verticalLayout_8.setObjectName("verticalLayout_8") - self.btn_add_document = QtWidgets.QPushButton(parent=self.verticalLayoutWidget_3) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.MinimumExpanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.btn_add_document.sizePolicy().hasHeightForWidth()) - self.btn_add_document.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.btn_add_document.setFont(font) - self.btn_add_document.setObjectName("btn_add_document") + self.btn_add_document = QPushButton(self.verticalLayoutWidget_3) + self.btn_add_document.setObjectName(u"btn_add_document") + sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.MinimumExpanding) + sizePolicy4.setHorizontalStretch(0) + sizePolicy4.setVerticalStretch(0) + sizePolicy4.setHeightForWidth(self.btn_add_document.sizePolicy().hasHeightForWidth()) + self.btn_add_document.setSizePolicy(sizePolicy4) + self.btn_add_document.setFont(font4) + self.verticalLayout_8.addWidget(self.btn_add_document) - self.btn_open_document = QtWidgets.QPushButton(parent=self.verticalLayoutWidget_3) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.MinimumExpanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.btn_open_document.sizePolicy().hasHeightForWidth()) - self.btn_open_document.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.btn_open_document.setFont(font) - self.btn_open_document.setObjectName("btn_open_document") + + self.btn_open_document = QPushButton(self.verticalLayoutWidget_3) + self.btn_open_document.setObjectName(u"btn_open_document") + sizePolicy4.setHeightForWidth(self.btn_open_document.sizePolicy().hasHeightForWidth()) + self.btn_open_document.setSizePolicy(sizePolicy4) + self.btn_open_document.setFont(font4) + self.verticalLayout_8.addWidget(self.btn_open_document) - self.check_file = QtWidgets.QPushButton(parent=self.verticalLayoutWidget_3) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.MinimumExpanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.check_file.sizePolicy().hasHeightForWidth()) - self.check_file.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.check_file.setFont(font) - self.check_file.setObjectName("check_file") + + self.check_file = QPushButton(self.verticalLayoutWidget_3) + self.check_file.setObjectName(u"check_file") + sizePolicy4.setHeightForWidth(self.check_file.sizePolicy().hasHeightForWidth()) + self.check_file.setSizePolicy(sizePolicy4) + self.check_file.setFont(font4) + self.verticalLayout_8.addWidget(self.check_file) - self.btn_extract_data_from_document = QtWidgets.QPushButton(parent=self.verticalLayoutWidget_3) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.MinimumExpanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.btn_extract_data_from_document.sizePolicy().hasHeightForWidth()) - self.btn_extract_data_from_document.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setPointSize(9) - font.setBold(False) - self.btn_extract_data_from_document.setFont(font) - self.btn_extract_data_from_document.setObjectName("btn_extract_data_from_document") + + self.btn_extract_data_from_document = QPushButton(self.verticalLayoutWidget_3) + self.btn_extract_data_from_document.setObjectName(u"btn_extract_data_from_document") + sizePolicy4.setHeightForWidth(self.btn_extract_data_from_document.sizePolicy().hasHeightForWidth()) + self.btn_extract_data_from_document.setSizePolicy(sizePolicy4) + self.btn_extract_data_from_document.setFont(font4) + self.verticalLayout_8.addWidget(self.btn_extract_data_from_document) + self.verticalLayout_8.setStretch(0, 1) self.verticalLayout_8.setStretch(1, 1) self.verticalLayout_8.setStretch(2, 2) self.verticalLayout_8.setStretch(3, 2) + self.gridLayout_2.addWidget(self.app_group_box, 1, 0, 1, 1) - self.add_medium = QtWidgets.QPushButton(parent=self.createApparat) - self.add_medium.setGeometry(QtCore.QRect(3, 695, 121, 20)) - self.add_medium.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.add_medium.setObjectName("add_medium") + + self.add_medium = QPushButton(self.createApparat) + self.add_medium.setObjectName(u"add_medium") + self.add_medium.setGeometry(QRect(3, 695, 121, 20)) + self.add_medium.setFocusPolicy(Qt.NoFocus) self.tabWidget.addTab(self.createApparat, "") - self.search_statistics = QtWidgets.QWidget() - self.search_statistics.setObjectName("search_statistics") + self.search_statistics = QWidget() + self.search_statistics.setObjectName(u"search_statistics") self.tabWidget.addTab(self.search_statistics, "") - self.elsatab = QtWidgets.QWidget() - self.elsatab.setObjectName("elsatab") + self.elsatab = QWidget() + self.elsatab.setObjectName(u"elsatab") self.tabWidget.addTab(self.elsatab, "") - self.admin = QtWidgets.QWidget() - self.admin.setObjectName("admin") - self.label_21 = QtWidgets.QLabel(parent=self.admin) - self.label_21.setGeometry(QtCore.QRect(10, 30, 47, 22)) - self.label_21.setObjectName("label_21") - self.select_action_box = QtWidgets.QComboBox(parent=self.admin) - self.select_action_box.setGeometry(QtCore.QRect(60, 30, 181, 22)) - self.select_action_box.setObjectName("select_action_box") + self.admin = QWidget() + self.admin.setObjectName(u"admin") + self.label_21 = QLabel(self.admin) + self.label_21.setObjectName(u"label_21") + self.label_21.setGeometry(QRect(10, 30, 47, 22)) + self.select_action_box = QComboBox(self.admin) self.select_action_box.addItem("") self.select_action_box.addItem("") self.select_action_box.addItem("") - self.admin_action = QtWidgets.QGroupBox(parent=self.admin) - self.admin_action.setGeometry(QtCore.QRect(10, 70, 570, 291)) - font = QtGui.QFont() - font.setBold(False) - self.admin_action.setFont(font) + self.select_action_box.setObjectName(u"select_action_box") + self.select_action_box.setGeometry(QRect(60, 30, 181, 22)) + self.admin_action = QGroupBox(self.admin) + self.admin_action.setObjectName(u"admin_action") + self.admin_action.setGeometry(QRect(10, 70, 570, 291)) + font5 = QFont() + font5.setBold(False) + self.admin_action.setFont(font5) self.admin_action.setFlat(True) self.admin_action.setCheckable(False) - self.admin_action.setObjectName("admin_action") self.tabWidget.addTab(self.admin, "") + self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) + + self.horizontalLayout.addLayout(self.gridLayout) + + self.mainLayout.addLayout(self.horizontalLayout) - self.verticalLayoutWidget_2 = QtWidgets.QWidget(parent=self.centralwidget) - self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(1280, 0, 306, 751)) - self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2") - self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2) + + self.verticalLayoutWidget_2 = QWidget(self.centralwidget) + self.verticalLayoutWidget_2.setObjectName(u"verticalLayoutWidget_2") + self.verticalLayoutWidget_2.setGeometry(QRect(1280, 0, 306, 751)) + self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget_2) + self.verticalLayout.setObjectName(u"verticalLayout") self.verticalLayout.setContentsMargins(0, 0, 0, 0) - self.verticalLayout.setObjectName("verticalLayout") - self.calendar_frame = QtWidgets.QFrame(parent=self.verticalLayoutWidget_2) - self.calendar_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.calendar_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.calendar_frame.setObjectName("calendar_frame") - self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.calendar_frame) - self.verticalLayout_7.setObjectName("verticalLayout_7") - self.calendarlayout = QtWidgets.QVBoxLayout() - self.calendarlayout.setObjectName("calendarlayout") + self.calendar_frame = QFrame(self.verticalLayoutWidget_2) + self.calendar_frame.setObjectName(u"calendar_frame") + self.calendar_frame.setFrameShape(QFrame.StyledPanel) + self.calendar_frame.setFrameShadow(QFrame.Raised) + self.verticalLayout_7 = QVBoxLayout(self.calendar_frame) + self.verticalLayout_7.setObjectName(u"verticalLayout_7") + self.calendarlayout = QVBoxLayout() + self.calendarlayout.setObjectName(u"calendarlayout") + self.verticalLayout_7.addLayout(self.calendarlayout) + + self.verticalLayout.addWidget(self.calendar_frame) - self.frame_creation_progress = QtWidgets.QFrame(parent=self.verticalLayoutWidget_2) - self.frame_creation_progress.setObjectName("frame_creation_progress") - self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frame_creation_progress) + + self.frame_creation_progress = QFrame(self.verticalLayoutWidget_2) + self.frame_creation_progress.setObjectName(u"frame_creation_progress") + self.verticalLayout_4 = QVBoxLayout(self.frame_creation_progress) self.verticalLayout_4.setSpacing(6) - self.verticalLayout_4.setObjectName("verticalLayout_4") - self.steps = QtWidgets.QFrame(parent=self.frame_creation_progress) - self.steps.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.steps.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.steps.setObjectName("steps") - self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.steps) + self.verticalLayout_4.setObjectName(u"verticalLayout_4") + self.steps = QFrame(self.frame_creation_progress) + self.steps.setObjectName(u"steps") + self.steps.setFrameShape(QFrame.StyledPanel) + self.steps.setFrameShadow(QFrame.Raised) + self.verticalLayout_3 = QVBoxLayout(self.steps) self.verticalLayout_3.setSpacing(0) - self.verticalLayout_3.setObjectName("verticalLayout_3") - self.groupBox_2 = QtWidgets.QGroupBox(parent=self.steps) + self.verticalLayout_3.setObjectName(u"verticalLayout_3") + self.groupBox_2 = QGroupBox(self.steps) + self.groupBox_2.setObjectName(u"groupBox_2") self.groupBox_2.setEnabled(True) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth()) - self.groupBox_2.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setPointSize(11) - font.setBold(True) + sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy5.setHorizontalStretch(0) + sizePolicy5.setVerticalStretch(0) + sizePolicy5.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth()) + self.groupBox_2.setSizePolicy(sizePolicy5) self.groupBox_2.setFont(font) - self.groupBox_2.setObjectName("groupBox_2") - self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.groupBox_2) - self.verticalLayout_6.setObjectName("verticalLayout_6") - self.appdata_check = QtWidgets.QCheckBox(parent=self.groupBox_2) - font = QtGui.QFont() - font.setPointSize(8) - font.setBold(False) - self.appdata_check.setFont(font) - self.appdata_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.appdata_check.setObjectName("appdata_check") + self.verticalLayout_6 = QVBoxLayout(self.groupBox_2) + self.verticalLayout_6.setObjectName(u"verticalLayout_6") + self.appdata_check = QCheckBox(self.groupBox_2) + self.appdata_check.setObjectName(u"appdata_check") + font6 = QFont() + font6.setPointSize(8) + font6.setBold(False) + self.appdata_check.setFont(font6) + self.appdata_check.setFocusPolicy(Qt.NoFocus) + self.verticalLayout_6.addWidget(self.appdata_check) - self.media_check = QtWidgets.QCheckBox(parent=self.groupBox_2) - font = QtGui.QFont() - font.setPointSize(8) - font.setBold(False) - self.media_check.setFont(font) - self.media_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.media_check.setObjectName("media_check") + + self.media_check = QCheckBox(self.groupBox_2) + self.media_check.setObjectName(u"media_check") + self.media_check.setFont(font6) + self.media_check.setFocusPolicy(Qt.NoFocus) + self.verticalLayout_6.addWidget(self.media_check) - self.ids_check = QtWidgets.QCheckBox(parent=self.groupBox_2) - font = QtGui.QFont() - font.setPointSize(8) - font.setBold(False) - self.ids_check.setFont(font) - self.ids_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.ids_check.setObjectName("ids_check") + + self.ids_check = QCheckBox(self.groupBox_2) + self.ids_check.setObjectName(u"ids_check") + self.ids_check.setFont(font6) + self.ids_check.setFocusPolicy(Qt.NoFocus) + self.verticalLayout_6.addWidget(self.ids_check) + + self.verticalLayout_3.addWidget(self.groupBox_2) - self.groupBox = QtWidgets.QGroupBox(parent=self.steps) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) - self.groupBox.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setPointSize(11) - font.setBold(True) + + self.groupBox = QGroupBox(self.steps) + self.groupBox.setObjectName(u"groupBox") + sizePolicy5.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) + self.groupBox.setSizePolicy(sizePolicy5) self.groupBox.setFont(font) - self.groupBox.setObjectName("groupBox") - self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox) - self.verticalLayout_5.setObjectName("verticalLayout_5") - self.media_checked = QtWidgets.QCheckBox(parent=self.groupBox) - font = QtGui.QFont() - font.setPointSize(8) - font.setBold(False) - font.setItalic(False) - font.setUnderline(False) - font.setKerning(True) - font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) - self.media_checked.setFont(font) - self.media_checked.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.media_checked.setObjectName("media_checked") + self.verticalLayout_5 = QVBoxLayout(self.groupBox) + self.verticalLayout_5.setObjectName(u"verticalLayout_5") + self.media_checked = QCheckBox(self.groupBox) + self.media_checked.setObjectName(u"media_checked") + font7 = QFont() + font7.setPointSize(8) + font7.setBold(False) + font7.setItalic(False) + font7.setUnderline(False) + font7.setKerning(True) + font7.setStyleStrategy(QFont.PreferDefault) + self.media_checked.setFont(font7) + self.media_checked.setFocusPolicy(Qt.NoFocus) + self.verticalLayout_5.addWidget(self.media_checked) - self.media_edited_check = QtWidgets.QCheckBox(parent=self.groupBox) - font = QtGui.QFont() - font.setPointSize(8) - font.setBold(False) - font.setItalic(False) - font.setUnderline(False) - font.setKerning(True) - font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) - self.media_edited_check.setFont(font) - self.media_edited_check.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.media_edited_check.setObjectName("media_edited_check") + + self.media_edited_check = QCheckBox(self.groupBox) + self.media_edited_check.setObjectName(u"media_edited_check") + self.media_edited_check.setFont(font7) + self.media_edited_check.setFocusPolicy(Qt.NoFocus) + self.verticalLayout_5.addWidget(self.media_edited_check) - self.app_created = QtWidgets.QCheckBox(parent=self.groupBox) - font = QtGui.QFont() - font.setPointSize(8) - font.setBold(False) - font.setItalic(False) - font.setUnderline(False) - font.setKerning(True) - font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) - self.app_created.setFont(font) - self.app_created.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.app_created.setObjectName("app_created") + + self.app_created = QCheckBox(self.groupBox) + self.app_created.setObjectName(u"app_created") + self.app_created.setFont(font7) + self.app_created.setFocusPolicy(Qt.NoFocus) + self.verticalLayout_5.addWidget(self.app_created) - self.btn_copy_adis_command = QtWidgets.QPushButton(parent=self.groupBox) - font = QtGui.QFont() - font.setPointSize(8) - font.setBold(False) - font.setItalic(False) - font.setUnderline(False) - font.setKerning(True) - font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferDefault) - self.btn_copy_adis_command.setFont(font) - self.btn_copy_adis_command.setStatusTip("") - self.btn_copy_adis_command.setWhatsThis("") - self.btn_copy_adis_command.setAccessibleDescription("") + + self.btn_copy_adis_command = QPushButton(self.groupBox) + self.btn_copy_adis_command.setObjectName(u"btn_copy_adis_command") + self.btn_copy_adis_command.setFont(font7) self.btn_copy_adis_command.setAutoFillBackground(False) - icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap("c:\\Users\\aky547\\GitHub\\SemesterapparatsManager\\src\\ui\\../../../../../../.designer/backup/icons/information.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + icon1 = QIcon() + icon1.addFile(u"../../../../../../.designer/backup/icons/information.png", QSize(), QIcon.Mode.Normal, QIcon.State.Off) self.btn_copy_adis_command.setIcon(icon1) self.btn_copy_adis_command.setCheckable(False) self.btn_copy_adis_command.setChecked(False) self.btn_copy_adis_command.setAutoDefault(False) - self.btn_copy_adis_command.setObjectName("btn_copy_adis_command") + self.verticalLayout_5.addWidget(self.btn_copy_adis_command) + + self.verticalLayout_3.addWidget(self.groupBox) + + self.verticalLayout_4.addWidget(self.steps) + + self.verticalLayout.addWidget(self.frame_creation_progress) + MainWindow.setCentralWidget(self.centralwidget) - self.menubar = QtWidgets.QMenuBar(parent=MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 1590, 22)) - self.menubar.setObjectName("menubar") - self.menuDatei = QtWidgets.QMenu(parent=self.menubar) - self.menuDatei.setObjectName("menuDatei") - self.menuEinstellungen = QtWidgets.QMenu(parent=self.menubar) - self.menuEinstellungen.setObjectName("menuEinstellungen") - self.menuHelp = QtWidgets.QMenu(parent=self.menubar) - self.menuHelp.setObjectName("menuHelp") + self.menubar = QMenuBar(MainWindow) + self.menubar.setObjectName(u"menubar") + self.menubar.setGeometry(QRect(0, 0, 1590, 22)) + self.menuDatei = QMenu(self.menubar) + self.menuDatei.setObjectName(u"menuDatei") + self.menuEinstellungen = QMenu(self.menubar) + self.menuEinstellungen.setObjectName(u"menuEinstellungen") + self.menuHelp = QMenu(self.menubar) + self.menuHelp.setObjectName(u"menuHelp") MainWindow.setMenuBar(self.menubar) - self.statusBar = QtWidgets.QStatusBar(parent=MainWindow) - self.statusBar.setObjectName("statusBar") + self.statusBar = QStatusBar(MainWindow) + self.statusBar.setObjectName(u"statusBar") MainWindow.setStatusBar(self.statusBar) - self.actionBeenden = QtGui.QAction(parent=MainWindow) - self.actionBeenden.setMenuRole(QtGui.QAction.MenuRole.QuitRole) - self.actionBeenden.setShortcutVisibleInContextMenu(True) - self.actionBeenden.setObjectName("actionBeenden") - self.actionEinstellungen = QtGui.QAction(parent=MainWindow) - self.actionEinstellungen.setShortcutVisibleInContextMenu(True) - self.actionEinstellungen.setObjectName("actionEinstellungen") - self.actionDokumentation = QtGui.QAction(parent=MainWindow) - self.actionDokumentation.setShortcutContext(QtCore.Qt.ShortcutContext.ApplicationShortcut) - self.actionDokumentation.setObjectName("actionDokumentation") - self.actionAbout = QtGui.QAction(parent=MainWindow) - self.actionAbout.setMenuRole(QtGui.QAction.MenuRole.AboutRole) - self.actionAbout.setObjectName("actionAbout") - self.actionDokumentation_lokal = QtGui.QAction(parent=MainWindow) - self.actionDokumentation_lokal.setObjectName("actionDokumentation_lokal") - self.menuDatei.addAction(self.actionBeenden) - self.menuEinstellungen.addAction(self.actionEinstellungen) - self.menuHelp.addAction(self.actionDokumentation_lokal) - self.menuHelp.addAction(self.actionAbout) - self.menubar.addAction(self.menuDatei.menuAction()) - self.menubar.addAction(self.menuEinstellungen.menuAction()) - self.menubar.addAction(self.menuHelp.menuAction()) +#if QT_CONFIG(shortcut) self.label_9.setBuddy(self.prof_tel_nr) self.label_3.setBuddy(self.prof_title) self.label_2.setBuddy(self.drpdwn_app_nr) @@ -850,153 +790,215 @@ class Ui_MainWindow(object): self.label_4.setBuddy(self.drpdwn_prof_name) self.label_5.setBuddy(self.app_name) self.label_6.setBuddy(self.sem_year) +#endif // QT_CONFIG(shortcut) + QWidget.setTabOrder(self.drpdwn_app_nr, self.drpdwn_prof_name) + QWidget.setTabOrder(self.drpdwn_prof_name, self.prof_mail) + QWidget.setTabOrder(self.prof_mail, self.prof_tel_nr) + QWidget.setTabOrder(self.prof_tel_nr, self.app_name) + QWidget.setTabOrder(self.app_name, self.app_fach) + QWidget.setTabOrder(self.app_fach, self.sem_sommer) + QWidget.setTabOrder(self.sem_sommer, self.sem_winter) + QWidget.setTabOrder(self.sem_winter, self.sem_year) + QWidget.setTabOrder(self.sem_year, self.check_eternal_app) + QWidget.setTabOrder(self.check_eternal_app, self.btn_add_document) + QWidget.setTabOrder(self.btn_add_document, self.btn_open_document) + QWidget.setTabOrder(self.btn_open_document, self.check_file) + QWidget.setTabOrder(self.check_file, self.check_send_mail) + QWidget.setTabOrder(self.check_send_mail, self.btn_apparat_save) + QWidget.setTabOrder(self.btn_apparat_save, self.btn_apparat_apply) + QWidget.setTabOrder(self.btn_apparat_apply, self.chkbx_show_del_media) + QWidget.setTabOrder(self.chkbx_show_del_media, self.btn_reserve) + QWidget.setTabOrder(self.btn_reserve, self.select_action_box) + QWidget.setTabOrder(self.select_action_box, self.prof_id_adis) + QWidget.setTabOrder(self.prof_id_adis, self.apparat_id_adis) + QWidget.setTabOrder(self.apparat_id_adis, self.automation_add_selected_books) + QWidget.setTabOrder(self.automation_add_selected_books, self.saveandcreate) + + self.menubar.addAction(self.menuDatei.menuAction()) + self.menubar.addAction(self.menuEinstellungen.menuAction()) + self.menubar.addAction(self.menuHelp.menuAction()) + self.menuDatei.addAction(self.actionBeenden) + self.menuEinstellungen.addAction(self.actionEinstellungen) + self.menuHelp.addAction(self.actionAbout) + self.menuHelp.addAction(self.actionDokumentation) self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(0) - QtCore.QMetaObject.connectSlotsByName(MainWindow) - MainWindow.setTabOrder(self.drpdwn_app_nr, self.drpdwn_prof_name) - MainWindow.setTabOrder(self.drpdwn_prof_name, self.prof_mail) - MainWindow.setTabOrder(self.prof_mail, self.prof_tel_nr) - MainWindow.setTabOrder(self.prof_tel_nr, self.app_name) - MainWindow.setTabOrder(self.app_name, self.app_fach) - MainWindow.setTabOrder(self.app_fach, self.sem_sommer) - MainWindow.setTabOrder(self.sem_sommer, self.sem_winter) - MainWindow.setTabOrder(self.sem_winter, self.sem_year) - MainWindow.setTabOrder(self.sem_year, self.check_eternal_app) - MainWindow.setTabOrder(self.check_eternal_app, self.btn_add_document) - MainWindow.setTabOrder(self.btn_add_document, self.btn_open_document) - MainWindow.setTabOrder(self.btn_open_document, self.check_file) - MainWindow.setTabOrder(self.check_file, self.check_send_mail) - MainWindow.setTabOrder(self.check_send_mail, self.btn_apparat_save) - MainWindow.setTabOrder(self.btn_apparat_save, self.btn_apparat_apply) - MainWindow.setTabOrder(self.btn_apparat_apply, self.chkbx_show_del_media) - MainWindow.setTabOrder(self.chkbx_show_del_media, self.btn_reserve) - MainWindow.setTabOrder(self.btn_reserve, self.select_action_box) - MainWindow.setTabOrder(self.select_action_box, self.prof_id_adis) - MainWindow.setTabOrder(self.prof_id_adis, self.apparat_id_adis) - MainWindow.setTabOrder(self.apparat_id_adis, self.automation_add_selected_books) - MainWindow.setTabOrder(self.automation_add_selected_books, self.saveandcreate) + + + QMetaObject.connectSlotsByName(MainWindow) + # setupUi def retranslateUi(self, MainWindow): - _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "Semesterapparatsmanagement")) - self.create_document.setToolTip(_translate("MainWindow", "Erstellt die Übersicht, welche am Regal ausgehängt werden kann")) - self.create_document.setText(_translate("MainWindow", "Übersicht erstellen")) - self.create_new_app.setText(_translate("MainWindow", "neu. App anlegen")) - self.cancel_active_selection.setText(_translate("MainWindow", "Auswahl abbrechen")) - self.tableWidget_apparate.setSortingEnabled(False) - item = self.tableWidget_apparate.horizontalHeaderItem(0) - item.setText(_translate("MainWindow", "AppNr")) - item = self.tableWidget_apparate.horizontalHeaderItem(1) - item.setText(_translate("MainWindow", "App Name")) - item = self.tableWidget_apparate.horizontalHeaderItem(2) - item.setText(_translate("MainWindow", "Professor")) - item = self.tableWidget_apparate.horizontalHeaderItem(3) - item.setText(_translate("MainWindow", "gültig bis")) - item = self.tableWidget_apparate.horizontalHeaderItem(4) - item.setText(_translate("MainWindow", "Dauerapparat")) - item = self.tableWidget_apparate.horizontalHeaderItem(5) - item.setText(_translate("MainWindow", "KontoNr")) - self.chkbx_show_del_media.setText(_translate("MainWindow", "gel. Medien anzeigen")) - self.btn_reserve.setText(_translate("MainWindow", "im Apparat?")) - self.label_info.setText(_translate("MainWindow", "Medien werden hinzugefügt")) - self.progress_label.setText(_translate("MainWindow", "Medium x/y")) - self.label_20.setText(_translate("MainWindow", "Medien werden geprüft")) - self.avail_status.setText(_translate("MainWindow", "TextLabel")) - self.automation_add_selected_books.setText(_translate("MainWindow", "Ausgewählte als verfügbar markieren")) - self.tableWidget_apparat_media.setSortingEnabled(True) - item = self.tableWidget_apparat_media.horizontalHeaderItem(0) - item.setText(_translate("MainWindow", "Buchtitel")) - item.setToolTip(_translate("MainWindow", "Es kann sein, dass der Buchtitel leer ist, dies kommt vor, wenn der Titel nicht passend formatiert ist")) - item = self.tableWidget_apparat_media.horizontalHeaderItem(1) - item.setText(_translate("MainWindow", "Signatur")) - item = self.tableWidget_apparat_media.horizontalHeaderItem(2) - item.setText(_translate("MainWindow", "Auflage")) - item = self.tableWidget_apparat_media.horizontalHeaderItem(3) - item.setText(_translate("MainWindow", "Autor")) - item = self.tableWidget_apparat_media.horizontalHeaderItem(4) - item.setText(_translate("MainWindow", "im Apparat?")) - item.setToolTip(_translate("MainWindow", "Diese Angabe ist nicht zuverlässig. Ist das ❌ vorhanden, kann das Medium im Apparat sein, aber aufgrund eines Bugs nicht gefunden worden")) - item = self.tableWidget_apparat_media.horizontalHeaderItem(5) - item.setText(_translate("MainWindow", "Vorgemerkt")) - item = self.tableWidget_apparat_media.horizontalHeaderItem(6) - item.setText(_translate("MainWindow", "Link")) - self.label.setText(_translate("MainWindow", " Medienliste")) - self.app_group_box.setTitle(_translate("MainWindow", "SemesterApparatsdetails")) - item = self.document_list.horizontalHeaderItem(0) - item.setText(_translate("MainWindow", "Dokumentname")) - item = self.document_list.horizontalHeaderItem(1) - item.setText(_translate("MainWindow", "Dateityp")) - item = self.document_list.horizontalHeaderItem(2) - item.setText(_translate("MainWindow", "Neu?")) - item = self.document_list.horizontalHeaderItem(3) - item.setText(_translate("MainWindow", "path")) - self.appname_mand.setText(_translate("MainWindow", "*")) - self.profname_mand.setText(_translate("MainWindow", "*")) - self.fach_mand.setText(_translate("MainWindow", "*")) - self.btn_apparat_apply.setText(_translate("MainWindow", "Aktualisieren")) - self.label_9.setText(_translate("MainWindow", "Tel")) - self._mand.setText(_translate("MainWindow", "*")) - self.check_eternal_app.setText(_translate("MainWindow", "Dauerapparat")) - self.sem_sommer.setText(_translate("MainWindow", "Sommer")) - self.drpdwn_prof_name.setToolTip(_translate("MainWindow", "Nachname, Vorname")) - self.mail_mand.setText(_translate("MainWindow", "*")) - self.label_3.setStatusTip(_translate("MainWindow", "sdvosdvsdv")) - self.label_3.setText(_translate("MainWindow", "Prof. Titel")) - self.label_2.setText(_translate("MainWindow", "Apparatsnummer")) - self.label_8.setText(_translate("MainWindow", "Mail")) - self.label_10.setText(_translate("MainWindow", "Fach")) - self.label_12.setText(_translate("MainWindow", "Prof-ID-aDIS")) - self.label_13.setText(_translate("MainWindow", "Apparat-ID-aDIS")) - self.sem_year.setPlaceholderText(_translate("MainWindow", "2023")) - self.check_send_mail.setText(_translate("MainWindow", "Mail senden")) - self.sem_winter.setText(_translate("MainWindow", "Winter")) - self.label_4.setText(_translate("MainWindow", "Prof. Name")) - self.telnr_mand.setText(_translate("MainWindow", "*")) - self.btn_apparat_save.setText(_translate("MainWindow", "Speichern")) - self.label_5.setText(_translate("MainWindow", "Apparatsname")) - self.label_6.setText(_translate("MainWindow", "Semester")) - self.valid_check_profname.setStatusTip(_translate("MainWindow", "Format: Nachname, Vorname")) - self.valid_check_mail.setStatusTip(_translate("MainWindow", "mail@irgendwas.wasanderes")) - self.saveandcreate.setText(_translate("MainWindow", "Speichern und anlegen")) - self.btn_add_document.setText(_translate("MainWindow", "Dokument hinzufügen")) - self.btn_open_document.setText(_translate("MainWindow", "Dokument öffnen")) - self.check_file.setToolTip(_translate("MainWindow", "Abhängig von der Anzahl der Medien kann die Suche sehr lange dauern")) - self.check_file.setText(_translate("MainWindow", "Medien aus Dokument\n" -" hinzufügen")) - self.btn_extract_data_from_document.setToolTip(_translate("MainWindow", "Die Apparatsdetails werden aus dem Dokument gelesen und eingetragen\n" -"Einige Angaben müssen ggf angepasst werden")) - self.btn_extract_data_from_document.setText(_translate("MainWindow", "Daten aus Dokument\n" -"übernehmen")) - self.add_medium.setText(_translate("MainWindow", "Medien hinzufügen")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.createApparat), _translate("MainWindow", "Anlegen")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.search_statistics), _translate("MainWindow", "Suchen / Statistik")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.elsatab), _translate("MainWindow", "ELSA")) - self.label_21.setText(_translate("MainWindow", "Aktion:")) - self.select_action_box.setItemText(0, _translate("MainWindow", "Nutzer anlegen")) - self.select_action_box.setItemText(1, _translate("MainWindow", "Nutzer bearbeiten")) - self.select_action_box.setItemText(2, _translate("MainWindow", "Lehrperson bearbeiten")) - self.admin_action.setTitle(_translate("MainWindow", "GroupBox")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.admin), _translate("MainWindow", "Admin")) - self.groupBox_2.setTitle(_translate("MainWindow", "Software")) - self.appdata_check.setText(_translate("MainWindow", "Apparatsdaten eingegeben")) - self.media_check.setText(_translate("MainWindow", "Medien hinzugefügt / importiert")) - self.ids_check.setText(_translate("MainWindow", "Prof-ID und Apparat-ID eingetragen")) - self.groupBox.setTitle(_translate("MainWindow", "aDIS")) - self.media_checked.setText(_translate("MainWindow", "Medien geprüft")) - self.media_edited_check.setText(_translate("MainWindow", "Medien bearbeitet")) - self.app_created.setText(_translate("MainWindow", "Apparat angelegt")) - self.btn_copy_adis_command.setToolTip(_translate("MainWindow", "Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren")) - self.btn_copy_adis_command.setText(_translate("MainWindow", " aDIS Abfrage in Zwischenablage kopieren")) - self.menuDatei.setTitle(_translate("MainWindow", "Datei")) - self.menuEinstellungen.setTitle(_translate("MainWindow", "Bearbeiten")) - self.menuHelp.setTitle(_translate("MainWindow", "Help")) - self.actionBeenden.setText(_translate("MainWindow", "Beenden")) - self.actionBeenden.setShortcut(_translate("MainWindow", "Ctrl+Q")) - self.actionEinstellungen.setText(_translate("MainWindow", "Einstellungen")) - self.actionEinstellungen.setShortcut(_translate("MainWindow", "Alt+S")) - self.actionDokumentation.setText(_translate("MainWindow", "Dokumentation (online)")) - self.actionDokumentation.setShortcut(_translate("MainWindow", "F1")) - self.actionAbout.setText(_translate("MainWindow", "About")) - self.actionDokumentation_lokal.setText(_translate("MainWindow", "Dokumentation (lokal)")) - self.actionDokumentation_lokal.setShortcut(_translate("MainWindow", "F1")) + MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"Semesterapparatsmanagement", None)) +#if QT_CONFIG(statustip) + MainWindow.setStatusTip("") +#endif // QT_CONFIG(statustip) + self.actionBeenden.setText(QCoreApplication.translate("MainWindow", u"Beenden", None)) +#if QT_CONFIG(shortcut) + self.actionBeenden.setShortcut(QCoreApplication.translate("MainWindow", u"Ctrl+Q", None)) +#endif // QT_CONFIG(shortcut) + self.actionEinstellungen.setText(QCoreApplication.translate("MainWindow", u"Einstellungen", None)) +#if QT_CONFIG(shortcut) + self.actionEinstellungen.setShortcut(QCoreApplication.translate("MainWindow", u"Alt+S", None)) +#endif // QT_CONFIG(shortcut) + self.actionAbout.setText(QCoreApplication.translate("MainWindow", u"About", None)) + self.actionDokumentation.setText(QCoreApplication.translate("MainWindow", u"Dokumentation", None)) +#if QT_CONFIG(shortcut) + self.actionDokumentation.setShortcut(QCoreApplication.translate("MainWindow", u"F1", None)) +#endif // QT_CONFIG(shortcut) +#if QT_CONFIG(tooltip) + self.create_document.setToolTip(QCoreApplication.translate("MainWindow", u"Erstellt die \u00dcbersicht, welche am Regal ausgeh\u00e4ngt werden kann", None)) +#endif // QT_CONFIG(tooltip) + self.create_document.setText(QCoreApplication.translate("MainWindow", u"\u00dcbersicht erstellen", None)) + self.create_new_app.setText(QCoreApplication.translate("MainWindow", u"neu. App anlegen", None)) + self.cancel_active_selection.setText(QCoreApplication.translate("MainWindow", u"Auswahl abbrechen", None)) + ___qtablewidgetitem = self.tableWidget_apparate.horizontalHeaderItem(0) + ___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", u"AppNr", None)); + ___qtablewidgetitem1 = self.tableWidget_apparate.horizontalHeaderItem(1) + ___qtablewidgetitem1.setText(QCoreApplication.translate("MainWindow", u"App Name", None)); + ___qtablewidgetitem2 = self.tableWidget_apparate.horizontalHeaderItem(2) + ___qtablewidgetitem2.setText(QCoreApplication.translate("MainWindow", u"Professor", None)); + ___qtablewidgetitem3 = self.tableWidget_apparate.horizontalHeaderItem(3) + ___qtablewidgetitem3.setText(QCoreApplication.translate("MainWindow", u"g\u00fcltig bis", None)); + ___qtablewidgetitem4 = self.tableWidget_apparate.horizontalHeaderItem(4) + ___qtablewidgetitem4.setText(QCoreApplication.translate("MainWindow", u"Dauerapparat", None)); + ___qtablewidgetitem5 = self.tableWidget_apparate.horizontalHeaderItem(5) + ___qtablewidgetitem5.setText(QCoreApplication.translate("MainWindow", u"KontoNr", None)); + self.chkbx_show_del_media.setText(QCoreApplication.translate("MainWindow", u"gel. Medien anzeigen", None)) + self.btn_reserve.setText(QCoreApplication.translate("MainWindow", u"im Apparat?", None)) + self.label_info.setText(QCoreApplication.translate("MainWindow", u"Medien werden hinzugef\u00fcgt", None)) + self.progress_label.setText(QCoreApplication.translate("MainWindow", u"Medium x/y", None)) + self.label_20.setText(QCoreApplication.translate("MainWindow", u"Medien werden gepr\u00fcft", None)) + self.avail_status.setText(QCoreApplication.translate("MainWindow", u"TextLabel", None)) + self.automation_add_selected_books.setText(QCoreApplication.translate("MainWindow", u"Ausgew\u00e4hlte als verf\u00fcgbar markieren", None)) + ___qtablewidgetitem6 = self.tableWidget_apparat_media.horizontalHeaderItem(0) + ___qtablewidgetitem6.setText(QCoreApplication.translate("MainWindow", u"Buchtitel", None)); +#if QT_CONFIG(tooltip) + ___qtablewidgetitem6.setToolTip(QCoreApplication.translate("MainWindow", u"Es kann sein, dass der Buchtitel leer ist, dies kommt vor, wenn der Titel nicht passend formatiert ist", None)); +#endif // QT_CONFIG(tooltip) + ___qtablewidgetitem7 = self.tableWidget_apparat_media.horizontalHeaderItem(1) + ___qtablewidgetitem7.setText(QCoreApplication.translate("MainWindow", u"Signatur", None)); + ___qtablewidgetitem8 = self.tableWidget_apparat_media.horizontalHeaderItem(2) + ___qtablewidgetitem8.setText(QCoreApplication.translate("MainWindow", u"Auflage", None)); + ___qtablewidgetitem9 = self.tableWidget_apparat_media.horizontalHeaderItem(3) + ___qtablewidgetitem9.setText(QCoreApplication.translate("MainWindow", u"Autor", None)); + ___qtablewidgetitem10 = self.tableWidget_apparat_media.horizontalHeaderItem(4) + ___qtablewidgetitem10.setText(QCoreApplication.translate("MainWindow", u"im Apparat?", None)); +#if QT_CONFIG(tooltip) + ___qtablewidgetitem10.setToolTip(QCoreApplication.translate("MainWindow", u"Diese Angabe ist nicht zuverl\u00e4ssig. Ist das \u274c vorhanden, kann das Medium im Apparat sein, aber aufgrund eines Bugs nicht gefunden worden", None)); +#endif // QT_CONFIG(tooltip) + ___qtablewidgetitem11 = self.tableWidget_apparat_media.horizontalHeaderItem(5) + ___qtablewidgetitem11.setText(QCoreApplication.translate("MainWindow", u"Vorgemerkt", None)); + ___qtablewidgetitem12 = self.tableWidget_apparat_media.horizontalHeaderItem(6) + ___qtablewidgetitem12.setText(QCoreApplication.translate("MainWindow", u"Link", None)); + self.label.setText(QCoreApplication.translate("MainWindow", u" Medienliste", None)) + self.app_group_box.setTitle(QCoreApplication.translate("MainWindow", u"SemesterApparatsdetails", None)) + ___qtablewidgetitem13 = self.document_list.horizontalHeaderItem(0) + ___qtablewidgetitem13.setText(QCoreApplication.translate("MainWindow", u"Dokumentname", None)); + ___qtablewidgetitem14 = self.document_list.horizontalHeaderItem(1) + ___qtablewidgetitem14.setText(QCoreApplication.translate("MainWindow", u"Dateityp", None)); + ___qtablewidgetitem15 = self.document_list.horizontalHeaderItem(2) + ___qtablewidgetitem15.setText(QCoreApplication.translate("MainWindow", u"Neu?", None)); + ___qtablewidgetitem16 = self.document_list.horizontalHeaderItem(3) + ___qtablewidgetitem16.setText(QCoreApplication.translate("MainWindow", u"path", None)); + self.appname_mand.setText(QCoreApplication.translate("MainWindow", u"*", None)) + self.profname_mand.setText(QCoreApplication.translate("MainWindow", u"*", None)) + self.fach_mand.setText(QCoreApplication.translate("MainWindow", u"*", None)) + self.btn_apparat_apply.setText(QCoreApplication.translate("MainWindow", u"Aktualisieren", None)) + self.label_9.setText(QCoreApplication.translate("MainWindow", u"Tel", None)) + self.valid_check_app_fach.setText("") + self._mand.setText(QCoreApplication.translate("MainWindow", u"*", None)) + self.prof_tel_nr.setPlaceholderText("") + self.check_eternal_app.setText(QCoreApplication.translate("MainWindow", u"Dauerapparat", None)) + self.sem_sommer.setText(QCoreApplication.translate("MainWindow", u"Sommer", None)) +#if QT_CONFIG(tooltip) + self.drpdwn_prof_name.setToolTip(QCoreApplication.translate("MainWindow", u"Nachname, Vorname", None)) +#endif // QT_CONFIG(tooltip) + self.drpdwn_prof_name.setPlaceholderText("") + self.mail_mand.setText(QCoreApplication.translate("MainWindow", u"*", None)) +#if QT_CONFIG(statustip) + self.label_3.setStatusTip(QCoreApplication.translate("MainWindow", u"sdvosdvsdv", None)) +#endif // QT_CONFIG(statustip) + self.label_3.setText(QCoreApplication.translate("MainWindow", u"Prof. Titel", None)) + self.label_2.setText(QCoreApplication.translate("MainWindow", u"Apparatsnummer", None)) + self.label_8.setText(QCoreApplication.translate("MainWindow", u"Mail", None)) + self.label_10.setText(QCoreApplication.translate("MainWindow", u"Fach", None)) + self.prof_mail.setPlaceholderText("") + self.label_12.setText(QCoreApplication.translate("MainWindow", u"Prof-ID-aDIS", None)) + self.prof_id_adis.setText("") + self.label_13.setText(QCoreApplication.translate("MainWindow", u"Apparat-ID-aDIS", None)) + self.sem_year.setPlaceholderText(QCoreApplication.translate("MainWindow", u"2023", None)) + self.check_send_mail.setText(QCoreApplication.translate("MainWindow", u"Mail senden", None)) + self.sem_winter.setText(QCoreApplication.translate("MainWindow", u"Winter", None)) + self.label_4.setText(QCoreApplication.translate("MainWindow", u"Prof. Name", None)) + self.telnr_mand.setText(QCoreApplication.translate("MainWindow", u"*", None)) +#if QT_CONFIG(statustip) + self.btn_apparat_save.setStatusTip("") +#endif // QT_CONFIG(statustip) + self.btn_apparat_save.setText(QCoreApplication.translate("MainWindow", u"Speichern", None)) + self.label_5.setText(QCoreApplication.translate("MainWindow", u"Apparatsname", None)) + self.label_6.setText(QCoreApplication.translate("MainWindow", u"Semester", None)) +#if QT_CONFIG(statustip) + self.valid_check_profname.setStatusTip(QCoreApplication.translate("MainWindow", u"Format: Nachname, Vorname", None)) +#endif // QT_CONFIG(statustip) + self.valid_check_profname.setText("") + self.valid_check_appname.setText("") + self.valid_check_semester.setText("") +#if QT_CONFIG(statustip) + self.valid_check_mail.setStatusTip(QCoreApplication.translate("MainWindow", u"mail@irgendwas.wasanderes", None)) +#endif // QT_CONFIG(statustip) + self.valid_check_mail.setText("") + self.valid_check_telnr.setText("") + self.saveandcreate.setText(QCoreApplication.translate("MainWindow", u"Speichern und anlegen", None)) + self.btn_add_document.setText(QCoreApplication.translate("MainWindow", u"Dokument hinzuf\u00fcgen", None)) + self.btn_open_document.setText(QCoreApplication.translate("MainWindow", u"Dokument \u00f6ffnen", None)) +#if QT_CONFIG(tooltip) + self.check_file.setToolTip(QCoreApplication.translate("MainWindow", u"Abh\u00e4ngig von der Anzahl der Medien kann die Suche sehr lange dauern", None)) +#endif // QT_CONFIG(tooltip) + self.check_file.setText(QCoreApplication.translate("MainWindow", u"Medien aus Dokument\n" +" hinzuf\u00fcgen", None)) +#if QT_CONFIG(tooltip) + self.btn_extract_data_from_document.setToolTip(QCoreApplication.translate("MainWindow", u"Die Apparatsdetails werden aus dem Dokument gelesen und eingetragen\n" +"Einige Angaben m\u00fcssen ggf angepasst werden", None)) +#endif // QT_CONFIG(tooltip) + self.btn_extract_data_from_document.setText(QCoreApplication.translate("MainWindow", u"Daten aus Dokument\n" +"\u00fcbernehmen", None)) + self.add_medium.setText(QCoreApplication.translate("MainWindow", u"Medien hinzuf\u00fcgen", None)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.createApparat), QCoreApplication.translate("MainWindow", u"Anlegen", None)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.search_statistics), QCoreApplication.translate("MainWindow", u"Suchen / Statistik", None)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.elsatab), QCoreApplication.translate("MainWindow", u"ELSA", None)) + self.label_21.setText(QCoreApplication.translate("MainWindow", u"Aktion:", None)) + self.select_action_box.setItemText(0, QCoreApplication.translate("MainWindow", u"Nutzer anlegen", None)) + self.select_action_box.setItemText(1, QCoreApplication.translate("MainWindow", u"Nutzer bearbeiten", None)) + self.select_action_box.setItemText(2, QCoreApplication.translate("MainWindow", u"Lehrperson bearbeiten", None)) + + self.admin_action.setTitle(QCoreApplication.translate("MainWindow", u"GroupBox", None)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.admin), QCoreApplication.translate("MainWindow", u"Admin", None)) + self.groupBox_2.setTitle(QCoreApplication.translate("MainWindow", u"Software", None)) + self.appdata_check.setText(QCoreApplication.translate("MainWindow", u"Apparatsdaten eingegeben", None)) + self.media_check.setText(QCoreApplication.translate("MainWindow", u"Medien hinzugef\u00fcgt / importiert", None)) + self.ids_check.setText(QCoreApplication.translate("MainWindow", u"Prof-ID und Apparat-ID eingetragen", None)) + self.groupBox.setTitle(QCoreApplication.translate("MainWindow", u"aDIS", None)) + self.media_checked.setText(QCoreApplication.translate("MainWindow", u"Medien gepr\u00fcft", None)) + self.media_edited_check.setText(QCoreApplication.translate("MainWindow", u"Medien bearbeitet", None)) + self.app_created.setText(QCoreApplication.translate("MainWindow", u"Apparat angelegt", None)) +#if QT_CONFIG(tooltip) + self.btn_copy_adis_command.setToolTip(QCoreApplication.translate("MainWindow", u"Hier klicken, um die aDIS Abfrage in die Zwischenablage zu kopieren", None)) +#endif // QT_CONFIG(tooltip) +#if QT_CONFIG(statustip) + self.btn_copy_adis_command.setStatusTip("") +#endif // QT_CONFIG(statustip) +#if QT_CONFIG(whatsthis) + self.btn_copy_adis_command.setWhatsThis("") +#endif // QT_CONFIG(whatsthis) +#if QT_CONFIG(accessibility) + self.btn_copy_adis_command.setAccessibleDescription("") +#endif // QT_CONFIG(accessibility) + self.btn_copy_adis_command.setText(QCoreApplication.translate("MainWindow", u" aDIS Abfrage in Zwischenablage kopieren", None)) + self.menuDatei.setTitle(QCoreApplication.translate("MainWindow", u"Datei", None)) + self.menuEinstellungen.setTitle(QCoreApplication.translate("MainWindow", u"Bearbeiten", None)) + self.menuHelp.setTitle(QCoreApplication.translate("MainWindow", u"Help", None)) + # retranslateUi + diff --git a/src/ui/sounds/semesterapparat_ui_ui.py b/src/ui/sounds/semesterapparat_ui_ui.py index 657741f..302f6f3 100644 --- a/src/ui/sounds/semesterapparat_ui_ui.py +++ b/src/ui/sounds/semesterapparat_ui_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\sounds\semesterapparat_ui.ui' # -# Created by: PyQt6 UI code generator 6.9.0 +# 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, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): diff --git a/src/ui/userInterface.py b/src/ui/userInterface.py index fb45198..f36dfa8 100644 --- a/src/ui/userInterface.py +++ b/src/ui/userInterface.py @@ -1,74 +1,71 @@ # encoding: utf-8 import atexit import os -import time import sys import tempfile +import time import webbrowser +from datetime import datetime from pathlib import Path from typing import Any, Union +import loguru from natsort import natsorted -from PyQt6 import QtCore, QtGui, QtWidgets -from PyQt6.QtCore import QThread -from PyQt6.QtGui import QRegularExpressionValidator +from PySide6 import QtCore, QtGui, QtWidgets +from PySide6.QtCore import QThread, Qt +from PySide6.QtGui import QRegularExpressionValidator -from src import Icon -from src.backend import Database, BookGrabber, AvailChecker, DocumentationThread -from src.backend.semester import Semester +from src import LOG_DIR, Icon +from src.backend import AvailChecker, BookGrabber, Database, DocumentationThread from src.backend.create_file import recreateFile from src.backend.delete_temp_contents import delete_temp_contents as tempdelete -from src.ui import Ui_Semesterapparat +from src.backend.semester import Semester from src.logic import ( APP_NRS, - # PROF_TITLES, + Apparat, ApparatData, BookData, + Prof, + SemapDocument, csv_to_list, word_to_semap, - SemapDocument, - Prof, - Apparat, ) +from src.ui import Ui_Semesterapparat from src.ui.dialogs import ( - popus_confirm, - MedienAdder, About, ApparatExtendDialog, - Mail_Dialog, - Settings, BookDataUI, + DocumentPrintDialog, LoginDialog, + Mail_Dialog, + MedienAdder, ParsedTitles, ReminderDialog, - DocumentPrintDialog, + Settings, + popus_confirm, ) from src.ui.widgets import ( - ElsaDialog, - MessageCalendar, - FilePicker, CalendarEntry, - UserCreate, - SearchStatisticPage, - EditUser, EditProf, + EditUser, + ElsaDialog, + FilePicker, + MessageCalendar, + SearchStatisticPage, + UserCreate, ) -from datetime import datetime - -import loguru - log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") log.add( - f"logs/{datetime.now().strftime('%Y-%m-%d')}.log", + f"{LOG_DIR}/{datetime.now().strftime('%Y-%m-%d')}.log", rotation="1 day", retention="1 month", ) - +log.critical("UI started") valid_input = (0, 0, 0, 0, 0, 0) @@ -120,7 +117,7 @@ class Ui(Ui_Semesterapparat): # Actions self.actionEinstellungen.triggered.connect(self.open_settings) # type:ignore Icon("settings", self.actionEinstellungen) - self.actionDokumentation_lokal.triggered.connect(self.open_documentation) # type:ignore + self.documentation_open = False Icon("offAction", self.actionBeenden) self.actionBeenden.triggered.connect(self.quit) # type:ignore self.actionAbout.triggered.connect(self.open_about) # type:ignore @@ -206,7 +203,7 @@ class Ui(Ui_Semesterapparat): self.add_medium.setEnabled(False) self.docu = DocumentationThread() - self.actionDokumentation_lokal.triggered.connect(self.open_documentation) # type:ignore + self.actionDokumentation.triggered.connect(self.open_documentation) # type:ignore # get all current apparats and cache them in a list self.apparats = self.get_apparats() @@ -331,10 +328,16 @@ class Ui(Ui_Semesterapparat): def open_documentation(self): log.info("Opening Documentation") - if not self.docu.isRunning(): + self.statusBar.showMessage("Dokumentation wird geöffnet", 5000) + + if not self.documentation_open: + # write "opening documentation in 5s into status bar" + self.documentation_open = True self.docu.start() - time.sleep(5) + time.sleep(5) + webbrowser.open("http://localhost:8000") + self.statusBar.showMessage("") def update_calendar(self, data: list[dict[str, Any]]): self.calendarWidget.setMessages([data]) @@ -556,6 +559,7 @@ class Ui(Ui_Semesterapparat): else: self.__setValidState(self.valid_check_semester, 0, self._mand, 5) self.check_eternal_app.setEnabled(False) + return valid def display_valid_semester(self): print(f""" @@ -563,6 +567,7 @@ class Ui(Ui_Semesterapparat): Sommer: {self.sem_sommer.isChecked()} Winter: {self.sem_winter.isChecked()} Eternal: {self.check_eternal_app.isChecked()} + Valid: {self.validate_semester()} """) def change_state(self, index, state): @@ -985,7 +990,7 @@ class Ui(Ui_Semesterapparat): self.confirm_popup("Bitte erst ein document auswählen!", title="Fehler") return if not _selected_doc_location == "Database": - path = Path(_selected_doc_location + "/" + _selected_doc_name) + path = Path(_selected_doc_location) # path: Path = path.resolve() # path. # path = path + "/" + _selected_doc_name @@ -1119,12 +1124,53 @@ class Ui(Ui_Semesterapparat): return self.prof_mail.setText(data.mail) - self.prof_tel_nr.setText(str(data.phoneNumber)) - self.app_name.setText(data.title) - self.app_fach.setCurrentText(data.subject) + self.prof_tel_nr.setText(str(data.phoneNumber).replace("-", "")) + if len(data.title_suggestions) > 0: + # create a dialog that has a dropdown with the suggestions, and oc and cancel button. on ok return the selected text and set it as title + dialog = QtWidgets.QDialog() + dialog.setWindowTitle("Titelvorschläge") + dialog.setModal(True) + layout = QtWidgets.QVBoxLayout() + label = QtWidgets.QLabel( + f"Bitte wählen Sie einen Titel aus:/nDer Titel darf max. {data.title_max_length} Zeichen lang sein." + ) + layout.addWidget(label) + dropdown = QtWidgets.QComboBox() + titles = [f"{title} [{len(title)}]" for title in data.title_suggestions] + dropdown.addItems(titles) + layout.addWidget(dropdown) + button_box = QtWidgets.QDialogButtonBox() + button_box.setStandardButtons( + QtWidgets.QDialogButtonBox.StandardButton.Cancel + | QtWidgets.QDialogButtonBox.StandardButton.Ok + ) + button_box.accepted.connect(dialog.accept) + button_box.rejected.connect(dialog.reject) + layout.addWidget(button_box) + dialog.setLayout(layout) + dialog.exec() + + if dialog.result() == QtWidgets.QDialog.DialogCode.Accepted: + print("Selected title:", dropdown.currentText()) + self.app_name.setText(dropdown.currentText().split(" [")[0].strip()) + else: + self.app_name.setText("CHANGEME") + # self.app_name.setText(data.title) + subjects = self.db.getSubjects() + subjects = [subject[1] for subject in subjects] + self.app_fach.setCurrentText(data.subject if data.subject in subjects else "") self.prof_title.setText(data.personTitle) self.drpdwn_prof_name.setCurrentText(data.personName) - self.sem_year.setText("20" + data.semester.year) + self.sem_year.setText("20" + str(data.semester.year)) + if data.semester.semester == "SoSe": + self.sem_sommer.setChecked(True) + self.sem_winter.setChecked(False) + else: + self.sem_winter.setChecked(True) + self.sem_sommer.setChecked(False) + if data.eternal: + self.check_eternal_app.setChecked(True) + self.validate_semester() def btn_check_file_threaded(self): for runner in self.bookGrabber: @@ -1771,7 +1817,11 @@ def launch_gui(): # #log.debug("checking if database available") log.info("Starting login dialog") - app = QtWidgets.QApplication(sys.argv) + app = QtWidgets.QApplication.instance() + if app is None: + app = QtWidgets.QApplication(sys.argv) + else: + log.info("Using existing QApplication instance") login_dialog = QtWidgets.QDialog() ui = LoginDialog() ui.setupUi(login_dialog) @@ -1787,8 +1837,14 @@ def launch_gui(): # #log.debug(aui.active_user) MainWindow.show() # atexit.register() + app.aboutToQuit.connect( + aui.validate_thread.quit + ) # if that thread uses an event loop + app.aboutToQuit.connect(aui.docu.terminate) # our new slot + app.aboutToQuit.connect(aui.docu.wait) atexit.register(tempdelete) - atexit.register(aui.validate_thread.quit) + # atexit.register(aui.validate_thread.quit) + # atexit.register(aui.docu.quit) sys.exit(app.exec()) elif ui.lresult == 0: diff --git a/src/ui/widgets/MessageCalendar.py b/src/ui/widgets/MessageCalendar.py index 487153e..f14fcbe 100644 --- a/src/ui/widgets/MessageCalendar.py +++ b/src/ui/widgets/MessageCalendar.py @@ -1,16 +1,19 @@ -from PyQt6 import QtWidgets, QtCore -from PyQt6.QtCore import QDate -from PyQt6.QtGui import QColor, QPen -from src.backend import Database +import sys from typing import Any + import darkdetect import loguru -import sys +from PySide6 import QtCore, QtWidgets +from PySide6.QtCore import QDate +from PySide6.QtGui import QColor, QPen + +from src import LOG_DIR +from src.backend import Database log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") color = "#ddfb00" if darkdetect.isDark() else "#2204ff" diff --git a/src/ui/widgets/__init__.py b/src/ui/widgets/__init__.py index 3eb366b..43b611a 100644 --- a/src/ui/widgets/__init__.py +++ b/src/ui/widgets/__init__.py @@ -16,7 +16,7 @@ __all__ = [ from .collapse import StatusWidget from .filepicker import FilePicker -from .graph import DataGraph +from .graph import DataQtGraph from .calendar_entry import CalendarEntry from .MessageCalendar import MessageCalendar from .searchPage import SearchStatisticPage diff --git a/src/ui/widgets/admin_create_user.py b/src/ui/widgets/admin_create_user.py index 2be5e2a..d9a0e68 100644 --- a/src/ui/widgets/admin_create_user.py +++ b/src/ui/widgets/admin_create_user.py @@ -1,11 +1,11 @@ -from PyQt6 import QtWidgets -from PyQt6.QtCore import pyqtSignal +from PySide6 import QtWidgets +from PySide6.QtCore import Signal from .widget_sources.admin_create_user_ui import Ui_Dialog from src.backend import AdminCommands, Database class UserCreate(QtWidgets.QDialog, Ui_Dialog): - admin_action_changed = pyqtSignal() + admin_action_changed = Signal() def __init__(self): super(UserCreate, self).__init__() diff --git a/src/ui/widgets/admin_edit_prof.py b/src/ui/widgets/admin_edit_prof.py index dfb9195..0e327c3 100644 --- a/src/ui/widgets/admin_edit_prof.py +++ b/src/ui/widgets/admin_edit_prof.py @@ -1,15 +1,15 @@ from .widget_sources.admin_edit_prof_ui import Ui_Dialog # -from PyQt6 import QtWidgets +from PySide6 import QtWidgets from src.logic import Prof from src.backend import Database import loguru import sys - +from src import LOG_DIR log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") diff --git a/src/ui/widgets/admin_edit_user.py b/src/ui/widgets/admin_edit_user.py index 7ce5914..6768dcb 100644 --- a/src/ui/widgets/admin_edit_user.py +++ b/src/ui/widgets/admin_edit_user.py @@ -1,5 +1,5 @@ from .widget_sources.admin_edit_user_ui import Ui_Dialog -from PyQt6 import QtWidgets +from PySide6 import QtWidgets from src.backend import Database from src.backend import AdminCommands diff --git a/src/ui/widgets/admin_query.py b/src/ui/widgets/admin_query.py index 46389ee..5c933f4 100644 --- a/src/ui/widgets/admin_query.py +++ b/src/ui/widgets/admin_query.py @@ -1,6 +1,6 @@ from .widget_sources.admin_query_ui import Ui_Form -from PyQt6 import QtWidgets, QtCore +from PySide6 import QtWidgets, QtCore from src import Icon from src.backend import Database diff --git a/src/ui/widgets/calendar_entry.py b/src/ui/widgets/calendar_entry.py index 1c70b94..566bd6f 100644 --- a/src/ui/widgets/calendar_entry.py +++ b/src/ui/widgets/calendar_entry.py @@ -1,15 +1,13 @@ from .widget_sources.calendar_entry_ui import Ui_Dialog -from PyQt6 import QtWidgets -from PyQt6.QtCore import pyqtSignal +from PySide6 import QtWidgets +from PySide6.QtCore import Signal from src.backend.database import Database from src import Icon class CalendarEntry(QtWidgets.QDialog, Ui_Dialog): - deleteSignal = pyqtSignal( - int - ) # when emit, send the id of the message to be deleted - repaintSignal = pyqtSignal(str) + deleteSignal = Signal(int) # when emit, send the id of the message to be deleted + repaintSignal = Signal(str) def __init__(self, parent=None, messages=None, date=None): super().__init__(parent) diff --git a/src/ui/widgets/collapse.py b/src/ui/widgets/collapse.py index cd5ceae..e6a1ca7 100644 --- a/src/ui/widgets/collapse.py +++ b/src/ui/widgets/collapse.py @@ -1,6 +1,6 @@ # import pysignal pyslot -from PyQt6.QtCore import pyqtSignal as Signal -from PyQt6.QtWidgets import ( +from PySide6.QtCore import Signal as Signal +from PySide6.QtWidgets import ( QApplication, QTreeWidget, QTreeWidgetItem, diff --git a/src/ui/widgets/elsa_main.py b/src/ui/widgets/elsa_main.py index 0a0b5a4..ccad176 100644 --- a/src/ui/widgets/elsa_main.py +++ b/src/ui/widgets/elsa_main.py @@ -1,21 +1,21 @@ import os from .widget_sources.elsa_maindialog_ui import Ui_Dialog -from PyQt6 import QtCore, QtWidgets, QtGui -from PyQt6.QtGui import QRegularExpressionValidator -from PyQt6.QtCore import QDate +from PySide6 import QtCore, QtWidgets, QtGui +from PySide6.QtGui import QRegularExpressionValidator +from PySide6.QtCore import QDate from src import Icon from src.backend import Semester, Database from src.logic import elsa_word_to_csv, Prof from src.ui.dialogs import ElsaAddEntry, popus_confirm -from src.ui.widgets import FilePicker, DataGraph +from src.ui.widgets import FilePicker, DataQtGraph from src.backend import recreateElsaFile import loguru import sys - +from src import LOG_DIR log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") @@ -463,10 +463,12 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog): self.graph_data["x"].pop(0) self.graph_data["y"].pop(0) # generateMissing = True if len(self.graph_data["x"]) > 2 else False - graph = DataGraph( + graph = DataQtGraph( title="ELSA Apparate pro Semester", data=self.graph_data, - label="Anzahl der Apparate", + generateMissing=False, + y_label="Anzahl der Apparate", + x_rotation=0, ) log.debug(self.graph_data) self.elsa_statistics_table.setRowCount(0) diff --git a/src/ui/widgets/filepicker.py b/src/ui/widgets/filepicker.py index fb89d82..e44a1fe 100644 --- a/src/ui/widgets/filepicker.py +++ b/src/ui/widgets/filepicker.py @@ -1,7 +1,7 @@ import sys -from PyQt6.QtCore import QSettings -from PyQt6.QtWidgets import QApplication, QFileDialog +from PySide6.QtCore import QSettings +from PySide6.QtWidgets import QApplication, QFileDialog class FilePicker: diff --git a/src/ui/widgets/graph.py b/src/ui/widgets/graph.py index cc9cfc0..4907652 100644 --- a/src/ui/widgets/graph.py +++ b/src/ui/widgets/graph.py @@ -1,15 +1,21 @@ import random -from typing import Union, Any - -import pyqtgraph as pg -from PyQt6 import QtWidgets -import loguru import sys +from typing import Any, Union + + +import loguru +from PySide6 import QtWidgets, QtCore, QtGui +from PySide6.QtCore import Qt +from PySide6.QtGui import QPainter, QPen, QColor +from PySide6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis, QCategoryAxis + +from src import LOG_DIR +from src.backend.semester import Semester log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") def mergedicts(d1: dict[str, Any], d2: dict[str, Any]): @@ -28,33 +34,66 @@ def mergedicts(d1: dict[str, Any], d2: dict[str, Any]): res.update(d2_dict) # type: ignore return res - -class DataGraph(QtWidgets.QWidget): +class DataQtGraph(QtWidgets.QWidget): def __init__( self, title: str, - data=Union[dict[list, list], dict[list[dict[str, list[Any]]]]], - generateMissing: bool = False, - label: str = None, + data: dict[str, Union[list[str], dict[str, list[int]]]], + generateMissing: bool, + y_label: str, + x_rotation: int = 90, ): super().__init__() - log.debug( - "Initialized with options: {}, {}, {}, {}".format( - title, data, generateMissing, label - ) - ) + self.series = QLineSeries() + self.chart = QChart() + # scale the chart to fit the data + self.chart.setTitle(title) + self.chart.legend().setVisible(True) + + layout = QtWidgets.QVBoxLayout() + lst = [] if generateMissing: + s_start = Semester.from_string(data["x"][0]) + s_end = Semester.from_string(data["x"][-1]) + # generate all semesters from start to end + missing_semesters = Semester.generate_missing(s_start, s_end) x_data = data["x"] y_data = data["y"] if not isinstance(y_data, list): for key in y_data: - data = {"x": x_data, "y": y_data[key]} - data = self.generateMissingSemesters(data) + data = {"x": [], "y": []} data["y-label"] = key + for semester in missing_semesters: + if semester not in x_data: + data["x"].append(semester) + data["y"].append(0) + data["x"].append(semester) + # get the index of the semester in x_data + if semester in x_data: + index = x_data.index(semester) + print("index:", index) + print(key, y_data[key]) + data["y"].append(y_data[key][index]) lst.append(data) + # for key in y_data: + # data = {"x": x_data, "y": y_data[key]} + # data = self.generateMissingSemesters(data) + # data["y-label"] = key else: - data = self.generateMissingSemesters(data) + # data = self.generateMissingSemesters(data) + data = {"x": [], "y": []} + for semester in missing_semesters: + # if semester not in x_data, set y to 0 + if semester not in x_data: + data["x"].append(semester) + data["y"].append(0) + data["x"].append(semester) + # get the index of the semester in x_data + if semester in x_data: + index = x_data.index(semester) + data["y"].append(y_data[index]) + data["y-label"] = y_label lst.append(data) else: @@ -68,55 +107,52 @@ class DataGraph(QtWidgets.QWidget): else: lst.append(data) x_data = lst[0]["x"] # - xdict = dict(enumerate(x_data)) - stringaxis_x = pg.AxisItem(orientation="bottom") - stringaxis_x.setTicks([xdict.items()]) - graph = pg.PlotWidget(axisItems={"bottom": stringaxis_x}) - graph.addLegend() - colors = ["b", "r", "c", "m", "y", "k", "w"] - symbols = [ - "o", - "s", - "t", - "d", - "+", - "t1", - "t2", - "t3", - "p", - "h", - "star", - "x", - "arrow_up", - "arrow_down", - "arrow_left", - "arrow_right", - ] - color_index = 0 - index = 0 - - for data in lst: - symbol = symbols[random.randint(0, len(symbols) - 1)] - if color_index >= len(colors): - color_index = 0 - # iterate over the list, use y-data and y-label to plot the graph - y_data = data["y"] - label = data["y-label"] if "y-label" in data else label - - pen = pg.mkPen(color=colors[color_index], width=2) - if isinstance(y_data, list): - graph.plot( - list(xdict.keys()), y_data, pen=pen, symbol=symbol, name=label + self.chart.createDefaultAxes() + for entry in lst: + print("entry:", entry) + entryseries = QLineSeries() + for x_val, y_val in zip(entry["x"], entry["y"]): + # + entryseries.append(entry["x"].index(x_val), y_val) + entryseries.setName(entry["y-label"] if "y-label" in entry else y_label) + entryseries.setPen( + QPen( + QColor( + random.randint(0, 255), + random.randint(0, 255), + random.randint(0, 255), + ), + 2, + ) ) - color_index += 1 - index += 1 - else: - pass - graph.setBackground("#d3d3d3") - graph.setTitle(title) - layout = QtWidgets.QVBoxLayout() - layout.addWidget(graph) + + self.chart.addSeries(entryseries) + + x_axis = QCategoryAxis() + for index, semester in enumerate(lst[0]["x"]): + x_axis.append(semester, index) + x_axis.setLabelsPosition( + QCategoryAxis.AxisLabelsPosition.AxisLabelsPositionOnValue + ) + # rotare the label by 45 degrees + x_axis.setLabelsAngle(x_rotation) + x_axis.setLabelsFont(QtGui.QFont("Arial", 8, QtGui.QFont.Weight.Normal, False)) + self.chart.setAxisX(x_axis, entryseries) + + # entryseries.append( + # str() + # ) + self.chart.legend().setVisible(True) + self.chart.legend().setAlignment(QtCore.Qt.AlignmentFlag.AlignTop) + # set legend labels + + self.chart.setAxisY(QValueAxis(self.chart), entryseries) + # the chart's x axis labels are not being displayed, as the chart only has limited space. scale down the x axis font + + chartview = QChartView(self.chart) + chartview.setRenderHint(QPainter.RenderHint.Antialiasing) + layout.addWidget(chartview) self.setLayout(layout) def generateMissingSemesters(self, data: dict[list]): diff --git a/src/ui/widgets/iconLine.py b/src/ui/widgets/iconLine.py index d4f1478..7a1e9b7 100644 --- a/src/ui/widgets/iconLine.py +++ b/src/ui/widgets/iconLine.py @@ -1,5 +1,5 @@ from .widget_sources.icon_widget_ui import Ui_Dialog -from PyQt6 import QtWidgets +from PySide6 import QtWidgets import sys from loguru import logger as log diff --git a/src/ui/widgets/searchPage.py b/src/ui/widgets/searchPage.py index 87fe6ea..0b23fb1 100644 --- a/src/ui/widgets/searchPage.py +++ b/src/ui/widgets/searchPage.py @@ -1,20 +1,22 @@ -from .widget_sources.search_statistic_page_ui import Ui_Dialog -from PyQt6 import QtWidgets, QtGui, QtCore -from PyQt6.QtCore import pyqtSignal -from src.backend import Database, Semester - -from src.logic import custom_sort, Prof, sort_semesters_list -from src.ui.dialogs import Mail_Dialog, ApparatExtendDialog, ReminderDialog -from src.ui.widgets import DataGraph, StatusWidget - -from natsort import natsorted -import loguru import sys +import loguru +from natsort import natsorted +from PySide6 import QtCore, QtGui, QtWidgets +from PySide6.QtCore import Signal + +from src import LOG_DIR +from src.backend import Database, Semester +from src.logic import Prof, custom_sort, sort_semesters_list +from src.ui.dialogs import ApparatExtendDialog, Mail_Dialog, ReminderDialog +from src.ui.widgets import DataQtGraph, StatusWidget + +from .widget_sources.search_statistic_page_ui import Ui_Dialog + log = loguru.logger log.remove() -log.add(sys.stdout) -log.add("logs/application.log", rotation="1 MB", retention="10 days") +log.add(sys.stdout, level="INFO") +log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days") @@ -24,10 +26,10 @@ class MyComboBox(QtWidgets.QComboBox): class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog): - apparat_open = pyqtSignal(str) - reloadSignal = pyqtSignal() - refreshSignal = pyqtSignal() - updateCalendar = pyqtSignal(int, list) + apparat_open = Signal(str) + reloadSignal = Signal() + refreshSignal = Signal() + updateCalendar = Signal(int, list) def __init__(self): log.info("SearchStatisticPage started") @@ -141,6 +143,8 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog): self.stackedWidget_4.setCurrentIndex(1) def search_book(self): + self.no_result.setText("") + self.book_search_result.setRowCount(0) signature = self.search_by_signature.text() title = self.search_by_title.text() @@ -149,9 +153,11 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog): "title": title if title != "" else None, } params = {key: value for key, value in params.items() if value is not None} - log.debug(params) + log.info(params) retdata = self.db.searchBook(params) - if retdata is None: + log.info(retdata) + if retdata == [] or retdata is None: + self.no_result.setText("Keine Ergebnisse gefunden") return for book in retdata: log.debug(book) @@ -308,7 +314,12 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog): "x": [i[0] for i in data], "y": {"Erstellt": [i[1] for i in data], "Gelöscht": [i[2] for i in data]}, } - graph = DataGraph(title="Erstellte und gelöschte Apparate", data=graph_data) + graph = DataQtGraph( + title="Erstellte und gelöschte Apparate", + data=graph_data, + generateMissing=False, + y_label="Anzahl der Apparate", + ) # place the graph into tabWidget_3 self.tabWidget_3.addTab(graph, "Graph") @@ -476,8 +487,12 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog): parent_depth = args[2] apparat = args[1] if header == "deleted" and parent_depth == 2: - # TODO: warn message here - logger.warning("Semesterapparat wurde bereits gelöscht") + log.warning("Semesterapparat wurde bereits gelöscht") + QtWidgets.QMessageBox.information( + self, + "Information", + f"Der Semesterapparat wurde bereits gelöscht und kann nicht angezeigt werden.", + ) if parent_depth == 1: # person selected case - open all apparats from this person in the tableWidget self.tableWidget.setRowCount(0) @@ -489,10 +504,12 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog): # insert new row self.tableWidget.insertRow(0) self.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem("")) - self.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(app[1])) - self.tableWidget.setItem(0, 2, QtWidgets.QTableWidgetItem(str(app[4]))) - self.tableWidget.setItem(0, 3, QtWidgets.QTableWidgetItem(app[2])) - self.tableWidget.setItem(0, 4, QtWidgets.QTableWidgetItem(app[3])) + self.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(app.name)) + self.tableWidget.setItem( + 0, 2, QtWidgets.QTableWidgetItem(str(app.appnr)) + ) + self.tableWidget.setItem(0, 3, QtWidgets.QTableWidgetItem(name)) + self.tableWidget.setItem(0, 4, QtWidgets.QTableWidgetItem(app.subject)) # replace the 0 with a checkbox checkbox = QtWidgets.QCheckBox() checkbox.setChecked(False) diff --git a/src/ui/widgets/welcome_wizard.py b/src/ui/widgets/welcome_wizard.py new file mode 100644 index 0000000..571ce01 --- /dev/null +++ b/src/ui/widgets/welcome_wizard.py @@ -0,0 +1,238 @@ +from typing import Any +from .widget_sources.welcome_wizard_ui import Ui_Wizard +from PySide6 import QtWidgets, QtCore, QtGui +from src import settings, LOG_DIR +from src.backend import Database +import sys +from appdirs import AppDirs +from pathlib import Path +import loguru + +appdirs = AppDirs("SemesterApparatsManager", "SAM") + +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 WelcomeWizard(QtWidgets.QWizard, Ui_Wizard): + def __init__(self, parent=None): + super().__init__(parent) + log.info("Initializing WelcomeWizard") + self.setupUi(self) + self.btn_database.clicked.connect(self.open_database_settings) + self.btn_temp.clicked.connect(self.open_temp_settings) + self.btn_test.clicked.connect(self.test_login_data) + self.btn_create.clicked.connect(self.create_sam_user) + # mail password field + self.settings_mail_password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + self.settings_zotero_api_key.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + self.settings_openai_api_key.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + self.sam_password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + + # allow user to toggle password visibility + self.settings_mail_password.setContextMenuPolicy( + QtCore.Qt.ContextMenuPolicy.CustomContextMenu + ) + self.settings_zotero_api_key.setContextMenuPolicy( + QtCore.Qt.ContextMenuPolicy.CustomContextMenu + ) + self.settings_openai_api_key.setContextMenuPolicy( + QtCore.Qt.ContextMenuPolicy.CustomContextMenu + ) + self.sam_password.setContextMenuPolicy( + QtCore.Qt.ContextMenuPolicy.CustomContextMenu + ) + self.settings_mail_password.customContextMenuRequested.connect( + lambda pos: self.toggle_password_visibility( + pos, self.settings_mail_password + ) + ) + self.settings_zotero_api_key.customContextMenuRequested.connect( + lambda pos: self.toggle_password_visibility( + pos, self.settings_zotero_api_key + ) + ) + self.settings_openai_api_key.customContextMenuRequested.connect( + lambda pos: self.toggle_password_visibility( + pos, self.settings_openai_api_key + ) + ) + self.sam_password.customContextMenuRequested.connect( + lambda pos: self.toggle_password_visibility(pos, self.sam_password) + ) + # if button for next page is clicked, run function to store settings + self.button(QtWidgets.QWizard.WizardButton.NextButton).clicked.connect( + self.store_settings + ) + self.settings_mail_use_user_name.toggled.connect(self.set_check_text) + # set initial values for checkbox, database + self.set_check_text(self.settings_mail_use_user_name.isChecked()) + self.settings_database.setText( + str(settings.database.path) + if settings.database.path is not None + else str(appdirs.user_data_dir) + ) + + self.settings_temp.setText( + str(settings.database.temp) + if settings.database.temp is not None + else str(appdirs.user_cache_dir) + ) + self.settings_database_name.setText("semesterapparate.db") + + def test_login_data(self): + from src.backend import AdminCommands + + log.info("Testing login data for SAM user") + db_path = ( + self.settings_database.text() + "/" + self.settings_database_name.text() + ) + db_path = Path(db_path).expanduser() + db = Database(db_path=db_path) + db.overwritePath(db_path) + db.initializeDatabase() + sam_users = AdminCommands(db_path=db_path).list_users() + sam_users = [user[2] for user in sam_users] + + username = self.sam_username.text() + if username in sam_users: + QtWidgets.QMessageBox.information( + self, + "Information", + f"User '{username}' exists in SAM.", + ) + else: + QtWidgets.QMessageBox.information( + self, + "Information", + f"User '{username}' does not exist in SAM.", + ) + + def create_sam_user(self): + """Create a SAM user in the database.""" + from src.backend import AdminCommands + + db_path = ( + self.settings_database.text() + "/" + self.settings_database_name.text() + ) + db_path = Path(db_path).expanduser() + db = Database(db_path=db_path) + db.overwritePath(db_path) + db.initializeDatabase() + admin = AdminCommands(db_path=db_path) + admin.create_admin() + if not admin.create_user(self.sam_username.text(), self.sam_password.text()): + QtWidgets.QMessageBox.critical( + self, + "Error", + "Failed to create SAM user", + ) + else: + QtWidgets.QMessageBox.information( + self, + "Success", + "SAM user created successfully", + ) + + def set_check_text(self, checked): + """Set the text of the checkbox based on its state.""" + if checked: + self.settings_mail_use_user_name.setText("Nutzername wird verwendet") + else: + self.settings_mail_use_user_name.setText("Nutzername wird nicht verwendet") + + def toggle_password_visibility(self, pos: Any, field): + """Toggle the visibility of the password field.""" + if field.echoMode() == QtWidgets.QLineEdit.EchoMode.Password: + field.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal) + else: + field.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + + def store_settings(self): + # database page + db_path = self.settings_database.text() + temp_path = self.settings_temp.text() + db_name = self.settings_database_name.text() + + # mail page + smtp_server = self.settings_mail_smtp_server.text() + smtp_port = self.settings_mail_smtp_port.text() + mail_sender = self.settings_mail_address.text() + mail_user_name = self.settings_mail_user_name.text() + mail_password = self.settings_mail_password.text() + mail_printer_mail = self.settings_mail_printer.text() + mail_signature = self.settings_mail_signature.toPlainText() + use_user_name = self.settings_mail_use_user_name.isChecked() + + # zotero page + zotero__api_key = self.settings_zotero_api_key.text() + zotero_user_id = self.settings_zotero_library_id.text() + zotero_library_type = self.settings_zotero_library_type.text() + + # openai page + openai_api_key = self.settings_openai_api_key.text() + openai_model = self.settings_openai_model.currentText() + + # store settings in config + settings.set_database_attr("path", db_path) + settings.set_database_attr("name", db_name) + settings.set_database_attr("temp", temp_path) + settings.set_mail_attr("smtp_server", smtp_server) + settings.set_mail_attr("port", smtp_port) + settings.set_mail_attr("sender", mail_sender) + settings.set_mail_attr("user_name", mail_user_name) + settings.set_mail_attr("password", mail_password) + settings.set_mail_attr("printer_mail", mail_printer_mail) + settings.set_mail_attr("signature", mail_signature) + settings.set_mail_attr("use_user_name", use_user_name) + settings.set_zotero_attr("api_key", zotero__api_key) + settings.set_zotero_attr("library_id", zotero_user_id) + settings.set_zotero_attr("library_type", zotero_library_type) + settings.set_openai_attr("api_key", openai_api_key) + settings.set_openai_attr("model", openai_model) + # save settings to file + print("Saving settings...") + settings.save() + + def open_database_settings(self): + #open filepicker dialog to select database file folder + file_dialog = QtWidgets.QFileDialog(self, "Select Database File") + file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.Directory) + file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.List) + file_dialog.setWindowFlags(file_dialog.windowFlags() | QtCore.Qt.WindowType.WindowStaysOnTopHint) + # set start dir to appdir.user_data_dir + file_dialog.setDirectory(str(appdirs.user_data_dir)) + if file_dialog.exec(): + selected_files = file_dialog.selectedFiles() + if selected_files: + # Do something with the selected database file + db_path = selected_files[0] + self.settings_database.setText(db_path) + + def open_temp_settings(self): + #open filepicker dialog to select temporary directory + dir_dialog = QtWidgets.QFileDialog(self, "Select Temporary Directory") + dir_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.Directory) + dir_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.List) + + if dir_dialog.exec(): + selected_dirs = dir_dialog.selectedFiles() + if selected_dirs: + # Do something with the selected temporary directory + temp_path = selected_dirs[0] + self.settings_temp.setText(temp_path) + +def launch_wizard(): + """Launch the welcome wizard.""" + app = QtWidgets.QApplication.instance() + if not app: + app = QtWidgets.QApplication([]) + wizard = WelcomeWizard() + # wizard.setWindowTitle("Welcome to the Semester Apparatus Manager") + # wizard.setWindowIcon(settings.Icon("welcome").icon) + wizard.setWizardStyle(QtWidgets.QWizard.WizardStyle.ModernStyle) + wizard.setStartId(0) + wizard.show() + return wizard.exec() \ No newline at end of file diff --git a/src/ui/widgets/widget_sources/admin_create_user_ui.py b/src/ui/widgets/widget_sources/admin_create_user_ui.py index a43d4bb..935fc8b 100644 --- a/src/ui/widgets/widget_sources/admin_create_user_ui.py +++ b/src/ui/widgets/widget_sources/admin_create_user_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\admin_create_user.ui' # -# Created by: PyQt6 UI code generator 6.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/widgets/widget_sources/admin_edit_prof_ui.py b/src/ui/widgets/widget_sources/admin_edit_prof_ui.py index 1ecaddc..3cbb6ce 100644 --- a/src/ui/widgets/widget_sources/admin_edit_prof_ui.py +++ b/src/ui/widgets/widget_sources/admin_edit_prof_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\admin_edit_prof.ui' # -# Created by: PyQt6 UI code generator 6.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/widgets/widget_sources/admin_edit_user_ui.py b/src/ui/widgets/widget_sources/admin_edit_user_ui.py index 8094d24..a33fce7 100644 --- a/src/ui/widgets/widget_sources/admin_edit_user_ui.py +++ b/src/ui/widgets/widget_sources/admin_edit_user_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\admin_edit_user.ui' # -# Created by: PyQt6 UI code generator 6.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/widgets/widget_sources/calendar_entry_ui.py b/src/ui/widgets/widget_sources/calendar_entry_ui.py index e5ea069..8041d1f 100644 --- a/src/ui/widgets/widget_sources/calendar_entry_ui.py +++ b/src/ui/widgets/widget_sources/calendar_entry_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\calendar_entry.ui' # -# Created by: PyQt6 UI code generator 6.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/widgets/widget_sources/elsa_maindialog_ui.py b/src/ui/widgets/widget_sources/elsa_maindialog_ui.py index 2822004..0edfbe5 100644 --- a/src/ui/widgets/widget_sources/elsa_maindialog_ui.py +++ b/src/ui/widgets/widget_sources/elsa_maindialog_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\elsa_maindialog.ui' # -# Created by: PyQt6 UI code generator 6.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/widgets/widget_sources/icon_widget_ui.py b/src/ui/widgets/widget_sources/icon_widget_ui.py index 82f9c01..66b7475 100644 --- a/src/ui/widgets/widget_sources/icon_widget_ui.py +++ b/src/ui/widgets/widget_sources/icon_widget_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\icon_widget.ui' # -# Created by: PyQt6 UI code generator 6.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/ui/widgets/widget_sources/search_statistic_page.ui b/src/ui/widgets/widget_sources/search_statistic_page.ui index 5356983..8960cb8 100644 --- a/src/ui/widgets/widget_sources/search_statistic_page.ui +++ b/src/ui/widgets/widget_sources/search_statistic_page.ui @@ -210,49 +210,6 @@ - - - - Titel - - - search_by_title - - - - - - - Qt::ClickFocus - - - true - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Signatur - - - search_by_signature - - - @@ -266,6 +223,67 @@ + + + + Signatur + + + search_by_signature + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::ClickFocus + + + true + + + + + + + Titel + + + search_by_title + + + + + + + + + Suche mit Enter starten + + + + + + + + + + + + diff --git a/src/ui/widgets/widget_sources/search_statistic_page_ui.py b/src/ui/widgets/widget_sources/search_statistic_page_ui.py index 210d580..31aa672 100644 --- a/src/ui/widgets/widget_sources/search_statistic_page_ui.py +++ b/src/ui/widgets/widget_sources/search_statistic_page_ui.py @@ -1,271 +1,379 @@ -# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\search_statistic_page.ui' -# -# Created by: PyQt6 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. +# -*- coding: utf-8 -*- +################################################################################ +## Form generated from reading UI file 'search_statistic_page.ui' +## +## Created by: Qt User Interface Compiler version 6.9.1 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ -from PyQt6 import QtCore, QtGui, QtWidgets - +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QAbstractItemView, QApplication, QCheckBox, QComboBox, + QDialog, QFrame, QGridLayout, QHBoxLayout, + QHeaderView, QLabel, QLayout, QLineEdit, + QPushButton, QSizePolicy, QSpacerItem, QStackedWidget, + QTabWidget, QTableWidget, QTableWidgetItem, QVBoxLayout, + QWidget) class Ui_Dialog(object): def setupUi(self, Dialog): - Dialog.setObjectName("Dialog") + if not Dialog.objectName(): + Dialog.setObjectName(u"Dialog") Dialog.resize(1244, 767) - self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) - self.verticalLayout.setObjectName("verticalLayout") - self.tabWidget_2 = QtWidgets.QTabWidget(parent=Dialog) - self.tabWidget_2.setMaximumSize(QtCore.QSize(16777215, 250)) - self.tabWidget_2.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus) - self.tabWidget_2.setTabPosition(QtWidgets.QTabWidget.TabPosition.North) - self.tabWidget_2.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) - self.tabWidget_2.setObjectName("tabWidget_2") - self.tab_3 = QtWidgets.QWidget() - self.tab_3.setObjectName("tab_3") - self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.tab_3) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.gridLayout_3 = QtWidgets.QGridLayout() - self.gridLayout_3.setObjectName("gridLayout_3") - self.box_semester = QtWidgets.QComboBox(parent=self.tab_3) + self.verticalLayout = QVBoxLayout(Dialog) + self.verticalLayout.setObjectName(u"verticalLayout") + self.tabWidget_2 = QTabWidget(Dialog) + self.tabWidget_2.setObjectName(u"tabWidget_2") + self.tabWidget_2.setMaximumSize(QSize(16777215, 250)) + self.tabWidget_2.setFocusPolicy(Qt.ClickFocus) + self.tabWidget_2.setTabPosition(QTabWidget.North) + self.tabWidget_2.setTabShape(QTabWidget.Rounded) + self.tab_3 = QWidget() + self.tab_3.setObjectName(u"tab_3") + self.horizontalLayout_2 = QHBoxLayout(self.tab_3) + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.gridLayout_3 = QGridLayout() + self.gridLayout_3.setObjectName(u"gridLayout_3") + self.box_semester = QComboBox(self.tab_3) + self.box_semester.setObjectName(u"box_semester") self.box_semester.setEditable(True) - self.box_semester.setObjectName("box_semester") + self.gridLayout_3.addWidget(self.box_semester, 0, 3, 1, 1) - self.label_18 = QtWidgets.QLabel(parent=self.tab_3) - self.label_18.setObjectName("label_18") + + self.label_18 = QLabel(self.tab_3) + self.label_18.setObjectName(u"label_18") + self.gridLayout_3.addWidget(self.label_18, 2, 2, 1, 1) - self.box_fach = QtWidgets.QComboBox(parent=self.tab_3) + + self.box_fach = QComboBox(self.tab_3) + self.box_fach.setObjectName(u"box_fach") self.box_fach.setEditable(True) - self.box_fach.setObjectName("box_fach") + self.gridLayout_3.addWidget(self.box_fach, 2, 1, 1, 1) - self.label_15 = QtWidgets.QLabel(parent=self.tab_3) - self.label_15.setObjectName("label_15") + + self.label_15 = QLabel(self.tab_3) + self.label_15.setObjectName(u"label_15") + self.gridLayout_3.addWidget(self.label_15, 3, 0, 1, 1) - self.label_11 = QtWidgets.QLabel(parent=self.tab_3) - self.label_11.setObjectName("label_11") + + self.label_11 = QLabel(self.tab_3) + self.label_11.setObjectName(u"label_11") + self.gridLayout_3.addWidget(self.label_11, 1, 0, 1, 1) - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) - self.gridLayout_3.addItem(spacerItem, 4, 0, 1, 1) - self.label_7 = QtWidgets.QLabel(parent=self.tab_3) - self.label_7.setObjectName("label_7") + + self.verticalSpacer_3 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.gridLayout_3.addItem(self.verticalSpacer_3, 4, 0, 1, 1) + + self.label_7 = QLabel(self.tab_3) + self.label_7.setObjectName(u"label_7") + self.gridLayout_3.addWidget(self.label_7, 0, 0, 1, 1) - self.label_17 = QtWidgets.QLabel(parent=self.tab_3) - self.label_17.setObjectName("label_17") + + self.label_17 = QLabel(self.tab_3) + self.label_17.setObjectName(u"label_17") + self.gridLayout_3.addWidget(self.label_17, 0, 2, 1, 1) - self.box_appnrs = QtWidgets.QComboBox(parent=self.tab_3) + + self.box_appnrs = QComboBox(self.tab_3) + self.box_appnrs.setObjectName(u"box_appnrs") self.box_appnrs.setEditable(True) - self.box_appnrs.setObjectName("box_appnrs") + self.gridLayout_3.addWidget(self.box_appnrs, 0, 1, 1, 1) - self.box_dauerapp = QtWidgets.QComboBox(parent=self.tab_3) - self.box_dauerapp.setObjectName("box_dauerapp") + + self.box_dauerapp = QComboBox(self.tab_3) + self.box_dauerapp.setObjectName(u"box_dauerapp") + self.gridLayout_3.addWidget(self.box_dauerapp, 2, 3, 1, 1) - self.box_person = QtWidgets.QComboBox(parent=self.tab_3) + + self.box_person = QComboBox(self.tab_3) + self.box_person.setObjectName(u"box_person") self.box_person.setEditable(True) - self.box_person.setObjectName("box_person") + self.gridLayout_3.addWidget(self.box_person, 1, 1, 1, 1) - self.box_erstellsemester = QtWidgets.QComboBox(parent=self.tab_3) + + self.box_erstellsemester = QComboBox(self.tab_3) + self.box_erstellsemester.setObjectName(u"box_erstellsemester") self.box_erstellsemester.setEditable(True) - self.box_erstellsemester.setObjectName("box_erstellsemester") + self.gridLayout_3.addWidget(self.box_erstellsemester, 1, 3, 1, 1) - self.label_19 = QtWidgets.QLabel(parent=self.tab_3) - self.label_19.setObjectName("label_19") + + self.label_19 = QLabel(self.tab_3) + self.label_19.setObjectName(u"label_19") + self.gridLayout_3.addWidget(self.label_19, 1, 2, 1, 1) - self.label_16 = QtWidgets.QLabel(parent=self.tab_3) - self.label_16.setObjectName("label_16") + + self.label_16 = QLabel(self.tab_3) + self.label_16.setObjectName(u"label_16") + self.gridLayout_3.addWidget(self.label_16, 2, 0, 1, 1) - self.check_deletable = QtWidgets.QCheckBox(parent=self.tab_3) - self.check_deletable.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) - self.check_deletable.setText("") - self.check_deletable.setObjectName("check_deletable") + + self.check_deletable = QCheckBox(self.tab_3) + self.check_deletable.setObjectName(u"check_deletable") + self.check_deletable.setFocusPolicy(Qt.StrongFocus) + self.gridLayout_3.addWidget(self.check_deletable, 3, 1, 1, 1) - self.btn_search = QtWidgets.QPushButton(parent=self.tab_3) - self.btn_search.setObjectName("btn_search") + + self.btn_search = QPushButton(self.tab_3) + self.btn_search.setObjectName(u"btn_search") + self.gridLayout_3.addWidget(self.btn_search, 5, 0, 1, 1) - self.db_err_message = QtWidgets.QLabel(parent=self.tab_3) - self.db_err_message.setText("") - self.db_err_message.setObjectName("db_err_message") + + self.db_err_message = QLabel(self.tab_3) + self.db_err_message.setObjectName(u"db_err_message") + self.gridLayout_3.addWidget(self.db_err_message, 5, 1, 1, 1) - self.gridLayout_3.setColumnMinimumWidth(0, 40) + self.gridLayout_3.setColumnStretch(0, 1) self.gridLayout_3.setColumnStretch(1, 1) self.gridLayout_3.setColumnStretch(2, 1) self.gridLayout_3.setColumnStretch(3, 1) + self.gridLayout_3.setColumnMinimumWidth(0, 40) + self.horizontalLayout_2.addLayout(self.gridLayout_3) - spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_2.addItem(spacerItem1) + + self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_2.addItem(self.horizontalSpacer) + self.horizontalLayout_2.setStretch(0, 1) self.horizontalLayout_2.setStretch(1, 1) self.tabWidget_2.addTab(self.tab_3, "") - self.tab_4 = QtWidgets.QWidget() - self.tab_4.setObjectName("tab_4") - self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.tab_4) - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.gridLayout = QtWidgets.QGridLayout() - self.gridLayout.setObjectName("gridLayout") - self.label_26 = QtWidgets.QLabel(parent=self.tab_4) - self.label_26.setObjectName("label_26") - self.gridLayout.addWidget(self.label_26, 1, 0, 1, 1) - self.search_by_title = QtWidgets.QLineEdit(parent=self.tab_4) - self.search_by_title.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus) - self.search_by_title.setClearButtonEnabled(True) - self.search_by_title.setObjectName("search_by_title") - self.gridLayout.addWidget(self.search_by_title, 1, 1, 1, 1) - spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) - self.gridLayout.addItem(spacerItem2, 2, 0, 1, 1) - self.label_25 = QtWidgets.QLabel(parent=self.tab_4) - self.label_25.setObjectName("label_25") - self.gridLayout.addWidget(self.label_25, 0, 0, 1, 1) - self.search_by_signature = QtWidgets.QLineEdit(parent=self.tab_4) - self.search_by_signature.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus) + self.tab_4 = QWidget() + self.tab_4.setObjectName(u"tab_4") + self.horizontalLayout_3 = QHBoxLayout(self.tab_4) + self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") + self.gridLayout = QGridLayout() + self.gridLayout.setObjectName(u"gridLayout") + self.search_by_signature = QLineEdit(self.tab_4) + self.search_by_signature.setObjectName(u"search_by_signature") + self.search_by_signature.setFocusPolicy(Qt.ClickFocus) self.search_by_signature.setClearButtonEnabled(True) - self.search_by_signature.setObjectName("search_by_signature") + self.gridLayout.addWidget(self.search_by_signature, 0, 1, 1, 1) + + self.label_25 = QLabel(self.tab_4) + self.label_25.setObjectName(u"label_25") + + self.gridLayout.addWidget(self.label_25, 0, 0, 1, 1) + + self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.gridLayout.addItem(self.verticalSpacer, 5, 0, 1, 1) + + self.search_by_title = QLineEdit(self.tab_4) + self.search_by_title.setObjectName(u"search_by_title") + self.search_by_title.setFocusPolicy(Qt.ClickFocus) + self.search_by_title.setClearButtonEnabled(True) + + self.gridLayout.addWidget(self.search_by_title, 1, 1, 1, 1) + + self.label_26 = QLabel(self.tab_4) + self.label_26.setObjectName(u"label_26") + + self.gridLayout.addWidget(self.label_26, 1, 0, 1, 1) + + self.horizontalLayout_4 = QHBoxLayout() + self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") + self.label = QLabel(self.tab_4) + self.label.setObjectName(u"label") + + self.horizontalLayout_4.addWidget(self.label) + + self.no_result = QLabel(self.tab_4) + self.no_result.setObjectName(u"no_result") + + self.horizontalLayout_4.addWidget(self.no_result) + + + self.gridLayout.addLayout(self.horizontalLayout_4, 3, 1, 1, 1) + + self.horizontalLayout_3.addLayout(self.gridLayout) - spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_3.addItem(spacerItem3) + + self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_3.addItem(self.horizontalSpacer_2) + self.horizontalLayout_3.setStretch(0, 30) self.horizontalLayout_3.setStretch(1, 70) self.tabWidget_2.addTab(self.tab_4, "") + self.verticalLayout.addWidget(self.tabWidget_2) - self.verticalLayout_3 = QtWidgets.QVBoxLayout() - self.verticalLayout_3.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetDefaultConstraint) - self.verticalLayout_3.setObjectName("verticalLayout_3") - self.stackedWidget_4 = QtWidgets.QStackedWidget(parent=Dialog) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + + self.verticalLayout_3 = QVBoxLayout() + self.verticalLayout_3.setObjectName(u"verticalLayout_3") + self.verticalLayout_3.setSizeConstraint(QLayout.SetDefaultConstraint) + self.stackedWidget_4 = QStackedWidget(Dialog) + self.stackedWidget_4.setObjectName(u"stackedWidget_4") + sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.stackedWidget_4.sizePolicy().hasHeightForWidth()) self.stackedWidget_4.setSizePolicy(sizePolicy) - self.stackedWidget_4.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.stackedWidget_4.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.stackedWidget_4.setObjectName("stackedWidget_4") - self.apparatResult = QtWidgets.QWidget() - self.apparatResult.setObjectName("apparatResult") - self.horizontalLayout = QtWidgets.QHBoxLayout(self.apparatResult) - self.horizontalLayout.setObjectName("horizontalLayout") - self.app_results = QtWidgets.QWidget(parent=self.apparatResult) - self.app_results.setObjectName("app_results") - self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.app_results) - self.verticalLayout_6.setObjectName("verticalLayout_6") - self.verticalLayout_4 = QtWidgets.QVBoxLayout() - self.verticalLayout_4.setObjectName("verticalLayout_4") - self.horizontalLayout_7 = QtWidgets.QHBoxLayout() - self.horizontalLayout_7.setObjectName("horizontalLayout_7") - self.verticalLayout_5 = QtWidgets.QVBoxLayout() - self.verticalLayout_5.setObjectName("verticalLayout_5") + self.stackedWidget_4.setFrameShape(QFrame.StyledPanel) + self.stackedWidget_4.setFrameShadow(QFrame.Raised) + self.apparatResult = QWidget() + self.apparatResult.setObjectName(u"apparatResult") + self.horizontalLayout = QHBoxLayout(self.apparatResult) + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.app_results = QWidget(self.apparatResult) + self.app_results.setObjectName(u"app_results") + self.verticalLayout_6 = QVBoxLayout(self.app_results) + self.verticalLayout_6.setObjectName(u"verticalLayout_6") + self.verticalLayout_4 = QVBoxLayout() + self.verticalLayout_4.setObjectName(u"verticalLayout_4") + self.horizontalLayout_7 = QHBoxLayout() + self.horizontalLayout_7.setObjectName(u"horizontalLayout_7") + self.verticalLayout_5 = QVBoxLayout() + self.verticalLayout_5.setObjectName(u"verticalLayout_5") + self.horizontalLayout_7.addLayout(self.verticalLayout_5) - self.btn_del_select_apparats = QtWidgets.QPushButton(parent=self.app_results) - self.btn_del_select_apparats.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) - self.btn_del_select_apparats.setObjectName("btn_del_select_apparats") + + self.btn_del_select_apparats = QPushButton(self.app_results) + self.btn_del_select_apparats.setObjectName(u"btn_del_select_apparats") + self.btn_del_select_apparats.setFocusPolicy(Qt.StrongFocus) + self.horizontalLayout_7.addWidget(self.btn_del_select_apparats) - self.btn_notify_for_deletion = QtWidgets.QPushButton(parent=self.app_results) - self.btn_notify_for_deletion.setObjectName("btn_notify_for_deletion") + + self.btn_notify_for_deletion = QPushButton(self.app_results) + self.btn_notify_for_deletion.setObjectName(u"btn_notify_for_deletion") + self.horizontalLayout_7.addWidget(self.btn_notify_for_deletion) - spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_7.addItem(spacerItem4) + + self.horizontalSpacer_5 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_7.addItem(self.horizontalSpacer_5) + + self.verticalLayout_4.addLayout(self.horizontalLayout_7) - self.tableWidget = QtWidgets.QTableWidget(parent=self.app_results) - self.tableWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.tableWidget.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu) - self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) - self.tableWidget.setGridStyle(QtCore.Qt.PenStyle.NoPen) - self.tableWidget.setObjectName("tableWidget") - self.tableWidget.setColumnCount(5) - self.tableWidget.setRowCount(0) - 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.setHorizontalHeaderItem(4, item) + + self.tableWidget = QTableWidget(self.app_results) + if (self.tableWidget.columnCount() < 5): + self.tableWidget.setColumnCount(5) + __qtablewidgetitem = QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem) + __qtablewidgetitem1 = QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1) + __qtablewidgetitem2 = QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(2, __qtablewidgetitem2) + __qtablewidgetitem3 = QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(3, __qtablewidgetitem3) + __qtablewidgetitem4 = QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(4, __qtablewidgetitem4) + self.tableWidget.setObjectName(u"tableWidget") + self.tableWidget.setFocusPolicy(Qt.NoFocus) + self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu) + self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) + self.tableWidget.setGridStyle(Qt.NoPen) + self.tableWidget.setSortingEnabled(True) self.tableWidget.horizontalHeader().setStretchLastSection(True) - self.tableWidget.verticalHeader().setSortIndicatorShown(True) + self.tableWidget.verticalHeader().setProperty(u"showSortIndicator", True) + self.verticalLayout_4.addWidget(self.tableWidget) + + self.verticalLayout_6.addLayout(self.verticalLayout_4) + + self.horizontalLayout.addWidget(self.app_results) - self.stats = QtWidgets.QFrame(parent=self.apparatResult) - self.stats.setObjectName("stats") - self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.stats) - self.verticalLayout_8.setObjectName("verticalLayout_8") - self.tabWidget_3 = QtWidgets.QTabWidget(parent=self.stats) - self.tabWidget_3.setObjectName("tabWidget_3") - self.statistic_table = QtWidgets.QWidget() - self.statistic_table.setObjectName("statistic_table") - self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.statistic_table) - self.verticalLayout_7.setObjectName("verticalLayout_7") - self.statistics_table = QtWidgets.QTableWidget(parent=self.statistic_table) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) + + self.stats = QFrame(self.apparatResult) + self.stats.setObjectName(u"stats") + self.verticalLayout_8 = QVBoxLayout(self.stats) + self.verticalLayout_8.setObjectName(u"verticalLayout_8") + self.tabWidget_3 = QTabWidget(self.stats) + self.tabWidget_3.setObjectName(u"tabWidget_3") + self.statistic_table = QWidget() + self.statistic_table.setObjectName(u"statistic_table") + self.verticalLayout_7 = QVBoxLayout(self.statistic_table) + self.verticalLayout_7.setObjectName(u"verticalLayout_7") + self.statistics_table = QTableWidget(self.statistic_table) + if (self.statistics_table.columnCount() < 3): + self.statistics_table.setColumnCount(3) + __qtablewidgetitem5 = QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(0, __qtablewidgetitem5) + __qtablewidgetitem6 = QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(1, __qtablewidgetitem6) + __qtablewidgetitem7 = QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(2, __qtablewidgetitem7) + self.statistics_table.setObjectName(u"statistics_table") sizePolicy.setHeightForWidth(self.statistics_table.sizePolicy().hasHeightForWidth()) self.statistics_table.setSizePolicy(sizePolicy) - self.statistics_table.setMaximumSize(QtCore.QSize(16777215, 16777215)) - self.statistics_table.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.statistics_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) - self.statistics_table.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.statistics_table.setMaximumSize(QSize(16777215, 16777215)) + self.statistics_table.setFocusPolicy(Qt.NoFocus) + self.statistics_table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.statistics_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.statistics_table.setAlternatingRowColors(True) - self.statistics_table.setObjectName("statistics_table") - self.statistics_table.setColumnCount(3) - self.statistics_table.setRowCount(0) - item = QtWidgets.QTableWidgetItem() - self.statistics_table.setHorizontalHeaderItem(0, item) - item = QtWidgets.QTableWidgetItem() - self.statistics_table.setHorizontalHeaderItem(1, item) - item = QtWidgets.QTableWidgetItem() - self.statistics_table.setHorizontalHeaderItem(2, item) self.statistics_table.horizontalHeader().setCascadingSectionResizes(True) - self.statistics_table.horizontalHeader().setDefaultSectionSize(80) self.statistics_table.horizontalHeader().setMinimumSectionSize(40) - self.statistics_table.horizontalHeader().setSortIndicatorShown(True) + self.statistics_table.horizontalHeader().setDefaultSectionSize(80) + self.statistics_table.horizontalHeader().setProperty(u"showSortIndicator", True) self.statistics_table.horizontalHeader().setStretchLastSection(False) self.statistics_table.verticalHeader().setStretchLastSection(True) + self.verticalLayout_7.addWidget(self.statistics_table) - self.dataLayout = QtWidgets.QHBoxLayout() - self.dataLayout.setObjectName("dataLayout") + + self.dataLayout = QHBoxLayout() + self.dataLayout.setObjectName(u"dataLayout") + self.verticalLayout_7.addLayout(self.dataLayout) + self.tabWidget_3.addTab(self.statistic_table, "") - self.graph_table = QtWidgets.QWidget() - self.graph_table.setObjectName("graph_table") + self.graph_table = QWidget() + self.graph_table.setObjectName(u"graph_table") self.tabWidget_3.addTab(self.graph_table, "") + self.verticalLayout_8.addWidget(self.tabWidget_3) + + self.horizontalLayout.addWidget(self.stats) + self.stackedWidget_4.addWidget(self.apparatResult) - self.bookresult = QtWidgets.QWidget() - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) + self.bookresult = QWidget() + self.bookresult.setObjectName(u"bookresult") sizePolicy.setHeightForWidth(self.bookresult.sizePolicy().hasHeightForWidth()) self.bookresult.setSizePolicy(sizePolicy) - self.bookresult.setObjectName("bookresult") - self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.bookresult) - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.book_search_result = QtWidgets.QTableWidget(parent=self.bookresult) - self.book_search_result.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) - self.book_search_result.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.verticalLayout_2 = QVBoxLayout(self.bookresult) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.book_search_result = QTableWidget(self.bookresult) + if (self.book_search_result.columnCount() < 3): + self.book_search_result.setColumnCount(3) + __qtablewidgetitem8 = QTableWidgetItem() + self.book_search_result.setHorizontalHeaderItem(0, __qtablewidgetitem8) + __qtablewidgetitem9 = QTableWidgetItem() + self.book_search_result.setHorizontalHeaderItem(1, __qtablewidgetitem9) + __qtablewidgetitem10 = QTableWidgetItem() + self.book_search_result.setHorizontalHeaderItem(2, __qtablewidgetitem10) + self.book_search_result.setObjectName(u"book_search_result") + self.book_search_result.setFrameShadow(QFrame.Plain) + self.book_search_result.setEditTriggers(QAbstractItemView.NoEditTriggers) self.book_search_result.setAlternatingRowColors(True) self.book_search_result.setRowCount(0) - self.book_search_result.setObjectName("book_search_result") - self.book_search_result.setColumnCount(3) - item = QtWidgets.QTableWidgetItem() - self.book_search_result.setHorizontalHeaderItem(0, item) - item = QtWidgets.QTableWidgetItem() - self.book_search_result.setHorizontalHeaderItem(1, item) - item = QtWidgets.QTableWidgetItem() - self.book_search_result.setHorizontalHeaderItem(2, item) self.book_search_result.horizontalHeader().setCascadingSectionResizes(True) - self.book_search_result.horizontalHeader().setDefaultSectionSize(200) self.book_search_result.horizontalHeader().setMinimumSectionSize(100) - self.book_search_result.horizontalHeader().setSortIndicatorShown(True) + self.book_search_result.horizontalHeader().setDefaultSectionSize(200) + self.book_search_result.horizontalHeader().setProperty(u"showSortIndicator", True) self.book_search_result.horizontalHeader().setStretchLastSection(True) - self.book_search_result.verticalHeader().setSortIndicatorShown(False) + self.book_search_result.verticalHeader().setProperty(u"showSortIndicator", False) + self.verticalLayout_2.addWidget(self.book_search_result) + self.stackedWidget_4.addWidget(self.bookresult) + self.verticalLayout_3.addWidget(self.stackedWidget_4) + + self.verticalLayout.addLayout(self.verticalLayout_3) + +#if QT_CONFIG(shortcut) self.label_18.setBuddy(self.box_dauerapp) self.label_15.setBuddy(self.check_deletable) self.label_11.setBuddy(self.box_person) @@ -273,64 +381,77 @@ class Ui_Dialog(object): self.label_17.setBuddy(self.box_semester) self.label_19.setBuddy(self.box_erstellsemester) self.label_16.setBuddy(self.box_fach) - self.label_26.setBuddy(self.search_by_title) self.label_25.setBuddy(self.search_by_signature) + self.label_26.setBuddy(self.search_by_title) +#endif // QT_CONFIG(shortcut) + QWidget.setTabOrder(self.box_appnrs, self.box_person) + QWidget.setTabOrder(self.box_person, self.box_fach) + QWidget.setTabOrder(self.box_fach, self.check_deletable) + QWidget.setTabOrder(self.check_deletable, self.box_semester) + QWidget.setTabOrder(self.box_semester, self.box_erstellsemester) + QWidget.setTabOrder(self.box_erstellsemester, self.box_dauerapp) + QWidget.setTabOrder(self.box_dauerapp, self.btn_search) + QWidget.setTabOrder(self.btn_search, self.book_search_result) + QWidget.setTabOrder(self.book_search_result, self.search_by_signature) + QWidget.setTabOrder(self.search_by_signature, self.search_by_title) self.retranslateUi(Dialog) + self.tabWidget_2.setCurrentIndex(0) self.stackedWidget_4.setCurrentIndex(0) self.tabWidget_3.setCurrentIndex(0) - QtCore.QMetaObject.connectSlotsByName(Dialog) - Dialog.setTabOrder(self.box_appnrs, self.box_person) - Dialog.setTabOrder(self.box_person, self.box_fach) - Dialog.setTabOrder(self.box_fach, self.check_deletable) - Dialog.setTabOrder(self.check_deletable, self.box_semester) - Dialog.setTabOrder(self.box_semester, self.box_erstellsemester) - Dialog.setTabOrder(self.box_erstellsemester, self.box_dauerapp) - Dialog.setTabOrder(self.box_dauerapp, self.btn_search) - Dialog.setTabOrder(self.btn_search, self.book_search_result) - Dialog.setTabOrder(self.book_search_result, self.search_by_signature) - Dialog.setTabOrder(self.search_by_signature, self.search_by_title) + + + QMetaObject.connectSlotsByName(Dialog) + # setupUi def retranslateUi(self, Dialog): - _translate = QtCore.QCoreApplication.translate - Dialog.setWindowTitle(_translate("Dialog", "Dialog")) - self.label_18.setText(_translate("Dialog", "Dauerapp:")) - self.label_15.setText(_translate("Dialog", "Löschbar")) - self.label_11.setText(_translate("Dialog", "Person:")) - self.label_7.setText(_translate("Dialog", "Appnr.:")) - self.label_17.setText(_translate("Dialog", "Endsemester:")) - self.label_19.setText(_translate("Dialog", "Erstellsemester:")) - self.label_16.setText(_translate("Dialog", "Fach:")) - self.btn_search.setText(_translate("Dialog", "Suchen")) - self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_3), _translate("Dialog", "Statistik")) - self.label_26.setText(_translate("Dialog", "Titel")) - self.label_25.setText(_translate("Dialog", "Signatur")) - self.search_by_signature.setStatusTip(_translate("Dialog", "Trunkierung mit * am Ende unterstützt")) - self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_4), _translate("Dialog", "Suchen")) - self.btn_del_select_apparats.setText(_translate("Dialog", "Ausgewählte Löschen")) - self.btn_notify_for_deletion.setStatusTip(_translate("Dialog", "Zeigt für jeden ausgewählten Apparat eine eMail-Vorlage an")) - self.btn_notify_for_deletion.setText(_translate("Dialog", "Ausgewählte Benachrichtigen")) - self.tableWidget.setSortingEnabled(True) - item = self.tableWidget.horizontalHeaderItem(1) - item.setText(_translate("Dialog", "Apparatsname")) - item = self.tableWidget.horizontalHeaderItem(2) - item.setText(_translate("Dialog", "Apparatsnummer")) - item = self.tableWidget.horizontalHeaderItem(3) - item.setText(_translate("Dialog", "Person")) - item = self.tableWidget.horizontalHeaderItem(4) - item.setText(_translate("Dialog", "Fach")) - item = self.statistics_table.horizontalHeaderItem(0) - item.setText(_translate("Dialog", "Semester")) - item = self.statistics_table.horizontalHeaderItem(1) - item.setText(_translate("Dialog", "Zugang")) - item = self.statistics_table.horizontalHeaderItem(2) - item.setText(_translate("Dialog", "Abgang")) - self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.statistic_table), _translate("Dialog", "Tabelle")) - self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.graph_table), _translate("Dialog", "Erstellte und gelöschte Semesterapparate")) - item = self.book_search_result.horizontalHeaderItem(0) - item.setText(_translate("Dialog", "Titel")) - item = self.book_search_result.horizontalHeaderItem(1) - item.setText(_translate("Dialog", "Signatur")) - item = self.book_search_result.horizontalHeaderItem(2) - item.setText(_translate("Dialog", "Apparat")) + Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None)) + self.label_18.setText(QCoreApplication.translate("Dialog", u"Dauerapp:", None)) + self.label_15.setText(QCoreApplication.translate("Dialog", u"L\u00f6schbar", None)) + self.label_11.setText(QCoreApplication.translate("Dialog", u"Person:", None)) + self.label_7.setText(QCoreApplication.translate("Dialog", u"Appnr.:", None)) + self.label_17.setText(QCoreApplication.translate("Dialog", u"Endsemester:", None)) + self.label_19.setText(QCoreApplication.translate("Dialog", u"Erstellsemester:", None)) + self.label_16.setText(QCoreApplication.translate("Dialog", u"Fach:", None)) + self.check_deletable.setText("") + self.btn_search.setText(QCoreApplication.translate("Dialog", u"Suchen", None)) + self.db_err_message.setText("") + self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_3), QCoreApplication.translate("Dialog", u"Statistik", None)) +#if QT_CONFIG(statustip) + self.search_by_signature.setStatusTip(QCoreApplication.translate("Dialog", u"Trunkierung mit * am Ende unterst\u00fctzt", None)) +#endif // QT_CONFIG(statustip) + self.label_25.setText(QCoreApplication.translate("Dialog", u"Signatur", None)) + self.label_26.setText(QCoreApplication.translate("Dialog", u"Titel", None)) + self.label.setText(QCoreApplication.translate("Dialog", u"Suche mit Enter starten", None)) + self.no_result.setText("") + self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_4), QCoreApplication.translate("Dialog", u"Suchen", None)) + self.btn_del_select_apparats.setText(QCoreApplication.translate("Dialog", u"Ausgew\u00e4hlte L\u00f6schen", None)) +#if QT_CONFIG(statustip) + self.btn_notify_for_deletion.setStatusTip(QCoreApplication.translate("Dialog", u"Zeigt f\u00fcr jeden ausgew\u00e4hlten Apparat eine eMail-Vorlage an", None)) +#endif // QT_CONFIG(statustip) + self.btn_notify_for_deletion.setText(QCoreApplication.translate("Dialog", u"Ausgew\u00e4hlte Benachrichtigen", None)) + ___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(1) + ___qtablewidgetitem.setText(QCoreApplication.translate("Dialog", u"Apparatsname", None)); + ___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(2) + ___qtablewidgetitem1.setText(QCoreApplication.translate("Dialog", u"Apparatsnummer", None)); + ___qtablewidgetitem2 = self.tableWidget.horizontalHeaderItem(3) + ___qtablewidgetitem2.setText(QCoreApplication.translate("Dialog", u"Person", None)); + ___qtablewidgetitem3 = self.tableWidget.horizontalHeaderItem(4) + ___qtablewidgetitem3.setText(QCoreApplication.translate("Dialog", u"Fach", None)); + ___qtablewidgetitem4 = self.statistics_table.horizontalHeaderItem(0) + ___qtablewidgetitem4.setText(QCoreApplication.translate("Dialog", u"Semester", None)); + ___qtablewidgetitem5 = self.statistics_table.horizontalHeaderItem(1) + ___qtablewidgetitem5.setText(QCoreApplication.translate("Dialog", u"Zugang", None)); + ___qtablewidgetitem6 = self.statistics_table.horizontalHeaderItem(2) + ___qtablewidgetitem6.setText(QCoreApplication.translate("Dialog", u"Abgang", None)); + self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.statistic_table), QCoreApplication.translate("Dialog", u"Tabelle", None)) + self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.graph_table), QCoreApplication.translate("Dialog", u"Erstellte und gel\u00f6schte Semesterapparate", None)) + ___qtablewidgetitem7 = self.book_search_result.horizontalHeaderItem(0) + ___qtablewidgetitem7.setText(QCoreApplication.translate("Dialog", u"Titel", None)); + ___qtablewidgetitem8 = self.book_search_result.horizontalHeaderItem(1) + ___qtablewidgetitem8.setText(QCoreApplication.translate("Dialog", u"Signatur", None)); + ___qtablewidgetitem9 = self.book_search_result.horizontalHeaderItem(2) + ___qtablewidgetitem9.setText(QCoreApplication.translate("Dialog", u"Apparat", None)); + # retranslateUi + diff --git a/src/ui/widgets/widget_sources/welcome_wizard.ui b/src/ui/widgets/widget_sources/welcome_wizard.ui new file mode 100644 index 0000000..e774473 --- /dev/null +++ b/src/ui/widgets/widget_sources/welcome_wizard.ui @@ -0,0 +1,497 @@ + + + Wizard + + + + 0 + 0 + 564 + 425 + + + + Wizard + + + false + + + QWizard::ClassicStyle + + + Qt::PlainText + + + 1 + + + + Willkommen + + + + + + 0 + + + + + + false + + + Qt::NoFocus + + + 0 + + + QTextEdit::AutoAll + + + true + + + <!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: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;">Es wurde erkannt, dass der SemesterApparatsManager (SAM) zum ersten Mal gestartet wurde. In den Folgenden Seiten werden die grundlegenden Einstellungen festgelegt, anschließend wird SAM geöffnet. Folgende Einstellungen werden über diesen Wizard festgelegt:</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;">- Datenbank</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- eMail</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Zotero Integration</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- KI Integration</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anschließend kann ein Nutzeraccount für SAM erstellt werden</p></body></html> + + + + + + + + Datenbank + + + Hier werden die Einstellungen für die Datenbank und temporären Dateien festgelegt. Über den [...] Knopf können die Speicherordner ausgewählt werden. + + + 1 + + + + + + Qt::NoFocus + + + true + + + C:\Users\[Nutzer]\AppData\Local\SAM\SemesterApparatsManager\Cache + + + + + + + Datenbankpfad + + + + + + + Qt::NoFocus + + + true + + + + + + + + + + Temporäre Daten + + + + + + + ... + + + + + + + ... + + + + + + + Datenbankname + + + + + + + semesterapparate.db + + + + + + + + Mail + + + Hier werden die Einstellungen für die Mailverbindung eingegeben + + + 2 + + + + + + SMTP Server + + + + + + + true + + + + + + + Qt::ImhDigitsOnly + + + true + + + + + + + true + + + + + + + Rechtsklick, um passwort anzuzeigen + + + + + + + + + + + + + Nutzername + + + + + + + SMTP Port + + + + + + + Passwort + + + + + + + CheckBox + + + + + + + true + + + + + + + Druckermail + + + + + + + Nutzername +für SMTP + + + + + + + + + + Signatur + + + + + + + Mail Adresse + + + + + + + true + + + + + + + + Zotero + + + Hier werden die Einstellungen für Zotero verwaltet + + + 3 + + + + + + API-Key + + + + + + + + + + + + + ID + + + + + + + Anwendungstyp + + + + + + + user + + + + + + + + KI-Integration + + + Hier werden die Einstellungen für die KI Integration eingestellt. + + + 9 + + + + + + + + + API Key + + + + + + + ChatGPT Modell + + + + + + + gpt3.5-turbo + + + + gpt3.5-turbo + + + + + gpt-4 + + + + + gpt-4o + + + + + gpt-4o-mini + + + + + gpt-4.1 + + + + + gpt-4.1-mini + + + + + gpt-4.1-nano + + + + + + + + + SAM Nutzer + + + Hier kann ein Nutzer für SAM erstellt werden + + + + + + Nutzername + + + + + + + + + + Passwort + + + + + + + + + + + + Prüfen + + + + + + + Anlegen + + + true + + + false + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + settings_database + btn_database + settings_database_name + settings_temp + btn_temp + settings_mail_smtp_server + settings_mail_smtp_port + settings_mail_address + settings_mail_user_name + settings_mail_password + settings_mail_signature + settings_mail_printer + settings_mail_use_user_name + settings_zotero_api_key + settings_zotero_library_id + settings_zotero_library_type + settings_openai_api_key + settings_openai_model + + + + diff --git a/src/ui/widgets/widget_sources/welcome_wizard_ui.py b/src/ui/widgets/widget_sources/welcome_wizard_ui.py new file mode 100644 index 0000000..1d87792 --- /dev/null +++ b/src/ui/widgets/widget_sources/welcome_wizard_ui.py @@ -0,0 +1,402 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'welcome_wizard.ui' +## +## Created by: Qt User Interface Compiler version 6.9.1 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QFormLayout, + QGridLayout, QHBoxLayout, QLabel, QLineEdit, + QPushButton, QSizePolicy, QSpacerItem, QTextEdit, + QToolButton, QVBoxLayout, QWidget, QWizard, + QWizardPage) + +class Ui_Wizard(object): + def setupUi(self, Wizard): + if not Wizard.objectName(): + Wizard.setObjectName(u"Wizard") + Wizard.resize(564, 425) + Wizard.setSizeGripEnabled(False) + Wizard.setWizardStyle(QWizard.ClassicStyle) + Wizard.setSubTitleFormat(Qt.PlainText) + Wizard.setCurrentId(1) + self.wizardPage1 = QWizardPage() + self.wizardPage1.setObjectName(u"wizardPage1") + self.verticalLayout = QVBoxLayout(self.wizardPage1) + self.verticalLayout.setObjectName(u"verticalLayout") + self.textEdit = QTextEdit(self.wizardPage1) + self.textEdit.setObjectName(u"textEdit") + self.textEdit.setEnabled(False) + self.textEdit.setFocusPolicy(Qt.NoFocus) + self.textEdit.setLineWidth(0) + self.textEdit.setAutoFormatting(QTextEdit.AutoAll) + self.textEdit.setReadOnly(True) + + self.verticalLayout.addWidget(self.textEdit) + + Wizard.setPage(0, self.wizardPage1) + self.wizardPage2 = QWizardPage() + self.wizardPage2.setObjectName(u"wizardPage2") + self.gridLayout = QGridLayout(self.wizardPage2) + self.gridLayout.setObjectName(u"gridLayout") + self.settings_temp = QLineEdit(self.wizardPage2) + self.settings_temp.setObjectName(u"settings_temp") + self.settings_temp.setFocusPolicy(Qt.NoFocus) + self.settings_temp.setReadOnly(True) + + self.gridLayout.addWidget(self.settings_temp, 2, 1, 1, 1) + + self.label = QLabel(self.wizardPage2) + self.label.setObjectName(u"label") + + self.gridLayout.addWidget(self.label, 0, 0, 1, 1) + + self.settings_database = QLineEdit(self.wizardPage2) + self.settings_database.setObjectName(u"settings_database") + self.settings_database.setFocusPolicy(Qt.NoFocus) + self.settings_database.setReadOnly(True) + + self.gridLayout.addWidget(self.settings_database, 0, 1, 1, 1) + + self.label_2 = QLabel(self.wizardPage2) + self.label_2.setObjectName(u"label_2") + + self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) + + self.btn_database = QToolButton(self.wizardPage2) + self.btn_database.setObjectName(u"btn_database") + + self.gridLayout.addWidget(self.btn_database, 0, 2, 1, 1) + + self.btn_temp = QToolButton(self.wizardPage2) + self.btn_temp.setObjectName(u"btn_temp") + + self.gridLayout.addWidget(self.btn_temp, 2, 2, 1, 1) + + self.label_16 = QLabel(self.wizardPage2) + self.label_16.setObjectName(u"label_16") + + self.gridLayout.addWidget(self.label_16, 1, 0, 1, 1) + + self.settings_database_name = QLineEdit(self.wizardPage2) + self.settings_database_name.setObjectName(u"settings_database_name") + + self.gridLayout.addWidget(self.settings_database_name, 1, 1, 1, 1) + + Wizard.setPage(1, self.wizardPage2) + self.wizardPage3 = QWizardPage() + self.wizardPage3.setObjectName(u"wizardPage3") + self.formLayout = QFormLayout(self.wizardPage3) + self.formLayout.setObjectName(u"formLayout") + self.label_3 = QLabel(self.wizardPage3) + self.label_3.setObjectName(u"label_3") + + self.formLayout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label_3) + + self.settings_mail_smtp_server = QLineEdit(self.wizardPage3) + self.settings_mail_smtp_server.setObjectName(u"settings_mail_smtp_server") + self.settings_mail_smtp_server.setClearButtonEnabled(True) + + self.formLayout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.settings_mail_smtp_server) + + self.settings_mail_smtp_port = QLineEdit(self.wizardPage3) + self.settings_mail_smtp_port.setObjectName(u"settings_mail_smtp_port") + self.settings_mail_smtp_port.setInputMethodHints(Qt.ImhDigitsOnly) + self.settings_mail_smtp_port.setClearButtonEnabled(True) + + self.formLayout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.settings_mail_smtp_port) + + self.settings_mail_user_name = QLineEdit(self.wizardPage3) + self.settings_mail_user_name.setObjectName(u"settings_mail_user_name") + self.settings_mail_user_name.setClearButtonEnabled(True) + + self.formLayout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.settings_mail_user_name) + + self.settings_mail_password = QLineEdit(self.wizardPage3) + self.settings_mail_password.setObjectName(u"settings_mail_password") + + self.formLayout.setWidget(4, QFormLayout.ItemRole.FieldRole, self.settings_mail_password) + + self.label_4 = QLabel(self.wizardPage3) + self.label_4.setObjectName(u"label_4") + + self.formLayout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.label_4) + + self.label_5 = QLabel(self.wizardPage3) + self.label_5.setObjectName(u"label_5") + + self.formLayout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_5) + + self.label_6 = QLabel(self.wizardPage3) + self.label_6.setObjectName(u"label_6") + + self.formLayout.setWidget(4, QFormLayout.ItemRole.LabelRole, self.label_6) + + self.settings_mail_use_user_name = QCheckBox(self.wizardPage3) + self.settings_mail_use_user_name.setObjectName(u"settings_mail_use_user_name") + + self.formLayout.setWidget(8, QFormLayout.ItemRole.FieldRole, self.settings_mail_use_user_name) + + self.settings_mail_printer = QLineEdit(self.wizardPage3) + self.settings_mail_printer.setObjectName(u"settings_mail_printer") + self.settings_mail_printer.setClearButtonEnabled(True) + + self.formLayout.setWidget(7, QFormLayout.ItemRole.FieldRole, self.settings_mail_printer) + + self.label_8 = QLabel(self.wizardPage3) + self.label_8.setObjectName(u"label_8") + + self.formLayout.setWidget(7, QFormLayout.ItemRole.LabelRole, self.label_8) + + self.label_9 = QLabel(self.wizardPage3) + self.label_9.setObjectName(u"label_9") + + self.formLayout.setWidget(8, QFormLayout.ItemRole.LabelRole, self.label_9) + + self.settings_mail_signature = QTextEdit(self.wizardPage3) + self.settings_mail_signature.setObjectName(u"settings_mail_signature") + + self.formLayout.setWidget(5, QFormLayout.ItemRole.FieldRole, self.settings_mail_signature) + + self.label_10 = QLabel(self.wizardPage3) + self.label_10.setObjectName(u"label_10") + + self.formLayout.setWidget(5, QFormLayout.ItemRole.LabelRole, self.label_10) + + self.label_7 = QLabel(self.wizardPage3) + self.label_7.setObjectName(u"label_7") + + self.formLayout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.label_7) + + self.settings_mail_address = QLineEdit(self.wizardPage3) + self.settings_mail_address.setObjectName(u"settings_mail_address") + self.settings_mail_address.setClearButtonEnabled(True) + + self.formLayout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.settings_mail_address) + + Wizard.setPage(2, self.wizardPage3) + self.wizardPage4 = QWizardPage() + self.wizardPage4.setObjectName(u"wizardPage4") + self.formLayout_2 = QFormLayout(self.wizardPage4) + self.formLayout_2.setObjectName(u"formLayout_2") + self.label_11 = QLabel(self.wizardPage4) + self.label_11.setObjectName(u"label_11") + + self.formLayout_2.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label_11) + + self.settings_zotero_api_key = QLineEdit(self.wizardPage4) + self.settings_zotero_api_key.setObjectName(u"settings_zotero_api_key") + + self.formLayout_2.setWidget(0, QFormLayout.ItemRole.FieldRole, self.settings_zotero_api_key) + + self.settings_zotero_library_id = QLineEdit(self.wizardPage4) + self.settings_zotero_library_id.setObjectName(u"settings_zotero_library_id") + + self.formLayout_2.setWidget(1, QFormLayout.ItemRole.FieldRole, self.settings_zotero_library_id) + + self.label_12 = QLabel(self.wizardPage4) + self.label_12.setObjectName(u"label_12") + + self.formLayout_2.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_12) + + self.label_13 = QLabel(self.wizardPage4) + self.label_13.setObjectName(u"label_13") + + self.formLayout_2.setWidget(2, QFormLayout.ItemRole.LabelRole, self.label_13) + + self.settings_zotero_library_type = QLineEdit(self.wizardPage4) + self.settings_zotero_library_type.setObjectName(u"settings_zotero_library_type") + + self.formLayout_2.setWidget(2, QFormLayout.ItemRole.FieldRole, self.settings_zotero_library_type) + + Wizard.setPage(3, self.wizardPage4) + self.wizardPage5 = QWizardPage() + self.wizardPage5.setObjectName(u"wizardPage5") + self.formLayout_3 = QFormLayout(self.wizardPage5) + self.formLayout_3.setObjectName(u"formLayout_3") + self.settings_openai_api_key = QLineEdit(self.wizardPage5) + self.settings_openai_api_key.setObjectName(u"settings_openai_api_key") + + self.formLayout_3.setWidget(0, QFormLayout.ItemRole.FieldRole, self.settings_openai_api_key) + + self.label_14 = QLabel(self.wizardPage5) + self.label_14.setObjectName(u"label_14") + + self.formLayout_3.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label_14) + + self.label_15 = QLabel(self.wizardPage5) + self.label_15.setObjectName(u"label_15") + + self.formLayout_3.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_15) + + self.settings_openai_model = QComboBox(self.wizardPage5) + self.settings_openai_model.addItem("") + self.settings_openai_model.addItem("") + self.settings_openai_model.addItem("") + self.settings_openai_model.addItem("") + self.settings_openai_model.addItem("") + self.settings_openai_model.addItem("") + self.settings_openai_model.addItem("") + self.settings_openai_model.setObjectName(u"settings_openai_model") + + self.formLayout_3.setWidget(1, QFormLayout.ItemRole.FieldRole, self.settings_openai_model) + + Wizard.setPage(9, self.wizardPage5) + self.wizardPage6 = QWizardPage() + self.wizardPage6.setObjectName(u"wizardPage6") + self.formLayout_4 = QFormLayout(self.wizardPage6) + self.formLayout_4.setObjectName(u"formLayout_4") + self.label_17 = QLabel(self.wizardPage6) + self.label_17.setObjectName(u"label_17") + + self.formLayout_4.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label_17) + + self.sam_username = QLineEdit(self.wizardPage6) + self.sam_username.setObjectName(u"sam_username") + + self.formLayout_4.setWidget(0, QFormLayout.ItemRole.FieldRole, self.sam_username) + + self.label_18 = QLabel(self.wizardPage6) + self.label_18.setObjectName(u"label_18") + + self.formLayout_4.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_18) + + self.sam_password = QLineEdit(self.wizardPage6) + self.sam_password.setObjectName(u"sam_password") + + self.formLayout_4.setWidget(1, QFormLayout.ItemRole.FieldRole, self.sam_password) + + self.horizontalLayout = QHBoxLayout() + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.btn_test = QPushButton(self.wizardPage6) + self.btn_test.setObjectName(u"btn_test") + + self.horizontalLayout.addWidget(self.btn_test) + + self.btn_create = QPushButton(self.wizardPage6) + self.btn_create.setObjectName(u"btn_create") + self.btn_create.setFlat(False) + + self.horizontalLayout.addWidget(self.btn_create) + + + self.formLayout_4.setLayout(2, QFormLayout.ItemRole.FieldRole, self.horizontalLayout) + + self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.formLayout_4.setItem(3, QFormLayout.ItemRole.FieldRole, self.verticalSpacer) + + Wizard.addPage(self.wizardPage6) + QWidget.setTabOrder(self.settings_database, self.btn_database) + QWidget.setTabOrder(self.btn_database, self.settings_database_name) + QWidget.setTabOrder(self.settings_database_name, self.settings_temp) + QWidget.setTabOrder(self.settings_temp, self.btn_temp) + QWidget.setTabOrder(self.btn_temp, self.settings_mail_smtp_server) + QWidget.setTabOrder(self.settings_mail_smtp_server, self.settings_mail_smtp_port) + QWidget.setTabOrder(self.settings_mail_smtp_port, self.settings_mail_address) + QWidget.setTabOrder(self.settings_mail_address, self.settings_mail_user_name) + QWidget.setTabOrder(self.settings_mail_user_name, self.settings_mail_password) + QWidget.setTabOrder(self.settings_mail_password, self.settings_mail_signature) + QWidget.setTabOrder(self.settings_mail_signature, self.settings_mail_printer) + QWidget.setTabOrder(self.settings_mail_printer, self.settings_mail_use_user_name) + QWidget.setTabOrder(self.settings_mail_use_user_name, self.settings_zotero_api_key) + QWidget.setTabOrder(self.settings_zotero_api_key, self.settings_zotero_library_id) + QWidget.setTabOrder(self.settings_zotero_library_id, self.settings_zotero_library_type) + QWidget.setTabOrder(self.settings_zotero_library_type, self.settings_openai_api_key) + QWidget.setTabOrder(self.settings_openai_api_key, self.settings_openai_model) + + self.retranslateUi(Wizard) + + self.btn_create.setDefault(True) + + + QMetaObject.connectSlotsByName(Wizard) + # setupUi + + def retranslateUi(self, Wizard): + Wizard.setWindowTitle(QCoreApplication.translate("Wizard", u"Wizard", None)) + self.wizardPage1.setTitle(QCoreApplication.translate("Wizard", u"Willkommen", None)) + self.wizardPage1.setSubTitle("") + self.textEdit.setHtml(QCoreApplication.translate("Wizard", u"\n" +"\n" +"

Es wurde erkannt, dass der SemesterApparatsManager (SAM) zum ersten Mal gestartet wurde. In den Folgenden Seiten werden die grundlegenden Einstellungen festgelegt, anschlie\u00dfend wird SAM ge\u00f6ffnet. Folgende Einstellungen werden \u00fcber diesen Wizard festgelegt:

\n" +"


\n" +"

- Datenbank

\n" +"

- eMail

\n" +"

- Zotero Integration

\n" +"

- KI Integration

\n" +"

Anschlie\u00dfend kann ein Nutzeraccount f\u00fcr SAM erstellt werden

", None)) + self.wizardPage2.setTitle(QCoreApplication.translate("Wizard", u"Datenbank", None)) + self.wizardPage2.setSubTitle(QCoreApplication.translate("Wizard", u"Hier werden die Einstellungen f\u00fcr die Datenbank und tempor\u00e4ren Dateien festgelegt. \u00dcber den [...] Knopf k\u00f6nnen die Speicherordner ausgew\u00e4hlt werden.", None)) + self.settings_temp.setPlaceholderText(QCoreApplication.translate("Wizard", u"C:\\Users\\[Nutzer]\\AppData\\Local\\SAM\\SemesterApparatsManager\\Cache", None)) + self.label.setText(QCoreApplication.translate("Wizard", u"Datenbankpfad", None)) + self.settings_database.setPlaceholderText("") + self.label_2.setText(QCoreApplication.translate("Wizard", u"Tempor\u00e4re Daten", None)) + self.btn_database.setText(QCoreApplication.translate("Wizard", u"...", None)) + self.btn_temp.setText(QCoreApplication.translate("Wizard", u"...", None)) + self.label_16.setText(QCoreApplication.translate("Wizard", u"Datenbankname", None)) + self.settings_database_name.setPlaceholderText(QCoreApplication.translate("Wizard", u"semesterapparate.db", None)) + self.wizardPage3.setTitle(QCoreApplication.translate("Wizard", u"Mail", None)) + self.wizardPage3.setSubTitle(QCoreApplication.translate("Wizard", u"Hier werden die Einstellungen f\u00fcr die Mailverbindung eingegeben", None)) + self.label_3.setText(QCoreApplication.translate("Wizard", u"SMTP Server", None)) +#if QT_CONFIG(tooltip) + self.settings_mail_password.setToolTip(QCoreApplication.translate("Wizard", u"Rechtsklick, um passwort anzuzeigen", None)) +#endif // QT_CONFIG(tooltip) +#if QT_CONFIG(statustip) + self.settings_mail_password.setStatusTip("") +#endif // QT_CONFIG(statustip) +#if QT_CONFIG(whatsthis) + self.settings_mail_password.setWhatsThis("") +#endif // QT_CONFIG(whatsthis) + self.label_4.setText(QCoreApplication.translate("Wizard", u"Nutzername", None)) + self.label_5.setText(QCoreApplication.translate("Wizard", u"SMTP Port", None)) + self.label_6.setText(QCoreApplication.translate("Wizard", u"Passwort", None)) + self.settings_mail_use_user_name.setText(QCoreApplication.translate("Wizard", u"CheckBox", None)) + self.label_8.setText(QCoreApplication.translate("Wizard", u"Druckermail", None)) + self.label_9.setText(QCoreApplication.translate("Wizard", u"Nutzername\n" +"f\u00fcr SMTP", None)) + self.label_10.setText(QCoreApplication.translate("Wizard", u"Signatur", None)) + self.label_7.setText(QCoreApplication.translate("Wizard", u"Mail Adresse", None)) + self.wizardPage4.setTitle(QCoreApplication.translate("Wizard", u"Zotero", None)) + self.wizardPage4.setSubTitle(QCoreApplication.translate("Wizard", u"Hier werden die Einstellungen f\u00fcr Zotero verwaltet", None)) + self.label_11.setText(QCoreApplication.translate("Wizard", u"API-Key", None)) + self.label_12.setText(QCoreApplication.translate("Wizard", u"ID", None)) + self.label_13.setText(QCoreApplication.translate("Wizard", u"Anwendungstyp", None)) + self.settings_zotero_library_type.setText(QCoreApplication.translate("Wizard", u"user", None)) + self.wizardPage5.setTitle(QCoreApplication.translate("Wizard", u"KI-Integration", None)) + self.wizardPage5.setSubTitle(QCoreApplication.translate("Wizard", u"Hier werden die Einstellungen f\u00fcr die KI Integration eingestellt.", None)) + self.label_14.setText(QCoreApplication.translate("Wizard", u"API Key", None)) + self.label_15.setText(QCoreApplication.translate("Wizard", u"ChatGPT Modell", None)) + self.settings_openai_model.setItemText(0, QCoreApplication.translate("Wizard", u"gpt3.5-turbo", None)) + self.settings_openai_model.setItemText(1, QCoreApplication.translate("Wizard", u"gpt-4", None)) + self.settings_openai_model.setItemText(2, QCoreApplication.translate("Wizard", u"gpt-4o", None)) + self.settings_openai_model.setItemText(3, QCoreApplication.translate("Wizard", u"gpt-4o-mini", None)) + self.settings_openai_model.setItemText(4, QCoreApplication.translate("Wizard", u"gpt-4.1", None)) + self.settings_openai_model.setItemText(5, QCoreApplication.translate("Wizard", u"gpt-4.1-mini", None)) + self.settings_openai_model.setItemText(6, QCoreApplication.translate("Wizard", u"gpt-4.1-nano", None)) + + self.settings_openai_model.setCurrentText(QCoreApplication.translate("Wizard", u"gpt3.5-turbo", None)) + self.wizardPage6.setTitle(QCoreApplication.translate("Wizard", u"SAM Nutzer", None)) + self.wizardPage6.setSubTitle(QCoreApplication.translate("Wizard", u"Hier kann ein Nutzer f\u00fcr SAM erstellt werden", None)) + self.label_17.setText(QCoreApplication.translate("Wizard", u"Nutzername", None)) + self.label_18.setText(QCoreApplication.translate("Wizard", u"Passwort", None)) + self.btn_test.setText(QCoreApplication.translate("Wizard", u"Pr\u00fcfen", None)) + self.btn_create.setText(QCoreApplication.translate("Wizard", u"Anlegen", None)) + # retranslateUi + diff --git a/src/utils/Ui_docs.py b/src/utils/Ui_docs.py index b849a8d..e4b744c 100644 --- a/src/utils/Ui_docs.py +++ b/src/utils/Ui_docs.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\utils\docs.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): diff --git a/src/utils/docs_ui.py b/src/utils/docs_ui.py index 3e11e63..1f0523a 100644 --- a/src/utils/docs_ui.py +++ b/src/utils/docs_ui.py @@ -1,12 +1,12 @@ # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\utils\docs.ui' # -# Created by: PyQt6 UI code generator 6.8.0 +# 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 PyQt6 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): diff --git a/src/utils/documentation.py b/src/utils/documentation.py index 2e41721..88789e5 100644 --- a/src/utils/documentation.py +++ b/src/utils/documentation.py @@ -1,15 +1,43 @@ import os -import sys +from pyramid.config import Configurator +from wsgiref.simple_server import WSGIRequestHandler +from src import LOG_DIR +import logging -def run_mkdocs(): - with open(os.devnull, "w") as devnull: - old_stdout = sys.stdout - old_stderr = sys.stderr - sys.stdout = devnull - sys.stderr = devnull - try: - os.system("mkdocs serve -q") - finally: - sys.stdout = old_stdout - sys.stderr = old_stderr +log_path = os.path.join(LOG_DIR, "web_documentation.log") + +# Replace the default StreamHandler with a FileHandler +logging.basicConfig( + level=logging.INFO, + handlers=[logging.FileHandler(log_path, encoding="utf-8")], + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", +) + +logger = logging.getLogger(__name__) # inherits the same file handler + +docport = 8000 + + +class QuietHandler(WSGIRequestHandler): + # suppress “GET /…” access log + def log_request(self, code="-", size="-"): + logger.info("Request: {} {}".format(self.requestline, code)) + pass + + # suppress all other messages (errors, etc.) + def log_message(self, fmt, *args): + logger.error("Error: {}, Args: {}".format(fmt, args)) + pass + + +def website(): + config = Configurator() + + # Set up static file serving from the 'site/' directory + config.add_static_view( + name="/", path=os.path.join(os.getcwd(), "site"), cache_max_age=3600 + ) + + app = config.make_wsgi_app() + return app diff --git a/src/utils/documentationview.py b/src/utils/documentationview.py index 2ad2283..ca180f2 100644 --- a/src/utils/documentationview.py +++ b/src/utils/documentationview.py @@ -1,8 +1,8 @@ import os import sys -# from PyQt6 import Webview -from PyQt6.QtWidgets import QApplication, QMainWindow, QTabWidget +# from PySide6 import Webview +from PySide6.QtWidgets import QApplication, QMainWindow, QTabWidget documentation_path = "docs" diff --git a/src/utils/icon.py b/src/utils/icon.py index f281a27..b659d75 100644 --- a/src/utils/icon.py +++ b/src/utils/icon.py @@ -1,5 +1,5 @@ import darkdetect -from PyQt6 import QtGui +from PySide6 import QtGui import re from src import settings diff --git a/uv.lock b/uv.lock index 51d6c6b..9fb517d 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,9 @@ version = 1 requires-python = ">=3.12" +resolution-markers = [ + "python_full_version < '3.13'", + "python_full_version >= '3.13'", +] [[package]] name = "annotated-types" @@ -30,6 +34,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, ] +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 }, +] + [[package]] name = "appscript" version = "1.3.0" @@ -65,15 +78,16 @@ wheels = [ [[package]] name = "backrefs" -version = "5.8" +version = "5.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/46/caba1eb32fa5784428ab401a5487f73db4104590ecd939ed9daaf18b47e0/backrefs-5.8.tar.gz", hash = "sha256:2cab642a205ce966af3dd4b38ee36009b31fa9502a35fd61d59ccc116e40a6bd", size = 6773994 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/cb/d019ab87fe70e0fe3946196d50d6a4428623dc0c38a6669c8cae0320fbf3/backrefs-5.8-py310-none-any.whl", hash = "sha256:c67f6638a34a5b8730812f5101376f9d41dc38c43f1fdc35cb54700f6ed4465d", size = 380337 }, - { url = "https://files.pythonhosted.org/packages/a9/86/abd17f50ee21b2248075cb6924c6e7f9d23b4925ca64ec660e869c2633f1/backrefs-5.8-py311-none-any.whl", hash = "sha256:2e1c15e4af0e12e45c8701bd5da0902d326b2e200cafcd25e49d9f06d44bb61b", size = 392142 }, - { url = "https://files.pythonhosted.org/packages/b3/04/7b415bd75c8ab3268cc138c76fa648c19495fcc7d155508a0e62f3f82308/backrefs-5.8-py312-none-any.whl", hash = "sha256:bbef7169a33811080d67cdf1538c8289f76f0942ff971222a16034da88a73486", size = 398021 }, - { url = "https://files.pythonhosted.org/packages/04/b8/60dcfb90eb03a06e883a92abbc2ab95c71f0d8c9dd0af76ab1d5ce0b1402/backrefs-5.8-py313-none-any.whl", hash = "sha256:e3a63b073867dbefd0536425f43db618578528e3896fb77be7141328642a1585", size = 399915 }, - { url = "https://files.pythonhosted.org/packages/0c/37/fb6973edeb700f6e3d6ff222400602ab1830446c25c7b4676d8de93e65b8/backrefs-5.8-py39-none-any.whl", hash = "sha256:a66851e4533fb5b371aa0628e1fee1af05135616b86140c9d787a2ffdf4b8fdc", size = 380336 }, + { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267 }, + { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072 }, + { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947 }, + { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843 }, + { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762 }, + { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265 }, ] [[package]] @@ -100,16 +114,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/92/8d/e296c7af03757debd [[package]] name = "bracex" -version = "2.5.post1" +version = "2.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/6c/57418c4404cd22fe6275b8301ca2b46a8cdaa8157938017a9ae0b3edf363/bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6", size = 26641 } +sdist = { url = "https://files.pythonhosted.org/packages/63/9a/fec38644694abfaaeca2798b58e276a8e61de49e2e37494ace423395febc/bracex-2.6.tar.gz", hash = "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7", size = 26642 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/02/8db98cdc1a58e0abd6716d5e63244658e6e63513c65f469f34b6f1053fd0/bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6", size = 11558 }, + { url = "https://files.pythonhosted.org/packages/9d/2a/9186535ce58db529927f6cf5990a849aa9e052eea3e2cfefe20b9e1802da/bracex-2.6-py3-none-any.whl", hash = "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952", size = 11508 }, ] [[package]] name = "bump-my-version" -version = "1.1.2" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -122,18 +136,18 @@ dependencies = [ { name = "tomlkit" }, { name = "wcmatch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/13/0a/544e8eb6d46baa99bf16d180b4ddb4509631fa8476e686c8e6c47681afb4/bump_my_version-1.1.2.tar.gz", hash = "sha256:0122845a78502b5a5a635ca17c1efb3e1ec05e77d72d13b2314186b9806882fb", size = 1120309 } +sdist = { url = "https://files.pythonhosted.org/packages/a4/b6/c45043a404e0878e3abeff1c25c87df78777c33760e7459901e0504f003a/bump_my_version-1.2.0.tar.gz", hash = "sha256:5120d798aaf26468a37ca0f127992dc036688b8e5e106adc8870b13c2a2df22d", size = 1136170 } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/a9/026894e86ce2838d029af1344c71fd57560d1b6e2ce6513c340cbf8e00cb/bump_my_version-1.1.2-py3-none-any.whl", hash = "sha256:71a2a8c3940c87749c4cc404b2ada2fafbeab4e478e0ef54537686905ae58e0d", size = 59495 }, + { url = "https://files.pythonhosted.org/packages/1f/e4/715484178fa80279cd67fd06c6641a4611c5ea580acdc221ad715b39d85c/bump_my_version-1.2.0-py3-none-any.whl", hash = "sha256:201e6b103ff0f2b240c9d0a6eb83db382840b1f78eb78f6d77726bed39a326d8", size = 59560 }, ] [[package]] name = "certifi" -version = "2025.4.26" +version = "2025.6.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705 } +sdist = { url = "https://files.pythonhosted.org/packages/73/f7/f14b46d4bcd21092d7d3ccef689615220d8a08fb25e564b65d20738e672e/certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b", size = 158753 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618 }, + { url = "https://files.pythonhosted.org/packages/84/ae/320161bd181fc06471eed047ecce67b693fd7515b16d495d8932db763426/certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", size = 157650 }, ] [[package]] @@ -215,14 +229,14 @@ wheels = [ [[package]] name = "click" -version = "8.1.8" +version = "8.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "platform_system == 'Windows'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, ] [[package]] @@ -236,11 +250,11 @@ wheels = [ [[package]] name = "comtypes" -version = "1.4.10" +version = "1.4.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/7e/34f4941ab5ec7d1d4c496282b1944a5119fc52641c5770a78e6fa0ca32ec/comtypes-1.4.10.zip", hash = "sha256:b92372e76299836177b41aeda784225e18c5071c6bacdab88a7433224a4dc912", size = 267293 } +sdist = { url = "https://files.pythonhosted.org/packages/3c/b9/4431119a640f568190499fd76fac4b4ccb5695659c4b3aac570329c150ea/comtypes-1.4.11.zip", hash = "sha256:0a4259370ec48b685fe4483b0944ba1df0aa45163922073fe9b7df1d187db09e", size = 272448 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/44/72009bb0a0d8286f6408c9cb70552350e21e9c280bfa1ef30784b30dfc0f/comtypes-1.4.10-py3-none-any.whl", hash = "sha256:e078555721ee7ab40648a3363697d420b845b323e5944b55846e96aff97d2534", size = 241481 }, + { url = "https://files.pythonhosted.org/packages/f1/f4/7b7fdbb613992013c4518a0bf8fee2915f79ec07bcfa6180569bca7fa8ef/comtypes-1.4.11-py3-none-any.whl", hash = "sha256:1760d5059ca7ca1d61b574c998378d879c271a86c41f88926619ea97497592bb", size = 246365 }, ] [[package]] @@ -252,6 +266,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f2/f2/728f041460f1b9739b85ee23b45fa5a505962ea11fd85bdbe2a02b021373/darkdetect-0.8.0-py3-none-any.whl", hash = "sha256:a7509ccf517eaad92b31c214f593dbcf138ea8a43b2935406bbd565e15527a85", size = 8955 }, ] +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, +] + [[package]] name = "docx2pdf" version = "0.1.8" @@ -301,36 +324,35 @@ wheels = [ [[package]] name = "greenlet" -version = "3.2.1" +version = "3.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/74/907bb43af91782e0366b0960af62a8ce1f9398e4291cac7beaeffbee0c04/greenlet-3.2.1.tar.gz", hash = "sha256:9f4dd4b4946b14bb3bf038f81e1d2e535b7d94f1b2a59fdba1293cd9c1a0a4d7", size = 184475 } +sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/d1/e4777b188a04726f6cf69047830d37365b9191017f54caf2f7af336a6f18/greenlet-3.2.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:0ba2811509a30e5f943be048895a983a8daf0b9aa0ac0ead526dfb5d987d80ea", size = 270381 }, - { url = "https://files.pythonhosted.org/packages/59/e7/b5b738f5679247ddfcf2179c38945519668dced60c3164c20d55c1a7bb4a/greenlet-3.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4245246e72352b150a1588d43ddc8ab5e306bef924c26571aafafa5d1aaae4e8", size = 637195 }, - { url = "https://files.pythonhosted.org/packages/6c/9f/57968c88a5f6bc371364baf983a2e5549cca8f503bfef591b6dd81332cbc/greenlet-3.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7abc0545d8e880779f0c7ce665a1afc3f72f0ca0d5815e2b006cafc4c1cc5840", size = 651381 }, - { url = "https://files.pythonhosted.org/packages/40/81/1533c9a458e9f2ebccb3ae22f1463b2093b0eb448a88aac36182f1c2cd3d/greenlet-3.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6dcc6d604a6575c6225ac0da39df9335cc0c6ac50725063fa90f104f3dbdb2c9", size = 646110 }, - { url = "https://files.pythonhosted.org/packages/06/66/25f7e4b1468ebe4a520757f2e41c2a36a2f49a12e963431b82e9f98df2a0/greenlet-3.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2273586879affca2d1f414709bb1f61f0770adcabf9eda8ef48fd90b36f15d12", size = 648070 }, - { url = "https://files.pythonhosted.org/packages/d7/4c/49d366565c4c4d29e6f666287b9e2f471a66c3a3d8d5066692e347f09e27/greenlet-3.2.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ff38c869ed30fff07f1452d9a204ece1ec6d3c0870e0ba6e478ce7c1515acf22", size = 603816 }, - { url = "https://files.pythonhosted.org/packages/04/15/1612bb61506f44b6b8b6bebb6488702b1fe1432547e95dda57874303a1f5/greenlet-3.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e934591a7a4084fa10ee5ef50eb9d2ac8c4075d5c9cf91128116b5dca49d43b1", size = 1119572 }, - { url = "https://files.pythonhosted.org/packages/cc/2f/002b99dacd1610e825876f5cbbe7f86740aa2a6b76816e5eca41c8457e85/greenlet-3.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:063bcf7f8ee28eb91e7f7a8148c65a43b73fbdc0064ab693e024b5a940070145", size = 1147442 }, - { url = "https://files.pythonhosted.org/packages/c0/ba/82a2c3b9868644ee6011da742156247070f30e952f4d33f33857458450f2/greenlet-3.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7132e024ebeeeabbe661cf8878aac5d2e643975c4feae833142592ec2f03263d", size = 296207 }, - { url = "https://files.pythonhosted.org/packages/77/2a/581b3808afec55b2db838742527c40b4ce68b9b64feedff0fd0123f4b19a/greenlet-3.2.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:e1967882f0c42eaf42282a87579685c8673c51153b845fde1ee81be720ae27ac", size = 269119 }, - { url = "https://files.pythonhosted.org/packages/b0/f3/1c4e27fbdc84e13f05afc2baf605e704668ffa26e73a43eca93e1120813e/greenlet-3.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e77ae69032a95640a5fe8c857ec7bee569a0997e809570f4c92048691ce4b437", size = 637314 }, - { url = "https://files.pythonhosted.org/packages/fc/1a/9fc43cb0044f425f7252da9847893b6de4e3b20c0a748bce7ab3f063d5bc/greenlet-3.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3227c6ec1149d4520bc99edac3b9bc8358d0034825f3ca7572165cb502d8f29a", size = 651421 }, - { url = "https://files.pythonhosted.org/packages/8a/65/d47c03cdc62c6680206b7420c4a98363ee997e87a5e9da1e83bd7eeb57a8/greenlet-3.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ddda0197c5b46eedb5628d33dad034c455ae77708c7bf192686e760e26d6a0c", size = 645789 }, - { url = "https://files.pythonhosted.org/packages/2f/40/0faf8bee1b106c241780f377b9951dd4564ef0972de1942ef74687aa6bba/greenlet-3.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de62b542e5dcf0b6116c310dec17b82bb06ef2ceb696156ff7bf74a7a498d982", size = 648262 }, - { url = "https://files.pythonhosted.org/packages/e0/a8/73305f713183c2cb08f3ddd32eaa20a6854ba9c37061d682192db9b021c3/greenlet-3.2.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c07a0c01010df42f1f058b3973decc69c4d82e036a951c3deaf89ab114054c07", size = 606770 }, - { url = "https://files.pythonhosted.org/packages/c3/05/7d726e1fb7f8a6ac55ff212a54238a36c57db83446523c763e20cd30b837/greenlet-3.2.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2530bfb0abcd451ea81068e6d0a1aac6dabf3f4c23c8bd8e2a8f579c2dd60d95", size = 1117960 }, - { url = "https://files.pythonhosted.org/packages/bf/9f/2b6cb1bd9f1537e7b08c08705c4a1d7bd4f64489c67d102225c4fd262bda/greenlet-3.2.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c472adfca310f849903295c351d297559462067f618944ce2650a1878b84123", size = 1145500 }, - { url = "https://files.pythonhosted.org/packages/e4/f6/339c6e707062319546598eb9827d3ca8942a3eccc610d4a54c1da7b62527/greenlet-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:24a496479bc8bd01c39aa6516a43c717b4cee7196573c47b1f8e1011f7c12495", size = 295994 }, - { url = "https://files.pythonhosted.org/packages/f1/72/2a251d74a596af7bb1717e891ad4275a3fd5ac06152319d7ad8c77f876af/greenlet-3.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:175d583f7d5ee57845591fc30d852b75b144eb44b05f38b67966ed6df05c8526", size = 629889 }, - { url = "https://files.pythonhosted.org/packages/29/2e/d7ed8bf97641bf704b6a43907c0e082cdf44d5bc026eb8e1b79283e7a719/greenlet-3.2.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ecc9d33ca9428e4536ea53e79d781792cee114d2fa2695b173092bdbd8cd6d5", size = 635261 }, - { url = "https://files.pythonhosted.org/packages/1e/75/802aa27848a6fcb5e566f69c64534f572e310f0f12d41e9201a81e741551/greenlet-3.2.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f56382ac4df3860ebed8ed838f268f03ddf4e459b954415534130062b16bc32", size = 632523 }, - { url = "https://files.pythonhosted.org/packages/56/09/f7c1c3bab9b4c589ad356503dd71be00935e9c4db4db516ed88fc80f1187/greenlet-3.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc45a7189c91c0f89aaf9d69da428ce8301b0fd66c914a499199cfb0c28420fc", size = 628816 }, - { url = "https://files.pythonhosted.org/packages/79/e0/1bb90d30b5450eac2dffeaac6b692857c4bd642c21883b79faa8fa056cf2/greenlet-3.2.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51a2f49da08cff79ee42eb22f1658a2aed60c72792f0a0a95f5f0ca6d101b1fb", size = 593687 }, - { url = "https://files.pythonhosted.org/packages/c5/b5/adbe03c8b4c178add20cc716021183ae6b0326d56ba8793d7828c94286f6/greenlet-3.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:0c68bbc639359493420282d2f34fa114e992a8724481d700da0b10d10a7611b8", size = 1105754 }, - { url = "https://files.pythonhosted.org/packages/39/93/84582d7ef38dec009543ccadec6ab41079a6cbc2b8c0566bcd07bf1aaf6c/greenlet-3.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:e775176b5c203a1fa4be19f91da00fd3bff536868b77b237da3f4daa5971ae5d", size = 1125160 }, - { url = "https://files.pythonhosted.org/packages/01/e6/f9d759788518a6248684e3afeb3691f3ab0276d769b6217a1533362298c8/greenlet-3.2.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:d6668caf15f181c1b82fb6406f3911696975cc4c37d782e19cb7ba499e556189", size = 269897 }, + { url = "https://files.pythonhosted.org/packages/f3/94/ad0d435f7c48debe960c53b8f60fb41c2026b1d0fa4a99a1cb17c3461e09/greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d", size = 271992 }, + { url = "https://files.pythonhosted.org/packages/93/5d/7c27cf4d003d6e77749d299c7c8f5fd50b4f251647b5c2e97e1f20da0ab5/greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b", size = 638820 }, + { url = "https://files.pythonhosted.org/packages/c6/7e/807e1e9be07a125bb4c169144937910bf59b9d2f6d931578e57f0bce0ae2/greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d", size = 653046 }, + { url = "https://files.pythonhosted.org/packages/9d/ab/158c1a4ea1068bdbc78dba5a3de57e4c7aeb4e7fa034320ea94c688bfb61/greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264", size = 647701 }, + { url = "https://files.pythonhosted.org/packages/cc/0d/93729068259b550d6a0288da4ff72b86ed05626eaf1eb7c0d3466a2571de/greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688", size = 649747 }, + { url = "https://files.pythonhosted.org/packages/f6/f6/c82ac1851c60851302d8581680573245c8fc300253fc1ff741ae74a6c24d/greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb", size = 605461 }, + { url = "https://files.pythonhosted.org/packages/98/82/d022cf25ca39cf1200650fc58c52af32c90f80479c25d1cbf57980ec3065/greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c", size = 1121190 }, + { url = "https://files.pythonhosted.org/packages/f5/e1/25297f70717abe8104c20ecf7af0a5b82d2f5a980eb1ac79f65654799f9f/greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163", size = 1149055 }, + { url = "https://files.pythonhosted.org/packages/1f/8f/8f9e56c5e82eb2c26e8cde787962e66494312dc8cb261c460e1f3a9c88bc/greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849", size = 297817 }, + { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732 }, + { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033 }, + { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999 }, + { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368 }, + { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037 }, + { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402 }, + { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577 }, + { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121 }, + { url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603 }, + { url = "https://files.pythonhosted.org/packages/d8/ca/accd7aa5280eb92b70ed9e8f7fd79dc50a2c21d8c73b9a0856f5b564e222/greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86", size = 271479 }, + { url = "https://files.pythonhosted.org/packages/55/71/01ed9895d9eb49223280ecc98a557585edfa56b3d0e965b9fa9f7f06b6d9/greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97", size = 683952 }, + { url = "https://files.pythonhosted.org/packages/ea/61/638c4bdf460c3c678a0a1ef4c200f347dff80719597e53b5edb2fb27ab54/greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728", size = 696917 }, + { url = "https://files.pythonhosted.org/packages/22/cc/0bd1a7eb759d1f3e3cc2d1bc0f0b487ad3cc9f34d74da4b80f226fde4ec3/greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a", size = 692443 }, + { url = "https://files.pythonhosted.org/packages/67/10/b2a4b63d3f08362662e89c103f7fe28894a51ae0bc890fabf37d1d780e52/greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892", size = 692995 }, + { url = "https://files.pythonhosted.org/packages/5a/c6/ad82f148a4e3ce9564056453a71529732baf5448ad53fc323e37efe34f66/greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141", size = 655320 }, + { url = "https://files.pythonhosted.org/packages/5c/4f/aab73ecaa6b3086a4c89863d94cf26fa84cbff63f52ce9bc4342b3087a06/greenlet-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:8c47aae8fbbfcf82cc13327ae802ba13c9c36753b67e760023fd116bc124a62a", size = 301236 }, ] [[package]] @@ -370,6 +392,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, ] +[[package]] +name = "hupper" +version = "1.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/e6/bb064537288eee2be97f3e0fcad8e7242bc5bbe9664ae57c7d29b3fa18c2/hupper-1.12.1.tar.gz", hash = "sha256:06bf54170ff4ecf4c84ad5f188dee3901173ab449c2608ad05b9bfd6b13e32eb", size = 43231 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/7d/3888833e4f5ea56af4a9935066ec09a83228e533d7b8877f65889d706ee4/hupper-1.12.1-py3-none-any.whl", hash = "sha256:e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19", size = 22830 }, +] + [[package]] name = "icecream" version = "2.1.4" @@ -406,6 +437,63 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] +[[package]] +name = "jiter" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/9d/ae7ddb4b8ab3fb1b51faf4deb36cb48a4fbbd7cb36bad6a5fca4741306f7/jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500", size = 162759 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/b5/348b3313c58f5fbfb2194eb4d07e46a35748ba6e5b3b3046143f3040bafa/jiter-0.10.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b", size = 312262 }, + { url = "https://files.pythonhosted.org/packages/9c/4a/6a2397096162b21645162825f058d1709a02965606e537e3304b02742e9b/jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744", size = 320124 }, + { url = "https://files.pythonhosted.org/packages/2a/85/1ce02cade7516b726dd88f59a4ee46914bf79d1676d1228ef2002ed2f1c9/jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2", size = 345330 }, + { url = "https://files.pythonhosted.org/packages/75/d0/bb6b4f209a77190ce10ea8d7e50bf3725fc16d3372d0a9f11985a2b23eff/jiter-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026", size = 369670 }, + { url = "https://files.pythonhosted.org/packages/a0/f5/a61787da9b8847a601e6827fbc42ecb12be2c925ced3252c8ffcb56afcaf/jiter-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c", size = 489057 }, + { url = "https://files.pythonhosted.org/packages/12/e4/6f906272810a7b21406c760a53aadbe52e99ee070fc5c0cb191e316de30b/jiter-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959", size = 389372 }, + { url = "https://files.pythonhosted.org/packages/e2/ba/77013b0b8ba904bf3762f11e0129b8928bff7f978a81838dfcc958ad5728/jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a", size = 352038 }, + { url = "https://files.pythonhosted.org/packages/67/27/c62568e3ccb03368dbcc44a1ef3a423cb86778a4389e995125d3d1aaa0a4/jiter-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95", size = 391538 }, + { url = "https://files.pythonhosted.org/packages/c0/72/0d6b7e31fc17a8fdce76164884edef0698ba556b8eb0af9546ae1a06b91d/jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea", size = 523557 }, + { url = "https://files.pythonhosted.org/packages/2f/09/bc1661fbbcbeb6244bd2904ff3a06f340aa77a2b94e5a7373fd165960ea3/jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b", size = 514202 }, + { url = "https://files.pythonhosted.org/packages/1b/84/5a5d5400e9d4d54b8004c9673bbe4403928a00d28529ff35b19e9d176b19/jiter-0.10.0-cp312-cp312-win32.whl", hash = "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01", size = 211781 }, + { url = "https://files.pythonhosted.org/packages/9b/52/7ec47455e26f2d6e5f2ea4951a0652c06e5b995c291f723973ae9e724a65/jiter-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49", size = 206176 }, + { url = "https://files.pythonhosted.org/packages/2e/b0/279597e7a270e8d22623fea6c5d4eeac328e7d95c236ed51a2b884c54f70/jiter-0.10.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644", size = 311617 }, + { url = "https://files.pythonhosted.org/packages/91/e3/0916334936f356d605f54cc164af4060e3e7094364add445a3bc79335d46/jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a", size = 318947 }, + { url = "https://files.pythonhosted.org/packages/6a/8e/fd94e8c02d0e94539b7d669a7ebbd2776e51f329bb2c84d4385e8063a2ad/jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6", size = 344618 }, + { url = "https://files.pythonhosted.org/packages/6f/b0/f9f0a2ec42c6e9c2e61c327824687f1e2415b767e1089c1d9135f43816bd/jiter-0.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3", size = 368829 }, + { url = "https://files.pythonhosted.org/packages/e8/57/5bbcd5331910595ad53b9fd0c610392ac68692176f05ae48d6ce5c852967/jiter-0.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2", size = 491034 }, + { url = "https://files.pythonhosted.org/packages/9b/be/c393df00e6e6e9e623a73551774449f2f23b6ec6a502a3297aeeece2c65a/jiter-0.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25", size = 388529 }, + { url = "https://files.pythonhosted.org/packages/42/3e/df2235c54d365434c7f150b986a6e35f41ebdc2f95acea3036d99613025d/jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041", size = 350671 }, + { url = "https://files.pythonhosted.org/packages/c6/77/71b0b24cbcc28f55ab4dbfe029f9a5b73aeadaba677843fc6dc9ed2b1d0a/jiter-0.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca", size = 390864 }, + { url = "https://files.pythonhosted.org/packages/6a/d3/ef774b6969b9b6178e1d1e7a89a3bd37d241f3d3ec5f8deb37bbd203714a/jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4", size = 522989 }, + { url = "https://files.pythonhosted.org/packages/0c/41/9becdb1d8dd5d854142f45a9d71949ed7e87a8e312b0bede2de849388cb9/jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e", size = 513495 }, + { url = "https://files.pythonhosted.org/packages/9c/36/3468e5a18238bdedae7c4d19461265b5e9b8e288d3f86cd89d00cbb48686/jiter-0.10.0-cp313-cp313-win32.whl", hash = "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d", size = 211289 }, + { url = "https://files.pythonhosted.org/packages/7e/07/1c96b623128bcb913706e294adb5f768fb7baf8db5e1338ce7b4ee8c78ef/jiter-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4", size = 205074 }, + { url = "https://files.pythonhosted.org/packages/54/46/caa2c1342655f57d8f0f2519774c6d67132205909c65e9aa8255e1d7b4f4/jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca", size = 318225 }, + { url = "https://files.pythonhosted.org/packages/43/84/c7d44c75767e18946219ba2d703a5a32ab37b0bc21886a97bc6062e4da42/jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070", size = 350235 }, + { url = "https://files.pythonhosted.org/packages/01/16/f5a0135ccd968b480daad0e6ab34b0c7c5ba3bc447e5088152696140dcb3/jiter-0.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca", size = 207278 }, + { url = "https://files.pythonhosted.org/packages/1c/9b/1d646da42c3de6c2188fdaa15bce8ecb22b635904fc68be025e21249ba44/jiter-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522", size = 310866 }, + { url = "https://files.pythonhosted.org/packages/ad/0e/26538b158e8a7c7987e94e7aeb2999e2e82b1f9d2e1f6e9874ddf71ebda0/jiter-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8", size = 318772 }, + { url = "https://files.pythonhosted.org/packages/7b/fb/d302893151caa1c2636d6574d213e4b34e31fd077af6050a9c5cbb42f6fb/jiter-0.10.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216", size = 344534 }, + { url = "https://files.pythonhosted.org/packages/01/d8/5780b64a149d74e347c5128d82176eb1e3241b1391ac07935693466d6219/jiter-0.10.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4", size = 369087 }, + { url = "https://files.pythonhosted.org/packages/e8/5b/f235a1437445160e777544f3ade57544daf96ba7e96c1a5b24a6f7ac7004/jiter-0.10.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426", size = 490694 }, + { url = "https://files.pythonhosted.org/packages/85/a9/9c3d4617caa2ff89cf61b41e83820c27ebb3f7b5fae8a72901e8cd6ff9be/jiter-0.10.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12", size = 388992 }, + { url = "https://files.pythonhosted.org/packages/68/b1/344fd14049ba5c94526540af7eb661871f9c54d5f5601ff41a959b9a0bbd/jiter-0.10.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9", size = 351723 }, + { url = "https://files.pythonhosted.org/packages/41/89/4c0e345041186f82a31aee7b9d4219a910df672b9fef26f129f0cda07a29/jiter-0.10.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a", size = 392215 }, + { url = "https://files.pythonhosted.org/packages/55/58/ee607863e18d3f895feb802154a2177d7e823a7103f000df182e0f718b38/jiter-0.10.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853", size = 522762 }, + { url = "https://files.pythonhosted.org/packages/15/d0/9123fb41825490d16929e73c212de9a42913d68324a8ce3c8476cae7ac9d/jiter-0.10.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86", size = 513427 }, + { url = "https://files.pythonhosted.org/packages/d8/b3/2bd02071c5a2430d0b70403a34411fc519c2f227da7b03da9ba6a956f931/jiter-0.10.0-cp314-cp314-win32.whl", hash = "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357", size = 210127 }, + { url = "https://files.pythonhosted.org/packages/03/0c/5fe86614ea050c3ecd728ab4035534387cd41e7c1855ef6c031f1ca93e3f/jiter-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00", size = 318527 }, + { url = "https://files.pythonhosted.org/packages/b3/4a/4175a563579e884192ba6e81725fc0448b042024419be8d83aa8a80a3f44/jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5", size = 354213 }, +] + +[[package]] +name = "legacy-cgi" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/ed/300cabc9693209d5a03e2ebc5eb5c4171b51607c08ed84a2b71c9015e0f3/legacy_cgi-2.6.3.tar.gz", hash = "sha256:4c119d6cb8e9d8b6ad7cc0ddad880552c62df4029622835d06dfd18f438a8154", size = 24401 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/33/68c6c38193684537757e0d50a7ccb4f4656e5c2f7cd2be737a9d4a1bff71/legacy_cgi-2.6.3-py3-none-any.whl", hash = "sha256:6df2ea5ae14c71ef6f097f8b6372b44f6685283dc018535a75c924564183cdab", size = 19851 }, +] + [[package]] name = "loguru" version = "0.7.3" @@ -463,11 +551,11 @@ wheels = [ [[package]] name = "markdown" -version = "3.8" +version = "3.8.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/15/222b423b0b88689c266d9eac4e61396fe2cc53464459d6a37618ac863b24/markdown-3.8.tar.gz", hash = "sha256:7df81e63f0df5c4b24b7d156eb81e4690595239b7d70937d0409f1b0de319c6f", size = 360906 } +sdist = { url = "https://files.pythonhosted.org/packages/d7/c2/4ab49206c17f75cb08d6311171f2d65798988db4360c4d1485bd0eedd67c/markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45", size = 362071 } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/3f/afe76f8e2246ffbc867440cbcf90525264df0e658f8a5ca1f872b3f6192a/markdown-3.8-py3-none-any.whl", hash = "sha256:794a929b79c5af141ef5ab0f2f642d0f7b1872981250230e72682346f7cc90dc", size = 106210 }, + { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827 }, ] [[package]] @@ -578,7 +666,7 @@ wheels = [ [[package]] name = "mkdocs-material" -version = "9.6.12" +version = "9.6.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, @@ -593,9 +681,9 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2d/ef/25fc10dbbb8faeeeb10ed7734d84a347cd2ec5d7200733f11c5553c02608/mkdocs_material-9.6.12.tar.gz", hash = "sha256:add6a6337b29f9ea7912cb1efc661de2c369060b040eb5119855d794ea85b473", size = 3951532 } +sdist = { url = "https://files.pythonhosted.org/packages/b3/fa/0101de32af88f87cf5cc23ad5f2e2030d00995f74e616306513431b8ab4b/mkdocs_material-9.6.14.tar.gz", hash = "sha256:39d795e90dce6b531387c255bd07e866e027828b7346d3eba5ac3de265053754", size = 3951707 } wheels = [ - { url = "https://files.pythonhosted.org/packages/09/00/592940f4d150327a4f455171b2c9d4c3be7779a88e18b0a086183fcd8f06/mkdocs_material-9.6.12-py3-none-any.whl", hash = "sha256:92b4fbdc329e4febc267ca6e2c51e8501fa97b2225c5f4deb4d4e43550f8e61e", size = 8703654 }, + { url = "https://files.pythonhosted.org/packages/3a/a1/7fdb959ad592e013c01558822fd3c22931a95a0f08cf0a7c36da13a5b2b5/mkdocs_material-9.6.14-py3-none-any.whl", hash = "sha256:3b9cee6d3688551bf7a8e8f41afda97a3c39a12f0325436d76c86706114b721b", size = 8703767 }, ] [[package]] @@ -618,50 +706,53 @@ wheels = [ [[package]] name = "nuitka" -version = "2.7.1" +version = "2.7.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ordered-set" }, { name = "zstandard" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/f7/f1d87901ab90be0bc1dd96d9f899a07f626f5f2bebe3b09e475fdc4b7fdb/Nuitka-2.7.1.tar.gz", hash = "sha256:1e7ff9208f8d8262302a6eee05d299650f30813dbecb4501d365a712c3169209", size = 3882402 } +sdist = { url = "https://files.pythonhosted.org/packages/07/23/01d9537320d170abff79d9f61bd1e9500b464a503433c0fa0a76375f3fd2/Nuitka-2.7.10.tar.gz", hash = "sha256:c510c44027bcd9890deb00586ea87b00dc787addace0722095f041b1414395fa", size = 3887512 } [[package]] name = "numpy" -version = "2.2.5" +version = "2.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/b2/ce4b867d8cd9c0ee84938ae1e6a6f7926ebf928c9090d036fc3c6a04f946/numpy-2.2.5.tar.gz", hash = "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291", size = 20273920 } +sdist = { url = "https://files.pythonhosted.org/packages/2e/19/d7c972dfe90a353dbd3efbbe1d14a5951de80c99c9dc1b93cd998d51dc0f/numpy-2.3.1.tar.gz", hash = "sha256:1ec9ae20a4226da374362cca3c62cd753faf2f951440b0e3b98e93c235441d2b", size = 20390372 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/f7/1fd4ff108cd9d7ef929b8882692e23665dc9c23feecafbb9c6b80f4ec583/numpy-2.2.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051", size = 20948633 }, - { url = "https://files.pythonhosted.org/packages/12/03/d443c278348371b20d830af155ff2079acad6a9e60279fac2b41dbbb73d8/numpy-2.2.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec31367fd6a255dc8de4772bd1658c3e926d8e860a0b6e922b615e532d320ddc", size = 14176123 }, - { url = "https://files.pythonhosted.org/packages/2b/0b/5ca264641d0e7b14393313304da48b225d15d471250376f3fbdb1a2be603/numpy-2.2.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:47834cde750d3c9f4e52c6ca28a7361859fcaf52695c7dc3cc1a720b8922683e", size = 5163817 }, - { url = "https://files.pythonhosted.org/packages/04/b3/d522672b9e3d28e26e1613de7675b441bbd1eaca75db95680635dd158c67/numpy-2.2.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2c1a1c6ccce4022383583a6ded7bbcda22fc635eb4eb1e0a053336425ed36dfa", size = 6698066 }, - { url = "https://files.pythonhosted.org/packages/a0/93/0f7a75c1ff02d4b76df35079676b3b2719fcdfb39abdf44c8b33f43ef37d/numpy-2.2.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d75f338f5f79ee23548b03d801d28a505198297534f62416391857ea0479571", size = 14087277 }, - { url = "https://files.pythonhosted.org/packages/b0/d9/7c338b923c53d431bc837b5b787052fef9ae68a56fe91e325aac0d48226e/numpy-2.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a801fef99668f309b88640e28d261991bfad9617c27beda4a3aec4f217ea073", size = 16135742 }, - { url = "https://files.pythonhosted.org/packages/2d/10/4dec9184a5d74ba9867c6f7d1e9f2e0fb5fe96ff2bf50bb6f342d64f2003/numpy-2.2.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:abe38cd8381245a7f49967a6010e77dbf3680bd3627c0fe4362dd693b404c7f8", size = 15581825 }, - { url = "https://files.pythonhosted.org/packages/80/1f/2b6fcd636e848053f5b57712a7d1880b1565eec35a637fdfd0a30d5e738d/numpy-2.2.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a0ac90e46fdb5649ab6369d1ab6104bfe5854ab19b645bf5cda0127a13034ae", size = 17899600 }, - { url = "https://files.pythonhosted.org/packages/ec/87/36801f4dc2623d76a0a3835975524a84bd2b18fe0f8835d45c8eae2f9ff2/numpy-2.2.5-cp312-cp312-win32.whl", hash = "sha256:0cd48122a6b7eab8f06404805b1bd5856200e3ed6f8a1b9a194f9d9054631beb", size = 6312626 }, - { url = "https://files.pythonhosted.org/packages/8b/09/4ffb4d6cfe7ca6707336187951992bd8a8b9142cf345d87ab858d2d7636a/numpy-2.2.5-cp312-cp312-win_amd64.whl", hash = "sha256:ced69262a8278547e63409b2653b372bf4baff0870c57efa76c5703fd6543282", size = 12645715 }, - { url = "https://files.pythonhosted.org/packages/e2/a0/0aa7f0f4509a2e07bd7a509042967c2fab635690d4f48c6c7b3afd4f448c/numpy-2.2.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4", size = 20935102 }, - { url = "https://files.pythonhosted.org/packages/7e/e4/a6a9f4537542912ec513185396fce52cdd45bdcf3e9d921ab02a93ca5aa9/numpy-2.2.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f", size = 14191709 }, - { url = "https://files.pythonhosted.org/packages/be/65/72f3186b6050bbfe9c43cb81f9df59ae63603491d36179cf7a7c8d216758/numpy-2.2.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9", size = 5149173 }, - { url = "https://files.pythonhosted.org/packages/e5/e9/83e7a9432378dde5802651307ae5e9ea07bb72b416728202218cd4da2801/numpy-2.2.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191", size = 6684502 }, - { url = "https://files.pythonhosted.org/packages/ea/27/b80da6c762394c8ee516b74c1f686fcd16c8f23b14de57ba0cad7349d1d2/numpy-2.2.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372", size = 14084417 }, - { url = "https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d", size = 16133807 }, - { url = "https://files.pythonhosted.org/packages/bf/9b/4cc171a0acbe4666f7775cfd21d4eb6bb1d36d3a0431f48a73e9212d2278/numpy-2.2.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7", size = 15575611 }, - { url = "https://files.pythonhosted.org/packages/a3/45/40f4135341850df48f8edcf949cf47b523c404b712774f8855a64c96ef29/numpy-2.2.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73", size = 17895747 }, - { url = "https://files.pythonhosted.org/packages/f8/4c/b32a17a46f0ffbde8cc82df6d3daeaf4f552e346df143e1b188a701a8f09/numpy-2.2.5-cp313-cp313-win32.whl", hash = "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b", size = 6309594 }, - { url = "https://files.pythonhosted.org/packages/13/ae/72e6276feb9ef06787365b05915bfdb057d01fceb4a43cb80978e518d79b/numpy-2.2.5-cp313-cp313-win_amd64.whl", hash = "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471", size = 12638356 }, - { url = "https://files.pythonhosted.org/packages/79/56/be8b85a9f2adb688e7ded6324e20149a03541d2b3297c3ffc1a73f46dedb/numpy-2.2.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6", size = 20963778 }, - { url = "https://files.pythonhosted.org/packages/ff/77/19c5e62d55bff507a18c3cdff82e94fe174957bad25860a991cac719d3ab/numpy-2.2.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba", size = 14207279 }, - { url = "https://files.pythonhosted.org/packages/75/22/aa11f22dc11ff4ffe4e849d9b63bbe8d4ac6d5fae85ddaa67dfe43be3e76/numpy-2.2.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133", size = 5199247 }, - { url = "https://files.pythonhosted.org/packages/4f/6c/12d5e760fc62c08eded0394f62039f5a9857f758312bf01632a81d841459/numpy-2.2.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376", size = 6711087 }, - { url = "https://files.pythonhosted.org/packages/ef/94/ece8280cf4218b2bee5cec9567629e61e51b4be501e5c6840ceb593db945/numpy-2.2.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19", size = 14059964 }, - { url = "https://files.pythonhosted.org/packages/39/41/c5377dac0514aaeec69115830a39d905b1882819c8e65d97fc60e177e19e/numpy-2.2.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0", size = 16121214 }, - { url = "https://files.pythonhosted.org/packages/db/54/3b9f89a943257bc8e187145c6bc0eb8e3d615655f7b14e9b490b053e8149/numpy-2.2.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a", size = 15575788 }, - { url = "https://files.pythonhosted.org/packages/b1/c4/2e407e85df35b29f79945751b8f8e671057a13a376497d7fb2151ba0d290/numpy-2.2.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066", size = 17893672 }, - { url = "https://files.pythonhosted.org/packages/29/7e/d0b44e129d038dba453f00d0e29ebd6eaf2f06055d72b95b9947998aca14/numpy-2.2.5-cp313-cp313t-win32.whl", hash = "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e", size = 6377102 }, - { url = "https://files.pythonhosted.org/packages/63/be/b85e4aa4bf42c6502851b971f1c326d583fcc68227385f92089cf50a7b45/numpy-2.2.5-cp313-cp313t-win_amd64.whl", hash = "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8", size = 12750096 }, + { url = "https://files.pythonhosted.org/packages/c6/56/71ad5022e2f63cfe0ca93559403d0edef14aea70a841d640bd13cdba578e/numpy-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2959d8f268f3d8ee402b04a9ec4bb7604555aeacf78b360dc4ec27f1d508177d", size = 20896664 }, + { url = "https://files.pythonhosted.org/packages/25/65/2db52ba049813670f7f987cc5db6dac9be7cd95e923cc6832b3d32d87cef/numpy-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:762e0c0c6b56bdedfef9a8e1d4538556438288c4276901ea008ae44091954e29", size = 14131078 }, + { url = "https://files.pythonhosted.org/packages/57/dd/28fa3c17b0e751047ac928c1e1b6990238faad76e9b147e585b573d9d1bd/numpy-2.3.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:867ef172a0976aaa1f1d1b63cf2090de8b636a7674607d514505fb7276ab08fc", size = 5112554 }, + { url = "https://files.pythonhosted.org/packages/c9/fc/84ea0cba8e760c4644b708b6819d91784c290288c27aca916115e3311d17/numpy-2.3.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:4e602e1b8682c2b833af89ba641ad4176053aaa50f5cacda1a27004352dde943", size = 6646560 }, + { url = "https://files.pythonhosted.org/packages/61/b2/512b0c2ddec985ad1e496b0bd853eeb572315c0f07cd6997473ced8f15e2/numpy-2.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8e333040d069eba1652fb08962ec5b76af7f2c7bce1df7e1418c8055cf776f25", size = 14260638 }, + { url = "https://files.pythonhosted.org/packages/6e/45/c51cb248e679a6c6ab14b7a8e3ead3f4a3fe7425fc7a6f98b3f147bec532/numpy-2.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e7cbf5a5eafd8d230a3ce356d892512185230e4781a361229bd902ff403bc660", size = 16632729 }, + { url = "https://files.pythonhosted.org/packages/e4/ff/feb4be2e5c09a3da161b412019caf47183099cbea1132fd98061808c2df2/numpy-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f1b8f26d1086835f442286c1d9b64bb3974b0b1e41bb105358fd07d20872952", size = 15565330 }, + { url = "https://files.pythonhosted.org/packages/bc/6d/ceafe87587101e9ab0d370e4f6e5f3f3a85b9a697f2318738e5e7e176ce3/numpy-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ee8340cb48c9b7a5899d1149eece41ca535513a9698098edbade2a8e7a84da77", size = 18361734 }, + { url = "https://files.pythonhosted.org/packages/2b/19/0fb49a3ea088be691f040c9bf1817e4669a339d6e98579f91859b902c636/numpy-2.3.1-cp312-cp312-win32.whl", hash = "sha256:e772dda20a6002ef7061713dc1e2585bc1b534e7909b2030b5a46dae8ff077ab", size = 6320411 }, + { url = "https://files.pythonhosted.org/packages/b1/3e/e28f4c1dd9e042eb57a3eb652f200225e311b608632bc727ae378623d4f8/numpy-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfecc7822543abdea6de08758091da655ea2210b8ffa1faf116b940693d3df76", size = 12734973 }, + { url = "https://files.pythonhosted.org/packages/04/a8/8a5e9079dc722acf53522b8f8842e79541ea81835e9b5483388701421073/numpy-2.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:7be91b2239af2658653c5bb6f1b8bccafaf08226a258caf78ce44710a0160d30", size = 10191491 }, + { url = "https://files.pythonhosted.org/packages/d4/bd/35ad97006d8abff8631293f8ea6adf07b0108ce6fec68da3c3fcca1197f2/numpy-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25a1992b0a3fdcdaec9f552ef10d8103186f5397ab45e2d25f8ac51b1a6b97e8", size = 20889381 }, + { url = "https://files.pythonhosted.org/packages/f1/4f/df5923874d8095b6062495b39729178eef4a922119cee32a12ee1bd4664c/numpy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dea630156d39b02a63c18f508f85010230409db5b2927ba59c8ba4ab3e8272e", size = 14152726 }, + { url = "https://files.pythonhosted.org/packages/8c/0f/a1f269b125806212a876f7efb049b06c6f8772cf0121139f97774cd95626/numpy-2.3.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bada6058dd886061f10ea15f230ccf7dfff40572e99fef440a4a857c8728c9c0", size = 5105145 }, + { url = "https://files.pythonhosted.org/packages/6d/63/a7f7fd5f375b0361682f6ffbf686787e82b7bbd561268e4f30afad2bb3c0/numpy-2.3.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:a894f3816eb17b29e4783e5873f92faf55b710c2519e5c351767c51f79d8526d", size = 6639409 }, + { url = "https://files.pythonhosted.org/packages/bf/0d/1854a4121af895aab383f4aa233748f1df4671ef331d898e32426756a8a6/numpy-2.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:18703df6c4a4fee55fd3d6e5a253d01c5d33a295409b03fda0c86b3ca2ff41a1", size = 14257630 }, + { url = "https://files.pythonhosted.org/packages/50/30/af1b277b443f2fb08acf1c55ce9d68ee540043f158630d62cef012750f9f/numpy-2.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5902660491bd7a48b2ec16c23ccb9124b8abfd9583c5fdfa123fe6b421e03de1", size = 16627546 }, + { url = "https://files.pythonhosted.org/packages/6e/ec/3b68220c277e463095342d254c61be8144c31208db18d3fd8ef02712bcd6/numpy-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:36890eb9e9d2081137bd78d29050ba63b8dab95dff7912eadf1185e80074b2a0", size = 15562538 }, + { url = "https://files.pythonhosted.org/packages/77/2b/4014f2bcc4404484021c74d4c5ee8eb3de7e3f7ac75f06672f8dcf85140a/numpy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a780033466159c2270531e2b8ac063704592a0bc62ec4a1b991c7c40705eb0e8", size = 18360327 }, + { url = "https://files.pythonhosted.org/packages/40/8d/2ddd6c9b30fcf920837b8672f6c65590c7d92e43084c25fc65edc22e93ca/numpy-2.3.1-cp313-cp313-win32.whl", hash = "sha256:39bff12c076812595c3a306f22bfe49919c5513aa1e0e70fac756a0be7c2a2b8", size = 6312330 }, + { url = "https://files.pythonhosted.org/packages/dd/c8/beaba449925988d415efccb45bf977ff8327a02f655090627318f6398c7b/numpy-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d5ee6eec45f08ce507a6570e06f2f879b374a552087a4179ea7838edbcbfa42", size = 12731565 }, + { url = "https://files.pythonhosted.org/packages/0b/c3/5c0c575d7ec78c1126998071f58facfc124006635da75b090805e642c62e/numpy-2.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:0c4d9e0a8368db90f93bd192bfa771ace63137c3488d198ee21dfb8e7771916e", size = 10190262 }, + { url = "https://files.pythonhosted.org/packages/ea/19/a029cd335cf72f79d2644dcfc22d90f09caa86265cbbde3b5702ccef6890/numpy-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b0b5397374f32ec0649dd98c652a1798192042e715df918c20672c62fb52d4b8", size = 20987593 }, + { url = "https://files.pythonhosted.org/packages/25/91/8ea8894406209107d9ce19b66314194675d31761fe2cb3c84fe2eeae2f37/numpy-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c5bdf2015ccfcee8253fb8be695516ac4457c743473a43290fd36eba6a1777eb", size = 14300523 }, + { url = "https://files.pythonhosted.org/packages/a6/7f/06187b0066eefc9e7ce77d5f2ddb4e314a55220ad62dd0bfc9f2c44bac14/numpy-2.3.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d70f20df7f08b90a2062c1f07737dd340adccf2068d0f1b9b3d56e2038979fee", size = 5227993 }, + { url = "https://files.pythonhosted.org/packages/e8/ec/a926c293c605fa75e9cfb09f1e4840098ed46d2edaa6e2152ee35dc01ed3/numpy-2.3.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:2fb86b7e58f9ac50e1e9dd1290154107e47d1eef23a0ae9145ded06ea606f992", size = 6736652 }, + { url = "https://files.pythonhosted.org/packages/e3/62/d68e52fb6fde5586650d4c0ce0b05ff3a48ad4df4ffd1b8866479d1d671d/numpy-2.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:23ab05b2d241f76cb883ce8b9a93a680752fbfcbd51c50eff0b88b979e471d8c", size = 14331561 }, + { url = "https://files.pythonhosted.org/packages/fc/ec/b74d3f2430960044bdad6900d9f5edc2dc0fb8bf5a0be0f65287bf2cbe27/numpy-2.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ce2ce9e5de4703a673e705183f64fd5da5bf36e7beddcb63a25ee2286e71ca48", size = 16693349 }, + { url = "https://files.pythonhosted.org/packages/0d/15/def96774b9d7eb198ddadfcbd20281b20ebb510580419197e225f5c55c3e/numpy-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c4913079974eeb5c16ccfd2b1f09354b8fed7e0d6f2cab933104a09a6419b1ee", size = 15642053 }, + { url = "https://files.pythonhosted.org/packages/2b/57/c3203974762a759540c6ae71d0ea2341c1fa41d84e4971a8e76d7141678a/numpy-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:010ce9b4f00d5c036053ca684c77441f2f2c934fd23bee058b4d6f196efd8280", size = 18434184 }, + { url = "https://files.pythonhosted.org/packages/22/8a/ccdf201457ed8ac6245187850aff4ca56a79edbea4829f4e9f14d46fa9a5/numpy-2.3.1-cp313-cp313t-win32.whl", hash = "sha256:6269b9edfe32912584ec496d91b00b6d34282ca1d07eb10e82dfc780907d6c2e", size = 6440678 }, + { url = "https://files.pythonhosted.org/packages/f1/7e/7f431d8bd8eb7e03d79294aed238b1b0b174b3148570d03a8a8a8f6a0da9/numpy-2.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:2a809637460e88a113e186e87f228d74ae2852a2e0c44de275263376f17b5bdc", size = 12870697 }, + { url = "https://files.pythonhosted.org/packages/d4/ca/af82bf0fad4c3e573c6930ed743b5308492ff19917c7caaf2f9b6f9e2e98/numpy-2.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", size = 10260376 }, ] [[package]] @@ -677,6 +768,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500 }, ] +[[package]] +name = "openai" +version = "1.91.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/e2/a22f2973b729eff3f1f429017bdf717930c5de0fbf9e14017bae330e4e7a/openai-1.91.0.tar.gz", hash = "sha256:d6b07730d2f7c6745d0991997c16f85cddfc90ddcde8d569c862c30716b9fc90", size = 472529 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/d2/f99bdd6fc737d6b3cf0df895508d621fc9a386b375a1230ee81d46c5436e/openai-1.91.0-py3-none-any.whl", hash = "sha256:207f87aa3bc49365e014fac2f7e291b99929f4fe126c4654143440e0ad446a5f", size = 735837 }, +] + [[package]] name = "ordered-set" version = "4.1.0" @@ -706,7 +816,7 @@ wheels = [ [[package]] name = "pandas" -version = "2.2.3" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, @@ -714,28 +824,37 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } +sdist = { url = "https://files.pythonhosted.org/packages/72/51/48f713c4c728d7c55ef7444ba5ea027c26998d96d1a40953b346438602fc/pandas-2.3.0.tar.gz", hash = "sha256:34600ab34ebf1131a7613a260a61dbe8b62c188ec0ea4c296da7c9a06b004133", size = 4484490 } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, - { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, - { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, - { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, - { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, - { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, - { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, - { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, - { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, - { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, - { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, - { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, - { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, - { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, - { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, - { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, - { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, - { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, - { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, - { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, + { url = "https://files.pythonhosted.org/packages/94/46/24192607058dd607dbfacdd060a2370f6afb19c2ccb617406469b9aeb8e7/pandas-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2eb4728a18dcd2908c7fccf74a982e241b467d178724545a48d0caf534b38ebf", size = 11573865 }, + { url = "https://files.pythonhosted.org/packages/9f/cc/ae8ea3b800757a70c9fdccc68b67dc0280a6e814efcf74e4211fd5dea1ca/pandas-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9d8c3187be7479ea5c3d30c32a5d73d62a621166675063b2edd21bc47614027", size = 10702154 }, + { url = "https://files.pythonhosted.org/packages/d8/ba/a7883d7aab3d24c6540a2768f679e7414582cc389876d469b40ec749d78b/pandas-2.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ff730713d4c4f2f1c860e36c005c7cefc1c7c80c21c0688fd605aa43c9fcf09", size = 11262180 }, + { url = "https://files.pythonhosted.org/packages/01/a5/931fc3ad333d9d87b10107d948d757d67ebcfc33b1988d5faccc39c6845c/pandas-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba24af48643b12ffe49b27065d3babd52702d95ab70f50e1b34f71ca703e2c0d", size = 11991493 }, + { url = "https://files.pythonhosted.org/packages/d7/bf/0213986830a92d44d55153c1d69b509431a972eb73f204242988c4e66e86/pandas-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:404d681c698e3c8a40a61d0cd9412cc7364ab9a9cc6e144ae2992e11a2e77a20", size = 12470733 }, + { url = "https://files.pythonhosted.org/packages/a4/0e/21eb48a3a34a7d4bac982afc2c4eb5ab09f2d988bdf29d92ba9ae8e90a79/pandas-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6021910b086b3ca756755e86ddc64e0ddafd5e58e076c72cb1585162e5ad259b", size = 13212406 }, + { url = "https://files.pythonhosted.org/packages/1f/d9/74017c4eec7a28892d8d6e31ae9de3baef71f5a5286e74e6b7aad7f8c837/pandas-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:094e271a15b579650ebf4c5155c05dcd2a14fd4fdd72cf4854b2f7ad31ea30be", size = 10976199 }, + { url = "https://files.pythonhosted.org/packages/d3/57/5cb75a56a4842bbd0511c3d1c79186d8315b82dac802118322b2de1194fe/pandas-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c7e2fc25f89a49a11599ec1e76821322439d90820108309bf42130d2f36c983", size = 11518913 }, + { url = "https://files.pythonhosted.org/packages/05/01/0c8785610e465e4948a01a059562176e4c8088aa257e2e074db868f86d4e/pandas-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6da97aeb6a6d233fb6b17986234cc723b396b50a3c6804776351994f2a658fd", size = 10655249 }, + { url = "https://files.pythonhosted.org/packages/e8/6a/47fd7517cd8abe72a58706aab2b99e9438360d36dcdb052cf917b7bf3bdc/pandas-2.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb32dc743b52467d488e7a7c8039b821da2826a9ba4f85b89ea95274f863280f", size = 11328359 }, + { url = "https://files.pythonhosted.org/packages/2a/b3/463bfe819ed60fb7e7ddffb4ae2ee04b887b3444feee6c19437b8f834837/pandas-2.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:213cd63c43263dbb522c1f8a7c9d072e25900f6975596f883f4bebd77295d4f3", size = 12024789 }, + { url = "https://files.pythonhosted.org/packages/04/0c/e0704ccdb0ac40aeb3434d1c641c43d05f75c92e67525df39575ace35468/pandas-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1d2b33e68d0ce64e26a4acc2e72d747292084f4e8db4c847c6f5f6cbe56ed6d8", size = 12480734 }, + { url = "https://files.pythonhosted.org/packages/e9/df/815d6583967001153bb27f5cf075653d69d51ad887ebbf4cfe1173a1ac58/pandas-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:430a63bae10b5086995db1b02694996336e5a8ac9a96b4200572b413dfdfccb9", size = 13223381 }, + { url = "https://files.pythonhosted.org/packages/79/88/ca5973ed07b7f484c493e941dbff990861ca55291ff7ac67c815ce347395/pandas-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4930255e28ff5545e2ca404637bcc56f031893142773b3468dc021c6c32a1390", size = 10970135 }, + { url = "https://files.pythonhosted.org/packages/24/fb/0994c14d1f7909ce83f0b1fb27958135513c4f3f2528bde216180aa73bfc/pandas-2.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f925f1ef673b4bd0271b1809b72b3270384f2b7d9d14a189b12b7fc02574d575", size = 12141356 }, + { url = "https://files.pythonhosted.org/packages/9d/a2/9b903e5962134497ac4f8a96f862ee3081cb2506f69f8e4778ce3d9c9d82/pandas-2.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78ad363ddb873a631e92a3c063ade1ecfb34cae71e9a2be6ad100f875ac1042", size = 11474674 }, + { url = "https://files.pythonhosted.org/packages/81/3a/3806d041bce032f8de44380f866059437fb79e36d6b22c82c187e65f765b/pandas-2.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951805d146922aed8357e4cc5671b8b0b9be1027f0619cea132a9f3f65f2f09c", size = 11439876 }, + { url = "https://files.pythonhosted.org/packages/15/aa/3fc3181d12b95da71f5c2537c3e3b3af6ab3a8c392ab41ebb766e0929bc6/pandas-2.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a881bc1309f3fce34696d07b00f13335c41f5f5a8770a33b09ebe23261cfc67", size = 11966182 }, + { url = "https://files.pythonhosted.org/packages/37/e7/e12f2d9b0a2c4a2cc86e2aabff7ccfd24f03e597d770abfa2acd313ee46b/pandas-2.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e1991bbb96f4050b09b5f811253c4f3cf05ee89a589379aa36cd623f21a31d6f", size = 12547686 }, + { url = "https://files.pythonhosted.org/packages/39/c2/646d2e93e0af70f4e5359d870a63584dacbc324b54d73e6b3267920ff117/pandas-2.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bb3be958022198531eb7ec2008cfc78c5b1eed51af8600c6c5d9160d89d8d249", size = 13231847 }, +] + +[[package]] +name = "pastedeploy" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/97/0c4a613ec96a54d21daa7e089178263915554320402e89b4e319436a63cb/PasteDeploy-3.1.0.tar.gz", hash = "sha256:9ddbaf152f8095438a9fe81f82c78a6714b92ae8e066bed418b6a7ff6a095a95", size = 37841 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/30/cdddd9a88969683a59222a6d61cd6dce923977f2e9f9ffba38e1324149cd/PasteDeploy-3.1.0-py3-none-any.whl", hash = "sha256:76388ad53a661448d436df28c798063108f70e994ddc749540d733cdbd1b38cf", size = 16943 }, ] [[package]] @@ -747,6 +866,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, ] +[[package]] +name = "plaster" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/93/66df0f87f1442d8afea8531ae8a4a9eca656006a54eac2b4489427e92c10/plaster-1.1.2.tar.gz", hash = "sha256:f8befc54bf8c1147c10ab40297ec84c2676fa2d4ea5d6f524d9436a80074ef98", size = 33232 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/8b/3f98db1448e3b4d2d142716874a7e02f6101685fdaa0f55a8668e9ffa048/plaster-1.1.2-py2.py3-none-any.whl", hash = "sha256:42992ab1f4865f1278e2ad740e8ad145683bb4022e03534265528f0c23c0df2d", size = 11554 }, +] + +[[package]] +name = "plaster-pastedeploy" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pastedeploy" }, + { name = "plaster" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/af/01a22f73ce97c6375c88d7ceaf6f5f4f345e940da93c94f98833d898a449/plaster_pastedeploy-1.0.1.tar.gz", hash = "sha256:be262e6d2e41a7264875daa2fe2850cbb0615728bcdc92828fdc72736e381412", size = 20915 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/30/2d4cf89035c22a89bf0e34dbc50fdc07c42c9bdc90fd972d495257ad2b6e/plaster_pastedeploy-1.0.1-py2.py3-none-any.whl", hash = "sha256:ad3550cc744648969ed3b810f33c9344f515ee8d8a8cec18e8f2c4a643c2181f", size = 7823 }, +] + [[package]] name = "platformdirs" version = "4.3.8" @@ -798,7 +939,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.11.4" +version = "2.11.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -806,9 +947,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/ab/5250d56ad03884ab5efd07f734203943c8a8ab40d551e208af81d0257bf2/pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", size = 786540 } +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb", size = 443900 }, + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782 }, ] [[package]] @@ -855,16 +996,16 @@ wheels = [ [[package]] name = "pydantic-settings" -version = "2.9.1" +version = "2.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234 } +sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356 }, + { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235 }, ] [[package]] @@ -881,24 +1022,24 @@ wheels = [ [[package]] name = "pygments" -version = "2.19.1" +version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, ] [[package]] name = "pymdown-extensions" -version = "10.15" +version = "10.16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/92/a7296491dbf5585b3a987f3f3fc87af0e632121ff3e490c14b5f2d2b4eb5/pymdown_extensions-10.15.tar.gz", hash = "sha256:0e5994e32155f4b03504f939e501b981d306daf7ec2aa1cd2eb6bd300784f8f7", size = 852320 } +sdist = { url = "https://files.pythonhosted.org/packages/1a/0a/c06b542ac108bfc73200677309cd9188a3a01b127a63f20cadc18d873d88/pymdown_extensions-10.16.tar.gz", hash = "sha256:71dac4fca63fabeffd3eb9038b756161a33ec6e8d230853d3cecf562155ab3de", size = 853197 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/d1/c54e608505776ce4e7966d03358ae635cfd51dff1da6ee421c090dbc797b/pymdown_extensions-10.15-py3-none-any.whl", hash = "sha256:46e99bb272612b0de3b7e7caf6da8dd5f4ca5212c0b273feb9304e236c484e5f", size = 265845 }, + { url = "https://files.pythonhosted.org/packages/98/d4/10bb14004d3c792811e05e21b5e5dcae805aacb739bd12a0540967b99592/pymdown_extensions-10.16-py3-none-any.whl", hash = "sha256:f5dd064a4db588cb2d95229fc4ee63a1b16cc8b4d0e6145c0899ed8723da1df2", size = 266143 }, ] [[package]] @@ -911,63 +1052,71 @@ wheels = [ ] [[package]] -name = "pyqt6" -version = "6.9.0" +name = "pyramid" +version = "2.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyqt6-qt6" }, - { name = "pyqt6-sip" }, + { name = "hupper" }, + { name = "plaster" }, + { name = "plaster-pastedeploy" }, + { name = "setuptools" }, + { name = "translationstring" }, + { name = "venusian" }, + { name = "webob" }, + { name = "zope-deprecation" }, + { name = "zope-interface" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/de/102e8e66149085acf38bbf01df572a2cd53259bcd99b7d8ecef0d6b36172/pyqt6-6.9.0.tar.gz", hash = "sha256:6a8ff8e3cd18311bb7d937f7d741e787040ae7ff47ce751c28a94c5cddc1b4e6", size = 1066831 } +sdist = { url = "https://files.pythonhosted.org/packages/47/c3/5d5736e692fc7ff052577f03136b5edfdf1e2e177eff2f4b91206acae11d/pyramid-2.0.2.tar.gz", hash = "sha256:372138a738e4216535cc76dcce6eddd5a1aaca95130f2354fb834264c06f18de", size = 2637533 } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/e5/f9e2b5326d6103bce4894a969be54ce3be4b0a7a6ff848228e6a61a9993f/PyQt6-6.9.0-cp39-abi3-macosx_10_14_universal2.whl", hash = "sha256:5344240747e81bde1a4e0e98d4e6e2d96ad56a985d8f36b69cd529c1ca9ff760", size = 12257215 }, - { url = "https://files.pythonhosted.org/packages/ed/3a/bcc7687c5a11079bbd1606a015514562f2ac8cb01c5e3e4a3b30fcbdad36/PyQt6-6.9.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e344868228c71fc89a0edeb325497df4ff731a89cfa5fe57a9a4e9baecc9512b", size = 8259731 }, - { url = "https://files.pythonhosted.org/packages/e1/47/13ab0b916b5bad07ab04767b412043f5c1ca206bf38a906b1d8d5c520a98/PyQt6-6.9.0-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:1cbc5a282454cf19691be09eadbde019783f1ae0523e269b211b0173b67373f6", size = 8207593 }, - { url = "https://files.pythonhosted.org/packages/d1/a8/955cfd880f2725a218ee7b272c005658e857e9224823d49c32c93517f6d9/PyQt6-6.9.0-cp39-abi3-win_amd64.whl", hash = "sha256:d36482000f0cd7ce84a35863766f88a5e671233d5f1024656b600cd8915b3752", size = 6748279 }, - { url = "https://files.pythonhosted.org/packages/9f/38/586ce139b1673a27607f7b85c594878e1bba215abdca3de67732b463f7b2/PyQt6-6.9.0-cp39-abi3-win_arm64.whl", hash = "sha256:0c8b7251608e05b479cfe731f95857e853067459f7cbbcfe90f89de1bcf04280", size = 5478122 }, + { url = "https://files.pythonhosted.org/packages/db/41/a2114b8dd2187ae007e022a2baabdc7937cc78211cefc0c01fc5452193af/pyramid-2.0.2-py3-none-any.whl", hash = "sha256:2e6585ac55c147f0a51bc00dadf72075b3bdd9a871b332ff9e5e04117ccd76fa", size = 247277 }, ] [[package]] -name = "pyqt6-qt6" -version = "6.9.0" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/11/8c450442bf4702ed810689a045f9c5d9236d709163886f09374fd8d84143/PyQt6_Qt6-6.9.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:b1c4e4a78f0f22fbf88556e3d07c99e5ce93032feae5c1e575958d914612e0f9", size = 66804297 }, - { url = "https://files.pythonhosted.org/packages/6e/be/191ba4402c24646f6b98c326ff0ee22e820096c69e67ba5860a687057616/PyQt6_Qt6-6.9.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6d3875119dec6bf5f799facea362aa0ad39bb23aa9654112faa92477abccb5ff", size = 60943708 }, - { url = "https://files.pythonhosted.org/packages/0f/70/ec018b6e979b3914c984e5ab7e130918930d5423735ac96c70c328227b9b/PyQt6_Qt6-6.9.0-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:9c0e603c934e4f130c110190fbf2c482ff1221a58317266570678bc02db6b152", size = 81846956 }, - { url = "https://files.pythonhosted.org/packages/ac/ed/2d78cd08be415a21dac2e7277967b90b0c05afc4782100f0a037447bb1c6/PyQt6_Qt6-6.9.0-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:cf840e8ae20a0704e0343810cf0e485552db28bf09ea976e58ec0e9b7bb27fcd", size = 80295982 }, - { url = "https://files.pythonhosted.org/packages/6e/24/6b6168a75c7b6a55b9f6b5c897e6164ec15e94594af11a6f358c49845442/PyQt6_Qt6-6.9.0-py3-none-win_amd64.whl", hash = "sha256:c825a6f5a9875ef04ef6681eda16aa3a9e9ad71847aa78dfafcf388c8007aa0a", size = 73652485 }, - { url = "https://files.pythonhosted.org/packages/44/fd/1238931df039e46e128d53974c0cfc9d34da3d54c5662bd589fe7b0a67c2/PyQt6_Qt6-6.9.0-py3-none-win_arm64.whl", hash = "sha256:1188f118d1c570d27fba39707e3d8a48525f979816e73de0da55b9e6fa9ad0a1", size = 49568913 }, -] - -[[package]] -name = "pyqt6-sip" -version = "13.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/18/0405c54acba0c8e276dd6f0601890e6e735198218d031a6646104870fe22/pyqt6_sip-13.10.0.tar.gz", hash = "sha256:d6daa95a0bd315d9ec523b549e0ce97455f61ded65d5eafecd83ed2aa4ae5350", size = 92464 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/81/66d9bdacb790592a0641378749a047f12e3b254cdc2cb51f7ed636cf01d2/PyQt6_sip-13.10.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:48791db2914fc39c3218519a02d2a5fd3fcd354a1be3141a57bf2880701486f2", size = 112334 }, - { url = "https://files.pythonhosted.org/packages/26/2c/4796c209009a018e0d4a5c406d5a519234c5a378f370dc679d0ad5f455b2/PyQt6_sip-13.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:466d6b4791973c9fcbdc2e0087ed194b9ea802a8c3948867a849498f0841c70c", size = 322334 }, - { url = "https://files.pythonhosted.org/packages/99/34/2ec54bd475f0a811df1d32be485f2344cf9e8b388ce7adb26b46ce5552d4/PyQt6_sip-13.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ae15358941f127cd3d1ab09c1ebd45c4dabb0b2e91587b9eebde0279d0039c54", size = 303798 }, - { url = "https://files.pythonhosted.org/packages/0c/e4/82099bb4ab8bc152b5718541e93c0b3adf7566c0f307c9e58e2368b8c517/PyQt6_sip-13.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad573184fa8b00041944e5a17d150ab0d08db2d2189e39c9373574ebab3f2e58", size = 53569 }, - { url = "https://files.pythonhosted.org/packages/e3/09/90e0378887a3cb9664da77061229cf8e97e6ec25a5611b7dbc9cc3e02c78/PyQt6_sip-13.10.0-cp312-cp312-win_arm64.whl", hash = "sha256:2d579d810d0047d40bde9c6aef281d6ed218db93c9496ebc9e55b9e6f27a229d", size = 45430 }, - { url = "https://files.pythonhosted.org/packages/6b/0c/8d1de48b45b565a46bf4757341f13f9b1853a7d2e6b023700f0af2c213ab/PyQt6_sip-13.10.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7b6e250c2e7c14702a623f2cc1479d7fb8db2b6eee9697cac10d06fe79c281bb", size = 112343 }, - { url = "https://files.pythonhosted.org/packages/af/13/e2cc2b667a9f5d44c2d0e18fa6e1066fca3f4521dcb301f4b5374caeb33e/PyQt6_sip-13.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fcb30756568f8cd59290f9ef2ae5ee3e72ff9cdd61a6f80c9e3d3b95ae676be", size = 322527 }, - { url = "https://files.pythonhosted.org/packages/20/1a/5c6fcae85edb65cf236c9dc6d23b279b5316e94cdca1abdee6d0a217ddbb/PyQt6_sip-13.10.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:757ac52c92b2ef0b56ecc7cd763b55a62d3c14271d7ea8d03315af85a70090ff", size = 303407 }, - { url = "https://files.pythonhosted.org/packages/b9/db/6924ec985be7d746772806b96ab81d24263ef72f0249f0573a82adaed75e/PyQt6_sip-13.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:571900c44a3e38738d696234d94fe2043972b9de0633505451c99e2922cb6a34", size = 53580 }, - { url = "https://files.pythonhosted.org/packages/77/c3/9e44729b582ee7f1d45160e8c292723156889f3e38ce6574f88d5ab8fa02/PyQt6_sip-13.10.0-cp313-cp313-win_arm64.whl", hash = "sha256:39cba2cc71cf80a99b4dc8147b43508d4716e128f9fb99f5eb5860a37f082282", size = 45446 }, -] - -[[package]] -name = "pyqtgraph" -version = "0.13.7" +name = "pyside6" +version = "6.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "pyside6-addons" }, + { name = "pyside6-essentials" }, + { name = "shiboken6" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/d9/b62d5cddb3caa6e5145664bee5ed90223dee23ca887ed3ee479f2609e40a/pyqtgraph-0.13.7.tar.gz", hash = "sha256:64f84f1935c6996d0e09b1ee66fe478a7771e3ca6f3aaa05f00f6e068321d9e3", size = 2343380 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/34/5702b3b7cafe99be1d94b42f100e8cc5e6957b761fcb1cf5f72d492851da/pyqtgraph-0.13.7-py3-none-any.whl", hash = "sha256:7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a", size = 1925473 }, + { url = "https://files.pythonhosted.org/packages/14/91/8e9c7f7e90431297de9856e90a156ade9420977e26d87996909c63f30bd2/PySide6-6.9.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:f843ef39970a2f79757810fffd7b8e93ac42a3de9ea62f2a03648cde57648aed", size = 558097 }, + { url = "https://files.pythonhosted.org/packages/d7/ff/04d1b6b30edd24d761cc30d964860f997bdf37d06620694bf9aab35eec3a/PySide6-6.9.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:db44ac08b8f7ac1b421bc1c6a44200d03f08d80dc7b3f68dfdb1684f30f41c17", size = 558239 }, + { url = "https://files.pythonhosted.org/packages/3c/b4/ca076c55c11a8e473363e05aa82c5c03dd7ba8f17b77cc9311ce17213193/PySide6-6.9.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:531a6e67c429b045674d57fe9864b711eb59e4cded753c2640982e368fd468d1", size = 558239 }, + { url = "https://files.pythonhosted.org/packages/83/ff/95c941f53b0faebc27dbe361d8e971b77f504b9cf36f8f5d750fd82cd6fc/PySide6-6.9.1-cp39-abi3-win_amd64.whl", hash = "sha256:c82dbb7d32bbdd465e01059174f71bddc97de152ab71bded3f1907c40f9a5f16", size = 564571 }, + { url = "https://files.pythonhosted.org/packages/d1/ef/0aa5e910fa4e9770db6b45c23e360a52313922e0ca71fc060a57db613de1/PySide6-6.9.1-cp39-abi3-win_arm64.whl", hash = "sha256:1525d63dc6dc425b8c2dc5bc01a8cb1d67530401449f3a3490c09a14c095b9f9", size = 401793 }, +] + +[[package]] +name = "pyside6-addons" +version = "6.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyside6-essentials" }, + { name = "shiboken6" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e2/39b9e04335d7ac782b6459bf7abec90c36b8efaac5a88ef818e972c59387/PySide6_Addons-6.9.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:7be0708fa89715c282541fca47e2ba97c0c8d2886e0236ef994b2dd8f52aacdd", size = 316212438 }, + { url = "https://files.pythonhosted.org/packages/cf/6f/691d7039a6f7943522a770b713ecd85fa169688dfdd65ddd4db1699d01b6/PySide6_Addons-6.9.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:da7869b02e3599d26546fad582db4656060786bc5ec8ece5ec9ee8aa8b42371c", size = 166690468 }, + { url = "https://files.pythonhosted.org/packages/9d/08/a264db09ad35819643d910cd4c73a86f72f23b7092f8ebc7e51dcca53a86/PySide6_Addons-6.9.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:53fd08c8152b6ba8c435458afd189835ba905793a5077a2bb0b1b11222b375d4", size = 162466096 }, + { url = "https://files.pythonhosted.org/packages/84/be/a849402f7e73d137b5ae8b4370a49b0cf0e0c02f028b845782cb743e4995/PySide6_Addons-6.9.1-cp39-abi3-win_amd64.whl", hash = "sha256:cd93a3a5e3886cd958f3a5acc7c061c24f10a394ce9f4ce657ac394544ca7ec2", size = 143150906 }, + { url = "https://files.pythonhosted.org/packages/2a/f1/1bb6b5859aff4e2b3f5ef789b9cee200811a9f469f04d9aa7425e816622b/PySide6_Addons-6.9.1-cp39-abi3-win_arm64.whl", hash = "sha256:4f589631bdceb518080ae9c9fa288e64f092cd5bebe25adc8ad89e8eadd4db29", size = 26938762 }, +] + +[[package]] +name = "pyside6-essentials" +version = "6.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "shiboken6" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/59/714874db9ef3bbbbda654fd3223248969bea02ec1a5bfdd1c941c4e97749/PySide6_Essentials-6.9.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:ed43435a70e018e1c22efcaf34a9430b83cfcad716dba661b03de21c13322fab", size = 132957077 }, + { url = "https://files.pythonhosted.org/packages/59/6a/ea0db68d40a1c487fd255634896f4e37b6560e3ef1f57ca5139bf6509b1f/PySide6_Essentials-6.9.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e5da48883f006c6206ef85874db74ddebcdf69b0281bd4f1642b1c5ac1d54aea", size = 96416183 }, + { url = "https://files.pythonhosted.org/packages/5b/2f/4243630d1733522638c4967d36018c38719d8b84f5246bf3d4c010e0aa9d/PySide6_Essentials-6.9.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:e46a2801c9c6098025515fd0af6c594b9e9c951842f68b8f6f3da9858b9b26c2", size = 94171343 }, + { url = "https://files.pythonhosted.org/packages/0d/a9/a8e0209ba9116f2c2db990cfb79f2edbd5a3a428013be2df1f1cddd660a9/PySide6_Essentials-6.9.1-cp39-abi3-win_amd64.whl", hash = "sha256:ad1ac94011492dba33051bc33db1c76a7d6f815a81c01422cb6220273b369145", size = 72435676 }, + { url = "https://files.pythonhosted.org/packages/d0/e4/23268c57e775a1a4d2843d288a9583a47f2e4b3977a9ae93cb9ded1a4ea5/PySide6_Essentials-6.9.1-cp39-abi3-win_arm64.whl", hash = "sha256:35c2c2bb4a88db74d11e638cf917524ff35785883f10b439ead07960a5733aa4", size = 49483707 }, ] [[package]] @@ -984,24 +1133,24 @@ wheels = [ [[package]] name = "python-docx" -version = "1.1.2" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "lxml" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/e4/386c514c53684772885009c12b67a7edd526c15157778ac1b138bc75063e/python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd", size = 5656581 } +sdist = { url = "https://files.pythonhosted.org/packages/a9/f7/eddfe33871520adab45aaa1a71f0402a2252050c14c7e3009446c8f4701c/python_docx-1.2.0.tar.gz", hash = "sha256:7bc9d7b7d8a69c9c02ca09216118c86552704edc23bac179283f2e38f86220ce", size = 5723256 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/3d/330d9efbdb816d3f60bf2ad92f05e1708e4a1b9abe80461ac3444c83f749/python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe", size = 244315 }, + { url = "https://files.pythonhosted.org/packages/d0/00/1e03a4989fa5795da308cd774f05b704ace555a70f9bf9d3be057b680bcf/python_docx-1.2.0-py3-none-any.whl", hash = "sha256:3fd478f3250fbbbfd3b94fe1e985955737c145627498896a8a6bf81f4baf66c7", size = 252987 }, ] [[package]] name = "python-dotenv" -version = "1.1.0" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556 }, ] [[package]] @@ -1054,14 +1203,14 @@ wheels = [ [[package]] name = "pyyaml-env-tag" -version = "0.1" +version = "1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/8e/da1c6c58f751b70f8ceb1eb25bc25d524e8f14fe16edcce3f4e3ba08629c/pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb", size = 5631 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/66/bbb1dd374f5c870f59c5bb1db0e18cbe7fa739415a24cbd95b2d1f5ae0c4/pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069", size = 3911 }, + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722 }, ] [[package]] @@ -1099,7 +1248,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d [[package]] name = "requests" -version = "2.32.3" +version = "2.32.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1107,9 +1256,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847 }, ] [[package]] @@ -1127,16 +1276,16 @@ wheels = [ [[package]] name = "rich-click" -version = "1.8.8" +version = "1.8.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/7a/4b78c5997f2a799a8c5c07f3b2145bbcda40115c4d35c76fbadd418a3c89/rich_click-1.8.8.tar.gz", hash = "sha256:547c618dea916620af05d4a6456da797fbde904c97901f44d2f32f89d85d6c84", size = 39066 } +sdist = { url = "https://files.pythonhosted.org/packages/b7/a8/dcc0a8ec9e91d76ecad9413a84b6d3a3310c6111cfe012d75ed385c78d96/rich_click-1.8.9.tar.gz", hash = "sha256:fd98c0ab9ddc1cf9c0b7463f68daf28b4d0033a74214ceb02f761b3ff2af3136", size = 39378 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/69/963f0bf44a654f6465bdb66fb5a91051b0d7af9f742b5bd7202607165036/rich_click-1.8.8-py3-none-any.whl", hash = "sha256:205aabd5a98e64ab2c105dee9e368be27480ba004c7dfa2accd0ed44f9f1550e", size = 35747 }, + { url = "https://files.pythonhosted.org/packages/b6/c2/9fce4c8a9587c4e90500114d742fe8ef0fd92d7bad29d136bb9941add271/rich_click-1.8.9-py3-none-any.whl", hash = "sha256:c3fa81ed8a671a10de65a9e20abf642cfdac6fdb882db1ef465ee33919fbcfe2", size = 36082 }, ] [[package]] @@ -1144,6 +1293,7 @@ name = "semesterapparatsmanager" version = "0.1.0" source = { virtual = "." } dependencies = [ + { name = "appdirs" }, { name = "beautifulsoup4" }, { name = "bump-my-version" }, { name = "chardet" }, @@ -1156,10 +1306,11 @@ dependencies = [ { name = "mkdocs-material-extensions" }, { name = "natsort" }, { name = "omegaconf" }, + { name = "openai" }, { name = "pandas" }, { name = "playwright" }, - { name = "pyqt6" }, - { name = "pyqtgraph" }, + { name = "pyramid" }, + { name = "pyside6" }, { name = "python-docx" }, { name = "pyzotero" }, { name = "ratelimit" }, @@ -1175,6 +1326,7 @@ dev = [ [package.metadata] requires-dist = [ + { name = "appdirs", specifier = ">=1.4.4" }, { name = "beautifulsoup4", specifier = ">=4.12.3" }, { name = "bump-my-version", specifier = ">=0.29.0" }, { name = "chardet", specifier = ">=5.2.0" }, @@ -1187,10 +1339,11 @@ requires-dist = [ { name = "mkdocs-material-extensions", specifier = ">=1.3.1" }, { name = "natsort", specifier = ">=8.4.0" }, { name = "omegaconf", specifier = ">=2.3.0" }, + { name = "openai", specifier = ">=1.79.0" }, { name = "pandas", specifier = ">=2.2.3" }, { name = "playwright", specifier = ">=1.49.1" }, - { name = "pyqt6", specifier = ">=6.8.0" }, - { name = "pyqtgraph", specifier = ">=0.13.7" }, + { name = "pyramid", specifier = ">=2.0.2" }, + { name = "pyside6", specifier = ">=6.9.1" }, { name = "python-docx", specifier = ">=1.1.2" }, { name = "pyzotero", specifier = ">=1.6.4" }, { name = "ratelimit", specifier = ">=2.2.1" }, @@ -1204,12 +1357,33 @@ dev = [ { name = "nuitka", specifier = ">=2.5.9" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486 }, +] + [[package]] name = "sgmllib3k" version = "1.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9e/bd/3704a8c3e0942d711c1299ebf7b9091930adae6675d7c8f476a7ce48653c/sgmllib3k-1.0.0.tar.gz", hash = "sha256:7868fb1c8bfa764c1ac563d3cf369c381d1325d36124933a726f29fcdaa812e9", size = 5750 } +[[package]] +name = "shiboken6" +version = "6.9.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/98/34d4d25b79055959b171420d47fcc10121aefcbb261c91d5491252830e31/shiboken6-6.9.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:40e92afc88da06b5100c56b761e59837ff282166e9531268f3d910b6128e621e", size = 406159 }, + { url = "https://files.pythonhosted.org/packages/5a/07/53b2532ecd42ff925feb06b7bb16917f5f99f9c3470f0815c256789d818b/shiboken6-6.9.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efcdfa8655d34aaf8d7a0c7724def3440bd46db02f5ad3b1785db5f6ccb0a8ff", size = 206756 }, + { url = "https://files.pythonhosted.org/packages/5e/b0/75b86ee3f7b044e6a87fbe7abefd1948ca4ae5fcde8321f4986a1d9eaa5e/shiboken6-6.9.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:efcf75d48a29ae072d0bf54b3cd5a59ae91bb6b3ab7459e17c769355486c2e0b", size = 203233 }, + { url = "https://files.pythonhosted.org/packages/30/56/00af281275aab4c79e22e0ea65feede0a5c6da3b84e86b21a4a0071e0744/shiboken6-6.9.1-cp39-abi3-win_amd64.whl", hash = "sha256:209ccf02c135bd70321143dcbc5023ae0c056aa4850a845955dd2f9b2ff280a9", size = 1153587 }, + { url = "https://files.pythonhosted.org/packages/de/ce/6ccd382fbe1a96926c5514afa6f2c42da3a9a8482e61f8dfc6068a9ca64f/shiboken6-6.9.1-cp39-abi3-win_arm64.whl", hash = "sha256:2a39997ce275ced7853defc89d3a1f19a11c90991ac6eef3435a69bb0b7ff1de", size = 1831623 }, +] + [[package]] name = "six" version = "1.17.0" @@ -1239,11 +1413,11 @@ wheels = [ [[package]] name = "tomlkit" -version = "0.13.2" +version = "0.13.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901 }, ] [[package]] @@ -1259,24 +1433,33 @@ wheels = [ ] [[package]] -name = "typing-extensions" -version = "4.13.2" +name = "translationstring" +version = "1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } +sdist = { url = "https://files.pythonhosted.org/packages/14/39/32325add93da9439775d7fe4b4887eb7986dbc1d5675b0431f4531f560e5/translationstring-1.4.tar.gz", hash = "sha256:bf947538d76e69ba12ab17283b10355a9ecfbc078e6123443f43f2107f6376f3", size = 24199 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, + { url = "https://files.pythonhosted.org/packages/3b/98/36187601a15e3d37e9bfcf0e0e1055532b39d044353b06861c3a519737a9/translationstring-1.4-py2.py3-none-any.whl", hash = "sha256:5f4dc4d939573db851c8d840551e1a0fb27b946afe3b95aafc22577eed2d6262", size = 15028 }, +] + +[[package]] +name = "typing-extensions" +version = "4.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839 }, ] [[package]] name = "typing-inspection" -version = "0.4.0" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552 }, ] [[package]] @@ -1290,11 +1473,20 @@ wheels = [ [[package]] name = "urllib3" -version = "2.4.0" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, +] + +[[package]] +name = "venusian" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/4c/eefa68085c555dc11e6744b9c6fbe5966b1c9378c47267776a448923e9a5/venusian-3.1.1.tar.gz", hash = "sha256:534fb3b355669283eb3954581931e5d1d071fce61d029d58f3219a5e3a6f0c41", size = 39269 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/4b/34d926eba40db81b204066a60b4efdc5d8867a8efcbfe44d69b634b1c907/venusian-3.1.1-py3-none-any.whl", hash = "sha256:0845808a985976acbceaa1fbb871c7fac4fb28ae75453232970e9c2c2866dbf4", size = 14026 }, ] [[package]] @@ -1323,14 +1515,14 @@ wheels = [ [[package]] name = "wcmatch" -version = "10.0" +version = "10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bracex" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/ab/b3a52228538ccb983653c446c1656eddf1d5303b9cb8b9aef6a91299f862/wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a", size = 115578 } +sdist = { url = "https://files.pythonhosted.org/packages/79/3e/c0bdc27cf06f4e47680bd5803a07cb3dfd17de84cde92dd217dcb9e05253/wcmatch-10.1.tar.gz", hash = "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af", size = 117421 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/df/4ee467ab39cc1de4b852c212c1ed3becfec2e486a51ac1ce0091f85f38d7/wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a", size = 39347 }, + { url = "https://files.pythonhosted.org/packages/eb/d8/0d1d2e9d3fabcf5d6840362adcf05f8cf3cd06a73358140c3a97189238ae/wcmatch-10.1-py3-none-any.whl", hash = "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a", size = 39854 }, ] [[package]] @@ -1342,6 +1534,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, ] +[[package]] +name = "webob" +version = "1.8.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "legacy-cgi", marker = "python_full_version >= '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/0b/1732085540b01f65e4e7999e15864fe14cd18b12a95731a43fd6fd11b26a/webob-1.8.9.tar.gz", hash = "sha256:ad6078e2edb6766d1334ec3dee072ac6a7f95b1e32ce10def8ff7f0f02d56589", size = 279775 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/bd/c336448be43d40be28e71f2e0f3caf7ccb28e2755c58f4c02c065bfe3e8e/WebOb-1.8.9-py2.py3-none-any.whl", hash = "sha256:45e34c58ed0c7e2ecd238ffd34432487ff13d9ad459ddfd77895e67abba7c1f9", size = 115364 }, +] + [[package]] name = "win32-setctime" version = "1.2.0" @@ -1351,6 +1555,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 }, ] +[[package]] +name = "zope-deprecation" +version = "5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/22/0e621e31b5826b2ff121fea5b1ea91173c88f86e182181f012abcc84a51f/zope_deprecation-5.1.tar.gz", hash = "sha256:46bed4611fb53edc731aadeb64b28308bcb848f4cc150c60c948d078f7108721", size = 24453 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/88/5fc32633682a452260f50417da3d4be26137dd220ef617bbd8ed52f0cfa9/zope.deprecation-5.1-py3-none-any.whl", hash = "sha256:60f957b964d8f947a4a592c647d51ce0f4f844d1f041657956ddde0d9fa9a76a", size = 10020 }, +] + +[[package]] +name = "zope-interface" +version = "7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/93/9210e7606be57a2dfc6277ac97dcc864fd8d39f142ca194fdc186d596fda/zope.interface-7.2.tar.gz", hash = "sha256:8b49f1a3d1ee4cdaf5b32d2e738362c7f5e40ac8b46dd7d1a65e82a4872728fe", size = 252960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/0b/c7516bc3bad144c2496f355e35bd699443b82e9437aa02d9867653203b4a/zope.interface-7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:086ee2f51eaef1e4a52bd7d3111a0404081dadae87f84c0ad4ce2649d4f708b7", size = 208959 }, + { url = "https://files.pythonhosted.org/packages/a2/e9/1463036df1f78ff8c45a02642a7bf6931ae4a38a4acd6a8e07c128e387a7/zope.interface-7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21328fcc9d5b80768bf051faa35ab98fb979080c18e6f84ab3f27ce703bce465", size = 209357 }, + { url = "https://files.pythonhosted.org/packages/07/a8/106ca4c2add440728e382f1b16c7d886563602487bdd90004788d45eb310/zope.interface-7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6dd02ec01f4468da0f234da9d9c8545c5412fef80bc590cc51d8dd084138a89", size = 264235 }, + { url = "https://files.pythonhosted.org/packages/fc/ca/57286866285f4b8a4634c12ca1957c24bdac06eae28fd4a3a578e30cf906/zope.interface-7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e7da17f53e25d1a3bde5da4601e026adc9e8071f9f6f936d0fe3fe84ace6d54", size = 259253 }, + { url = "https://files.pythonhosted.org/packages/96/08/2103587ebc989b455cf05e858e7fbdfeedfc3373358320e9c513428290b1/zope.interface-7.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cab15ff4832580aa440dc9790b8a6128abd0b88b7ee4dd56abacbc52f212209d", size = 264702 }, + { url = "https://files.pythonhosted.org/packages/5f/c7/3c67562e03b3752ba4ab6b23355f15a58ac2d023a6ef763caaca430f91f2/zope.interface-7.2-cp312-cp312-win_amd64.whl", hash = "sha256:29caad142a2355ce7cfea48725aa8bcf0067e2b5cc63fcf5cd9f97ad12d6afb5", size = 212466 }, + { url = "https://files.pythonhosted.org/packages/c6/3b/e309d731712c1a1866d61b5356a069dd44e5b01e394b6cb49848fa2efbff/zope.interface-7.2-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:3e0350b51e88658d5ad126c6a57502b19d5f559f6cb0a628e3dc90442b53dd98", size = 208961 }, + { url = "https://files.pythonhosted.org/packages/49/65/78e7cebca6be07c8fc4032bfbb123e500d60efdf7b86727bb8a071992108/zope.interface-7.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15398c000c094b8855d7d74f4fdc9e73aa02d4d0d5c775acdef98cdb1119768d", size = 209356 }, + { url = "https://files.pythonhosted.org/packages/11/b1/627384b745310d082d29e3695db5f5a9188186676912c14b61a78bbc6afe/zope.interface-7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:802176a9f99bd8cc276dcd3b8512808716492f6f557c11196d42e26c01a69a4c", size = 264196 }, + { url = "https://files.pythonhosted.org/packages/b8/f6/54548df6dc73e30ac6c8a7ff1da73ac9007ba38f866397091d5a82237bd3/zope.interface-7.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb23f58a446a7f09db85eda09521a498e109f137b85fb278edb2e34841055398", size = 259237 }, + { url = "https://files.pythonhosted.org/packages/b6/66/ac05b741c2129fdf668b85631d2268421c5cd1a9ff99be1674371139d665/zope.interface-7.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a71a5b541078d0ebe373a81a3b7e71432c61d12e660f1d67896ca62d9628045b", size = 264696 }, + { url = "https://files.pythonhosted.org/packages/0a/2f/1bccc6f4cc882662162a1158cda1a7f616add2ffe322b28c99cb031b4ffc/zope.interface-7.2-cp313-cp313-win_amd64.whl", hash = "sha256:4893395d5dd2ba655c38ceb13014fd65667740f09fa5bb01caa1e6284e48c0cd", size = 212472 }, +] + [[package]] name = "zstandard" version = "0.23.0"