From eda556b5ea31430b3f162f28a598df6d07dc0ecb Mon Sep 17 00:00:00 2001
From: WorldTeacher
Date: Tue, 17 Dec 2024 10:02:56 +0100
Subject: [PATCH] rework logging, add more dataclasses, reworked config
---
config/config.py | 72 +-
icons/__init__.py | 3 +
icons/api.svg | 1 +
icons/database.svg | 1 +
icons/icons.svg | 1 +
src/backend/database.py | 119 +--
src/backend/db.py | 8 +-
src/backend/semester.py | 4 +-
src/logic/__init__.py | 4 +-
src/logic/dataclass.py | 63 +-
src/logic/log.py | 17 +-
src/ui/Ui_semesterapparat_ui.py | 18 +-
.../dialog_sources/Ui_apparat_extend.py | 4 +-
.../dialog_sources/Ui_confirm_extend.py | 12 +-
.../dialog_sources/Ui_elsa_add_table_entry.py | 17 +-
.../dialogs/dialog_sources/Ui_mail_preview.py | 4 +-
src/ui/dialogs/dialog_sources/Ui_settings.py | 290 +++--
.../dialogs/dialog_sources/apparat_extend.ui | 2 +-
.../dialogs/dialog_sources/confirm_extend.ui | 41 +-
.../dialog_sources/elsa_add_table_entry.ui | 64 +-
src/ui/dialogs/dialog_sources/settings.ui | 999 ++++++++++--------
src/ui/dialogs/elsa_add_entry.py | 23 +-
src/ui/dialogs/mail.py | 1 +
src/ui/dialogs/parsed_titles.py | 4 +-
src/ui/dialogs/reminder.py | 3 +-
src/ui/dialogs/settings.py | 97 +-
src/ui/extensions/ValidatorButton.py | 16 +
src/ui/semesterapparat_ui.ui | 14 +-
src/ui/userInterface.py | 49 +-
src/ui/widgets/admin_create_user.py | 15 +-
src/ui/widgets/admin_edit_prof.py | 47 +-
src/ui/widgets/admin_edit_user.py | 22 +-
src/ui/widgets/collapse.py | 2 +-
src/ui/widgets/elsa_main.py | 77 +-
src/ui/widgets/searchPage.py | 30 +-
.../widget_sources/Ui_admin_edit_prof.py | 9 +
.../widget_sources/Ui_elsa_maindialog.py | 94 +-
.../widgets/widget_sources/admin_edit_prof.ui | 14 +
.../widgets/widget_sources/elsa_maindialog.ui | 175 ++-
src/utils/__init__.py | 2 +
src/utils/icon.py | 51 +-
41 files changed, 1624 insertions(+), 865 deletions(-)
create mode 100644 icons/__init__.py
create mode 100644 icons/api.svg
create mode 100644 icons/database.svg
create mode 100644 icons/icons.svg
create mode 100644 src/ui/extensions/ValidatorButton.py
diff --git a/config/config.py b/config/config.py
index 94be5bd..106eaef 100644
--- a/config/config.py
+++ b/config/config.py
@@ -64,19 +64,62 @@ class Mail:
def _setattr(self, name, value):
setattr(self, name, value)
+ def setValue(self, **kwargs):
+ for key, value in kwargs.items():
+ if hasattr(self, key):
+ setattr(self, key, value)
+ else:
+ raise KeyError(f"Invalid option: {key}")
+
+
+class Icons:
+ def __init__(self):
+ self._path = None
+ self._colors = None
+ self._icons = None
+
+ def assign(self, key, value):
+ setattr(self, key, value)
+
+ @property
+ def path(self):
+ return self._path
+
+ @path.setter
+ def path(self, value):
+ self._path = value
+
+ @property
+ def colors(self):
+ return self._colors
+
+ @colors.setter
+ def colors(self, value):
+ self._colors = value
+
+ @property
+ def icons(self):
+ return self._icons
+
+ @icons.setter
+ def icons(self, value):
+ self._icons = value
+
+ def get(self, name):
+ return self.icons.get(name)
class Config:
- '''A class to handle the configuration of the application. After initializing, it will try to load the config file and store it for future access. Any changes made can be saved to the file using the .save() method. Changes are used in real time in the app, if a restart is required, the Application will show a window.
+ """A class to handle the configuration of the application. After initializing, it will try to load the config file and store it for future access. Any changes made can be saved to the file using the .save() method. Changes are used in real time in the app, if a restart is required, the Application will show a window.
Raises:
RuntimeError: Configuration not loaded
-
+
KeyError: Invalid option
- '''
+ """
_config: Optional[DictConfig] = None
-
+
def __init__(self, config_path: str):
"""
Loads the configuration file and stores it for future access.
@@ -141,6 +184,9 @@ class Config:
def set_zotero_attr(self, name, value):
OmegaConf.update(self._config, f"zotero.{name}", value)
+ def set_icon_attr(self, name, value):
+ OmegaConf.update(self._config, f"icons.{name}", value)
+
@property
def save_path(self):
return self._config.save_path
@@ -149,14 +195,16 @@ class Config:
def save_path(self, value: str):
self._config.save_path = value
- @property
- def icon_path(self):
- """Path to Icon folder
+ def load_config(self, path, filename):
+ return OmegaConf.load(os.path.join(path, filename))
- Returns:
- str: Folder path as string
- """
- return self._config.icon_path
+ @property
+ def icons(self):
+ icons = Icons()
+ icons.assign("path", self._config.icon_path)
+ icons.assign("colors", self._config.colors)
+ icons.assign("icons", self._config.icons)
+ return icons
def dict(self):
- return OmegaConf.to_container(self._config)
\ No newline at end of file
+ return OmegaConf.to_container(self._config)
diff --git a/icons/__init__.py b/icons/__init__.py
new file mode 100644
index 0000000..d881932
--- /dev/null
+++ b/icons/__init__.py
@@ -0,0 +1,3 @@
+from .config import Icons
+
+icons = Icons()
diff --git a/icons/api.svg b/icons/api.svg
new file mode 100644
index 0000000..34edcee
--- /dev/null
+++ b/icons/api.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icons/database.svg b/icons/database.svg
new file mode 100644
index 0000000..e1dfb1c
--- /dev/null
+++ b/icons/database.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icons/icons.svg b/icons/icons.svg
new file mode 100644
index 0000000..8bb120a
--- /dev/null
+++ b/icons/icons.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/backend/database.py b/src/backend/database.py
index 669ce69..452ff73 100644
--- a/src/backend/database.py
+++ b/src/backend/database.py
@@ -7,7 +7,7 @@ from src import settings
from typing import Any, Dict, List, Optional, Tuple, Union
# from icecream import ic
from omegaconf import OmegaConf
-
+import datetime
from src.backend.db import (
CREATE_ELSA_FILES_TABLE,
CREATE_ELSA_MEDIA_TABLE,
@@ -22,18 +22,18 @@ from src.backend.db import (
CREATE_TABLE_USER,
)
from src.errors import AppPresentError, NoResultError
-from src.logic import ApparatData, BookData, Prof, MyLogger
+from src.logic import ApparatData, BookData, Prof, Apparat, ELSA, logger as log
from src.logic.constants import SEMAP_MEDIA_ACCOUNTS
from src.utils import create_blob, dump_pickle, load_pickle
from .semester import generateSemesterByDate
from icecream import ic
+from string import ascii_lowercase as lower, digits
-ascii_lowercase = "abcdefghijklmnopqrstuvwxyz0123456789)"
-caller_frame = inspect.stack()[1]
+ascii_lowercase = lower + digits
# get the line that called the function
-database = settings.database
class Database:
+ database = settings.database
"""
Initialize the database and create the tables if they do not exist.
"""
@@ -45,23 +45,15 @@ class Database:
Args:
db_path (str, optional): Optional Path for testing / specific purposes. Defaults to None.
"""
- caller_frame = inspect.stack()[1]
-
- script_name = (
- caller_frame.filename.replace("\\", "/").split("/")[-1].split(".")[0]
- )
- name = f"Database.{script_name}"
- self.name = script_name
- self.logger = MyLogger(name)
if db_path is None:
- self.db_path = database.path + database.name
+ self.db_path = self.database.path + self.database.name
self.db_path = self.db_path.replace("~", str(Path.home()))
else:
self.db_path = db_path
self.checkDatabaseStatus()
def checkDatabaseStatus(self):
- path = database.path
+ path = self.database.path
path = path.replace("~", str(Path.home()))
# print(path)
path = os.path.abspath(path)
@@ -70,22 +62,10 @@ class Database:
# print(path)
os.makedirs(path)
if self.get_db_contents() == []:
- self.logger.log_critical("Database does not exist, creating tables")
+ log.critical("Database does not exist, creating tables")
self.create_tables()
self.insertSubjects()
- def get_caller_line(self) -> str:
- # get the line from the script that called the function
- caller_frame = inspect.stack()
- # get the line that called the function based on self.name and caller_frame
- script_name = self.name
- for frame in caller_frame:
- if script_name in frame.filename:
- caller_frame = frame
- break
- line = f"{caller_frame.function}:{caller_frame.lineno} ->"
- return line
-
def getElsaMediaID(self, work_author, signature, pages):
query = (
"SELECT id FROM elsa_media WHERE work_author=? AND signature=? AND pages=?"
@@ -151,7 +131,6 @@ class Database:
cursor.execute(CREATE_TABLE_USER)
cursor.execute(CREATE_TABLE_SUBJECTS)
cursor.execute(CREATE_ELSA_TABLE)
- cursor.execute(CREATE_ELSA_PROF_TABLE)
cursor.execute(CREATE_ELSA_FILES_TABLE)
cursor.execute(CREATE_ELSA_MEDIA_TABLE)
conn.commit()
@@ -167,11 +146,12 @@ class Database:
"""
conn = self.connect()
cursor = conn.cursor()
- self.logger.log_info(f"Inserting {params} into database with query {query}")
+ log.info(f"Inserting {params} into database with query {query}")
cursor.execute(query, params)
conn.commit()
self.close_connection(conn)
+ @log.catch
def query_db(
self, query: str, args: Tuple = (), one: bool = False
) -> Union[Tuple, List[Tuple]]:
@@ -191,24 +171,24 @@ class Database:
logs_query = query
logs_args = args
if "fileblob" in query:
- #set fileblob arg in logger to "too long"
+ # set fileblob arg in logger to "too long"
logs_query = query
fileblob_location = query.find("fileblob")
- #remove fileblob from query
+ # remove fileblob from query
logs_query = query[:fileblob_location] + "fileblob = too long"
-
- log_message = f"{self.get_caller_line()} Querying database with query {logs_query}, args: {logs_args}"
+
+ log_message = f"Querying database with query {logs_query}, args: {logs_args}"
# if "INSERT" in query:
# log_message = f"Querying database with query {query}"
- self.logger.log_info(log_message)
+ log.info(log_message)
try:
cursor.execute(query, args)
rv = cursor.fetchall()
conn.commit()
self.close_connection(conn)
except sql.OperationalError as e:
- self.logger.log_error(f"Error in query: {e}")
+ log.error(f"Error in query: {e}")
return None
return (rv[0] if rv else None) if one else rv
@@ -231,7 +211,7 @@ class Database:
t_query = (
f"SELECT bookdata FROM media WHERE app_id={app_id} AND prof_id={prof_id}"
)
- self.logger.log_info(t_query)
+ log.info(t_query)
# # print(t_query)
result = cursor.execute(t_query).fetchall()
result = [load_pickle(i[0]) for i in result]
@@ -258,7 +238,7 @@ class Database:
params = (converted, app_id, prof_id, 0)
cursor.execute(query, params)
logMessage = f"Added book with signature {bookdata.signature} to database, data: {converted}"
- self.logger.log_info(logMessage)
+ log.info(logMessage)
conn.commit()
self.close_connection(conn)
@@ -507,7 +487,7 @@ class Database:
str: The filename of the recreated file
"""
blob = self.getBlob(filename, app_id)
- tempdir = database.tempdir
+ tempdir = self.database.tempdir
tempdir = tempdir.replace("~", str(Path.home()))
tempdir_path = Path(tempdir)
if not os.path.exists(tempdir_path):
@@ -660,7 +640,7 @@ class Database:
Args:
message_id (str): the id of the message
"""
- self.logger.log_info(f"Deleting message with id {message_id}")
+ log.info(f"Deleting message with id {message_id}")
self.query_db("DELETE FROM messages WHERE id=?", (message_id,))
# Prof data
@@ -734,7 +714,17 @@ class Database:
person = Prof()
return person.from_tuple(data)
-
+ def getProf(self, id) -> Prof:
+ """Get a professor based on the id
+
+ Args:
+ id ([type]): the id of the professor
+
+ Returns:
+ Prof: a Prof object containing the data of the professor
+ """
+ data = self.query_db("SELECT * FROM prof WHERE id=?", (id,), one=True)
+ return Prof().from_tuple(data)
def getProfs(self) -> list[Prof]:
"""Return all the professors in the database
@@ -806,7 +796,7 @@ class Database:
"SELECT appnr FROM semesterapparat WHERE deletion_status=0"
)
numbers = [i[0] for i in numbers]
- self.logger.log_info(f"Currently used apparat numbers: {numbers}")
+ log.info(f"Currently used apparat numbers: {numbers}")
return numbers
def setNewSemesterDate(self, app_id: Union[str, int], newDate, dauerapp=False):
@@ -817,16 +807,18 @@ class Database:
newDate (str): the new date
dauerapp (bool, optional): if the apparat was changed to dauerapparat. Defaults to False.
"""
+ # today as yyyy-mm-dd
+ today = datetime.datetime.now().strftime("%Y-%m-%d")
if dauerapp:
self.query_db(
- "UPDATE semesterapparat SET verlängerung_bis=?, dauer=? WHERE appnr=?",
- (newDate, dauerapp, app_id),
+ "UPDATE semesterapparat SET verlängerung_bis=?, dauer=?, verlängert_am=? WHERE appnr=?",
+ (newDate, dauerapp, today, app_id),
)
else:
self.query_db(
- "UPDATE semesterapparat SET verlängerung_bis=? WHERE appnr=?",
- (newDate, app_id),
+ "UPDATE semesterapparat SET verlängerung_bis=?, verlängerung_am=? WHERE appnr=?",
+ (newDate, today, app_id),
)
def getApparatId(self, apparat_name) -> Optional[int]:
@@ -872,7 +864,7 @@ class Database:
# self.getProfId(apparat.profname)
ic(prof_id)
query = f"INSERT OR IGNORE INTO semesterapparat (appnr, name, erstellsemester, dauer, prof_id, fach,deletion_status,konto) VALUES ('{apparat.appnr}', '{apparat.appname}', '{apparat.semester}', '{apparat.dauerapp}', {prof_id}, '{apparat.app_fach}', '{0}', '{SEMAP_MEDIA_ACCOUNTS[apparat.appnr]}')"
- self.logger.log_info(query)
+ log.info(query)
self.query_db(query)
return None
def getApparatsByProf(self, prof_id: Union[str, int]) -> list[tuple]:
@@ -884,9 +876,14 @@ class Database:
Returns:
list[tuple]: a list of tuples containing the apparats
"""
- return self.query_db(
+ data = self.query_db(
"SELECT * FROM semesterapparat WHERE prof_id=?", (prof_id,)
)
+ ret = []
+ for i in data:
+ print(i)
+ ret.append(Apparat().from_tuple(i))
+ return ret
def getApparatsBySemester(self, semester: str) -> dict[list]:
"""get all apparats based on the semester
@@ -960,16 +957,17 @@ class Database:
self.close_connection(conn)
return ret
- def deleteApparat(self, app_id: Union[str, int], semester: str):
+ def deleteApparat(self, app_id: Union[str, int]):
"""Delete an apparat from the database
Args:
app_id (Union[str, int]): the id of the apparat
semester (str): the semester the apparat should be deleted from
"""
+ today = datetime.datetime.now().strftime("%Y-%m-%d")
self.query_db(
"UPDATE semesterapparat SET deletion_status=1, deleted_date=? WHERE appnr=?",
- (semester, app_id),
+ (today, app_id),
)
def isEternal(self, id):
@@ -1017,7 +1015,7 @@ class Database:
apparat_data.apparat_adis_id,
apparat_data.appnr,
)
- self.logger.log_info(f"Updating apparat with query {query} and params {params}")
+ log.info(f"Updating apparat with query {query} and params {params}")
self.query_db(query, params)
def checkApparatExists(self, app_name: str):
@@ -1082,7 +1080,7 @@ class Database:
result_a = tuple(result_a)
result[result.index(orig_value)] = result_a
self.close_connection(conn)
- self.logger.log_info(f"Query result: {result}")
+ log.info(f"Query result: {result}")
return result
if "deletable" in kwargs.keys():
@@ -1418,7 +1416,7 @@ class Database:
"SELECT fileblob FROM elsa_files WHERE filename=?", (filename,), one=True
)[0]
# print(blob)
- tempdir = database.tempdir
+ tempdir = self.database.tempdir
tempdir = tempdir.replace("~", str(Path.home()))
tempdir_path = Path(tempdir)
if not os.path.exists(tempdir_path):
@@ -1430,7 +1428,7 @@ class Database:
# print("file created")
return file.name
- def getElsaApparats(self):
+ def getElsaApparats(self) -> ELSA:
"""Get all the ELSA apparats in the database
Returns:
@@ -1438,20 +1436,17 @@ class Database:
"""
return self.query_db("SELECT * FROM elsa")
- def getElsaId(self, prof, semester, date):
+ def getElsaId(self, prof_id, semester, date):
"""get the id of an ELSA apparat based on the professor, semester and date
Args:
- prof (str): the name of the professor
+ prof_id (int): the id of the professor
semester (str): the semester
date (str): the date of the apparat
Returns:
int: the id of the ELSA apparat
"""
- prof_id = self.getElsaProfId(prof)
- if prof_id is None:
- return None
data = self.query_db(
"SELECT id FROM elsa WHERE prof_id=? AND semester=? AND date=?",
@@ -1491,7 +1486,7 @@ class Database:
title = profdata.title #profdata["title"]
query = f"INSERT INTO prof (fname, lname, fullname, mail, telnr,titel) VALUES ('{fname}','{lname}','{fullname}','{mail}','{telnr}','{title}')"
- self.logger.log_info(query)
+ log.info(query)
cursor.execute(query)
conn.commit()
@@ -1534,7 +1529,7 @@ class Database:
else:
fullname = profdata["profname"]
query = f"SELECT id FROM prof WHERE fullname = '{fullname}'"
- self.logger.log_info(query)
+ log.info(query)
cursor.execute(query)
result = cursor.fetchone()
@@ -1551,7 +1546,7 @@ class Database:
conn = self.connect()
cursor = conn.cursor()
query = f"SELECT * FROM prof WHERE fullname = '{fullname}'"
- self.logger.log_info(query)
+ log.info(query)
result = cursor.execute(query).fetchone()
if result:
diff --git a/src/backend/db.py b/src/backend/db.py
index cd81444..16cb35c 100644
--- a/src/backend/db.py
+++ b/src/backend/db.py
@@ -74,16 +74,12 @@ CREATE_TABLE_SUBJECTS = """CREATE TABLE subjects (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
name TEXT NOT NULL UNIQUE
)"""
-CREATE_ELSA_PROF_TABLE = """CREATE TABLE elsa_prof (
- id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
- fullname TEXT NOT NULL UNIQUE
- )"""
+
CREATE_ELSA_TABLE = """CREATE TABLE elsa (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
date TEXT NOT NULL,
semester TEXT NOT NULL,
- prof_id INTEGER NOT NULL,
- FOREIGN KEY (prof_id) REFERENCES elsa_prof (id)
+ prof_id INTEGER NOT NULL
)"""
CREATE_ELSA_FILES_TABLE = """CREATE TABLE elsa_files (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
diff --git a/src/backend/semester.py b/src/backend/semester.py
index 379621b..91e304e 100644
--- a/src/backend/semester.py
+++ b/src/backend/semester.py
@@ -14,7 +14,7 @@ def generateSemesterByDate(next:bool = False):
if month >= 4 and month <= 9:
return "SoSe " + str(currentYear)
else:
- if month == any([10, 11, 12]):
+ if month in [10, 11, 12]:
return f"WiSe {currentYear}/{currentYear+1}"
else:
return f"WiSe {currentYear-1}/{currentYear}"
@@ -43,4 +43,4 @@ def generateSemesterByOffset(offset):
if __name__ == "__main__":
- print(generateSemesterByDate(next=True))
\ No newline at end of file
+ print(generateSemesterByDate())
\ No newline at end of file
diff --git a/src/logic/__init__.py b/src/logic/__init__.py
index bbe64a1..eeab8b3 100644
--- a/src/logic/__init__.py
+++ b/src/logic/__init__.py
@@ -1,5 +1,5 @@
-from .log import MyLogger
-from .dataclass import ApparatData, BookData, Prof
+from .log import MyLogger, logger
+from .dataclass import ApparatData, BookData, Prof, Apparat, ELSA
from .thread_bookgrabber import BookGrabber
from .threads_autoadder import AutoAdder
from .threads_availchecker import AvailChecker
diff --git a/src/logic/dataclass.py b/src/logic/dataclass.py
index 3720269..b8725cb 100644
--- a/src/logic/dataclass.py
+++ b/src/logic/dataclass.py
@@ -5,7 +5,7 @@ from enum import Enum
@dataclass
class Prof:
id: int = None
- title: str= None
+ _title: str = None
firstname: str= None
lastname: str= None
fullname: str= None
@@ -18,11 +18,20 @@ class Prof:
if hasattr(self, key):
setattr(self, key, value)
return self
-
+
+ @property
+ def title(self):
+ if self._title is None or self._title == "None":
+ return ""
+ return self._title
+
+ @title.setter
+ def title(self, value):
+ self._title = value
#add function that sets the data from a tuple
def from_tuple(self, data: tuple):
setattr(self, "id", data[0])
- setattr(self, "title", data[1])
+ setattr(self, "_title", data[1])
setattr(self, "firstname", data[2])
setattr(self, "lastname", data[3])
setattr(self, "fullname", data[4])
@@ -154,3 +163,51 @@ class Subjects(Enum):
if i.name == name:
return i.id - 1
+@dataclass
+class Apparat:
+ id: int | None = None
+ name: str | None = None
+ prof_id: int | None = None
+ subject: str | None = None
+ appnr: int | None = None
+ created_semester: str | None = None
+ extended_at: str | None = None
+ eternal: bool = False
+ extend_until: str | None = None
+ deleted: int | None = None
+ deleted_date: str | None = None
+ apparat_id_adis: str | None = None
+ prof_id_adis: str | None = None
+ konto: int | None = None
+
+ def from_tuple(self, data: tuple):
+ setattr(self, "id", data[0])
+ setattr(self, "name", data[1])
+ setattr(self, "prof_id", data[2])
+ setattr(self, "subject", data[3])
+ setattr(self, "appnr", data[4])
+ setattr(self, "created_semester", data[5])
+ setattr(self, "extended_at", data[6])
+ setattr(self, "eternal", data[7])
+ setattr(self, "extend_until", data[8])
+ setattr(self, "deleted", data[9])
+ setattr(self, "deleted_date", data[10])
+ setattr(self, "apparat_id_adis", data[11])
+ setattr(self, "prof_id_adis", data[12])
+ setattr(self, "konto", data[13])
+ return self
+
+
+@dataclass
+class ELSA:
+ id: int | None = None
+ date: str | None = None
+ semester: str | None = None
+ prof_id: int | None = None
+
+ def from_tuple(self, data):
+ setattr(self, "id", data[0])
+ setattr(self, "date", data[1])
+ setattr(self, "semester", data[2])
+ setattr(self, "prof_id", data[3])
+ return self
diff --git a/src/logic/log.py b/src/logic/log.py
index d7747d8..021c265 100644
--- a/src/logic/log.py
+++ b/src/logic/log.py
@@ -2,11 +2,24 @@ import logging
import logging.handlers
import os
+from loguru import logger as log
+import sys
+
+
if not os.path.exists("logs"):
os.mkdir("logs")
# open and close the file to create it
- with open("logs/application.log", "w") as f:
- pass
+logger = log
+logger.remove()
+logger.add("logs/application.log", rotation="50MB")
+# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO")
+logger.add(
+ sys.stdout,
+ colorize=True,
+ format="{time} {message}",
+ level="WARNING",
+)
+
log_filesize = 10 * 1024**2 # 10MB
backups = 5
diff --git a/src/ui/Ui_semesterapparat_ui.py b/src/ui/Ui_semesterapparat_ui.py
index 981e6aa..7ca795c 100644
--- a/src/ui/Ui_semesterapparat_ui.py
+++ b/src/ui/Ui_semesterapparat_ui.py
@@ -66,10 +66,10 @@ class Ui_MainWindow(object):
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.load_app = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2)
- self.load_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
- self.load_app.setObjectName("load_app")
- self.verticalLayout_2.addWidget(self.load_app)
+ self.create_document = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2)
+ self.create_document.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+ self.create_document.setObjectName("create_document")
+ 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")
@@ -795,8 +795,11 @@ class Ui_MainWindow(object):
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.actionDokumentation)
self.menuHelp.addAction(self.actionAbout)
self.menubar.addAction(self.menuDatei.menuAction())
@@ -842,8 +845,8 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Semesterapparatsmanagement"))
- self.load_app.setToolTip(_translate("MainWindow", "Load the Semesterapparate from the database"))
- self.load_app.setText(_translate("MainWindow", "App. aufrufen"))
+ 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)
@@ -953,6 +956,7 @@ class Ui_MainWindow(object):
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"))
+ 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)"))
diff --git a/src/ui/dialogs/dialog_sources/Ui_apparat_extend.py b/src/ui/dialogs/dialog_sources/Ui_apparat_extend.py
index 06217ab..f640967 100644
--- a/src/ui/dialogs/dialog_sources/Ui_apparat_extend.py
+++ b/src/ui/dialogs/dialog_sources/Ui_apparat_extend.py
@@ -1,6 +1,6 @@
# 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.6.1
+# Created by: PyQt6 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.
@@ -56,7 +56,7 @@ class Ui_Dialog(object):
self.sem_year.setGeometry(QtCore.QRect(10, 70, 121, 20))
self.sem_year.setObjectName("sem_year")
self.dauerapp = QtWidgets.QCheckBox(parent=Dialog)
- self.dauerapp.setGeometry(QtCore.QRect(150, 70, 91, 21))
+ self.dauerapp.setGeometry(QtCore.QRect(150, 70, 111, 21))
self.dauerapp.setObjectName("dauerapp")
self.retranslateUi(Dialog)
diff --git a/src/ui/dialogs/dialog_sources/Ui_confirm_extend.py b/src/ui/dialogs/dialog_sources/Ui_confirm_extend.py
index bcb7531..6d42379 100644
--- a/src/ui/dialogs/dialog_sources/Ui_confirm_extend.py
+++ b/src/ui/dialogs/dialog_sources/Ui_confirm_extend.py
@@ -1,6 +1,6 @@
# 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.6.1
+# Created by: PyQt6 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.
@@ -13,14 +13,16 @@ class Ui_extend_confirm(object):
def setupUi(self, extend_confirm):
extend_confirm.setObjectName("extend_confirm")
extend_confirm.resize(380, 97)
+ self.horizontalLayout = QtWidgets.QHBoxLayout(extend_confirm)
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.textEdit = QtWidgets.QTextEdit(parent=extend_confirm)
+ self.textEdit.setObjectName("textEdit")
+ self.horizontalLayout.addWidget(self.textEdit)
self.buttonBox = QtWidgets.QDialogButtonBox(parent=extend_confirm)
- self.buttonBox.setGeometry(QtCore.QRect(290, 20, 81, 241))
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Vertical)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox")
- self.textEdit = QtWidgets.QTextEdit(parent=extend_confirm)
- self.textEdit.setGeometry(QtCore.QRect(10, 10, 271, 81))
- self.textEdit.setObjectName("textEdit")
+ self.horizontalLayout.addWidget(self.buttonBox)
self.retranslateUi(extend_confirm)
self.buttonBox.accepted.connect(extend_confirm.accept) # type: ignore
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 a6f937f..7f4fc1f 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,6 +1,6 @@
# 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.6.1
+# Created by: PyQt6 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.
@@ -337,17 +337,19 @@ class Ui_Dialog(object):
self.gridLayout_5.addLayout(self.verticalLayout_4, 6, 1, 1, 1)
self.stackedWidget.addWidget(self.page)
self.verticalLayout.addWidget(self.stackedWidget)
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
- self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Discard|QtWidgets.QDialogButtonBox.StandardButton.Ok)
- self.buttonBox.setCenterButtons(False)
self.buttonBox.setObjectName("buttonBox")
- self.verticalLayout.addWidget(self.buttonBox)
+ self.horizontalLayout.addWidget(self.buttonBox)
+ self.retryButton = QtWidgets.QPushButton(parent=Dialog)
+ self.retryButton.setObjectName("retryButton")
+ self.horizontalLayout.addWidget(self.retryButton)
+ self.verticalLayout.addLayout(self.horizontalLayout)
self.retranslateUi(Dialog)
- self.stackedWidget.setCurrentIndex(0)
- self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
- self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
+ self.stackedWidget.setCurrentIndex(3)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -406,3 +408,4 @@ class Ui_Dialog(object):
self.copy_filename.setText(_translate("Dialog", "Kopieren"))
self.copy_ilias_filename.setText(_translate("Dialog", "Kopieren"))
self.copy_qoute.setText(_translate("Dialog", "Kopieren"))
+ self.retryButton.setText(_translate("Dialog", "Wiederholen"))
diff --git a/src/ui/dialogs/dialog_sources/Ui_mail_preview.py b/src/ui/dialogs/dialog_sources/Ui_mail_preview.py
index cf6d8f2..2df1d4f 100644
--- a/src/ui/dialogs/dialog_sources/Ui_mail_preview.py
+++ b/src/ui/dialogs/dialog_sources/Ui_mail_preview.py
@@ -1,6 +1,6 @@
# 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.6.1
+# Created by: PyQt6 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.
@@ -102,7 +102,7 @@ class Ui_eMailPreview(object):
def retranslateUi(self, eMailPreview):
_translate = QtCore.QCoreApplication.translate
eMailPreview.setWindowTitle(_translate("eMailPreview", "eMail Voransicht"))
- self.label_6.setText(_translate("eMailPreview", "Geschlecht"))
+ self.label_6.setText(_translate("eMailPreview", "Anrede"))
self.label_2.setText(_translate("eMailPreview", "Prof"))
self.label_5.setText(_translate("eMailPreview", "Art"))
self.label_4.setText(_translate("eMailPreview", "Betreff"))
diff --git a/src/ui/dialogs/dialog_sources/Ui_settings.py b/src/ui/dialogs/dialog_sources/Ui_settings.py
index f88db08..4e266e8 100644
--- a/src/ui/dialogs/dialog_sources/Ui_settings.py
+++ b/src/ui/dialogs/dialog_sources/Ui_settings.py
@@ -1,6 +1,6 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\settings.ui'
#
-# Created by: PyQt6 UI code generator 6.6.1
+# Created by: PyQt6 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.
@@ -12,149 +12,188 @@ from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
- Dialog.resize(750, 580)
- self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
- self.buttonBox.setGeometry(QtCore.QRect(120, 540, 621, 32))
- self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
- self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
- self.buttonBox.setObjectName("buttonBox")
- self.frame = QtWidgets.QFrame(parent=Dialog)
- self.frame.setGeometry(QtCore.QRect(0, 0, 751, 541))
- self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
- self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
- self.frame.setObjectName("frame")
- self.label_2 = QtWidgets.QLabel(parent=self.frame)
- self.label_2.setGeometry(QtCore.QRect(10, 20, 161, 21))
- self.label_2.setObjectName("label_2")
- self.formLayoutWidget = QtWidgets.QWidget(parent=self.frame)
- self.formLayoutWidget.setGeometry(QtCore.QRect(10, 40, 361, 491))
- self.formLayoutWidget.setObjectName("formLayoutWidget")
- self.gridLayout = QtWidgets.QGridLayout(self.formLayoutWidget)
- self.gridLayout.setContentsMargins(0, 0, 0, 0)
- self.gridLayout.setObjectName("gridLayout")
- self.tb_select_db = QtWidgets.QToolButton(parent=self.formLayoutWidget)
- self.tb_select_db.setObjectName("tb_select_db")
- self.gridLayout.addWidget(self.tb_select_db, 0, 2, 1, 1)
- self.db_path = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
+ Dialog.setWindowModality(QtCore.Qt.WindowModality.NonModal)
+ Dialog.resize(651, 679)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
+ Dialog.setSizePolicy(sizePolicy)
+ self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.toolBox = QtWidgets.QToolBox(parent=Dialog)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.toolBox.sizePolicy().hasHeightForWidth())
+ self.toolBox.setSizePolicy(sizePolicy)
+ self.toolBox.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone)
+ self.toolBox.setObjectName("toolBox")
+ self.page_1 = QtWidgets.QWidget()
+ self.page_1.setGeometry(QtCore.QRect(0, 0, 633, 511))
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.page_1.sizePolicy().hasHeightForWidth())
+ self.page_1.setSizePolicy(sizePolicy)
+ self.page_1.setObjectName("page_1")
+ self.gridLayout_3 = QtWidgets.QGridLayout(self.page_1)
+ self.gridLayout_3.setObjectName("gridLayout_3")
+ self.db_name = QtWidgets.QLineEdit(parent=self.page_1)
+ self.db_name.setObjectName("db_name")
+ self.gridLayout_3.addWidget(self.db_name, 0, 1, 1, 1)
+ self.label_5 = QtWidgets.QLabel(parent=self.page_1)
+ self.label_5.setObjectName("label_5")
+ self.gridLayout_3.addWidget(self.label_5, 0, 0, 1, 1)
+ self.db_path = QtWidgets.QLineEdit(parent=self.page_1)
self.db_path.setEnabled(False)
self.db_path.setObjectName("db_path")
- self.gridLayout.addWidget(self.db_path, 1, 1, 1, 1)
- self.label_3 = QtWidgets.QLabel(parent=self.formLayoutWidget)
- self.label_3.setObjectName("label_3")
- self.gridLayout.addWidget(self.label_3, 0, 0, 1, 1)
- self.db_name = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
- self.db_name.setObjectName("db_name")
- self.gridLayout.addWidget(self.db_name, 0, 1, 1, 1)
- self.label_4 = QtWidgets.QLabel(parent=self.formLayoutWidget)
- self.label_4.setObjectName("label_4")
- self.gridLayout.addWidget(self.label_4, 1, 0, 1, 1)
- self.save_path = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
- self.save_path.setObjectName("save_path")
- self.gridLayout.addWidget(self.save_path, 2, 1, 1, 1)
- self.tb_set_save_path = QtWidgets.QToolButton(parent=self.formLayoutWidget)
+ self.gridLayout_3.addWidget(self.db_path, 1, 1, 1, 1)
+ self.label_12 = QtWidgets.QLabel(parent=self.page_1)
+ self.label_12.setObjectName("label_12")
+ self.gridLayout_3.addWidget(self.label_12, 2, 0, 1, 1)
+ self.label_11 = QtWidgets.QLabel(parent=self.page_1)
+ self.label_11.setObjectName("label_11")
+ self.gridLayout_3.addWidget(self.label_11, 1, 0, 1, 1)
+ self.tb_set_save_path = QtWidgets.QToolButton(parent=self.page_1)
self.tb_set_save_path.setObjectName("tb_set_save_path")
- self.gridLayout.addWidget(self.tb_set_save_path, 2, 2, 1, 1)
+ self.gridLayout_3.addWidget(self.tb_set_save_path, 2, 2, 1, 1)
+ self.tb_select_db = QtWidgets.QToolButton(parent=self.page_1)
+ self.tb_select_db.setObjectName("tb_select_db")
+ self.gridLayout_3.addWidget(self.tb_select_db, 0, 2, 1, 1)
+ self.save_path = QtWidgets.QLineEdit(parent=self.page_1)
+ self.save_path.setObjectName("save_path")
+ self.gridLayout_3.addWidget(self.save_path, 2, 1, 1, 1)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
- self.gridLayout.addItem(spacerItem, 3, 1, 1, 1)
- self.label_5 = QtWidgets.QLabel(parent=self.formLayoutWidget)
- self.label_5.setObjectName("label_5")
- self.gridLayout.addWidget(self.label_5, 2, 0, 1, 1)
- self.email_settings = QtWidgets.QTabWidget(parent=self.frame)
- self.email_settings.setGeometry(QtCore.QRect(390, 40, 341, 491))
+ self.gridLayout_3.addItem(spacerItem, 3, 1, 1, 1)
+ self.toolBox.addItem(self.page_1, "")
+ self.page_2 = QtWidgets.QWidget()
+ self.page_2.setObjectName("page_2")
+ self.gridLayout = QtWidgets.QGridLayout(self.page_2)
+ self.gridLayout.setObjectName("gridLayout")
+ self.zotero_library_type = QtWidgets.QLineEdit(parent=self.page_2)
+ self.zotero_library_type.setObjectName("zotero_library_type")
+ self.gridLayout.addWidget(self.zotero_library_type, 2, 2, 1, 1)
+ self.zotero_library_id = QtWidgets.QLineEdit(parent=self.page_2)
+ self.zotero_library_id.setObjectName("zotero_library_id")
+ self.gridLayout.addWidget(self.zotero_library_id, 1, 2, 1, 1)
+ self.label_4 = QtWidgets.QLabel(parent=self.page_2)
+ self.label_4.setObjectName("label_4")
+ self.gridLayout.addWidget(self.label_4, 2, 0, 1, 1)
+ self.label_3 = QtWidgets.QLabel(parent=self.page_2)
+ self.label_3.setObjectName("label_3")
+ self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
+ self.zotero_api_key = QtWidgets.QLineEdit(parent=self.page_2)
+ self.zotero_api_key.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhHiddenText|QtCore.Qt.InputMethodHint.ImhSensitiveData)
+ self.zotero_api_key.setObjectName("zotero_api_key")
+ self.gridLayout.addWidget(self.zotero_api_key, 0, 2, 1, 1)
+ self.label_2 = QtWidgets.QLabel(parent=self.page_2)
+ self.label_2.setObjectName("label_2")
+ self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
+ self.toggle_api_visibility = QtWidgets.QToolButton(parent=self.page_2)
+ self.toggle_api_visibility.setText("")
+ self.toggle_api_visibility.setObjectName("toggle_api_visibility")
+ self.gridLayout.addWidget(self.toggle_api_visibility, 0, 3, 1, 1)
+ spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+ self.gridLayout.addItem(spacerItem1, 3, 2, 1, 1)
+ self.toolBox.addItem(self.page_2, "")
+ self.page_3 = QtWidgets.QWidget()
+ self.page_3.setGeometry(QtCore.QRect(0, 0, 633, 511))
+ self.page_3.setObjectName("page_3")
+ self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.page_3)
+ self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+ self.email_settings = QtWidgets.QTabWidget(parent=self.page_3)
self.email_settings.setObjectName("email_settings")
self.email_settingsPage1_2 = QtWidgets.QWidget()
self.email_settingsPage1_2.setObjectName("email_settingsPage1_2")
- self.formLayoutWidget_2 = QtWidgets.QWidget(parent=self.email_settingsPage1_2)
- self.formLayoutWidget_2.setGeometry(QtCore.QRect(10, 30, 321, 381))
- self.formLayoutWidget_2.setObjectName("formLayoutWidget_2")
- self.gridLayout_2 = QtWidgets.QGridLayout(self.formLayoutWidget_2)
- self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.email_settingsPage1_2)
+ self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+ self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
- self.smtp_address = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
+ self.smtp_address = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.smtp_address.setClearButtonEnabled(True)
self.smtp_address.setObjectName("smtp_address")
self.gridLayout_2.addWidget(self.smtp_address, 0, 1, 1, 1)
- self.label_8 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
+ self.label_8 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_8.setObjectName("label_8")
self.gridLayout_2.addWidget(self.label_8, 3, 0, 1, 1)
- self.use_username_smtp_login = QtWidgets.QCheckBox(parent=self.formLayoutWidget_2)
+ self.use_username_smtp_login = QtWidgets.QCheckBox(parent=self.email_settingsPage1_2)
self.use_username_smtp_login.setTristate(False)
self.use_username_smtp_login.setObjectName("use_username_smtp_login")
self.gridLayout_2.addWidget(self.use_username_smtp_login, 4, 1, 1, 1)
- self.mail_username = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
+ self.mail_username = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.mail_username.setClearButtonEnabled(True)
self.mail_username.setObjectName("mail_username")
self.gridLayout_2.addWidget(self.mail_username, 3, 1, 1, 1)
- self.smtp_port = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
+ self.smtp_port = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.smtp_port.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhDigitsOnly|QtCore.Qt.InputMethodHint.ImhPreferNumbers)
self.smtp_port.setClearButtonEnabled(True)
self.smtp_port.setObjectName("smtp_port")
self.gridLayout_2.addWidget(self.smtp_port, 1, 1, 1, 1)
- self.label_10 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
+ self.label_10 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_10.setObjectName("label_10")
self.gridLayout_2.addWidget(self.label_10, 5, 0, 1, 1)
- self.label_7 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
+ self.label_7 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_7.setObjectName("label_7")
self.gridLayout_2.addWidget(self.label_7, 2, 0, 1, 1)
- self.label_9 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
+ self.label_9 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_9.setText("")
self.label_9.setObjectName("label_9")
self.gridLayout_2.addWidget(self.label_9, 6, 0, 1, 1)
- self.sender_email = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
+ self.sender_email = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.sender_email.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhEmailCharactersOnly)
self.sender_email.setClearButtonEnabled(True)
self.sender_email.setObjectName("sender_email")
self.gridLayout_2.addWidget(self.sender_email, 2, 1, 1, 1)
- self.label = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
+ self.label = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label.setObjectName("label")
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
- self.password = QtWidgets.QLineEdit(parent=self.formLayoutWidget_2)
+ self.password = QtWidgets.QLineEdit(parent=self.email_settingsPage1_2)
self.password.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhHiddenText|QtCore.Qt.InputMethodHint.ImhSensitiveData)
self.password.setClearButtonEnabled(True)
self.password.setObjectName("password")
self.gridLayout_2.addWidget(self.password, 5, 1, 1, 1)
- self.label_6 = QtWidgets.QLabel(parent=self.formLayoutWidget_2)
+ self.label_6 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_6.setObjectName("label_6")
self.gridLayout_2.addWidget(self.label_6, 1, 0, 1, 1)
- self.togglePassword = QtWidgets.QPushButton(parent=self.formLayoutWidget_2)
+ self.togglePassword = QtWidgets.QPushButton(parent=self.email_settingsPage1_2)
self.togglePassword.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.togglePassword.setText("")
self.togglePassword.setObjectName("togglePassword")
self.gridLayout_2.addWidget(self.togglePassword, 5, 2, 1, 1)
+ self.horizontalLayout_4.addLayout(self.gridLayout_2)
self.email_settings.addTab(self.email_settingsPage1_2, "")
self.email_settingsPage2_2 = QtWidgets.QWidget()
self.email_settingsPage2_2.setObjectName("email_settingsPage2_2")
- self.verticalLayoutWidget = QtWidgets.QWidget(parent=self.email_settingsPage2_2)
- self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 0, 321, 71))
- self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
- self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
- self.verticalLayout.setContentsMargins(0, 0, 0, 0)
- self.verticalLayout.setObjectName("verticalLayout")
+ self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.email_settingsPage2_2)
+ self.verticalLayout_3.setObjectName("verticalLayout_3")
+ self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
- spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.horizontalLayout_3.addItem(spacerItem1)
- self.bold = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
+ spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+ self.horizontalLayout_3.addItem(spacerItem2)
+ self.bold = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
self.bold.setCheckable(True)
self.bold.setObjectName("bold")
self.horizontalLayout_3.addWidget(self.bold)
- self.italic = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
+ self.italic = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
self.italic.setCheckable(True)
self.italic.setObjectName("italic")
self.horizontalLayout_3.addWidget(self.italic)
- self.underscore = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
+ self.underscore = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
self.underscore.setCheckable(True)
self.underscore.setObjectName("underscore")
self.horizontalLayout_3.addWidget(self.underscore)
- spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.horizontalLayout_3.addItem(spacerItem2)
- self.verticalLayout.addLayout(self.horizontalLayout_3)
+ spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+ self.horizontalLayout_3.addItem(spacerItem3)
+ self.verticalLayout_2.addLayout(self.horizontalLayout_3)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
- self.fontComboBox = QtWidgets.QFontComboBox(parent=self.verticalLayoutWidget)
+ self.fontComboBox = QtWidgets.QFontComboBox(parent=self.email_settingsPage2_2)
self.fontComboBox.setObjectName("fontComboBox")
self.horizontalLayout.addWidget(self.fontComboBox)
- self.font_size = QtWidgets.QComboBox(parent=self.verticalLayoutWidget)
+ self.font_size = QtWidgets.QComboBox(parent=self.email_settingsPage2_2)
self.font_size.setObjectName("font_size")
self.font_size.addItem("")
self.font_size.addItem("")
@@ -172,40 +211,92 @@ class Ui_Dialog(object):
self.font_size.addItem("")
self.font_size.addItem("")
self.horizontalLayout.addWidget(self.font_size)
- spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.horizontalLayout.addItem(spacerItem3)
- self.verticalLayout.addLayout(self.horizontalLayout)
+ spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+ self.horizontalLayout.addItem(spacerItem4)
+ self.verticalLayout_2.addLayout(self.horizontalLayout)
+ self.verticalLayout_3.addLayout(self.verticalLayout_2)
self.editSignature = QtWidgets.QTextEdit(parent=self.email_settingsPage2_2)
- self.editSignature.setGeometry(QtCore.QRect(10, 80, 321, 301))
self.editSignature.setObjectName("editSignature")
+ self.verticalLayout_3.addWidget(self.editSignature)
self.debug = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
- self.debug.setGeometry(QtCore.QRect(30, 430, 75, 24))
self.debug.setObjectName("debug")
+ self.verticalLayout_3.addWidget(self.debug)
self.email_settings.addTab(self.email_settingsPage2_2, "")
- self.label_3.setBuddy(self.db_name)
- self.label_4.setBuddy(self.db_path)
- self.label_5.setBuddy(self.save_path)
+ self.horizontalLayout_2.addWidget(self.email_settings)
+ self.toolBox.addItem(self.page_3, "")
+ self.page_4 = QtWidgets.QWidget()
+ self.page_4.setObjectName("page_4")
+ self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.page_4)
+ self.verticalLayout_4.setObjectName("verticalLayout_4")
+ self.groupBox = QtWidgets.QGroupBox(parent=self.page_4)
+ font = QtGui.QFont()
+ font.setPointSize(12)
+ font.setBold(True)
+ self.groupBox.setFont(font)
+ self.groupBox.setObjectName("groupBox")
+ self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox)
+ self.verticalLayout_5.setObjectName("verticalLayout_5")
+ self.scrollArea_3 = QtWidgets.QScrollArea(parent=self.groupBox)
+ self.scrollArea_3.setWidgetResizable(True)
+ self.scrollArea_3.setObjectName("scrollArea_3")
+ self.scrollAreaWidgetContents_3 = QtWidgets.QWidget()
+ self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 593, 201))
+ self.scrollAreaWidgetContents_3.setObjectName("scrollAreaWidgetContents_3")
+ self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents_3)
+ self.verticalLayout_7.setObjectName("verticalLayout_7")
+ self.gridLayout_4 = QtWidgets.QGridLayout()
+ self.gridLayout_4.setObjectName("gridLayout_4")
+ self.verticalLayout_7.addLayout(self.gridLayout_4)
+ self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3)
+ self.verticalLayout_5.addWidget(self.scrollArea_3)
+ self.verticalLayout_4.addWidget(self.groupBox)
+ self.scrollArea_2 = QtWidgets.QScrollArea(parent=self.page_4)
+ self.scrollArea_2.setWidgetResizable(True)
+ self.scrollArea_2.setObjectName("scrollArea_2")
+ self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
+ self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 613, 241))
+ self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
+ self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents_2)
+ self.verticalLayout_6.setObjectName("verticalLayout_6")
+ self.formLayout = QtWidgets.QFormLayout()
+ self.formLayout.setObjectName("formLayout")
+ self.verticalLayout_6.addLayout(self.formLayout)
+ self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2)
+ self.verticalLayout_4.addWidget(self.scrollArea_2)
+ self.toolBox.addItem(self.page_4, "")
+ self.verticalLayout.addWidget(self.toolBox)
+ self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog)
+ self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
+ self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
+ self.buttonBox.setObjectName("buttonBox")
+ self.verticalLayout.addWidget(self.buttonBox)
+ self.label_5.setBuddy(self.db_name)
+ self.label_12.setBuddy(self.save_path)
+ self.label_11.setBuddy(self.db_path)
self.retranslateUi(Dialog)
+ self.toolBox.setCurrentIndex(3)
self.email_settings.setCurrentIndex(0)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog)
- Dialog.setTabOrder(self.db_name, self.db_path)
- Dialog.setTabOrder(self.db_path, self.save_path)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
- Dialog.setWindowTitle(_translate("Dialog", "Einstellungen"))
- self.label_2.setText(_translate("Dialog", "Allgemeine Einstellungen"))
- self.tb_select_db.setText(_translate("Dialog", "..."))
- self.label_3.setToolTip(_translate("Dialog", "
Name der Datenbank, welche verwendet werden soll. Muss auf .db enden
"))
- self.label_3.setText(_translate("Dialog", "Datenbankname"))
+ Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.db_name.setText(_translate("Dialog", "sap.db"))
- self.label_4.setText(_translate("Dialog", "Datenbankpfad"))
+ self.label_5.setToolTip(_translate("Dialog", "Name der Datenbank, welche verwendet werden soll. Muss auf .db enden
"))
+ self.label_5.setText(_translate("Dialog", "Datenbankname"))
+ self.label_12.setToolTip(_translate("Dialog", "Pfad, an dem heruntergeladene Dateien gespeichert werden sollen"))
+ self.label_12.setText(_translate("Dialog", "Temporäre Dateien"))
+ self.label_11.setText(_translate("Dialog", "Datenbankpfad"))
self.tb_set_save_path.setText(_translate("Dialog", "..."))
- self.label_5.setToolTip(_translate("Dialog", "Pfad, an dem heruntergeladene Dateien gespeichert werden sollen"))
- self.label_5.setText(_translate("Dialog", "Temporäre Dateien"))
+ self.tb_select_db.setText(_translate("Dialog", "..."))
+ self.toolBox.setItemText(self.toolBox.indexOf(self.page_1), _translate("Dialog", "Datenbank"))
+ self.label_4.setText(_translate("Dialog", "Bibliothekstyp"))
+ self.label_3.setText(_translate("Dialog", "Bibliotheks-ID"))
+ self.label_2.setText(_translate("Dialog", "API Key"))
+ self.toolBox.setItemText(self.toolBox.indexOf(self.page_2), _translate("Dialog", "Zotero"))
self.label_8.setText(_translate("Dialog", "Nutzername"))
self.use_username_smtp_login.setStatusTip(_translate("Dialog", "Anklicken, wenn Nutzername benötigt wird, um sich beim Server anzumelden"))
self.use_username_smtp_login.setText(_translate("Dialog", "Nutzername zum\n"
@@ -236,3 +327,6 @@ class Ui_Dialog(object):
self.font_size.setItemText(14, _translate("Dialog", "72"))
self.debug.setText(_translate("Dialog", "Debug"))
self.email_settings.setTabText(self.email_settings.indexOf(self.email_settingsPage2_2), _translate("Dialog", "Signatur"))
+ self.toolBox.setItemText(self.toolBox.indexOf(self.page_3), _translate("Dialog", "e-Mail"))
+ self.groupBox.setTitle(_translate("Dialog", "Farben"))
+ self.toolBox.setItemText(self.toolBox.indexOf(self.page_4), _translate("Dialog", "Icons"))
diff --git a/src/ui/dialogs/dialog_sources/apparat_extend.ui b/src/ui/dialogs/dialog_sources/apparat_extend.ui
index f8b513e..d32a643 100644
--- a/src/ui/dialogs/dialog_sources/apparat_extend.ui
+++ b/src/ui/dialogs/dialog_sources/apparat_extend.ui
@@ -144,7 +144,7 @@
150
70
- 91
+ 111
21
diff --git a/src/ui/dialogs/dialog_sources/confirm_extend.ui b/src/ui/dialogs/dialog_sources/confirm_extend.ui
index 7b2cde2..9d8b5e7 100644
--- a/src/ui/dialogs/dialog_sources/confirm_extend.ui
+++ b/src/ui/dialogs/dialog_sources/confirm_extend.ui
@@ -13,32 +13,21 @@
Dialog
-
-
-
- 290
- 20
- 81
- 241
-
-
-
- Qt::Vertical
-
-
- QDialogButtonBox::Cancel|QDialogButtonBox::Ok
-
-
-
-
-
- 10
- 10
- 271
- 81
-
-
-
+
+ -
+
+
+ -
+
+
+ Qt::Vertical
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
diff --git a/src/ui/dialogs/dialog_sources/elsa_add_table_entry.ui b/src/ui/dialogs/dialog_sources/elsa_add_table_entry.ui
index 07ce0db..1f44d99 100644
--- a/src/ui/dialogs/dialog_sources/elsa_add_table_entry.ui
+++ b/src/ui/dialogs/dialog_sources/elsa_add_table_entry.ui
@@ -113,7 +113,7 @@
-
- 0
+ 3
@@ -684,53 +684,25 @@ Nachname, Vorname
-
-
-
- Qt::Horizontal
-
-
- QDialogButtonBox::Cancel|QDialogButtonBox::Discard|QDialogButtonBox::Ok
-
-
- false
-
-
+
+
-
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Discard|QDialogButtonBox::Ok
+
+
+
+ -
+
+
+ Wiederholen
+
+
+
+
-
-
- buttonBox
- accepted()
- Dialog
- accept()
-
-
- 266
- 472
-
-
- 157
- 274
-
-
-
-
- buttonBox
- rejected()
- Dialog
- reject()
-
-
- 334
- 472
-
-
- 286
- 274
-
-
-
-
+
diff --git a/src/ui/dialogs/dialog_sources/settings.ui b/src/ui/dialogs/dialog_sources/settings.ui
index 204b157..4551513 100644
--- a/src/ui/dialogs/dialog_sources/settings.ui
+++ b/src/ui/dialogs/dialog_sources/settings.ui
@@ -2,505 +2,610 @@
Dialog
+
+ Qt::NonModal
+
0
0
- 750
- 580
+ 651
+ 679
-
- Einstellungen
+
+
+ 0
+ 0
+
-
-
-
- 120
- 540
- 621
- 32
-
-
-
- Qt::Horizontal
-
-
- QDialogButtonBox::Cancel|QDialogButtonBox::Ok
-
-
-
-
-
- 0
- 0
- 751
- 541
-
-
-
- QFrame::StyledPanel
-
-
- QFrame::Raised
-
-
-
-
- 10
- 20
- 161
- 21
-
-
-
- Allgemeine Einstellungen
-
-
-
-
-
- 10
- 40
- 361
- 491
-
-
-
- -
-
-
- ...
-
-
-
- -
-
-
- false
-
-
-
- -
-
-
- <html><head/><body><p>Name der Datenbank, welche verwendet werden soll. <span style=" font-weight:600;">Muss</span> auf .db enden</p></body></html>
-
-
- Datenbankname
-
-
- db_name
-
-
-
- -
-
-
- sap.db
-
-
-
- -
-
-
- Datenbankpfad
-
-
- db_path
-
-
-
- -
-
-
- -
-
-
- ...
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- Pfad, an dem heruntergeladene Dateien gespeichert werden sollen
-
-
- Temporäre Dateien
-
-
- save_path
-
-
-
-
-
-
-
-
- 390
- 40
- 341
- 491
-
-
-
- 0
-
-
-
- Allgemeines
-
-
+
+ Dialog
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::ImhNone
+
+
+ 3
+
+
- 10
- 30
- 321
- 381
+ 0
+ 0
+ 633
+ 511
-
+
+
+ 0
+ 0
+
+
+
+ Datenbank
+
+
-
-
-
- true
-
-
-
- -
-
+
- Nutzername
-
-
-
- -
-
-
- Anklicken, wenn Nutzername benötigt wird, um sich beim Server anzumelden
-
-
- Nutzername zum
- Anmelden verwenden
-
-
- false
-
-
-
- -
-
-
- Kürzel, von der Hochschule vergeben, bsp: Aky547
-
-
- true
-
-
-
- -
-
-
- Qt::ImhDigitsOnly|Qt::ImhPreferNumbers
-
-
- true
-
-
-
- -
-
-
- Passwort
-
-
-
- -
-
-
- Sender-eMail
-
-
-
- -
-
-
-
-
-
-
- -
-
-
- Qt::ImhEmailCharactersOnly
-
-
- true
+ sap.db
-
-
+
+
+ <html><head/><body><p>Name der Datenbank, welche verwendet werden soll. <span style=" font-weight:600;">Muss</span> auf .db enden</p></body></html>
+
- SMTP-Server
+ Datenbankname
+
+
+ db_name
- -
-
-
- Qt::ImhHiddenText|Qt::ImhSensitiveData
+
-
+
+
+ false
-
- true
+
+
+ -
+
+
+ Pfad, an dem heruntergeladene Dateien gespeichert werden sollen
+
+
+ Temporäre Dateien
+
+
+ save_path
-
-
+
- Port
+ Datenbankpfad
+
+
+ db_path
- -
-
-
- Qt::NoFocus
+
-
+
+
+ ...
+
+
+ -
+
+
+ ...
+
+
+
+ -
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
+ Zotero
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ Bibliothekstyp
+
+
+
+ -
+
+
+ Bibliotheks-ID
+
+
+
+ -
+
+
+ Qt::ImhHiddenText|Qt::ImhSensitiveData
+
+
+
+ -
+
+
+ API Key
+
+
+
+ -
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
-
-
-
- Signatur
-
-
+
- 10
+ 0
0
- 321
- 71
+ 633
+ 511
-
+
+ e-Mail
+
+
-
-
-
-
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Fett
-
-
- true
-
-
-
- -
-
-
- Kursiv
-
-
- true
-
-
-
- -
-
-
- Unterstrichen
-
-
- true
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
- -
-
-
-
-
-
- -
-
+
+
+ 0
+
+
+
+ Allgemeines
+
+
-
-
- 8
-
+
+
-
+
+
+ true
+
+
+
+ -
+
+
+ Nutzername
+
+
+
+ -
+
+
+ Anklicken, wenn Nutzername benötigt wird, um sich beim Server anzumelden
+
+
+ Nutzername zum
+ Anmelden verwenden
+
+
+ false
+
+
+
+ -
+
+
+ Kürzel, von der Hochschule vergeben, bsp: Aky547
+
+
+ true
+
+
+
+ -
+
+
+ Qt::ImhDigitsOnly|Qt::ImhPreferNumbers
+
+
+ true
+
+
+
+ -
+
+
+ Passwort
+
+
+
+ -
+
+
+ Sender-eMail
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ Qt::ImhEmailCharactersOnly
+
+
+ true
+
+
+
+ -
+
+
+ SMTP-Server
+
+
+
+ -
+
+
+ Qt::ImhHiddenText|Qt::ImhSensitiveData
+
+
+ true
+
+
+
+ -
+
+
+ Port
+
+
+
+ -
+
+
+ Qt::NoFocus
+
+
+
+
+
+
+
+
+
+
+
+
+ Signatur
+
+
+ -
+
+
-
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ Fett
+
+
+ true
+
+
+
+ -
+
+
+ Kursiv
+
+
+ true
+
+
+
+ -
+
+
+ Unterstrichen
+
+
+ true
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
+
+
-
+
+
+ -
+
+
-
+
+ 8
+
+
+ -
+
+ 9
+
+
+ -
+
+ 11
+
+
+ -
+
+ 12
+
+
+ -
+
+ 14
+
+
+ -
+
+ 16
+
+
+ -
+
+ 18
+
+
+ -
+
+ 20
+
+
+ -
+
+ 22
+
+
+ -
+
+ 24
+
+
+ -
+
+ 26
+
+
+ -
+
+ 28
+
+
+ -
+
+ 36
+
+
+ -
+
+ 48
+
+
+ -
+
+ 72
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+
-
-
- 9
-
+
-
-
- 11
-
+
+
+ Debug
+
+
- -
-
- 12
-
-
- -
-
- 14
-
-
- -
-
- 16
-
-
- -
-
- 18
-
-
- -
-
- 20
-
-
- -
-
- 22
-
-
- -
-
- 24
-
-
- -
-
- 26
-
-
- -
-
- 28
-
-
- -
-
- 36
-
-
- -
-
- 48
-
-
- -
-
- 72
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
+
+
+
-
-
-
- 10
- 80
- 321
- 301
-
-
-
-
-
-
- 30
- 430
- 75
- 24
-
-
-
- Debug
-
+
+
+ Icons
+
+
+ -
+
+
+
+ 12
+ true
+
+
+
+ Farben
+
+
+
-
+
+
+ true
+
+
+
+
+ 0
+ 0
+ 593
+ 201
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+ -
+
+
+ true
+
+
+
+
+ 0
+ 0
+ 613
+ 241
+
+
+
+
-
+
+
+
+
+
+
+
-
-
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
-
- db_name
- db_path
- save_path
-
-
-
-
+
buttonBox
@@ -509,8 +614,8 @@
accept()
- 358
- 540
+ 227
+ 563
157
@@ -525,8 +630,8 @@
reject()
- 426
- 540
+ 295
+ 569
286
diff --git a/src/ui/dialogs/elsa_add_entry.py b/src/ui/dialogs/elsa_add_entry.py
index 1e0f23f..9b5a8e4 100644
--- a/src/ui/dialogs/elsa_add_entry.py
+++ b/src/ui/dialogs/elsa_add_entry.py
@@ -54,7 +54,8 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
self.book_pages.textChanged.connect(self.check_pages)
self.hg_pages.textChanged.connect(self.check_pages)
self.zs_pages.textChanged.connect(self.check_pages)
-
+ self.retryButton.clicked.connect(self.retry)
+
def check_pages(self):
if self.source_pages:
if self.book_pages.text() !=self.source_pages:
@@ -73,6 +74,15 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
for line in self.findChildren(QtWidgets.QTextEdit):
line.clear()
+ def retry(self):
+ match self.mode:
+ case "book":
+ self.stackedWidget.setCurrentIndex(0)
+ case "hg":
+ self.stackedWidget.setCurrentIndex(1)
+ case "zs":
+ self.stackedWidget.setCurrentIndex(2)
+
def stack(self):
self.stackedWidget.setEnabled(True)
if self.btn_mono.isChecked():
@@ -162,7 +172,8 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
self.ilias_filename.setText(ilias_name)
self.stackedWidget.setCurrentIndex(3)
- def search(self):
+ def search(self, pages=None):
+ print("searching")
param = self.searchIdent.text()
web = WebRequest()
web.get_ppn(param)
@@ -172,9 +183,9 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
bib = BibTextTransformer("ARRAY")
bib.get_data(data)
data = bib.return_data()
- self.setdata(data)
+ self.setdata(data, pages)
- def setdata(self, data):
+ def setdata(self, data, pages=None):
# use field to set data in the correct fields
fields = self.findChildren(QtWidgets.QLineEdit)
self.source_pages = data.pages
@@ -201,6 +212,10 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
c_field.setText(c_data)
if "Seiten" in c_field.text():
self.source_pages = c_field.text()
+
+ if pages:
+ self.source_pages = pages
+ eval(f"self.{self.mode}_pages").setText(pages)
def launch():
app = QtWidgets.QApplication([])
dialog = ElsaAddEntry()
diff --git a/src/ui/dialogs/mail.py b/src/ui/dialogs/mail.py
index f43d484..f80b716 100644
--- a/src/ui/dialogs/mail.py
+++ b/src/ui/dialogs/mail.py
@@ -51,6 +51,7 @@ class Mail_Dialog(QtWidgets.QDialog, MailPreviewDialog):
# app_subject,
# prof_name,
)
+
logger.log_info("Setting up mail dialog")
self.appid = app_id
self.appname = app_name
diff --git a/src/ui/dialogs/parsed_titles.py b/src/ui/dialogs/parsed_titles.py
index df542a6..e3d06a0 100644
--- a/src/ui/dialogs/parsed_titles.py
+++ b/src/ui/dialogs/parsed_titles.py
@@ -28,7 +28,7 @@ class ParsedTitles(QtWidgets.QWidget, Ui_Form):
self.progressBar.setValue(value)
def worker_quit(self):
- print("Terminating worker")
+ # print("Terminating worker")
self.worker.terminate()
self.worker.quit()
self.worker.deleteLater()
@@ -62,7 +62,7 @@ class ParsedTitles(QtWidgets.QWidget, Ui_Form):
def determine_progress(self, signal):
# check length of listWidget
length = self.listWidget.count()
- print(f"Length of listWidget: {length}")
+ # print(f"Length of listWidget: {length}")
if length == 0:
logger.log_info("AutoAdder finished")
self.buttonBox.accepted.emit()
diff --git a/src/ui/dialogs/reminder.py b/src/ui/dialogs/reminder.py
index c357f8b..cb0d1b7 100644
--- a/src/ui/dialogs/reminder.py
+++ b/src/ui/dialogs/reminder.py
@@ -2,13 +2,14 @@ from PyQt6 import QtWidgets
from .dialog_sources.Ui_reminder import Ui_Erinnerung as Ui_Dialog
from src import Icon
-
+import datetime as date
class ReminderDialog(QtWidgets.QDialog, Ui_Dialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.setWindowIcon(Icon("notification").icon)
self.setWindowTitle("Erinnerung")
+ self.dateEdit.setDate(date.datetime.now())
def return_message(self) -> dict:
return {
"message": self.message_box.toPlainText(),
diff --git a/src/ui/dialogs/settings.py b/src/ui/dialogs/settings.py
index c77be0e..97d21ba 100644
--- a/src/ui/dialogs/settings.py
+++ b/src/ui/dialogs/settings.py
@@ -1,7 +1,5 @@
from PyQt6 import QtCore, QtGui, QtWidgets
-
from src import Icon, settings
-
from .dialog_sources.Ui_settings import Ui_Dialog as _settings
base = """'
@@ -25,10 +23,11 @@ base = """' dict:
+ colors = {}
+ for i in range(self.gridLayout_4.count()):
+ widget = self.gridLayout_4.itemAt(i).widget()
+ if isinstance(widget, QtWidgets.QLineEdit):
+ colors[self.gridLayout_4.itemAt(i - 1).widget().text()] = widget.text()
+ return colors
+
+ def get_icons(self):
+ icons = {}
+ for row in range(self.formLayout.count()):
+ widget = self.formLayout.itemAt(row).widget()
+ if isinstance(widget, QtWidgets.QLineEdit):
+ icons[self.formLayout.itemAt(row - 1).widget().text()] = widget.text()
+ return icons
+
def save(self):
config = self.return_data()
- print(config.mail)
- print("Saving config")
- print(config)
+ # print(config)
+
config.save()
self.accept()
@@ -175,6 +242,6 @@ def launch_settings():
import sys
app = QtWidgets.QApplication(sys.argv)
- window = Settings("admin")
+ window = Settings()
window.show()
sys.exit(app.exec())
diff --git a/src/ui/extensions/ValidatorButton.py b/src/ui/extensions/ValidatorButton.py
new file mode 100644
index 0000000..85fa7b8
--- /dev/null
+++ b/src/ui/extensions/ValidatorButton.py
@@ -0,0 +1,16 @@
+from PyQt6 import QtWidgets
+
+
+class ValidatorButton(QtWidgets.QToolButton):
+ def __init__(self, status_tip="", *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.setToolTip(status_tip)
+
+ def setActiveIcon(self, icon):
+ super().setIcon(icon)
+
+ def showStatusTip(self, event):
+ if self.isEnabled():
+ self.showStatusTip(event)
+ else:
+ self.showStatusTip(event)
diff --git a/src/ui/semesterapparat_ui.ui b/src/ui/semesterapparat_ui.ui
index 4019166..efeb68d 100644
--- a/src/ui/semesterapparat_ui.ui
+++ b/src/ui/semesterapparat_ui.ui
@@ -114,15 +114,15 @@
-
-
+
Qt::NoFocus
- Load the Semesterapparate from the database
+ Erstellt die Übersicht, welche am Regal ausgehängt werden kann
- App. aufrufen
+ Übersicht erstellen
@@ -1897,6 +1897,7 @@
Help
+
@@ -1932,7 +1933,7 @@
- Dokumentation
+ Dokumentation (online)
F1
@@ -1949,6 +1950,11 @@
QAction::AboutRole
+
+
+ Dokumentation (lokal)
+
+
drpdwn_app_nr
diff --git a/src/ui/userInterface.py b/src/ui/userInterface.py
index 47ba8d5..22e2abe 100644
--- a/src/ui/userInterface.py
+++ b/src/ui/userInterface.py
@@ -52,6 +52,7 @@ from src.ui import (
EditUser,
EditProf
)
+from src.utils import SemesterDocument
valid_input = (0, 0, 0, 0, 0, 0)
@@ -139,7 +140,7 @@ class Ui(Ui_Semesterapparat):
QtWidgets.QScrollBar(), QtCore.Qt.AlignmentFlag.AlignRight
)
self.tableWidget_apparate.doubleClicked.connect(self.load_app_data)
- self.load_app.hide()
+
# print(f"user:{self.active_user}")
userrole = self.db.getRole(self.active_user)
# hide admin interface when non-admin is logged in
@@ -163,7 +164,6 @@ class Ui(Ui_Semesterapparat):
self.sem_year.textChanged.connect(self.validate_semester)
self.check_eternal_app.stateChanged.connect(self.validate_semester)
self.chkbx_show_del_media.stateChanged.connect(self.update_app_media_list)
-
self.progress_label.setText("Bitte warten...")
# Set visibility/enabled state of certain entries
@@ -188,6 +188,9 @@ class Ui(Ui_Semesterapparat):
self.validate_thread.started.connect(self.thread_check)
self.validate_thread.start()
self.add_medium.setEnabled(False)
+ self.docuthread = QThread()
+ self.docuthread.started.connect(self.create_doc)
+ self.create_document.clicked.connect(self.docuthread.start)
# get all current apparats and cache them in a list
self.apparats = self.get_apparats()
@@ -229,6 +232,32 @@ class Ui(Ui_Semesterapparat):
self.steps.hide()
+ def create_doc(self):
+ result = self.confirm_popup(
+ "Mit dem Klick auf Okay wird eine Übersicht aller aktiven Semesterapparate erstellt und an den FollowME Drucker gesendet. Es kann bis zu 10 Minuten dauern, bis das Dokument im Drucker angezeigt wird",
+ "Dokument erstellen?",
+ )
+ if result == QtWidgets.QDialog.DialogCode.Accepted:
+ print("Creating document")
+ apparats = self.apparats
+ apps = []
+ for apparat in apparats:
+ prof = self.db.getProf(apparat[2])
+ data = (apparat[4], f"{prof.lastname} ({apparat[1]})")
+ apps.append(data)
+ print(apps)
+ doc = SemesterDocument(
+ semester=self.generateSemester(today=True),
+ filename="Semesterapparate",
+ apparats=apps,
+ )
+ doc.make_document()
+ doc.create_pdf()
+ doc.print_document()
+ doc.cleanup()
+
+ # kill thread after execution done
+
def checkValidInput(self):
if valid_input == (1, 1, 1, 1, 1, 1):
self.check_file.setEnabled(True)
@@ -475,11 +504,11 @@ class Ui(Ui_Semesterapparat):
# Validators
def __setValidState(self, widget, state, mand, index):
if state:
- Icon("valid_true", widget)
+ Icon("valid_true", widget, True, color="success")
mand.setText("")
self.change_state(index, 1)
else:
- Icon("valid_false", widget)
+ Icon("valid_false", widget, recolor=True, color="warning")
mand.setText("*")
self.change_state(index, 0)
@@ -1191,9 +1220,7 @@ class Ui(Ui_Semesterapparat):
return False
appd = ApparatData()
appd.appnr = self.active_apparat
- appd.prof_title = (
- None if self.prof_title.text() == "" else self.prof_title.text()
- )
+ appd.prof_title = self.prof_title.text()
appd.profname = self.drpdwn_prof_name.currentText()
appd.appname = self.app_name.text()
appd.semester = self.generateSemester()
@@ -1344,13 +1371,15 @@ class Ui(Ui_Semesterapparat):
self.logger.log_info("Opening reminder dialog")
reminder = reminder_ui()
reminder.exec()
+ tableposition = self.tableWidget_apparate.currentRow()
+ appnr = self.tableWidget_apparate.item(tableposition, 0).text()
if reminder.result() == QtWidgets.QDialog.DialogCode.Accepted:
data = reminder.return_message()
# print(data)
self.db.addMessage(
data,
self.active_user,
- self.active_apparat if self.active_apparat != "" else None,
+ self.active_apparat if self.active_apparat != "" else appnr,
)
self.calendarWidget.setMessages([data])
self.calendarWidget.updateCells()
@@ -1366,6 +1395,8 @@ class Ui(Ui_Semesterapparat):
self.calendarWidget.updateCells()
def open_reminder(self):
+ if settings.mail.use_user_name == False:
+ print("False")
selected_date = self.calendarWidget.selectedDate().toString("yyyy-MM-dd")
# # print(selected_date)
messages = self.db.getMessages(selected_date)
@@ -1685,7 +1716,7 @@ class Ui(Ui_Semesterapparat):
# print(state)
pid = self.__get_table_data_field(self.tableWidget_apparate, position[0], 2)
if state == 1:
- self.db.deleteApparat(selected_apparat_id, generateSemesterByDate())
+ self.db.deleteApparat(selected_apparat_id)
# delete the corresponding entry from self.apparats
for apparat in self.apparats:
if apparat[4] == int(selected_apparat_id):
diff --git a/src/ui/widgets/admin_create_user.py b/src/ui/widgets/admin_create_user.py
index 7d70bb3..ceccae9 100644
--- a/src/ui/widgets/admin_create_user.py
+++ b/src/ui/widgets/admin_create_user.py
@@ -7,11 +7,16 @@ class UserCreate(QtWidgets.QDialog, Ui_Dialog):
def __init__(self):
super(UserCreate, self).__init__()
self.setupUi(self)
-
- self.user_frame_addUser.clicked.connect(self.add_user)
- #Variables
+ self.user_frame_addUser.clicked.connect(self.add_user)
self.db = Database()
+ self.roles = self.db.getRoles()
+
+ self.user_frame_userrole.addItems(self.roles)
+ self.user_frame_userrole.addItem("")
+ self.user_frame_userrole.setCurrentText("")
+
+ # Variables
def add_user(self):
username = self.user_create_frame_username.text()
@@ -26,9 +31,11 @@ class UserCreate(QtWidgets.QDialog, Ui_Dialog):
salt=userdata[1],
role=role,
)
+ if role not in self.roles:
+ self.roles.append(role)
+ self.user_frame_userrole.addItem(role)
self.user_create_frame_username.clear()
self.user_create_frame_password.clear()
- self.user_frame_userrole.setCurrentText("")
self.admin_action_changed.emit()
def launch():
diff --git a/src/ui/widgets/admin_edit_prof.py b/src/ui/widgets/admin_edit_prof.py
index 608c5cd..2047600 100644
--- a/src/ui/widgets/admin_edit_prof.py
+++ b/src/ui/widgets/admin_edit_prof.py
@@ -3,7 +3,7 @@ from PyQt6 import QtWidgets, QtCore
from PyQt6.QtCore import pyqtSignal
from icecream import ic
from src.backend import Database
-
+from src.logic import Prof
class EditProf(QtWidgets.QDialog, Ui_Dialog):
def __init__(self):
super(EditProf, self).__init__()
@@ -19,7 +19,21 @@ class EditProf(QtWidgets.QDialog, Ui_Dialog):
def gather_data(self):
self.add_faculty_member_data()
-
+ apparats = self.db.getApparatsByProf(
+ self.db.getProfId(
+ Prof(fullname=self.edit_faculty_member_select_member.currentText())
+ )
+ )
+ if len(apparats) == 0:
+ self.delete_faculty_member.setEnabled(True)
+ for apparat in apparats:
+ if apparat.deleted == 0:
+ self.delete_faculty_member.setEnabled(False)
+ self.delete_faculty_member.setToolTip(
+ "Professoren mit Apparaten können nicht gelöscht werden"
+ )
+ break
+
def add_faculty_member_data(self):
faculty_members = self.db.getFacultyMembers()
names = [f"{member[5]}" for member in faculty_members]
@@ -43,22 +57,19 @@ class EditProf(QtWidgets.QDialog, Ui_Dialog):
self.faculty_member_oldmail.setText("")
self.edit_faculty_member_title.setText("")
else:
- # title = data[1]
- # if title is None:
- # title = ""
- # self.edit_faculty_member_title.setText(title)
- self.faculty_member_old_telnr.setText(data[6])
- self.faculty_member_oldmail.setText(data[5])
+ self.faculty_member_old_telnr.setText(data.telnr)
+ self.faculty_member_oldmail.setText(data.mail)
+ ic(data)
(
- self.edit_faculty_member_title.setText(data[1])
- if data[1] is not None
+ self.edit_faculty_member_title.setText(data.title)
+ if data.title is not None
else self.edit_faculty_member_title.setText("")
)
def edit_faculty_member_action(self):
def __gen_fullname(fname, lname, data):
if fname == "" and lname == "":
- return data[3]
+ return data[0]
if fname == "" and lname != "":
return f"{lname} {data[1]}"
if fname != "" and lname == "":
@@ -69,13 +80,13 @@ class EditProf(QtWidgets.QDialog, Ui_Dialog):
# get the data and use new value if it is not none and does not mach the old value
if self.edit_faculty_member_select_member.currentText() == "":
return
- olddata = self.db.getFacultyMember(
+ olddata = self.db.getProfByName(
self.edit_faculty_member_select_member.currentText()
)
ic(olddata)
data = olddata
- oldlname = data[2]
- oldfname = data[1]
+ oldlname = data.lastname
+ oldfname = data.firstname
# take data except first and last entry
titel = (
@@ -86,16 +97,12 @@ class EditProf(QtWidgets.QDialog, Ui_Dialog):
fname = (
self.edit_faculty_member_new_surname.text()
if self.edit_faculty_member_new_surname.text() != ""
- else self.edit_faculty_member_select_member.currentText()
- .split(" ")[1]
- .strip()
+ else self.edit_faculty_member_select_member.currentText().strip()
)
lname = (
self.user_faculty_member_new_name.text()
if self.user_faculty_member_new_name.text() != ""
- else self.edit_faculty_member_select_member.currentText()
- .split(" ")[0]
- .strip()
+ else self.edit_faculty_member_select_member.currentText().strip()
)
fullname = __gen_fullname(fname, lname, data)
telnr = self.user_faculty_member_new_telnr.text()
diff --git a/src/ui/widgets/admin_edit_user.py b/src/ui/widgets/admin_edit_user.py
index 93fe317..6065d35 100644
--- a/src/ui/widgets/admin_edit_user.py
+++ b/src/ui/widgets/admin_edit_user.py
@@ -4,16 +4,32 @@ from PyQt6.QtCore import pyqtSignal
from icecream import ic
from src.backend import Database
from src.backend import AdminCommands
+admin = AdminCommands()
class EditUser(QtWidgets.QDialog, Ui_Dialog):
def __init__(self):
super(EditUser, self).__init__()
self.setupUi(self)
self.btn_delete_user.clicked.connect(self.delete_user)
self.update_user.clicked.connect(self.update_user_data)
-
+ self.user_delete_frame_user_select.currentIndexChanged.connect(self.updateData)
#Variables
self.db = Database()
-
+ self.users = self.db.getUsers()
+ for user in self.users:
+ self.user_delete_frame_user_select.addItem(user[2])
+ self.user_edit_frame_role_select.addItem(user[5])
+
+ def updateData(self):
+ role = self.users[self.user_delete_frame_user_select.currentIndex()][5]
+ self.user_edit_frame_role_select.setCurrentText(role)
+ if role == "admin":
+ self.user_edit_frame_role_select.setEnabled(False)
+ self.btn_delete_user.setEnabled(False)
+ self.btn_delete_user.setToolTip("Admins cannot be deleted")
+ else:
+ self.user_edit_frame_role_select.setEnabled(True)
+ self.btn_delete_user.setEnabled(True)
+
def update_user_data(self):
username = self.user_delete_frame_user_select.currentText()
password = (
@@ -27,7 +43,7 @@ class EditUser(QtWidgets.QDialog, Ui_Dialog):
else None
)
- userdata = AdminCommands().create_password(password)
+ userdata = admin.create_password(password)
data = {
"password": f"{userdata[1]}{userdata[0]}",
"salt": userdata[1],
diff --git a/src/ui/widgets/collapse.py b/src/ui/widgets/collapse.py
index 75a1d65..cd5ceae 100644
--- a/src/ui/widgets/collapse.py
+++ b/src/ui/widgets/collapse.py
@@ -30,7 +30,7 @@ class StatusWidget(QWidget):
while parent:
parent_depth += 1
parent = parent.parent()
- print(parent_depth)
+ # print(parent_depth)
# Emit the person_double_clicked signal with the name of the person and the parent depth
self.person_double_clicked.emit(self.header, item.text(column), parent_depth)
diff --git a/src/ui/widgets/elsa_main.py b/src/ui/widgets/elsa_main.py
index dae48d4..d3a0fa9 100644
--- a/src/ui/widgets/elsa_main.py
+++ b/src/ui/widgets/elsa_main.py
@@ -8,6 +8,7 @@ from PyQt6.QtCore import QDate
from src import Icon
from src.backend import recreateElsaFile, generateSemesterByDate, Database
from src.logic import elsa_word_to_csv, MyLogger, Prof
+from src.logic.log import log
from src.ui import popus_confirm
from src.ui.dialogs import ElsaAddEntry
from src.ui.widgets import FilePicker
@@ -69,6 +70,7 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.newProf_title.textChanged.connect(self.checkProfData)
self.loadFrame()
+ log.info("Elsa Dialog loaded")
# self.show()
def checkProfData(self):
@@ -118,32 +120,26 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
selected_row = self.table_elsa_list.currentRow()
signature = self.table_elsa_list.item(selected_row, 10).text()
mediatype = self.table_elsa_list.item(selected_row, 11).text()
+ pages = self.table_elsa_list.item(selected_row, 7).text().strip()
data.searchIdent.setText(signature)
- if mediatype == "Zeitschriftenaufsätze":
- data.btn_zs.click()
- elif mediatype == "Herausgeberwerke":
- data.btn_hg.click()
- elif mediatype == "Monografien":
- data.btn_mono.click()
-
- data.search()
+ match mediatype:
+ case "Monografien":
+ data.btn_mono.click()
+ case "Herausgeberwerke":
+ data.btn_hg.click()
+ case "Zeitschriftenaufsätze":
+ data.btn_zs.click()
+ if ";" in pages:
+ data.search()
+ else:
+ data.search(pages=pages)
data.exec()
def add_new_elsa(self):
self.create_frame_elsa.setEnabled(True)
self.elsa_cancel_create.setEnabled(True)
self.dokument_list_elsa.setRowCount(0)
- profs = self.db.getProfs()
- profs = [f"{prof.lastname}, {prof.firstname}" for prof in profs]
- elsa_profs = self.db.getElsaProfs()
- profs.extend(elsa_profs)
- profs = list(set(profs))
- profs.sort()
- for prof in profs:
- self.elsa_prof.addItem(prof)
- self.elsa_prof.setCurrentText("")
- self.elsa_date.setText("")
- self.elsa_semester.setText("")
+
self.elsa_save.setEnabled(True)
self.elsa_update.setEnabled(False)
self.elsa_prof.setFocus()
@@ -159,6 +155,8 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.quote_entry.setEnabled(False)
self.elsa_save.setEnabled(False)
self.elsa_update.setEnabled(False)
+ self.seperateEntries.setChecked(False)
+
def generateTodayDateElsa(self):
self.elsa_date.setText(QDate.currentDate().toString("dd.MM.yyyy"))
@@ -230,13 +228,12 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
files,
elsa_id,
)
+ log.info("Stored {} files in the database", len(files))
self.cancel_elsa_creation()
self.refresh_elsa_table()
- self.elsa_prof.clear()
- self.elsa_prof.addItems(self.getProfs())
- self.elsa_prof.addItem("")
self.elsa_prof.setCurrentText("")
self.quote_entry.setEnabled(False)
+ log.info("Saved apparat to database, id {}", elsa_id)
def refresh_elsa_table(self):
self.elsa_table.setRowCount(0)
@@ -272,7 +269,12 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
elsa_apparats = self.db.getElsaApparats()
elsa_id = None
for apparat in elsa_apparats:
- if apparat[1] == date and apparat[2] == semester and apparat[3] == prof:
+ print(apparat)
+ if (
+ apparat[1] == date
+ and apparat[2] == semester
+ and apparat[3] == self.db.getProfId({"profname": prof})
+ ):
elsa_id = apparat[0]
# print(elsa_id)
break
@@ -281,7 +283,6 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.elsa_prof.setCurrentText(prof)
ic(elsa_id)
if elsa_id is None:
- log.
return
documents = self.db.getElsaFiles(elsa_id)
for document in documents:
@@ -397,24 +398,31 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
filename=filename, filetype=filetype, open=False
)
# print(file)
- data, doctype = elsa_word_to_csv(file)
+ data, _ = elsa_word_to_csv(file)
elsa_id = self.db.getElsaId(
+ self.db.getProfId(Prof(fullname=self.elsa_prof.currentText())),
+ self.elsa_semester.text(),
+ self.elsa_date.text(),
+ )
+ ic(
+ elsa_id,
self.elsa_prof.currentText(),
self.elsa_semester.text(),
self.elsa_date.text(),
)
for row in data:
- if ";" in row["pages"]:
- count = row["pages"].split(";")
- for i in range(len(count)):
- row["pages"] = count[i]
- self.setElsaRow(
- row,
- )
+ if self.seperateEntries.isChecked():
+ if ";" in row["pages"]:
+ count = row["pages"].split(";")
+ for i in range(len(count)):
+ row["pages"] = count[i]
+ self.setElsaRow(
+ row,
+ )
+ self.db.addElsaMedia(row, elsa_id)
else:
self.setElsaRow(row)
-
- self.db.addElsaMedia(row, elsa_id)
+ self.db.addElsaMedia(row, elsa_id)
self.quote_entry.setEnabled(True)
def openDocumentElsa(self):
@@ -471,6 +479,7 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.elsa_statistics.addTab(graph, "Graph")
def launch():
+ log.debug("Launching Elsa Dialog")
app = QtWidgets.QApplication([])
window = ElsaDialog()
window.show()
diff --git a/src/ui/widgets/searchPage.py b/src/ui/widgets/searchPage.py
index 0cbefe6..a7dcc84 100644
--- a/src/ui/widgets/searchPage.py
+++ b/src/ui/widgets/searchPage.py
@@ -1,5 +1,5 @@
from .widget_sources.Ui_search_statistic_page import Ui_Dialog
-from PyQt6 import QtWidgets, QtGui
+from PyQt6 import QtWidgets, QtGui, QtCore
from PyQt6.QtCore import pyqtSignal
from src.backend import Database, generateSemesterByDate
from src.logic import custom_sort, Prof
@@ -55,13 +55,25 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
self.populate_tab()
def restore_apparat(self):
- row = self.tableWidget.currentRow()
- apparat = self.tableWidget.item(row, 1).text()
- ic(apparat)
- apparat_id = self.db.getApparatId(apparat)
- # restore the apparat
- self.db.restoreApparat(apparat_id)
- # update the table
+ selected_rows = self.tableWidget.selectionModel().selectedRows()
+ apparats = []
+ if len(selected_rows) == 0:
+ # get position of right click
+ row = self.tableWidget.currentRow()
+ apparats.append(self.tableWidget.item(row, 1).text())
+ else:
+ for row in selected_rows:
+ apparats.append(self.tableWidget.item(row.row(), 1).text())
+ for apparat in apparats:
+ apparat_id = self.db.getApparatId(apparat)
+ self.db.restoreApparat(apparat_id)
+ # remove the red color from the row
+ # get row where the apparat is
+ row = self.tableWidget.findItems(apparat, QtCore.Qt.MatchFlag.MatchExactly)[
+ 0
+ ].row()
+ for j in range(5):
+ self.tableWidget.item(row, j).setBackground(QtGui.QColor(255, 255, 255))
self.reloadSignal.emit()
def statistics_table_context_menu(self, position):
@@ -140,7 +152,7 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
app_id = i["app_id"]
app_name = i["app_name"]
prof_name = i["prof_name"]
- prof_mail = self.db.getProfData(prof_name)[0]
+ prof_mail = self.db.getProfData(prof_name).mail
self.mail_thread = Mail_Dialog(
app_id=app_id,
app_name=app_name,
diff --git a/src/ui/widgets/widget_sources/Ui_admin_edit_prof.py b/src/ui/widgets/widget_sources/Ui_admin_edit_prof.py
index c3c9b69..87e725a 100644
--- a/src/ui/widgets/widget_sources/Ui_admin_edit_prof.py
+++ b/src/ui/widgets/widget_sources/Ui_admin_edit_prof.py
@@ -31,6 +31,7 @@ class Ui_Dialog(object):
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.edit_faculty_member_title.sizePolicy().hasHeightForWidth())
self.edit_faculty_member_title.setSizePolicy(sizePolicy)
+ self.edit_faculty_member_title.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.edit_faculty_member_title.setReadOnly(True)
self.edit_faculty_member_title.setObjectName("edit_faculty_member_title")
self.gridLayout_2.addWidget(self.edit_faculty_member_title, 0, 0, 1, 1)
@@ -122,6 +123,14 @@ class Ui_Dialog(object):
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
+ Dialog.setTabOrder(self.edit_faculty_member_select_member, self.faculty_member_old_telnr)
+ Dialog.setTabOrder(self.faculty_member_old_telnr, self.faculty_member_oldmail)
+ Dialog.setTabOrder(self.faculty_member_oldmail, self.edit_faculty_member_new_title)
+ Dialog.setTabOrder(self.edit_faculty_member_new_title, self.edit_faculty_member_new_surname)
+ Dialog.setTabOrder(self.edit_faculty_member_new_surname, self.user_faculty_member_new_name)
+ Dialog.setTabOrder(self.user_faculty_member_new_name, self.user_faculty_member_new_telnr)
+ Dialog.setTabOrder(self.user_faculty_member_new_telnr, self.user_faculty_member_new_mail)
+ Dialog.setTabOrder(self.user_faculty_member_new_mail, self.edit_faculty_member_title)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
diff --git a/src/ui/widgets/widget_sources/Ui_elsa_maindialog.py b/src/ui/widgets/widget_sources/Ui_elsa_maindialog.py
index 40b557a..d5b2691 100644
--- a/src/ui/widgets/widget_sources/Ui_elsa_maindialog.py
+++ b/src/ui/widgets/widget_sources/Ui_elsa_maindialog.py
@@ -32,7 +32,9 @@ class Ui_Dialog(object):
self.verticalLayout_2.addItem(spacerItem1)
self.horizontalLayout.addLayout(self.verticalLayout_2)
self.elsa_table = QtWidgets.QTableWidget(parent=Dialog)
+ self.elsa_table.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.elsa_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+ self.elsa_table.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
self.elsa_table.setObjectName("elsa_table")
self.elsa_table.setColumnCount(3)
self.elsa_table.setRowCount(0)
@@ -97,10 +99,58 @@ class Ui_Dialog(object):
self.horizontalLayout_4.addWidget(self.elsa_update)
self.gridLayout_2.addLayout(self.horizontalLayout_4, 4, 1, 1, 1)
self.horizontalLayout_2.addLayout(self.gridLayout_2)
- spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.horizontalLayout_2.addItem(spacerItem3)
+ self.newProf = QtWidgets.QFrame(parent=self.create_frame_elsa)
+ self.newProf.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+ self.newProf.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+ self.newProf.setObjectName("newProf")
+ self.formLayout_2 = QtWidgets.QFormLayout(self.newProf)
+ self.formLayout_2.setObjectName("formLayout_2")
+ self.label_4 = QtWidgets.QLabel(parent=self.newProf)
+ self.label_4.setObjectName("label_4")
+ self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_4)
+ self.label_5 = QtWidgets.QLabel(parent=self.newProf)
+ self.label_5.setObjectName("label_5")
+ self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_5)
+ self.label_6 = QtWidgets.QLabel(parent=self.newProf)
+ self.label_6.setObjectName("label_6")
+ self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_6)
+ self.newProf_title = QtWidgets.QLineEdit(parent=self.newProf)
+ self.newProf_title.setObjectName("newProf_title")
+ self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.newProf_title)
+ self.newProf_mail = QtWidgets.QLineEdit(parent=self.newProf)
+ self.newProf_mail.setObjectName("newProf_mail")
+ self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.newProf_mail)
+ self.newProf_telnr = QtWidgets.QLineEdit(parent=self.newProf)
+ self.newProf_telnr.setObjectName("newProf_telnr")
+ self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.ItemRole.FieldRole, self.newProf_telnr)
+ self.label_7 = QtWidgets.QLabel(parent=self.newProf)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.label_7.sizePolicy().hasHeightForWidth())
+ self.label_7.setSizePolicy(sizePolicy)
+ self.label_7.setObjectName("label_7")
+ self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.label_7)
+ spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+ self.formLayout_2.setItem(4, QtWidgets.QFormLayout.ItemRole.FieldRole, spacerItem3)
+ self.prof_icon = QtWidgets.QToolButton(parent=self.newProf)
+ self.prof_icon.setText("")
+ self.prof_icon.setIconSize(QtCore.QSize(24, 24))
+ self.prof_icon.setAutoRaise(True)
+ self.prof_icon.setObjectName("prof_icon")
+ self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.prof_icon)
+ self.horizontalLayout_2.addWidget(self.newProf)
self.dokument_list_elsa = QtWidgets.QTableWidget(parent=self.create_frame_elsa)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.dokument_list_elsa.sizePolicy().hasHeightForWidth())
+ self.dokument_list_elsa.setSizePolicy(sizePolicy)
+ self.dokument_list_elsa.setMinimumSize(QtCore.QSize(350, 0))
+ self.dokument_list_elsa.setBaseSize(QtCore.QSize(350, 0))
+ self.dokument_list_elsa.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.dokument_list_elsa.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+ self.dokument_list_elsa.setDragDropMode(QtWidgets.QAbstractItemView.DragDropMode.NoDragDrop)
self.dokument_list_elsa.setObjectName("dokument_list_elsa")
self.dokument_list_elsa.setColumnCount(4)
self.dokument_list_elsa.setRowCount(0)
@@ -128,6 +178,9 @@ class Ui_Dialog(object):
self.check_file_elsa = QtWidgets.QPushButton(parent=self.create_frame_elsa)
self.check_file_elsa.setObjectName("check_file_elsa")
self.verticalLayout_3.addWidget(self.check_file_elsa)
+ self.seperateEntries = QtWidgets.QCheckBox(parent=self.create_frame_elsa)
+ self.seperateEntries.setObjectName("seperateEntries")
+ self.verticalLayout_3.addWidget(self.seperateEntries)
spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout_3.addItem(spacerItem4)
self.horizontalLayout_2.addLayout(self.verticalLayout_3)
@@ -143,12 +196,17 @@ class Ui_Dialog(object):
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.table_elsa_list = QtWidgets.QTableWidget(parent=Dialog)
+ self.table_elsa_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
+ self.table_elsa_list.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
+ self.table_elsa_list.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectItems)
self.table_elsa_list.setObjectName("table_elsa_list")
self.table_elsa_list.setColumnCount(12)
self.table_elsa_list.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
+ item.setTextAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignVCenter)
self.table_elsa_list.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
+ item.setTextAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignVCenter)
self.table_elsa_list.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.table_elsa_list.setHorizontalHeaderItem(2, item)
@@ -180,7 +238,9 @@ class Ui_Dialog(object):
self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.tab)
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.elsa_statistics_table = QtWidgets.QTableWidget(parent=self.tab)
+ self.elsa_statistics_table.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.elsa_statistics_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+ self.elsa_statistics_table.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
self.elsa_statistics_table.setTextElideMode(QtCore.Qt.TextElideMode.ElideMiddle)
self.elsa_statistics_table.setObjectName("elsa_statistics_table")
self.elsa_statistics_table.setColumnCount(2)
@@ -196,12 +256,33 @@ class Ui_Dialog(object):
self.horizontalLayout_5.setStretch(0, 7)
self.horizontalLayout_5.setStretch(1, 3)
self.verticalLayout.addLayout(self.horizontalLayout_5)
- self.verticalLayout.setStretch(1, 1)
+ self.verticalLayout.setStretch(0, 1)
self.verticalLayout.setStretch(3, 2)
self.retranslateUi(Dialog)
self.elsa_statistics.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(Dialog)
+ Dialog.setTabOrder(self.elsa_add_new, self.elsa_cancel_create)
+ Dialog.setTabOrder(self.elsa_cancel_create, self.elsa_prof)
+ Dialog.setTabOrder(self.elsa_prof, self.newProf_title)
+ Dialog.setTabOrder(self.newProf_title, self.newProf_mail)
+ Dialog.setTabOrder(self.newProf_mail, self.newProf_telnr)
+ Dialog.setTabOrder(self.newProf_telnr, self.elsa_date)
+ Dialog.setTabOrder(self.elsa_date, self.elsa_date_today)
+ Dialog.setTabOrder(self.elsa_date_today, self.elsa_semester)
+ Dialog.setTabOrder(self.elsa_semester, self.active_semester)
+ Dialog.setTabOrder(self.active_semester, self.btn_add_document_elsa)
+ Dialog.setTabOrder(self.btn_add_document_elsa, self.btn_open_document_elsa)
+ Dialog.setTabOrder(self.btn_open_document_elsa, self.seperateEntries)
+ Dialog.setTabOrder(self.seperateEntries, self.check_file_elsa)
+ Dialog.setTabOrder(self.check_file_elsa, self.elsa_save)
+ Dialog.setTabOrder(self.elsa_save, self.elsa_update)
+ Dialog.setTabOrder(self.elsa_update, self.quote_entry)
+ Dialog.setTabOrder(self.quote_entry, self.elsa_statistics)
+ Dialog.setTabOrder(self.elsa_statistics, self.table_elsa_list)
+ Dialog.setTabOrder(self.table_elsa_list, self.elsa_table)
+ Dialog.setTabOrder(self.elsa_table, self.elsa_statistics_table)
+ Dialog.setTabOrder(self.elsa_statistics_table, self.dokument_list_elsa)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
@@ -215,11 +296,15 @@ class Ui_Dialog(object):
item = self.elsa_table.horizontalHeaderItem(2)
item.setText(_translate("Dialog", "Semester"))
self.create_frame_elsa.setTitle(_translate("Dialog", "Auftragsdaten"))
- self.label.setText(_translate("Dialog", "Professor"))
+ self.label.setText(_translate("Dialog", "Prof."))
self.label_3.setText(_translate("Dialog", "Semester"))
self.label_2.setText(_translate("Dialog", "Auftragsdatum"))
self.elsa_save.setText(_translate("Dialog", "Speichern"))
self.elsa_update.setText(_translate("Dialog", "Aktualisieren"))
+ self.label_4.setText(_translate("Dialog", "Titel"))
+ self.label_5.setText(_translate("Dialog", "Mail"))
+ self.label_6.setText(_translate("Dialog", "TelNr"))
+ self.label_7.setText(_translate("Dialog", "Kontaktdaten eingeben:"))
item = self.dokument_list_elsa.horizontalHeaderItem(0)
item.setText(_translate("Dialog", "Dokumentname"))
item = self.dokument_list_elsa.horizontalHeaderItem(1)
@@ -232,6 +317,7 @@ class Ui_Dialog(object):
self.btn_open_document_elsa.setText(_translate("Dialog", "Dokument öffnen"))
self.check_file_elsa.setText(_translate("Dialog", "Medien aus Dokument\n"
"hinzufügen"))
+ self.seperateEntries.setText(_translate("Dialog", "Abschnitte trennen"))
self.quote_entry.setText(_translate("Dialog", " Eintrag zitieren "))
item = self.table_elsa_list.horizontalHeaderItem(0)
item.setText(_translate("Dialog", "Autor(en) des Werks"))
diff --git a/src/ui/widgets/widget_sources/admin_edit_prof.ui b/src/ui/widgets/widget_sources/admin_edit_prof.ui
index 2db4f2a..ea6564c 100644
--- a/src/ui/widgets/widget_sources/admin_edit_prof.ui
+++ b/src/ui/widgets/widget_sources/admin_edit_prof.ui
@@ -41,6 +41,9 @@
0
+
+ Qt::NoFocus
+
true
@@ -206,6 +209,17 @@
+
+ edit_faculty_member_select_member
+ faculty_member_old_telnr
+ faculty_member_oldmail
+ edit_faculty_member_new_title
+ edit_faculty_member_new_surname
+ user_faculty_member_new_name
+ user_faculty_member_new_telnr
+ user_faculty_member_new_mail
+ edit_faculty_member_title
+
diff --git a/src/ui/widgets/widget_sources/elsa_maindialog.ui b/src/ui/widgets/widget_sources/elsa_maindialog.ui
index ce355a1..1e56fe8 100644
--- a/src/ui/widgets/widget_sources/elsa_maindialog.ui
+++ b/src/ui/widgets/widget_sources/elsa_maindialog.ui
@@ -13,7 +13,7 @@
Dialog
-
+
-
-
@@ -65,9 +65,15 @@
-
+
+ Qt::NoFocus
+
Qt::ScrollBarAlwaysOff
+
+ QAbstractItemView::NoEditTriggers
+
374
@@ -104,7 +110,7 @@
-
- Professor
+ Prof.
@@ -201,23 +207,118 @@
-
-
-
- Qt::Horizontal
+
+
+ QFrame::StyledPanel
-
-
- 40
- 20
-
+
+ QFrame::Raised
-
+
+
-
+
+
+ Titel
+
+
+
+ -
+
+
+ Mail
+
+
+
+ -
+
+
+ TelNr
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Kontaktdaten eingeben:
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+
+
+
+
+ 24
+ 24
+
+
+
+ true
+
+
+
+
+
-
+
+
+ 0
+ 0
+
+
+
+
+ 350
+ 0
+
+
+
+
+ 350
+ 0
+
+
+
+ Qt::NoFocus
+
Qt::ScrollBarAlwaysOff
+
+ QAbstractItemView::NoDragDrop
+
43
@@ -276,6 +377,13 @@ hinzufügen
+ -
+
+
+ Abschnitte trennen
+
+
+
-
@@ -322,6 +430,15 @@ hinzufügen
-
+
+ Qt::NoFocus
+
+
+ QAbstractItemView::NoEditTriggers
+
+
+ QAbstractItemView::SelectItems
+
31
@@ -332,11 +449,17 @@ hinzufügen
Autor(en) des Werks
+
+ AlignLeading|AlignVCenter
+
Autor(en) des Beitrags
+
+ AlignLeading|AlignVCenter
+
@@ -402,9 +525,15 @@ hinzufügen
-
+
+ Qt::NoFocus
+
Qt::ScrollBarAlwaysOff
+
+ QAbstractItemView::NoEditTriggers
+
Qt::ElideMiddle
@@ -431,6 +560,30 @@ hinzufügen
+
+ elsa_add_new
+ elsa_cancel_create
+ elsa_prof
+ newProf_title
+ newProf_mail
+ newProf_telnr
+ elsa_date
+ elsa_date_today
+ elsa_semester
+ active_semester
+ btn_add_document_elsa
+ btn_open_document_elsa
+ seperateEntries
+ check_file_elsa
+ elsa_save
+ elsa_update
+ quote_entry
+ elsa_statistics
+ table_elsa_list
+ elsa_table
+ elsa_statistics_table
+ dokument_list_elsa
+
diff --git a/src/utils/__init__.py b/src/utils/__init__.py
index 328a17f..7a6a2e8 100644
--- a/src/utils/__init__.py
+++ b/src/utils/__init__.py
@@ -1,3 +1,5 @@
from .blob import create_blob
from .icon import Icon
from .pickles import dump_pickle, load_pickle
+from .sortgenerator import app_sort, name_sort
+from .richtext import SemesterDocument
\ No newline at end of file
diff --git a/src/utils/icon.py b/src/utils/icon.py
index e345d99..6207295 100644
--- a/src/utils/icon.py
+++ b/src/utils/icon.py
@@ -2,28 +2,51 @@ import darkdetect
from omegaconf import OmegaConf
from PyQt6 import QtGui
import re
+from src import settings
-from config import Config
-settings = Config("config/config.yaml")
+config = settings.icons
-config = OmegaConf.load(f"{settings.icon_path}/icons.yaml")
-
-path = config.icon_path
+path = config.path
class Icon:
- def __init__(self, icon_type, widget=None,recolor=False):
+ def __init__(self, icon_type, widget=None, recolor=True, color=None):
+ """Set an icon to a widget or window. Recolors the icon if needed
+
+ Args:
+ icon_type (str): Name of the icon in the config file
+ widget (Any, optional): Object the icon will be added to. Defaults to None.
+ recolor (bool, optional): If Icon should be recolored. Defaults to True.
+ color (str, optional): Color type to use. Configured in config file. Defaults to None.
+ """
+ assert (
+ icon_type in settings.icons.icons.keys()
+ ), f"Icon {icon_type} not in config file"
+ assert (
+ color in settings.icons.colors.keys() or color is None
+ ), f"Color {color} not in config file"
+ icon = settings.icons.get(icon_type)
dark = darkdetect.isDark()
if dark:
- self.color = config.dark_color
+ self.color = config.colors.dark
else:
- self.color = config.light_color
+ self.color = config.colors.light
+ if color:
+ self.color = config.colors[color]
self.icon = QtGui.QIcon()
- self.icon_path = path + config["icons"][icon_type]
- self.add_icon(self.icon_path,recolor)
+ self.icon_path = path + icon
+ recolor = (
+ False
+ if icon_type.endswith(".ico") or icon_type.endswith(".png")
+ else recolor
+ )
+ self.add_icon(self.icon_path, recolor)
if widget is not None:
- widget.setIcon(self.icon)
+ try:
+ widget.setIcon(self.icon)
+ except AttributeError:
+ widget.setWindowIcon(self.icon)
def add_icon(self, icon_path,recolor=False):
icon = self.changeColor(icon_path,recolor)
@@ -38,7 +61,7 @@ class Icon:
QtGui.QIcon.State.Off,
)
- def overwriteColor(self, color):
+ def overwriteColor(self):
# take the icon, read it as bytes and change the color in fill
icon = self.changeColor(self.icon_path)
cicon = str(icon)
@@ -49,9 +72,9 @@ class Icon:
if fill and stroke:
# replace stroke
- newicon = icon.replace(stroke.encode(), color.encode())
+ newicon = icon.replace(stroke.encode(), config.color.encode())
else:
- newicon = icon.replace(fill.encode(), color.encode())
+ newicon = icon.replace(fill.encode(), config.color.encode())
pixmap = QtGui.QPixmap()
pixmap.loadFromData(newicon)