rework logging, add more dataclasses, reworked config

This commit is contained in:
2024-12-17 10:02:56 +01:00
parent ccb4df10bb
commit eda556b5ea
41 changed files with 1624 additions and 865 deletions

View File

@@ -64,19 +64,62 @@ class Mail:
def _setattr(self, name, value): def _setattr(self, name, value):
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: 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: Raises:
RuntimeError: Configuration not loaded RuntimeError: Configuration not loaded
KeyError: Invalid option KeyError: Invalid option
''' """
_config: Optional[DictConfig] = None _config: Optional[DictConfig] = None
def __init__(self, config_path: str): def __init__(self, config_path: str):
""" """
Loads the configuration file and stores it for future access. Loads the configuration file and stores it for future access.
@@ -141,6 +184,9 @@ class Config:
def set_zotero_attr(self, name, value): def set_zotero_attr(self, name, value):
OmegaConf.update(self._config, f"zotero.{name}", value) OmegaConf.update(self._config, f"zotero.{name}", value)
def set_icon_attr(self, name, value):
OmegaConf.update(self._config, f"icons.{name}", value)
@property @property
def save_path(self): def save_path(self):
return self._config.save_path return self._config.save_path
@@ -149,14 +195,16 @@ class Config:
def save_path(self, value: str): def save_path(self, value: str):
self._config.save_path = value self._config.save_path = value
@property def load_config(self, path, filename):
def icon_path(self): return OmegaConf.load(os.path.join(path, filename))
"""Path to Icon folder
Returns: @property
str: Folder path as string def icons(self):
""" icons = Icons()
return self._config.icon_path icons.assign("path", self._config.icon_path)
icons.assign("colors", self._config.colors)
icons.assign("icons", self._config.icons)
return icons
def dict(self): def dict(self):
return OmegaConf.to_container(self._config) return OmegaConf.to_container(self._config)

3
icons/__init__.py Normal file
View File

@@ -0,0 +1,3 @@
from .config import Icons
icons = Icons()

1
icons/api.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M280-120q-83 0-141.5-58.5T80-320q0-73 45.5-127.5T240-516v83q-35 12-57.5 43T160-320q0 50 35 85t85 35q50 0 85-35t35-85v-40h235q8-9 19.5-14.5T680-380q25 0 42.5 17.5T740-320q0 25-17.5 42.5T680-260q-14 0-25.5-5.5T635-280H476q-14 69-68.5 114.5T280-120Zm400 0q-56 0-101.5-27.5T507-220h107q14 10 31 15t35 5q50 0 85-35t35-85q0-50-35-85t-85-35q-20 0-37 5.5T611-418L489-621q-21-4-35-20t-14-39q0-25 17.5-42.5T500-740q25 0 42.5 17.5T560-680v8.5q0 3.5-2 8.5l87 146q8-2 17-2.5t18-.5q83 0 141.5 58.5T880-320q0 83-58.5 141.5T680-120ZM280-260q-25 0-42.5-17.5T220-320q0-22 14-38t34-21l94-156q-29-27-45.5-64.5T300-680q0-83 58.5-141.5T500-880q83 0 141.5 58.5T700-680h-80q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 43 26 75.5t66 41.5L337-338q2 5 2.5 9t.5 9q0 25-17.5 42.5T280-260Z"/></svg>

After

Width:  |  Height:  |  Size: 879 B

1
icons/database.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M480-120q-151 0-255.5-46.5T120-280v-400q0-66 105.5-113T480-840q149 0 254.5 47T840-680v400q0 67-104.5 113.5T480-120Zm0-479q89 0 179-25.5T760-679q-11-29-100.5-55T480-760q-91 0-178.5 25.5T200-679q14 30 101.5 55T480-599Zm0 199q42 0 81-4t74.5-11.5q35.5-7.5 67-18.5t57.5-25v-120q-26 14-57.5 25t-67 18.5Q600-528 561-524t-81 4q-42 0-82-4t-75.5-11.5Q287-543 256-554t-56-25v120q25 14 56 25t66.5 18.5Q358-408 398-404t82 4Zm0 200q46 0 93.5-7t87.5-18.5q40-11.5 67-26t32-29.5v-98q-26 14-57.5 25t-67 18.5Q600-328 561-324t-81 4q-42 0-82-4t-75.5-11.5Q287-343 256-354t-56-25v99q5 15 31.5 29t66.5 25.5q40 11.5 88 18.5t94 7Z"/></svg>

After

Width:  |  Height:  |  Size: 729 B

1
icons/icons.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M480-480Zm-400 0q0-88 34-163t93-130q59-55 136-83.5T508-879q17 2 27 14.5t7 29.5q-3 17-16.5 27t-30.5 9q-69-3-129.5 19.5T259-713q-46 44-72.5 103.5T160-480q0 134 93 227t227 93q69 0 128.5-26.5T712-259q46-48 68-109t19-127q-1-17 9-30.5t27-16.5q17-3 29.5 7t14.5 27q6 87-22.5 164T774-208q-57 62-133 95T480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480Zm640-120q-50 0-85-35t-35-85q0-50 35-85t85-35q50 0 85 35t35 85q0 50-35 85t-85 35Z"/></svg>

After

Width:  |  Height:  |  Size: 551 B

View File

@@ -7,7 +7,7 @@ from src import settings
from typing import Any, Dict, List, Optional, Tuple, Union from typing import Any, Dict, List, Optional, Tuple, Union
# from icecream import ic # from icecream import ic
from omegaconf import OmegaConf from omegaconf import OmegaConf
import datetime
from src.backend.db import ( from src.backend.db import (
CREATE_ELSA_FILES_TABLE, CREATE_ELSA_FILES_TABLE,
CREATE_ELSA_MEDIA_TABLE, CREATE_ELSA_MEDIA_TABLE,
@@ -22,18 +22,18 @@ from src.backend.db import (
CREATE_TABLE_USER, CREATE_TABLE_USER,
) )
from src.errors import AppPresentError, NoResultError from src.errors import AppPresentError, NoResultError
from src.logic import 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.logic.constants import SEMAP_MEDIA_ACCOUNTS
from src.utils import create_blob, dump_pickle, load_pickle from src.utils import create_blob, dump_pickle, load_pickle
from .semester import generateSemesterByDate from .semester import generateSemesterByDate
from icecream import ic from icecream import ic
from string import ascii_lowercase as lower, digits
ascii_lowercase = "abcdefghijklmnopqrstuvwxyz0123456789)" ascii_lowercase = lower + digits
caller_frame = inspect.stack()[1]
# get the line that called the function # get the line that called the function
database = settings.database
class Database: class Database:
database = settings.database
""" """
Initialize the database and create the tables if they do not exist. Initialize the database and create the tables if they do not exist.
""" """
@@ -45,23 +45,15 @@ class Database:
Args: Args:
db_path (str, optional): Optional Path for testing / specific purposes. Defaults to None. db_path (str, optional): Optional Path for testing / specific purposes. Defaults to None.
""" """
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: 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())) self.db_path = self.db_path.replace("~", str(Path.home()))
else: else:
self.db_path = db_path self.db_path = db_path
self.checkDatabaseStatus() self.checkDatabaseStatus()
def checkDatabaseStatus(self): def checkDatabaseStatus(self):
path = database.path path = self.database.path
path = path.replace("~", str(Path.home())) path = path.replace("~", str(Path.home()))
# print(path) # print(path)
path = os.path.abspath(path) path = os.path.abspath(path)
@@ -70,22 +62,10 @@ class Database:
# print(path) # print(path)
os.makedirs(path) os.makedirs(path)
if self.get_db_contents() == []: 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.create_tables()
self.insertSubjects() 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): def getElsaMediaID(self, work_author, signature, pages):
query = ( query = (
"SELECT id FROM elsa_media WHERE work_author=? AND signature=? AND pages=?" "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_USER)
cursor.execute(CREATE_TABLE_SUBJECTS) cursor.execute(CREATE_TABLE_SUBJECTS)
cursor.execute(CREATE_ELSA_TABLE) cursor.execute(CREATE_ELSA_TABLE)
cursor.execute(CREATE_ELSA_PROF_TABLE)
cursor.execute(CREATE_ELSA_FILES_TABLE) cursor.execute(CREATE_ELSA_FILES_TABLE)
cursor.execute(CREATE_ELSA_MEDIA_TABLE) cursor.execute(CREATE_ELSA_MEDIA_TABLE)
conn.commit() conn.commit()
@@ -167,11 +146,12 @@ class Database:
""" """
conn = self.connect() conn = self.connect()
cursor = conn.cursor() 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) cursor.execute(query, params)
conn.commit() conn.commit()
self.close_connection(conn) self.close_connection(conn)
@log.catch
def query_db( def query_db(
self, query: str, args: Tuple = (), one: bool = False self, query: str, args: Tuple = (), one: bool = False
) -> Union[Tuple, List[Tuple]]: ) -> Union[Tuple, List[Tuple]]:
@@ -191,24 +171,24 @@ class Database:
logs_query = query logs_query = query
logs_args = args logs_args = args
if "fileblob" in query: if "fileblob" in query:
#set fileblob arg in logger to "too long" # set fileblob arg in logger to "too long"
logs_query = query logs_query = query
fileblob_location = query.find("fileblob") fileblob_location = query.find("fileblob")
#remove fileblob from query # remove fileblob from query
logs_query = query[:fileblob_location] + "fileblob = too long" 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: # if "INSERT" in query:
# log_message = f"Querying database with query {query}" # log_message = f"Querying database with query {query}"
self.logger.log_info(log_message) log.info(log_message)
try: try:
cursor.execute(query, args) cursor.execute(query, args)
rv = cursor.fetchall() rv = cursor.fetchall()
conn.commit() conn.commit()
self.close_connection(conn) self.close_connection(conn)
except sql.OperationalError as e: except sql.OperationalError as e:
self.logger.log_error(f"Error in query: {e}") log.error(f"Error in query: {e}")
return None return None
return (rv[0] if rv else None) if one else rv return (rv[0] if rv else None) if one else rv
@@ -231,7 +211,7 @@ class Database:
t_query = ( t_query = (
f"SELECT bookdata FROM media WHERE app_id={app_id} AND prof_id={prof_id}" f"SELECT bookdata FROM media WHERE app_id={app_id} AND prof_id={prof_id}"
) )
self.logger.log_info(t_query) log.info(t_query)
# # print(t_query) # # print(t_query)
result = cursor.execute(t_query).fetchall() result = cursor.execute(t_query).fetchall()
result = [load_pickle(i[0]) for i in result] result = [load_pickle(i[0]) for i in result]
@@ -258,7 +238,7 @@ class Database:
params = (converted, app_id, prof_id, 0) params = (converted, app_id, prof_id, 0)
cursor.execute(query, params) cursor.execute(query, params)
logMessage = f"Added book with signature {bookdata.signature} to database, data: {converted}" logMessage = f"Added book with signature {bookdata.signature} to database, data: {converted}"
self.logger.log_info(logMessage) log.info(logMessage)
conn.commit() conn.commit()
self.close_connection(conn) self.close_connection(conn)
@@ -507,7 +487,7 @@ class Database:
str: The filename of the recreated file str: The filename of the recreated file
""" """
blob = self.getBlob(filename, app_id) blob = self.getBlob(filename, app_id)
tempdir = database.tempdir tempdir = self.database.tempdir
tempdir = tempdir.replace("~", str(Path.home())) tempdir = tempdir.replace("~", str(Path.home()))
tempdir_path = Path(tempdir) tempdir_path = Path(tempdir)
if not os.path.exists(tempdir_path): if not os.path.exists(tempdir_path):
@@ -660,7 +640,7 @@ class Database:
Args: Args:
message_id (str): the id of the message 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,)) self.query_db("DELETE FROM messages WHERE id=?", (message_id,))
# Prof data # Prof data
@@ -734,7 +714,17 @@ class Database:
person = Prof() person = Prof()
return person.from_tuple(data) 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]: def getProfs(self) -> list[Prof]:
"""Return all the professors in the database """Return all the professors in the database
@@ -806,7 +796,7 @@ class Database:
"SELECT appnr FROM semesterapparat WHERE deletion_status=0" "SELECT appnr FROM semesterapparat WHERE deletion_status=0"
) )
numbers = [i[0] for i in numbers] 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 return numbers
def setNewSemesterDate(self, app_id: Union[str, int], newDate, dauerapp=False): def setNewSemesterDate(self, app_id: Union[str, int], newDate, dauerapp=False):
@@ -817,16 +807,18 @@ class Database:
newDate (str): the new date newDate (str): the new date
dauerapp (bool, optional): if the apparat was changed to dauerapparat. Defaults to False. 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: if dauerapp:
self.query_db( self.query_db(
"UPDATE semesterapparat SET verlängerung_bis=?, dauer=? WHERE appnr=?", "UPDATE semesterapparat SET verlängerung_bis=?, dauer=?, verlängert_am=? WHERE appnr=?",
(newDate, dauerapp, app_id), (newDate, dauerapp, today, app_id),
) )
else: else:
self.query_db( self.query_db(
"UPDATE semesterapparat SET verlängerung_bis=? WHERE appnr=?", "UPDATE semesterapparat SET verlängerung_bis=?, verlängerung_am=? WHERE appnr=?",
(newDate, app_id), (newDate, today, app_id),
) )
def getApparatId(self, apparat_name) -> Optional[int]: def getApparatId(self, apparat_name) -> Optional[int]:
@@ -872,7 +864,7 @@ class Database:
# self.getProfId(apparat.profname) # self.getProfId(apparat.profname)
ic(prof_id) 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]}')" 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) self.query_db(query)
return None return None
def getApparatsByProf(self, prof_id: Union[str, int]) -> list[tuple]: def getApparatsByProf(self, prof_id: Union[str, int]) -> list[tuple]:
@@ -884,9 +876,14 @@ class Database:
Returns: Returns:
list[tuple]: a list of tuples containing the apparats 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,) "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]: def getApparatsBySemester(self, semester: str) -> dict[list]:
"""get all apparats based on the semester """get all apparats based on the semester
@@ -960,16 +957,17 @@ class Database:
self.close_connection(conn) self.close_connection(conn)
return ret 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 """Delete an apparat from the database
Args: Args:
app_id (Union[str, int]): the id of the apparat app_id (Union[str, int]): the id of the apparat
semester (str): the semester the apparat should be deleted from semester (str): the semester the apparat should be deleted from
""" """
today = datetime.datetime.now().strftime("%Y-%m-%d")
self.query_db( self.query_db(
"UPDATE semesterapparat SET deletion_status=1, deleted_date=? WHERE appnr=?", "UPDATE semesterapparat SET deletion_status=1, deleted_date=? WHERE appnr=?",
(semester, app_id), (today, app_id),
) )
def isEternal(self, id): def isEternal(self, id):
@@ -1017,7 +1015,7 @@ class Database:
apparat_data.apparat_adis_id, apparat_data.apparat_adis_id,
apparat_data.appnr, 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) self.query_db(query, params)
def checkApparatExists(self, app_name: str): def checkApparatExists(self, app_name: str):
@@ -1082,7 +1080,7 @@ class Database:
result_a = tuple(result_a) result_a = tuple(result_a)
result[result.index(orig_value)] = result_a result[result.index(orig_value)] = result_a
self.close_connection(conn) self.close_connection(conn)
self.logger.log_info(f"Query result: {result}") log.info(f"Query result: {result}")
return result return result
if "deletable" in kwargs.keys(): if "deletable" in kwargs.keys():
@@ -1418,7 +1416,7 @@ class Database:
"SELECT fileblob FROM elsa_files WHERE filename=?", (filename,), one=True "SELECT fileblob FROM elsa_files WHERE filename=?", (filename,), one=True
)[0] )[0]
# print(blob) # print(blob)
tempdir = database.tempdir tempdir = self.database.tempdir
tempdir = tempdir.replace("~", str(Path.home())) tempdir = tempdir.replace("~", str(Path.home()))
tempdir_path = Path(tempdir) tempdir_path = Path(tempdir)
if not os.path.exists(tempdir_path): if not os.path.exists(tempdir_path):
@@ -1430,7 +1428,7 @@ class Database:
# print("file created") # print("file created")
return file.name return file.name
def getElsaApparats(self): def getElsaApparats(self) -> ELSA:
"""Get all the ELSA apparats in the database """Get all the ELSA apparats in the database
Returns: Returns:
@@ -1438,20 +1436,17 @@ class Database:
""" """
return self.query_db("SELECT * FROM elsa") 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 """get the id of an ELSA apparat based on the professor, semester and date
Args: Args:
prof (str): the name of the professor prof_id (int): the id of the professor
semester (str): the semester semester (str): the semester
date (str): the date of the apparat date (str): the date of the apparat
Returns: Returns:
int: the id of the ELSA apparat int: the id of the ELSA apparat
""" """
prof_id = self.getElsaProfId(prof)
if prof_id is None:
return None
data = self.query_db( data = self.query_db(
"SELECT id FROM elsa WHERE prof_id=? AND semester=? AND date=?", "SELECT id FROM elsa WHERE prof_id=? AND semester=? AND date=?",
@@ -1491,7 +1486,7 @@ class Database:
title = profdata.title #profdata["title"] title = profdata.title #profdata["title"]
query = f"INSERT INTO prof (fname, lname, fullname, mail, telnr,titel) VALUES ('{fname}','{lname}','{fullname}','{mail}','{telnr}','{title}')" query = f"INSERT INTO prof (fname, lname, fullname, mail, telnr,titel) VALUES ('{fname}','{lname}','{fullname}','{mail}','{telnr}','{title}')"
self.logger.log_info(query) log.info(query)
cursor.execute(query) cursor.execute(query)
conn.commit() conn.commit()
@@ -1534,7 +1529,7 @@ class Database:
else: else:
fullname = profdata["profname"] fullname = profdata["profname"]
query = f"SELECT id FROM prof WHERE fullname = '{fullname}'" query = f"SELECT id FROM prof WHERE fullname = '{fullname}'"
self.logger.log_info(query) log.info(query)
cursor.execute(query) cursor.execute(query)
result = cursor.fetchone() result = cursor.fetchone()
@@ -1551,7 +1546,7 @@ class Database:
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
query = f"SELECT * FROM prof WHERE fullname = '{fullname}'" query = f"SELECT * FROM prof WHERE fullname = '{fullname}'"
self.logger.log_info(query) log.info(query)
result = cursor.execute(query).fetchone() result = cursor.execute(query).fetchone()
if result: if result:

View File

@@ -74,16 +74,12 @@ CREATE_TABLE_SUBJECTS = """CREATE TABLE subjects (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
name TEXT NOT NULL UNIQUE 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 ( CREATE_ELSA_TABLE = """CREATE TABLE elsa (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
date TEXT NOT NULL, date TEXT NOT NULL,
semester TEXT NOT NULL, semester TEXT NOT NULL,
prof_id INTEGER NOT NULL, prof_id INTEGER NOT NULL
FOREIGN KEY (prof_id) REFERENCES elsa_prof (id)
)""" )"""
CREATE_ELSA_FILES_TABLE = """CREATE TABLE elsa_files ( CREATE_ELSA_FILES_TABLE = """CREATE TABLE elsa_files (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,

View File

@@ -14,7 +14,7 @@ def generateSemesterByDate(next:bool = False):
if month >= 4 and month <= 9: if month >= 4 and month <= 9:
return "SoSe " + str(currentYear) return "SoSe " + str(currentYear)
else: else:
if month == any([10, 11, 12]): if month in [10, 11, 12]:
return f"WiSe {currentYear}/{currentYear+1}" return f"WiSe {currentYear}/{currentYear+1}"
else: else:
return f"WiSe {currentYear-1}/{currentYear}" return f"WiSe {currentYear-1}/{currentYear}"
@@ -43,4 +43,4 @@ def generateSemesterByOffset(offset):
if __name__ == "__main__": if __name__ == "__main__":
print(generateSemesterByDate(next=True)) print(generateSemesterByDate())

View File

@@ -1,5 +1,5 @@
from .log import MyLogger from .log import MyLogger, logger
from .dataclass import ApparatData, BookData, Prof from .dataclass import ApparatData, BookData, Prof, Apparat, ELSA
from .thread_bookgrabber import BookGrabber from .thread_bookgrabber import BookGrabber
from .threads_autoadder import AutoAdder from .threads_autoadder import AutoAdder
from .threads_availchecker import AvailChecker from .threads_availchecker import AvailChecker

View File

@@ -5,7 +5,7 @@ from enum import Enum
@dataclass @dataclass
class Prof: class Prof:
id: int = None id: int = None
title: str= None _title: str = None
firstname: str= None firstname: str= None
lastname: str= None lastname: str= None
fullname: str= None fullname: str= None
@@ -18,11 +18,20 @@ class Prof:
if hasattr(self, key): if hasattr(self, key):
setattr(self, key, value) setattr(self, key, value)
return self 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 #add function that sets the data from a tuple
def from_tuple(self, data: tuple): def from_tuple(self, data: tuple):
setattr(self, "id", data[0]) setattr(self, "id", data[0])
setattr(self, "title", data[1]) setattr(self, "_title", data[1])
setattr(self, "firstname", data[2]) setattr(self, "firstname", data[2])
setattr(self, "lastname", data[3]) setattr(self, "lastname", data[3])
setattr(self, "fullname", data[4]) setattr(self, "fullname", data[4])
@@ -154,3 +163,51 @@ class Subjects(Enum):
if i.name == name: if i.name == name:
return i.id - 1 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

View File

@@ -2,11 +2,24 @@ import logging
import logging.handlers import logging.handlers
import os import os
from loguru import logger as log
import sys
if not os.path.exists("logs"): if not os.path.exists("logs"):
os.mkdir("logs") os.mkdir("logs")
# open and close the file to create it # open and close the file to create it
with open("logs/application.log", "w") as f: logger = log
pass logger.remove()
logger.add("logs/application.log", rotation="50MB")
# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO")
logger.add(
sys.stdout,
colorize=True,
format="<green>{time}</green> <level>{message}</level>",
level="WARNING",
)
log_filesize = 10 * 1024**2 # 10MB log_filesize = 10 * 1024**2 # 10MB
backups = 5 backups = 5

View File

@@ -66,10 +66,10 @@ class Ui_MainWindow(object):
self.verticalLayout_2.setObjectName("verticalLayout_2") self.verticalLayout_2.setObjectName("verticalLayout_2")
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout_2.addItem(spacerItem) self.verticalLayout_2.addItem(spacerItem)
self.load_app = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) self.create_document = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2)
self.load_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.create_document.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.load_app.setObjectName("load_app") self.create_document.setObjectName("create_document")
self.verticalLayout_2.addWidget(self.load_app) self.verticalLayout_2.addWidget(self.create_document)
self.create_new_app = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2) self.create_new_app = QtWidgets.QPushButton(parent=self.horizontalLayoutWidget_2)
self.create_new_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.create_new_app.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.create_new_app.setObjectName("create_new_app") self.create_new_app.setObjectName("create_new_app")
@@ -795,8 +795,11 @@ class Ui_MainWindow(object):
self.actionAbout = QtGui.QAction(parent=MainWindow) self.actionAbout = QtGui.QAction(parent=MainWindow)
self.actionAbout.setMenuRole(QtGui.QAction.MenuRole.AboutRole) self.actionAbout.setMenuRole(QtGui.QAction.MenuRole.AboutRole)
self.actionAbout.setObjectName("actionAbout") self.actionAbout.setObjectName("actionAbout")
self.actionDokumentation_lokal = QtGui.QAction(parent=MainWindow)
self.actionDokumentation_lokal.setObjectName("actionDokumentation_lokal")
self.menuDatei.addAction(self.actionBeenden) self.menuDatei.addAction(self.actionBeenden)
self.menuEinstellungen.addAction(self.actionEinstellungen) self.menuEinstellungen.addAction(self.actionEinstellungen)
self.menuHelp.addAction(self.actionDokumentation_lokal)
self.menuHelp.addAction(self.actionDokumentation) self.menuHelp.addAction(self.actionDokumentation)
self.menuHelp.addAction(self.actionAbout) self.menuHelp.addAction(self.actionAbout)
self.menubar.addAction(self.menuDatei.menuAction()) self.menubar.addAction(self.menuDatei.menuAction())
@@ -842,8 +845,8 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Semesterapparatsmanagement")) MainWindow.setWindowTitle(_translate("MainWindow", "Semesterapparatsmanagement"))
self.load_app.setToolTip(_translate("MainWindow", "Load the Semesterapparate from the database")) self.create_document.setToolTip(_translate("MainWindow", "Erstellt die Übersicht, welche am Regal ausgehängt werden kann"))
self.load_app.setText(_translate("MainWindow", "App. aufrufen")) self.create_document.setText(_translate("MainWindow", "Übersicht erstellen"))
self.create_new_app.setText(_translate("MainWindow", "neu. App anlegen")) self.create_new_app.setText(_translate("MainWindow", "neu. App anlegen"))
self.cancel_active_selection.setText(_translate("MainWindow", "Auswahl abbrechen")) self.cancel_active_selection.setText(_translate("MainWindow", "Auswahl abbrechen"))
self.tableWidget_apparate.setSortingEnabled(False) self.tableWidget_apparate.setSortingEnabled(False)
@@ -953,6 +956,7 @@ class Ui_MainWindow(object):
self.actionBeenden.setShortcut(_translate("MainWindow", "Ctrl+Q")) self.actionBeenden.setShortcut(_translate("MainWindow", "Ctrl+Q"))
self.actionEinstellungen.setText(_translate("MainWindow", "Einstellungen")) self.actionEinstellungen.setText(_translate("MainWindow", "Einstellungen"))
self.actionEinstellungen.setShortcut(_translate("MainWindow", "Alt+S")) 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.actionDokumentation.setShortcut(_translate("MainWindow", "F1"))
self.actionAbout.setText(_translate("MainWindow", "About")) self.actionAbout.setText(_translate("MainWindow", "About"))
self.actionDokumentation_lokal.setText(_translate("MainWindow", "Dokumentation (lokal)"))

View File

@@ -1,6 +1,6 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\apparat_extend.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\apparat_extend.ui'
# #
# Created by: 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 # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
@@ -56,7 +56,7 @@ class Ui_Dialog(object):
self.sem_year.setGeometry(QtCore.QRect(10, 70, 121, 20)) self.sem_year.setGeometry(QtCore.QRect(10, 70, 121, 20))
self.sem_year.setObjectName("sem_year") self.sem_year.setObjectName("sem_year")
self.dauerapp = QtWidgets.QCheckBox(parent=Dialog) 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.dauerapp.setObjectName("dauerapp")
self.retranslateUi(Dialog) self.retranslateUi(Dialog)

View File

@@ -1,6 +1,6 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\confirm_extend.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\confirm_extend.ui'
# #
# Created by: 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 # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
@@ -13,14 +13,16 @@ class Ui_extend_confirm(object):
def setupUi(self, extend_confirm): def setupUi(self, extend_confirm):
extend_confirm.setObjectName("extend_confirm") extend_confirm.setObjectName("extend_confirm")
extend_confirm.resize(380, 97) 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 = QtWidgets.QDialogButtonBox(parent=extend_confirm)
self.buttonBox.setGeometry(QtCore.QRect(290, 20, 81, 241))
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Vertical) self.buttonBox.setOrientation(QtCore.Qt.Orientation.Vertical)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setObjectName("buttonBox") self.buttonBox.setObjectName("buttonBox")
self.textEdit = QtWidgets.QTextEdit(parent=extend_confirm) self.horizontalLayout.addWidget(self.buttonBox)
self.textEdit.setGeometry(QtCore.QRect(10, 10, 271, 81))
self.textEdit.setObjectName("textEdit")
self.retranslateUi(extend_confirm) self.retranslateUi(extend_confirm)
self.buttonBox.accepted.connect(extend_confirm.accept) # type: ignore self.buttonBox.accepted.connect(extend_confirm.accept) # type: ignore

View File

@@ -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' # 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 # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
@@ -337,17 +337,19 @@ class Ui_Dialog(object):
self.gridLayout_5.addLayout(self.verticalLayout_4, 6, 1, 1, 1) self.gridLayout_5.addLayout(self.verticalLayout_4, 6, 1, 1, 1)
self.stackedWidget.addWidget(self.page) self.stackedWidget.addWidget(self.page)
self.verticalLayout.addWidget(self.stackedWidget) self.verticalLayout.addWidget(self.stackedWidget)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog) 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.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Discard|QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.setCenterButtons(False)
self.buttonBox.setObjectName("buttonBox") 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.retranslateUi(Dialog)
self.stackedWidget.setCurrentIndex(0) self.stackedWidget.setCurrentIndex(3)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog): def retranslateUi(self, Dialog):
@@ -406,3 +408,4 @@ class Ui_Dialog(object):
self.copy_filename.setText(_translate("Dialog", "Kopieren")) self.copy_filename.setText(_translate("Dialog", "Kopieren"))
self.copy_ilias_filename.setText(_translate("Dialog", "Kopieren")) self.copy_ilias_filename.setText(_translate("Dialog", "Kopieren"))
self.copy_qoute.setText(_translate("Dialog", "Kopieren")) self.copy_qoute.setText(_translate("Dialog", "Kopieren"))
self.retryButton.setText(_translate("Dialog", "Wiederholen"))

View File

@@ -1,6 +1,6 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\mail_preview.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\mail_preview.ui'
# #
# Created by: 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 # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
@@ -102,7 +102,7 @@ class Ui_eMailPreview(object):
def retranslateUi(self, eMailPreview): def retranslateUi(self, eMailPreview):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
eMailPreview.setWindowTitle(_translate("eMailPreview", "eMail Voransicht")) 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_2.setText(_translate("eMailPreview", "Prof"))
self.label_5.setText(_translate("eMailPreview", "Art")) self.label_5.setText(_translate("eMailPreview", "Art"))
self.label_4.setText(_translate("eMailPreview", "Betreff")) self.label_4.setText(_translate("eMailPreview", "Betreff"))

View File

@@ -1,6 +1,6 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\settings.ui' # Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\settings.ui'
# #
# Created by: 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 # WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
@@ -12,149 +12,188 @@ from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):
def setupUi(self, Dialog): def setupUi(self, Dialog):
Dialog.setObjectName("Dialog") Dialog.setObjectName("Dialog")
Dialog.resize(750, 580) Dialog.setWindowModality(QtCore.Qt.WindowModality.NonModal)
self.buttonBox = QtWidgets.QDialogButtonBox(parent=Dialog) Dialog.resize(651, 679)
self.buttonBox.setGeometry(QtCore.QRect(120, 540, 621, 32)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) sizePolicy.setHorizontalStretch(0)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) sizePolicy.setVerticalStretch(0)
self.buttonBox.setObjectName("buttonBox") sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
self.frame = QtWidgets.QFrame(parent=Dialog) Dialog.setSizePolicy(sizePolicy)
self.frame.setGeometry(QtCore.QRect(0, 0, 751, 541)) self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) self.verticalLayout.setObjectName("verticalLayout")
self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) self.toolBox = QtWidgets.QToolBox(parent=Dialog)
self.frame.setObjectName("frame") sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
self.label_2 = QtWidgets.QLabel(parent=self.frame) sizePolicy.setHorizontalStretch(0)
self.label_2.setGeometry(QtCore.QRect(10, 20, 161, 21)) sizePolicy.setVerticalStretch(0)
self.label_2.setObjectName("label_2") sizePolicy.setHeightForWidth(self.toolBox.sizePolicy().hasHeightForWidth())
self.formLayoutWidget = QtWidgets.QWidget(parent=self.frame) self.toolBox.setSizePolicy(sizePolicy)
self.formLayoutWidget.setGeometry(QtCore.QRect(10, 40, 361, 491)) self.toolBox.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhNone)
self.formLayoutWidget.setObjectName("formLayoutWidget") self.toolBox.setObjectName("toolBox")
self.gridLayout = QtWidgets.QGridLayout(self.formLayoutWidget) self.page_1 = QtWidgets.QWidget()
self.gridLayout.setContentsMargins(0, 0, 0, 0) self.page_1.setGeometry(QtCore.QRect(0, 0, 633, 511))
self.gridLayout.setObjectName("gridLayout") sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
self.tb_select_db = QtWidgets.QToolButton(parent=self.formLayoutWidget) sizePolicy.setHorizontalStretch(0)
self.tb_select_db.setObjectName("tb_select_db") sizePolicy.setVerticalStretch(0)
self.gridLayout.addWidget(self.tb_select_db, 0, 2, 1, 1) sizePolicy.setHeightForWidth(self.page_1.sizePolicy().hasHeightForWidth())
self.db_path = QtWidgets.QLineEdit(parent=self.formLayoutWidget) 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.setEnabled(False)
self.db_path.setObjectName("db_path") self.db_path.setObjectName("db_path")
self.gridLayout.addWidget(self.db_path, 1, 1, 1, 1) self.gridLayout_3.addWidget(self.db_path, 1, 1, 1, 1)
self.label_3 = QtWidgets.QLabel(parent=self.formLayoutWidget) self.label_12 = QtWidgets.QLabel(parent=self.page_1)
self.label_3.setObjectName("label_3") self.label_12.setObjectName("label_12")
self.gridLayout.addWidget(self.label_3, 0, 0, 1, 1) self.gridLayout_3.addWidget(self.label_12, 2, 0, 1, 1)
self.db_name = QtWidgets.QLineEdit(parent=self.formLayoutWidget) self.label_11 = QtWidgets.QLabel(parent=self.page_1)
self.db_name.setObjectName("db_name") self.label_11.setObjectName("label_11")
self.gridLayout.addWidget(self.db_name, 0, 1, 1, 1) self.gridLayout_3.addWidget(self.label_11, 1, 0, 1, 1)
self.label_4 = QtWidgets.QLabel(parent=self.formLayoutWidget) self.tb_set_save_path = QtWidgets.QToolButton(parent=self.page_1)
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.tb_set_save_path.setObjectName("tb_set_save_path") 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) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.gridLayout.addItem(spacerItem, 3, 1, 1, 1) self.gridLayout_3.addItem(spacerItem, 3, 1, 1, 1)
self.label_5 = QtWidgets.QLabel(parent=self.formLayoutWidget) self.toolBox.addItem(self.page_1, "")
self.label_5.setObjectName("label_5") self.page_2 = QtWidgets.QWidget()
self.gridLayout.addWidget(self.label_5, 2, 0, 1, 1) self.page_2.setObjectName("page_2")
self.email_settings = QtWidgets.QTabWidget(parent=self.frame) self.gridLayout = QtWidgets.QGridLayout(self.page_2)
self.email_settings.setGeometry(QtCore.QRect(390, 40, 341, 491)) 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_settings.setObjectName("email_settings")
self.email_settingsPage1_2 = QtWidgets.QWidget() self.email_settingsPage1_2 = QtWidgets.QWidget()
self.email_settingsPage1_2.setObjectName("email_settingsPage1_2") self.email_settingsPage1_2.setObjectName("email_settingsPage1_2")
self.formLayoutWidget_2 = QtWidgets.QWidget(parent=self.email_settingsPage1_2) self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.email_settingsPage1_2)
self.formLayoutWidget_2.setGeometry(QtCore.QRect(10, 30, 321, 381)) self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.formLayoutWidget_2.setObjectName("formLayoutWidget_2") self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2 = QtWidgets.QGridLayout(self.formLayoutWidget_2)
self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
self.gridLayout_2.setObjectName("gridLayout_2") self.gridLayout_2.setObjectName("gridLayout_2")
self.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.setClearButtonEnabled(True)
self.smtp_address.setObjectName("smtp_address") self.smtp_address.setObjectName("smtp_address")
self.gridLayout_2.addWidget(self.smtp_address, 0, 1, 1, 1) self.gridLayout_2.addWidget(self.smtp_address, 0, 1, 1, 1)
self.label_8 = QtWidgets.QLabel(parent=self.formLayoutWidget_2) self.label_8 = QtWidgets.QLabel(parent=self.email_settingsPage1_2)
self.label_8.setObjectName("label_8") self.label_8.setObjectName("label_8")
self.gridLayout_2.addWidget(self.label_8, 3, 0, 1, 1) 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.setTristate(False)
self.use_username_smtp_login.setObjectName("use_username_smtp_login") self.use_username_smtp_login.setObjectName("use_username_smtp_login")
self.gridLayout_2.addWidget(self.use_username_smtp_login, 4, 1, 1, 1) 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.setClearButtonEnabled(True)
self.mail_username.setObjectName("mail_username") self.mail_username.setObjectName("mail_username")
self.gridLayout_2.addWidget(self.mail_username, 3, 1, 1, 1) 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.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhDigitsOnly|QtCore.Qt.InputMethodHint.ImhPreferNumbers)
self.smtp_port.setClearButtonEnabled(True) self.smtp_port.setClearButtonEnabled(True)
self.smtp_port.setObjectName("smtp_port") self.smtp_port.setObjectName("smtp_port")
self.gridLayout_2.addWidget(self.smtp_port, 1, 1, 1, 1) 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.label_10.setObjectName("label_10")
self.gridLayout_2.addWidget(self.label_10, 5, 0, 1, 1) self.gridLayout_2.addWidget(self.label_10, 5, 0, 1, 1)
self.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.label_7.setObjectName("label_7")
self.gridLayout_2.addWidget(self.label_7, 2, 0, 1, 1) 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.setText("")
self.label_9.setObjectName("label_9") self.label_9.setObjectName("label_9")
self.gridLayout_2.addWidget(self.label_9, 6, 0, 1, 1) 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.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhEmailCharactersOnly)
self.sender_email.setClearButtonEnabled(True) self.sender_email.setClearButtonEnabled(True)
self.sender_email.setObjectName("sender_email") self.sender_email.setObjectName("sender_email")
self.gridLayout_2.addWidget(self.sender_email, 2, 1, 1, 1) 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.label.setObjectName("label")
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1) 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.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhHiddenText|QtCore.Qt.InputMethodHint.ImhSensitiveData)
self.password.setClearButtonEnabled(True) self.password.setClearButtonEnabled(True)
self.password.setObjectName("password") self.password.setObjectName("password")
self.gridLayout_2.addWidget(self.password, 5, 1, 1, 1) 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.label_6.setObjectName("label_6")
self.gridLayout_2.addWidget(self.label_6, 1, 0, 1, 1) 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.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.togglePassword.setText("") self.togglePassword.setText("")
self.togglePassword.setObjectName("togglePassword") self.togglePassword.setObjectName("togglePassword")
self.gridLayout_2.addWidget(self.togglePassword, 5, 2, 1, 1) self.gridLayout_2.addWidget(self.togglePassword, 5, 2, 1, 1)
self.horizontalLayout_4.addLayout(self.gridLayout_2)
self.email_settings.addTab(self.email_settingsPage1_2, "") self.email_settings.addTab(self.email_settingsPage1_2, "")
self.email_settingsPage2_2 = QtWidgets.QWidget() self.email_settingsPage2_2 = QtWidgets.QWidget()
self.email_settingsPage2_2.setObjectName("email_settingsPage2_2") self.email_settingsPage2_2.setObjectName("email_settingsPage2_2")
self.verticalLayoutWidget = QtWidgets.QWidget(parent=self.email_settingsPage2_2) self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.email_settingsPage2_2)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 0, 321, 71)) self.verticalLayout_3.setObjectName("verticalLayout_3")
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout_2.setObjectName("verticalLayout_2")
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.horizontalLayout_3.setObjectName("horizontalLayout_3")
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_3.addItem(spacerItem1) self.horizontalLayout_3.addItem(spacerItem2)
self.bold = QtWidgets.QPushButton(parent=self.verticalLayoutWidget) self.bold = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
self.bold.setCheckable(True) self.bold.setCheckable(True)
self.bold.setObjectName("bold") self.bold.setObjectName("bold")
self.horizontalLayout_3.addWidget(self.bold) self.horizontalLayout_3.addWidget(self.bold)
self.italic = QtWidgets.QPushButton(parent=self.verticalLayoutWidget) self.italic = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
self.italic.setCheckable(True) self.italic.setCheckable(True)
self.italic.setObjectName("italic") self.italic.setObjectName("italic")
self.horizontalLayout_3.addWidget(self.italic) self.horizontalLayout_3.addWidget(self.italic)
self.underscore = QtWidgets.QPushButton(parent=self.verticalLayoutWidget) self.underscore = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
self.underscore.setCheckable(True) self.underscore.setCheckable(True)
self.underscore.setObjectName("underscore") self.underscore.setObjectName("underscore")
self.horizontalLayout_3.addWidget(self.underscore) self.horizontalLayout_3.addWidget(self.underscore)
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_3.addItem(spacerItem2) self.horizontalLayout_3.addItem(spacerItem3)
self.verticalLayout.addLayout(self.horizontalLayout_3) self.verticalLayout_2.addLayout(self.horizontalLayout_3)
self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout") self.horizontalLayout.setObjectName("horizontalLayout")
self.fontComboBox = QtWidgets.QFontComboBox(parent=self.verticalLayoutWidget) self.fontComboBox = QtWidgets.QFontComboBox(parent=self.email_settingsPage2_2)
self.fontComboBox.setObjectName("fontComboBox") self.fontComboBox.setObjectName("fontComboBox")
self.horizontalLayout.addWidget(self.fontComboBox) self.horizontalLayout.addWidget(self.fontComboBox)
self.font_size = QtWidgets.QComboBox(parent=self.verticalLayoutWidget) self.font_size = QtWidgets.QComboBox(parent=self.email_settingsPage2_2)
self.font_size.setObjectName("font_size") self.font_size.setObjectName("font_size")
self.font_size.addItem("") self.font_size.addItem("")
self.font_size.addItem("") self.font_size.addItem("")
@@ -172,40 +211,92 @@ class Ui_Dialog(object):
self.font_size.addItem("") self.font_size.addItem("")
self.font_size.addItem("") self.font_size.addItem("")
self.horizontalLayout.addWidget(self.font_size) self.horizontalLayout.addWidget(self.font_size)
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout.addItem(spacerItem3) self.horizontalLayout.addItem(spacerItem4)
self.verticalLayout.addLayout(self.horizontalLayout) self.verticalLayout_2.addLayout(self.horizontalLayout)
self.verticalLayout_3.addLayout(self.verticalLayout_2)
self.editSignature = QtWidgets.QTextEdit(parent=self.email_settingsPage2_2) self.editSignature = QtWidgets.QTextEdit(parent=self.email_settingsPage2_2)
self.editSignature.setGeometry(QtCore.QRect(10, 80, 321, 301))
self.editSignature.setObjectName("editSignature") self.editSignature.setObjectName("editSignature")
self.verticalLayout_3.addWidget(self.editSignature)
self.debug = QtWidgets.QPushButton(parent=self.email_settingsPage2_2) self.debug = QtWidgets.QPushButton(parent=self.email_settingsPage2_2)
self.debug.setGeometry(QtCore.QRect(30, 430, 75, 24))
self.debug.setObjectName("debug") self.debug.setObjectName("debug")
self.verticalLayout_3.addWidget(self.debug)
self.email_settings.addTab(self.email_settingsPage2_2, "") self.email_settings.addTab(self.email_settingsPage2_2, "")
self.label_3.setBuddy(self.db_name) self.horizontalLayout_2.addWidget(self.email_settings)
self.label_4.setBuddy(self.db_path) self.toolBox.addItem(self.page_3, "")
self.label_5.setBuddy(self.save_path) 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.retranslateUi(Dialog)
self.toolBox.setCurrentIndex(3)
self.email_settings.setCurrentIndex(0) self.email_settings.setCurrentIndex(0)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.db_name, self.db_path)
Dialog.setTabOrder(self.db_path, self.save_path)
def retranslateUi(self, Dialog): def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Einstellungen")) Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label_2.setText(_translate("Dialog", "Allgemeine Einstellungen"))
self.tb_select_db.setText(_translate("Dialog", "..."))
self.label_3.setToolTip(_translate("Dialog", "<html><head/><body><p>Name der Datenbank, welche verwendet werden soll. <span style=\" font-weight:600;\">Muss</span> auf .db enden</p></body></html>"))
self.label_3.setText(_translate("Dialog", "Datenbankname"))
self.db_name.setText(_translate("Dialog", "sap.db")) self.db_name.setText(_translate("Dialog", "sap.db"))
self.label_4.setText(_translate("Dialog", "Datenbankpfad")) self.label_5.setToolTip(_translate("Dialog", "<html><head/><body><p>Name der Datenbank, welche verwendet werden soll. <span style=\" font-weight:600;\">Muss</span> auf .db enden</p></body></html>"))
self.label_5.setText(_translate("Dialog", "Datenbankname"))
self.label_12.setToolTip(_translate("Dialog", "Pfad, an dem heruntergeladene Dateien gespeichert werden sollen"))
self.label_12.setText(_translate("Dialog", "Temporäre Dateien"))
self.label_11.setText(_translate("Dialog", "Datenbankpfad"))
self.tb_set_save_path.setText(_translate("Dialog", "...")) self.tb_set_save_path.setText(_translate("Dialog", "..."))
self.label_5.setToolTip(_translate("Dialog", "Pfad, an dem heruntergeladene Dateien gespeichert werden sollen")) self.tb_select_db.setText(_translate("Dialog", "..."))
self.label_5.setText(_translate("Dialog", "Temporäre Dateien")) 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.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.setStatusTip(_translate("Dialog", "Anklicken, wenn Nutzername benötigt wird, um sich beim Server anzumelden"))
self.use_username_smtp_login.setText(_translate("Dialog", "Nutzername zum\n" self.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.font_size.setItemText(14, _translate("Dialog", "72"))
self.debug.setText(_translate("Dialog", "Debug")) self.debug.setText(_translate("Dialog", "Debug"))
self.email_settings.setTabText(self.email_settings.indexOf(self.email_settingsPage2_2), _translate("Dialog", "Signatur")) self.email_settings.setTabText(self.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"))

View File

@@ -144,7 +144,7 @@
<rect> <rect>
<x>150</x> <x>150</x>
<y>70</y> <y>70</y>
<width>91</width> <width>111</width>
<height>21</height> <height>21</height>
</rect> </rect>
</property> </property>

View File

@@ -13,32 +13,21 @@
<property name="windowTitle"> <property name="windowTitle">
<string>Dialog</string> <string>Dialog</string>
</property> </property>
<widget class="QDialogButtonBox" name="buttonBox"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="geometry"> <item>
<rect> <widget class="QTextEdit" name="textEdit"/>
<x>290</x> </item>
<y>20</y> <item>
<width>81</width> <widget class="QDialogButtonBox" name="buttonBox">
<height>241</height> <property name="orientation">
</rect> <enum>Qt::Vertical</enum>
</property> </property>
<property name="orientation"> <property name="standardButtons">
<enum>Qt::Vertical</enum> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property> </property>
<property name="standardButtons"> </widget>
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </item>
</property> </layout>
</widget>
<widget class="QTextEdit" name="textEdit">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>271</width>
<height>81</height>
</rect>
</property>
</widget>
</widget> </widget>
<resources/> <resources/>
<connections> <connections>

View File

@@ -113,7 +113,7 @@
<item> <item>
<widget class="QStackedWidget" name="stackedWidget"> <widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>3</number>
</property> </property>
<widget class="QWidget" name="mono"> <widget class="QWidget" name="mono">
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
@@ -684,53 +684,25 @@ Nachname, Vorname</string>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QDialogButtonBox" name="buttonBox"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="orientation"> <item>
<enum>Qt::Horizontal</enum> <widget class="QDialogButtonBox" name="buttonBox">
</property> <property name="standardButtons">
<property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Discard|QDialogButtonBox::Ok</set>
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Discard|QDialogButtonBox::Ok</set> </property>
</property> </widget>
<property name="centerButtons"> </item>
<bool>false</bool> <item>
</property> <widget class="QPushButton" name="retryButton">
</widget> <property name="text">
<string>Wiederholen</string>
</property>
</widget>
</item>
</layout>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections> <connections/>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>Dialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>266</x>
<y>472</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>Dialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>334</x>
<y>472</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui> </ui>

File diff suppressed because it is too large Load Diff

View File

@@ -54,7 +54,8 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
self.book_pages.textChanged.connect(self.check_pages) self.book_pages.textChanged.connect(self.check_pages)
self.hg_pages.textChanged.connect(self.check_pages) self.hg_pages.textChanged.connect(self.check_pages)
self.zs_pages.textChanged.connect(self.check_pages) self.zs_pages.textChanged.connect(self.check_pages)
self.retryButton.clicked.connect(self.retry)
def check_pages(self): def check_pages(self):
if self.source_pages: if self.source_pages:
if self.book_pages.text() !=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): for line in self.findChildren(QtWidgets.QTextEdit):
line.clear() 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): def stack(self):
self.stackedWidget.setEnabled(True) self.stackedWidget.setEnabled(True)
if self.btn_mono.isChecked(): if self.btn_mono.isChecked():
@@ -162,7 +172,8 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
self.ilias_filename.setText(ilias_name) self.ilias_filename.setText(ilias_name)
self.stackedWidget.setCurrentIndex(3) self.stackedWidget.setCurrentIndex(3)
def search(self): def search(self, pages=None):
print("searching")
param = self.searchIdent.text() param = self.searchIdent.text()
web = WebRequest() web = WebRequest()
web.get_ppn(param) web.get_ppn(param)
@@ -172,9 +183,9 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
bib = BibTextTransformer("ARRAY") bib = BibTextTransformer("ARRAY")
bib.get_data(data) bib.get_data(data)
data = bib.return_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 # use field to set data in the correct fields
fields = self.findChildren(QtWidgets.QLineEdit) fields = self.findChildren(QtWidgets.QLineEdit)
self.source_pages = data.pages self.source_pages = data.pages
@@ -201,6 +212,10 @@ class ElsaAddEntry(QtWidgets.QDialog, Ui_Dialog):
c_field.setText(c_data) c_field.setText(c_data)
if "Seiten" in c_field.text(): if "Seiten" in c_field.text():
self.source_pages = 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(): def launch():
app = QtWidgets.QApplication([]) app = QtWidgets.QApplication([])
dialog = ElsaAddEntry() dialog = ElsaAddEntry()

View File

@@ -51,6 +51,7 @@ class Mail_Dialog(QtWidgets.QDialog, MailPreviewDialog):
# app_subject, # app_subject,
# prof_name, # prof_name,
) )
logger.log_info("Setting up mail dialog") logger.log_info("Setting up mail dialog")
self.appid = app_id self.appid = app_id
self.appname = app_name self.appname = app_name

View File

@@ -28,7 +28,7 @@ class ParsedTitles(QtWidgets.QWidget, Ui_Form):
self.progressBar.setValue(value) self.progressBar.setValue(value)
def worker_quit(self): def worker_quit(self):
print("Terminating worker") # print("Terminating worker")
self.worker.terminate() self.worker.terminate()
self.worker.quit() self.worker.quit()
self.worker.deleteLater() self.worker.deleteLater()
@@ -62,7 +62,7 @@ class ParsedTitles(QtWidgets.QWidget, Ui_Form):
def determine_progress(self, signal): def determine_progress(self, signal):
# check length of listWidget # check length of listWidget
length = self.listWidget.count() length = self.listWidget.count()
print(f"Length of listWidget: {length}") # print(f"Length of listWidget: {length}")
if length == 0: if length == 0:
logger.log_info("AutoAdder finished") logger.log_info("AutoAdder finished")
self.buttonBox.accepted.emit() self.buttonBox.accepted.emit()

View File

@@ -2,13 +2,14 @@ from PyQt6 import QtWidgets
from .dialog_sources.Ui_reminder import Ui_Erinnerung as Ui_Dialog from .dialog_sources.Ui_reminder import Ui_Erinnerung as Ui_Dialog
from src import Icon from src import Icon
import datetime as date
class ReminderDialog(QtWidgets.QDialog, Ui_Dialog): class ReminderDialog(QtWidgets.QDialog, Ui_Dialog):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setupUi(self) self.setupUi(self)
self.setWindowIcon(Icon("notification").icon) self.setWindowIcon(Icon("notification").icon)
self.setWindowTitle("Erinnerung") self.setWindowTitle("Erinnerung")
self.dateEdit.setDate(date.datetime.now())
def return_message(self) -> dict: def return_message(self) -> dict:
return { return {
"message": self.message_box.toPlainText(), "message": self.message_box.toPlainText(),

View File

@@ -1,7 +1,5 @@
from PyQt6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
from src import Icon, settings from src import Icon, settings
from .dialog_sources.Ui_settings import Ui_Dialog as _settings from .dialog_sources.Ui_settings import Ui_Dialog as _settings
base = """'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> base = """'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
@@ -25,10 +23,11 @@ base = """'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/T
class Settings(QtWidgets.QDialog, _settings): class Settings(QtWidgets.QDialog, _settings):
def __init__(self, user): def __init__(self, user=None):
super().__init__() super().__init__()
self.setupUi(self) self.setupUi(self)
self.password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) self.password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal)
self.zotero_api_key.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal)
self.editSignature.setAcceptRichText(True) self.editSignature.setAcceptRichText(True)
self.editSignature.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) self.editSignature.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
self.bold.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.bold.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
@@ -36,7 +35,8 @@ class Settings(QtWidgets.QDialog, _settings):
self.underscore.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.underscore.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.font_size.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.font_size.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.fontComboBox.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.fontComboBox.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.setWindowIcon(Icon("settings").icon) # self.setWindowIcon(Icon("settings").icon)
Icon("settings", self)
self.setWindowTitle("Einstellungen") self.setWindowTitle("Einstellungen")
self.font_size.setCurrentText("9") self.font_size.setCurrentText("9")
# add button to toggle password visibility # add button to toggle password visibility
@@ -46,6 +46,7 @@ class Settings(QtWidgets.QDialog, _settings):
self.debug.hide() self.debug.hide()
self.showPassword = True self.showPassword = True
self.togglePassword.clicked.connect(self.toggle_password) self.togglePassword.clicked.connect(self.toggle_password)
self.toggle_api_visibility.clicked.connect(self.toggle_api)
self.tb_select_db.clicked.connect(self.select_db) self.tb_select_db.clicked.connect(self.select_db)
self.tb_set_save_path.clicked.connect(self.set_save_path) self.tb_set_save_path.clicked.connect(self.set_save_path)
self.bold.clicked.connect(self.setFontBold) self.bold.clicked.connect(self.setFontBold)
@@ -55,8 +56,15 @@ class Settings(QtWidgets.QDialog, _settings):
self.fontComboBox.currentFontChanged.connect(self.setCurrentFont) self.fontComboBox.currentFontChanged.connect(self.setCurrentFont)
self.debug.clicked.connect(self.debug_mode) self.debug.clicked.connect(self.debug_mode)
self.toggle_password() self.toggle_password()
self.toggle_api()
self.load_config() self.load_config()
self.buttonBox.accepted.connect(self.save) self.buttonBox.accepted.connect(self.save)
# set text in gridlayout_4 to be not bold
self.toolBox.setItemIcon(0, Icon("database").icon)
self.toolBox.setItemIcon(1, Icon("api").icon)
self.toolBox.setItemIcon(2, Icon("mail").icon)
self.toolBox.setItemIcon(3, Icon("icons").icon)
def load_config(self): def load_config(self):
self.db_name.setText(settings.database.name) self.db_name.setText(settings.database.name)
@@ -71,6 +79,36 @@ class Settings(QtWidgets.QDialog, _settings):
settings.mail.use_user_name if settings.mail.use_user_name else False settings.mail.use_user_name if settings.mail.use_user_name else False
) )
self.editSignature.setHtml(settings.mail.signature) self.editSignature.setHtml(settings.mail.signature)
self.zotero_api_key.setText(settings.zotero.api_key)
self.zotero_library_id.setText(settings.zotero.library_id)
self.zotero_library_type.setText(settings.zotero.library_type)
for row, color in enumerate(settings.icons.colors):
# add a label with the color name, a lineedit with the color value and a button to change the color
label = QtWidgets.QLabel(color)
lineedit = QtWidgets.QLineEdit(settings.icons.colors[color])
button = QtWidgets.QPushButton("Farbe ändern")
button.clicked.connect(lambda: self.change_color(lineedit))
self.gridLayout_4.addWidget(label, row, 0)
self.gridLayout_4.addWidget(lineedit, row, 1)
self.gridLayout_4.addWidget(button, row, 2)
for i in range(self.gridLayout_4.count()):
self.gridLayout_4.itemAt(i).widget().setFont(QtGui.QFont("Segoe UI", 9))
# set scrollarea layout to be a form layout
# label = QtWidgets.QLabel("Icon Name")
# filename = QtWidgets.QLabel("Dateiname")
# self.formLayout.addRow(label, filename)
for row, icon in enumerate(settings.icons.icons):
label = QtWidgets.QLabel(icon)
lineedit = QtWidgets.QLineEdit(settings.icons.icons[icon])
self.formLayout.addRow(label, lineedit)
def change_color(self, lineedit):
colorDialog = QtWidgets.QColorDialog()
colorDialog.setSizePolicy()
color = colorDialog.getColor()
if color.isValid():
lineedit.setText(color.name())
def setCurrentFont(self): def setCurrentFont(self):
font = self.fontComboBox.currentFont() font = self.fontComboBox.currentFont()
@@ -82,17 +120,23 @@ class Settings(QtWidgets.QDialog, _settings):
self.editSignature.setFontPointSize(int(size)) self.editSignature.setFontPointSize(int(size))
def toggle_password(self): def toggle_password(self):
self.togglePassword.setIconSize(QtCore.QSize(16, 16)) # self.togglePassword.setIconSize(QtCore.QSize(16, 16))
if self.showPassword is False: if self.password.echoMode() == QtWidgets.QLineEdit.EchoMode.Password:
self.password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal) self.password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal)
Icon("show_password", self.togglePassword) Icon("show_password", self.togglePassword)
self.showPassword = True
else: else:
self.password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) self.password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
Icon("hide_password", self.togglePassword) Icon("hide_password", self.togglePassword)
self.showPassword = False
def toggle_api(self):
if self.zotero_api_key.echoMode() == QtWidgets.QLineEdit.EchoMode.Normal:
self.zotero_api_key.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
Icon("hide_password", self.toggle_api_visibility)
else:
self.zotero_api_key.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal)
Icon("show_password", widget=self.toggle_api_visibility)
def setFontBold(self): def setFontBold(self):
if self.bold.isChecked(): if self.bold.isChecked():
@@ -158,15 +202,38 @@ class Settings(QtWidgets.QDialog, _settings):
"use_user_name", self.use_username_smtp_login.isChecked() "use_user_name", self.use_username_smtp_login.isChecked()
) )
settings.set_mail_attr("signature", signature) settings.set_mail_attr("signature", signature)
print("Settings:") settings.set_zotero_attr("api_key", self.zotero_api_key.text())
print(settings) settings.set_zotero_attr("library_id", self.zotero_library_id.text())
settings.set_zotero_attr("library_type", self.zotero_library_type.text())
for color in self.get_colors():
settings.icons.colors[color] = self.get_colors()[color]
print(color)
for icon in self.get_icons():
settings.icons.icons[icon] = self.get_icons()[icon]
settings.icons.save()
return settings return settings
def get_colors(self) -> 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): def save(self):
config = self.return_data() config = self.return_data()
print(config.mail) # print(config)
print("Saving config")
print(config)
config.save() config.save()
self.accept() self.accept()
@@ -175,6 +242,6 @@ def launch_settings():
import sys import sys
app = QtWidgets.QApplication(sys.argv) app = QtWidgets.QApplication(sys.argv)
window = Settings("admin") window = Settings()
window.show() window.show()
sys.exit(app.exec()) sys.exit(app.exec())

View File

@@ -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)

View File

@@ -114,15 +114,15 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="load_app"> <widget class="QPushButton" name="create_document">
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::NoFocus</enum> <enum>Qt::NoFocus</enum>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Load the Semesterapparate from the database</string> <string>Erstellt die Übersicht, welche am Regal ausgehängt werden kann</string>
</property> </property>
<property name="text"> <property name="text">
<string>App. aufrufen</string> <string>Übersicht erstellen</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -1897,6 +1897,7 @@
<property name="title"> <property name="title">
<string>Help</string> <string>Help</string>
</property> </property>
<addaction name="actionDokumentation_lokal"/>
<addaction name="actionDokumentation"/> <addaction name="actionDokumentation"/>
<addaction name="actionAbout"/> <addaction name="actionAbout"/>
</widget> </widget>
@@ -1932,7 +1933,7 @@
</action> </action>
<action name="actionDokumentation"> <action name="actionDokumentation">
<property name="text"> <property name="text">
<string>Dokumentation</string> <string>Dokumentation (online)</string>
</property> </property>
<property name="shortcut"> <property name="shortcut">
<string>F1</string> <string>F1</string>
@@ -1949,6 +1950,11 @@
<enum>QAction::AboutRole</enum> <enum>QAction::AboutRole</enum>
</property> </property>
</action> </action>
<action name="actionDokumentation_lokal">
<property name="text">
<string>Dokumentation (lokal)</string>
</property>
</action>
</widget> </widget>
<tabstops> <tabstops>
<tabstop>drpdwn_app_nr</tabstop> <tabstop>drpdwn_app_nr</tabstop>

View File

@@ -52,6 +52,7 @@ from src.ui import (
EditUser, EditUser,
EditProf EditProf
) )
from src.utils import SemesterDocument
valid_input = (0, 0, 0, 0, 0, 0) valid_input = (0, 0, 0, 0, 0, 0)
@@ -139,7 +140,7 @@ class Ui(Ui_Semesterapparat):
QtWidgets.QScrollBar(), QtCore.Qt.AlignmentFlag.AlignRight QtWidgets.QScrollBar(), QtCore.Qt.AlignmentFlag.AlignRight
) )
self.tableWidget_apparate.doubleClicked.connect(self.load_app_data) self.tableWidget_apparate.doubleClicked.connect(self.load_app_data)
self.load_app.hide()
# print(f"user:{self.active_user}") # print(f"user:{self.active_user}")
userrole = self.db.getRole(self.active_user) userrole = self.db.getRole(self.active_user)
# hide admin interface when non-admin is logged in # 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.sem_year.textChanged.connect(self.validate_semester)
self.check_eternal_app.stateChanged.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.chkbx_show_del_media.stateChanged.connect(self.update_app_media_list)
self.progress_label.setText("Bitte warten...") self.progress_label.setText("Bitte warten...")
# Set visibility/enabled state of certain entries # 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.started.connect(self.thread_check)
self.validate_thread.start() self.validate_thread.start()
self.add_medium.setEnabled(False) 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 # get all current apparats and cache them in a list
self.apparats = self.get_apparats() self.apparats = self.get_apparats()
@@ -229,6 +232,32 @@ class Ui(Ui_Semesterapparat):
self.steps.hide() 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): def checkValidInput(self):
if valid_input == (1, 1, 1, 1, 1, 1): if valid_input == (1, 1, 1, 1, 1, 1):
self.check_file.setEnabled(True) self.check_file.setEnabled(True)
@@ -475,11 +504,11 @@ class Ui(Ui_Semesterapparat):
# Validators # Validators
def __setValidState(self, widget, state, mand, index): def __setValidState(self, widget, state, mand, index):
if state: if state:
Icon("valid_true", widget) Icon("valid_true", widget, True, color="success")
mand.setText("") mand.setText("")
self.change_state(index, 1) self.change_state(index, 1)
else: else:
Icon("valid_false", widget) Icon("valid_false", widget, recolor=True, color="warning")
mand.setText("*") mand.setText("*")
self.change_state(index, 0) self.change_state(index, 0)
@@ -1191,9 +1220,7 @@ class Ui(Ui_Semesterapparat):
return False return False
appd = ApparatData() appd = ApparatData()
appd.appnr = self.active_apparat appd.appnr = self.active_apparat
appd.prof_title = ( appd.prof_title = self.prof_title.text()
None if self.prof_title.text() == "" else self.prof_title.text()
)
appd.profname = self.drpdwn_prof_name.currentText() appd.profname = self.drpdwn_prof_name.currentText()
appd.appname = self.app_name.text() appd.appname = self.app_name.text()
appd.semester = self.generateSemester() appd.semester = self.generateSemester()
@@ -1344,13 +1371,15 @@ class Ui(Ui_Semesterapparat):
self.logger.log_info("Opening reminder dialog") self.logger.log_info("Opening reminder dialog")
reminder = reminder_ui() reminder = reminder_ui()
reminder.exec() reminder.exec()
tableposition = self.tableWidget_apparate.currentRow()
appnr = self.tableWidget_apparate.item(tableposition, 0).text()
if reminder.result() == QtWidgets.QDialog.DialogCode.Accepted: if reminder.result() == QtWidgets.QDialog.DialogCode.Accepted:
data = reminder.return_message() data = reminder.return_message()
# print(data) # print(data)
self.db.addMessage( self.db.addMessage(
data, data,
self.active_user, 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.setMessages([data])
self.calendarWidget.updateCells() self.calendarWidget.updateCells()
@@ -1366,6 +1395,8 @@ class Ui(Ui_Semesterapparat):
self.calendarWidget.updateCells() self.calendarWidget.updateCells()
def open_reminder(self): def open_reminder(self):
if settings.mail.use_user_name == False:
print("False")
selected_date = self.calendarWidget.selectedDate().toString("yyyy-MM-dd") selected_date = self.calendarWidget.selectedDate().toString("yyyy-MM-dd")
# # print(selected_date) # # print(selected_date)
messages = self.db.getMessages(selected_date) messages = self.db.getMessages(selected_date)
@@ -1685,7 +1716,7 @@ class Ui(Ui_Semesterapparat):
# print(state) # print(state)
pid = self.__get_table_data_field(self.tableWidget_apparate, position[0], 2) pid = self.__get_table_data_field(self.tableWidget_apparate, position[0], 2)
if state == 1: if state == 1:
self.db.deleteApparat(selected_apparat_id, generateSemesterByDate()) self.db.deleteApparat(selected_apparat_id)
# delete the corresponding entry from self.apparats # delete the corresponding entry from self.apparats
for apparat in self.apparats: for apparat in self.apparats:
if apparat[4] == int(selected_apparat_id): if apparat[4] == int(selected_apparat_id):

View File

@@ -7,11 +7,16 @@ class UserCreate(QtWidgets.QDialog, Ui_Dialog):
def __init__(self): def __init__(self):
super(UserCreate, self).__init__() super(UserCreate, self).__init__()
self.setupUi(self) 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.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): def add_user(self):
username = self.user_create_frame_username.text() username = self.user_create_frame_username.text()
@@ -26,9 +31,11 @@ class UserCreate(QtWidgets.QDialog, Ui_Dialog):
salt=userdata[1], salt=userdata[1],
role=role, 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_username.clear()
self.user_create_frame_password.clear() self.user_create_frame_password.clear()
self.user_frame_userrole.setCurrentText("")
self.admin_action_changed.emit() self.admin_action_changed.emit()
def launch(): def launch():

View File

@@ -3,7 +3,7 @@ from PyQt6 import QtWidgets, QtCore
from PyQt6.QtCore import pyqtSignal from PyQt6.QtCore import pyqtSignal
from icecream import ic from icecream import ic
from src.backend import Database from src.backend import Database
from src.logic import Prof
class EditProf(QtWidgets.QDialog, Ui_Dialog): class EditProf(QtWidgets.QDialog, Ui_Dialog):
def __init__(self): def __init__(self):
super(EditProf, self).__init__() super(EditProf, self).__init__()
@@ -19,7 +19,21 @@ class EditProf(QtWidgets.QDialog, Ui_Dialog):
def gather_data(self): def gather_data(self):
self.add_faculty_member_data() 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): def add_faculty_member_data(self):
faculty_members = self.db.getFacultyMembers() faculty_members = self.db.getFacultyMembers()
names = [f"{member[5]}" for member in faculty_members] 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.faculty_member_oldmail.setText("")
self.edit_faculty_member_title.setText("") self.edit_faculty_member_title.setText("")
else: else:
# title = data[1] self.faculty_member_old_telnr.setText(data.telnr)
# if title is None: self.faculty_member_oldmail.setText(data.mail)
# title = "" ic(data)
# self.edit_faculty_member_title.setText(title)
self.faculty_member_old_telnr.setText(data[6])
self.faculty_member_oldmail.setText(data[5])
( (
self.edit_faculty_member_title.setText(data[1]) self.edit_faculty_member_title.setText(data.title)
if data[1] is not None if data.title is not None
else self.edit_faculty_member_title.setText("") else self.edit_faculty_member_title.setText("")
) )
def edit_faculty_member_action(self): def edit_faculty_member_action(self):
def __gen_fullname(fname, lname, data): def __gen_fullname(fname, lname, data):
if fname == "" and lname == "": if fname == "" and lname == "":
return data[3] return data[0]
if fname == "" and lname != "": if fname == "" and lname != "":
return f"{lname} {data[1]}" return f"{lname} {data[1]}"
if fname != "" and lname == "": 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 # 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() == "": if self.edit_faculty_member_select_member.currentText() == "":
return return
olddata = self.db.getFacultyMember( olddata = self.db.getProfByName(
self.edit_faculty_member_select_member.currentText() self.edit_faculty_member_select_member.currentText()
) )
ic(olddata) ic(olddata)
data = olddata data = olddata
oldlname = data[2] oldlname = data.lastname
oldfname = data[1] oldfname = data.firstname
# take data except first and last entry # take data except first and last entry
titel = ( titel = (
@@ -86,16 +97,12 @@ class EditProf(QtWidgets.QDialog, Ui_Dialog):
fname = ( fname = (
self.edit_faculty_member_new_surname.text() self.edit_faculty_member_new_surname.text()
if self.edit_faculty_member_new_surname.text() != "" if self.edit_faculty_member_new_surname.text() != ""
else self.edit_faculty_member_select_member.currentText() else self.edit_faculty_member_select_member.currentText().strip()
.split(" ")[1]
.strip()
) )
lname = ( lname = (
self.user_faculty_member_new_name.text() self.user_faculty_member_new_name.text()
if self.user_faculty_member_new_name.text() != "" if self.user_faculty_member_new_name.text() != ""
else self.edit_faculty_member_select_member.currentText() else self.edit_faculty_member_select_member.currentText().strip()
.split(" ")[0]
.strip()
) )
fullname = __gen_fullname(fname, lname, data) fullname = __gen_fullname(fname, lname, data)
telnr = self.user_faculty_member_new_telnr.text() telnr = self.user_faculty_member_new_telnr.text()

View File

@@ -4,16 +4,32 @@ from PyQt6.QtCore import pyqtSignal
from icecream import ic from icecream import ic
from src.backend import Database from src.backend import Database
from src.backend import AdminCommands from src.backend import AdminCommands
admin = AdminCommands()
class EditUser(QtWidgets.QDialog, Ui_Dialog): class EditUser(QtWidgets.QDialog, Ui_Dialog):
def __init__(self): def __init__(self):
super(EditUser, self).__init__() super(EditUser, self).__init__()
self.setupUi(self) self.setupUi(self)
self.btn_delete_user.clicked.connect(self.delete_user) self.btn_delete_user.clicked.connect(self.delete_user)
self.update_user.clicked.connect(self.update_user_data) self.update_user.clicked.connect(self.update_user_data)
self.user_delete_frame_user_select.currentIndexChanged.connect(self.updateData)
#Variables #Variables
self.db = Database() 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): def update_user_data(self):
username = self.user_delete_frame_user_select.currentText() username = self.user_delete_frame_user_select.currentText()
password = ( password = (
@@ -27,7 +43,7 @@ class EditUser(QtWidgets.QDialog, Ui_Dialog):
else None else None
) )
userdata = AdminCommands().create_password(password) userdata = admin.create_password(password)
data = { data = {
"password": f"{userdata[1]}{userdata[0]}", "password": f"{userdata[1]}{userdata[0]}",
"salt": userdata[1], "salt": userdata[1],

View File

@@ -30,7 +30,7 @@ class StatusWidget(QWidget):
while parent: while parent:
parent_depth += 1 parent_depth += 1
parent = parent.parent() 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 # 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) self.person_double_clicked.emit(self.header, item.text(column), parent_depth)

View File

@@ -8,6 +8,7 @@ from PyQt6.QtCore import QDate
from src import Icon from src import Icon
from src.backend import recreateElsaFile, generateSemesterByDate, Database from src.backend import recreateElsaFile, generateSemesterByDate, Database
from src.logic import elsa_word_to_csv, MyLogger, Prof 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 import popus_confirm
from src.ui.dialogs import ElsaAddEntry from src.ui.dialogs import ElsaAddEntry
from src.ui.widgets import FilePicker from src.ui.widgets import FilePicker
@@ -69,6 +70,7 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.newProf_title.textChanged.connect(self.checkProfData) self.newProf_title.textChanged.connect(self.checkProfData)
self.loadFrame() self.loadFrame()
log.info("Elsa Dialog loaded")
# self.show() # self.show()
def checkProfData(self): def checkProfData(self):
@@ -118,32 +120,26 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
selected_row = self.table_elsa_list.currentRow() selected_row = self.table_elsa_list.currentRow()
signature = self.table_elsa_list.item(selected_row, 10).text() signature = self.table_elsa_list.item(selected_row, 10).text()
mediatype = self.table_elsa_list.item(selected_row, 11).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) data.searchIdent.setText(signature)
if mediatype == "Zeitschriftenaufsätze": match mediatype:
data.btn_zs.click() case "Monografien":
elif mediatype == "Herausgeberwerke": data.btn_mono.click()
data.btn_hg.click() case "Herausgeberwerke":
elif mediatype == "Monografien": data.btn_hg.click()
data.btn_mono.click() case "Zeitschriftenaufsätze":
data.btn_zs.click()
data.search() if ";" in pages:
data.search()
else:
data.search(pages=pages)
data.exec() data.exec()
def add_new_elsa(self): def add_new_elsa(self):
self.create_frame_elsa.setEnabled(True) self.create_frame_elsa.setEnabled(True)
self.elsa_cancel_create.setEnabled(True) self.elsa_cancel_create.setEnabled(True)
self.dokument_list_elsa.setRowCount(0) 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_save.setEnabled(True)
self.elsa_update.setEnabled(False) self.elsa_update.setEnabled(False)
self.elsa_prof.setFocus() self.elsa_prof.setFocus()
@@ -159,6 +155,8 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.quote_entry.setEnabled(False) self.quote_entry.setEnabled(False)
self.elsa_save.setEnabled(False) self.elsa_save.setEnabled(False)
self.elsa_update.setEnabled(False) self.elsa_update.setEnabled(False)
self.seperateEntries.setChecked(False)
def generateTodayDateElsa(self): def generateTodayDateElsa(self):
self.elsa_date.setText(QDate.currentDate().toString("dd.MM.yyyy")) self.elsa_date.setText(QDate.currentDate().toString("dd.MM.yyyy"))
@@ -230,13 +228,12 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
files, files,
elsa_id, elsa_id,
) )
log.info("Stored {} files in the database", len(files))
self.cancel_elsa_creation() self.cancel_elsa_creation()
self.refresh_elsa_table() self.refresh_elsa_table()
self.elsa_prof.clear()
self.elsa_prof.addItems(self.getProfs())
self.elsa_prof.addItem("")
self.elsa_prof.setCurrentText("") self.elsa_prof.setCurrentText("")
self.quote_entry.setEnabled(False) self.quote_entry.setEnabled(False)
log.info("Saved apparat to database, id {}", elsa_id)
def refresh_elsa_table(self): def refresh_elsa_table(self):
self.elsa_table.setRowCount(0) self.elsa_table.setRowCount(0)
@@ -272,7 +269,12 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
elsa_apparats = self.db.getElsaApparats() elsa_apparats = self.db.getElsaApparats()
elsa_id = None elsa_id = None
for apparat in elsa_apparats: 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] elsa_id = apparat[0]
# print(elsa_id) # print(elsa_id)
break break
@@ -281,7 +283,6 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.elsa_prof.setCurrentText(prof) self.elsa_prof.setCurrentText(prof)
ic(elsa_id) ic(elsa_id)
if elsa_id is None: if elsa_id is None:
log.
return return
documents = self.db.getElsaFiles(elsa_id) documents = self.db.getElsaFiles(elsa_id)
for document in documents: for document in documents:
@@ -397,24 +398,31 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
filename=filename, filetype=filetype, open=False filename=filename, filetype=filetype, open=False
) )
# print(file) # print(file)
data, doctype = elsa_word_to_csv(file) data, _ = elsa_word_to_csv(file)
elsa_id = self.db.getElsaId( 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_prof.currentText(),
self.elsa_semester.text(), self.elsa_semester.text(),
self.elsa_date.text(), self.elsa_date.text(),
) )
for row in data: for row in data:
if ";" in row["pages"]: if self.seperateEntries.isChecked():
count = row["pages"].split(";") if ";" in row["pages"]:
for i in range(len(count)): count = row["pages"].split(";")
row["pages"] = count[i] for i in range(len(count)):
self.setElsaRow( row["pages"] = count[i]
row, self.setElsaRow(
) row,
)
self.db.addElsaMedia(row, elsa_id)
else: else:
self.setElsaRow(row) self.setElsaRow(row)
self.db.addElsaMedia(row, elsa_id)
self.db.addElsaMedia(row, elsa_id)
self.quote_entry.setEnabled(True) self.quote_entry.setEnabled(True)
def openDocumentElsa(self): def openDocumentElsa(self):
@@ -471,6 +479,7 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.elsa_statistics.addTab(graph, "Graph") self.elsa_statistics.addTab(graph, "Graph")
def launch(): def launch():
log.debug("Launching Elsa Dialog")
app = QtWidgets.QApplication([]) app = QtWidgets.QApplication([])
window = ElsaDialog() window = ElsaDialog()
window.show() window.show()

View File

@@ -1,5 +1,5 @@
from .widget_sources.Ui_search_statistic_page import Ui_Dialog 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 PyQt6.QtCore import pyqtSignal
from src.backend import Database, generateSemesterByDate from src.backend import Database, generateSemesterByDate
from src.logic import custom_sort, Prof from src.logic import custom_sort, Prof
@@ -55,13 +55,25 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
self.populate_tab() self.populate_tab()
def restore_apparat(self): def restore_apparat(self):
row = self.tableWidget.currentRow() selected_rows = self.tableWidget.selectionModel().selectedRows()
apparat = self.tableWidget.item(row, 1).text() apparats = []
ic(apparat) if len(selected_rows) == 0:
apparat_id = self.db.getApparatId(apparat) # get position of right click
# restore the apparat row = self.tableWidget.currentRow()
self.db.restoreApparat(apparat_id) apparats.append(self.tableWidget.item(row, 1).text())
# update the table 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() self.reloadSignal.emit()
def statistics_table_context_menu(self, position): def statistics_table_context_menu(self, position):
@@ -140,7 +152,7 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
app_id = i["app_id"] app_id = i["app_id"]
app_name = i["app_name"] app_name = i["app_name"]
prof_name = i["prof_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( self.mail_thread = Mail_Dialog(
app_id=app_id, app_id=app_id,
app_name=app_name, app_name=app_name,

View File

@@ -31,6 +31,7 @@ class Ui_Dialog(object):
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.edit_faculty_member_title.sizePolicy().hasHeightForWidth()) sizePolicy.setHeightForWidth(self.edit_faculty_member_title.sizePolicy().hasHeightForWidth())
self.edit_faculty_member_title.setSizePolicy(sizePolicy) 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.setReadOnly(True)
self.edit_faculty_member_title.setObjectName("edit_faculty_member_title") self.edit_faculty_member_title.setObjectName("edit_faculty_member_title")
self.gridLayout_2.addWidget(self.edit_faculty_member_title, 0, 0, 1, 1) self.gridLayout_2.addWidget(self.edit_faculty_member_title, 0, 0, 1, 1)
@@ -122,6 +123,14 @@ class Ui_Dialog(object):
self.retranslateUi(Dialog) self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(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): def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate

View File

@@ -32,7 +32,9 @@ class Ui_Dialog(object):
self.verticalLayout_2.addItem(spacerItem1) self.verticalLayout_2.addItem(spacerItem1)
self.horizontalLayout.addLayout(self.verticalLayout_2) self.horizontalLayout.addLayout(self.verticalLayout_2)
self.elsa_table = QtWidgets.QTableWidget(parent=Dialog) 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.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
self.elsa_table.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
self.elsa_table.setObjectName("elsa_table") self.elsa_table.setObjectName("elsa_table")
self.elsa_table.setColumnCount(3) self.elsa_table.setColumnCount(3)
self.elsa_table.setRowCount(0) self.elsa_table.setRowCount(0)
@@ -97,10 +99,58 @@ class Ui_Dialog(object):
self.horizontalLayout_4.addWidget(self.elsa_update) self.horizontalLayout_4.addWidget(self.elsa_update)
self.gridLayout_2.addLayout(self.horizontalLayout_4, 4, 1, 1, 1) self.gridLayout_2.addLayout(self.horizontalLayout_4, 4, 1, 1, 1)
self.horizontalLayout_2.addLayout(self.gridLayout_2) self.horizontalLayout_2.addLayout(self.gridLayout_2)
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.newProf = QtWidgets.QFrame(parent=self.create_frame_elsa)
self.horizontalLayout_2.addItem(spacerItem3) 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) 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.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.setObjectName("dokument_list_elsa")
self.dokument_list_elsa.setColumnCount(4) self.dokument_list_elsa.setColumnCount(4)
self.dokument_list_elsa.setRowCount(0) 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 = QtWidgets.QPushButton(parent=self.create_frame_elsa)
self.check_file_elsa.setObjectName("check_file_elsa") self.check_file_elsa.setObjectName("check_file_elsa")
self.verticalLayout_3.addWidget(self.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) spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout_3.addItem(spacerItem4) self.verticalLayout_3.addItem(spacerItem4)
self.horizontalLayout_2.addLayout(self.verticalLayout_3) self.horizontalLayout_2.addLayout(self.verticalLayout_3)
@@ -143,12 +196,17 @@ class Ui_Dialog(object):
self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.table_elsa_list = QtWidgets.QTableWidget(parent=Dialog) 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.setObjectName("table_elsa_list")
self.table_elsa_list.setColumnCount(12) self.table_elsa_list.setColumnCount(12)
self.table_elsa_list.setRowCount(0) self.table_elsa_list.setRowCount(0)
item = QtWidgets.QTableWidgetItem() item = QtWidgets.QTableWidgetItem()
item.setTextAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignVCenter)
self.table_elsa_list.setHorizontalHeaderItem(0, item) self.table_elsa_list.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem() item = QtWidgets.QTableWidgetItem()
item.setTextAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignVCenter)
self.table_elsa_list.setHorizontalHeaderItem(1, item) self.table_elsa_list.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem() item = QtWidgets.QTableWidgetItem()
self.table_elsa_list.setHorizontalHeaderItem(2, item) 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 = QtWidgets.QHBoxLayout(self.tab)
self.horizontalLayout_7.setObjectName("horizontalLayout_7") self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.elsa_statistics_table = QtWidgets.QTableWidget(parent=self.tab) 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.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.setTextElideMode(QtCore.Qt.TextElideMode.ElideMiddle)
self.elsa_statistics_table.setObjectName("elsa_statistics_table") self.elsa_statistics_table.setObjectName("elsa_statistics_table")
self.elsa_statistics_table.setColumnCount(2) self.elsa_statistics_table.setColumnCount(2)
@@ -196,12 +256,33 @@ class Ui_Dialog(object):
self.horizontalLayout_5.setStretch(0, 7) self.horizontalLayout_5.setStretch(0, 7)
self.horizontalLayout_5.setStretch(1, 3) self.horizontalLayout_5.setStretch(1, 3)
self.verticalLayout.addLayout(self.horizontalLayout_5) self.verticalLayout.addLayout(self.horizontalLayout_5)
self.verticalLayout.setStretch(1, 1) self.verticalLayout.setStretch(0, 1)
self.verticalLayout.setStretch(3, 2) self.verticalLayout.setStretch(3, 2)
self.retranslateUi(Dialog) self.retranslateUi(Dialog)
self.elsa_statistics.setCurrentIndex(0) self.elsa_statistics.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(Dialog) 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): def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
@@ -215,11 +296,15 @@ class Ui_Dialog(object):
item = self.elsa_table.horizontalHeaderItem(2) item = self.elsa_table.horizontalHeaderItem(2)
item.setText(_translate("Dialog", "Semester")) item.setText(_translate("Dialog", "Semester"))
self.create_frame_elsa.setTitle(_translate("Dialog", "Auftragsdaten")) 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_3.setText(_translate("Dialog", "Semester"))
self.label_2.setText(_translate("Dialog", "Auftragsdatum")) self.label_2.setText(_translate("Dialog", "Auftragsdatum"))
self.elsa_save.setText(_translate("Dialog", "Speichern")) self.elsa_save.setText(_translate("Dialog", "Speichern"))
self.elsa_update.setText(_translate("Dialog", "Aktualisieren")) 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 = self.dokument_list_elsa.horizontalHeaderItem(0)
item.setText(_translate("Dialog", "Dokumentname")) item.setText(_translate("Dialog", "Dokumentname"))
item = self.dokument_list_elsa.horizontalHeaderItem(1) 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.btn_open_document_elsa.setText(_translate("Dialog", "Dokument öffnen"))
self.check_file_elsa.setText(_translate("Dialog", "Medien aus Dokument\n" self.check_file_elsa.setText(_translate("Dialog", "Medien aus Dokument\n"
"hinzufügen")) "hinzufügen"))
self.seperateEntries.setText(_translate("Dialog", "Abschnitte trennen"))
self.quote_entry.setText(_translate("Dialog", " Eintrag zitieren ")) self.quote_entry.setText(_translate("Dialog", " Eintrag zitieren "))
item = self.table_elsa_list.horizontalHeaderItem(0) item = self.table_elsa_list.horizontalHeaderItem(0)
item.setText(_translate("Dialog", "Autor(en) des Werks")) item.setText(_translate("Dialog", "Autor(en) des Werks"))

View File

@@ -41,6 +41,9 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="readOnly"> <property name="readOnly">
<bool>true</bool> <bool>true</bool>
</property> </property>
@@ -206,6 +209,17 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<tabstops>
<tabstop>edit_faculty_member_select_member</tabstop>
<tabstop>faculty_member_old_telnr</tabstop>
<tabstop>faculty_member_oldmail</tabstop>
<tabstop>edit_faculty_member_new_title</tabstop>
<tabstop>edit_faculty_member_new_surname</tabstop>
<tabstop>user_faculty_member_new_name</tabstop>
<tabstop>user_faculty_member_new_telnr</tabstop>
<tabstop>user_faculty_member_new_mail</tabstop>
<tabstop>edit_faculty_member_title</tabstop>
</tabstops>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@@ -13,7 +13,7 @@
<property name="windowTitle"> <property name="windowTitle">
<string>Dialog</string> <string>Dialog</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,0,2"> <layout class="QVBoxLayout" name="verticalLayout" stretch="1,0,0,2">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
@@ -65,9 +65,15 @@
</item> </item>
<item> <item>
<widget class="QTableWidget" name="elsa_table"> <widget class="QTableWidget" name="elsa_table">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="horizontalScrollBarPolicy"> <property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum> <enum>Qt::ScrollBarAlwaysOff</enum>
</property> </property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<attribute name="horizontalHeaderDefaultSectionSize"> <attribute name="horizontalHeaderDefaultSectionSize">
<number>374</number> <number>374</number>
</attribute> </attribute>
@@ -104,7 +110,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Professor</string> <string>Prof.</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -201,23 +207,118 @@
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="horizontalSpacer"> <widget class="QFrame" name="newProf">
<property name="orientation"> <property name="frameShape">
<enum>Qt::Horizontal</enum> <enum>QFrame::StyledPanel</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="frameShadow">
<size> <enum>QFrame::Raised</enum>
<width>40</width>
<height>20</height>
</size>
</property> </property>
</spacer> <layout class="QFormLayout" name="formLayout_2">
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Titel</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Mail</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>TelNr</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="newProf_title"/>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="newProf_mail"/>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="newProf_telnr"/>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Kontaktdaten eingeben:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QToolButton" name="prof_icon">
<property name="text">
<string/>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item> </item>
<item> <item>
<widget class="QTableWidget" name="dokument_list_elsa"> <widget class="QTableWidget" name="dokument_list_elsa">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>350</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>350</width>
<height>0</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="horizontalScrollBarPolicy"> <property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum> <enum>Qt::ScrollBarAlwaysOff</enum>
</property> </property>
<property name="dragDropMode">
<enum>QAbstractItemView::NoDragDrop</enum>
</property>
<attribute name="horizontalHeaderMinimumSectionSize"> <attribute name="horizontalHeaderMinimumSectionSize">
<number>43</number> <number>43</number>
</attribute> </attribute>
@@ -276,6 +377,13 @@ hinzufügen</string>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="seperateEntries">
<property name="text">
<string>Abschnitte trennen</string>
</property>
</widget>
</item>
<item> <item>
<spacer name="verticalSpacer_2"> <spacer name="verticalSpacer_2">
<property name="orientation"> <property name="orientation">
@@ -322,6 +430,15 @@ hinzufügen</string>
<layout class="QHBoxLayout" name="horizontalLayout_5" stretch="7,3"> <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="7,3">
<item> <item>
<widget class="QTableWidget" name="table_elsa_list"> <widget class="QTableWidget" name="table_elsa_list">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectItems</enum>
</property>
<attribute name="horizontalHeaderMinimumSectionSize"> <attribute name="horizontalHeaderMinimumSectionSize">
<number>31</number> <number>31</number>
</attribute> </attribute>
@@ -332,11 +449,17 @@ hinzufügen</string>
<property name="text"> <property name="text">
<string>Autor(en) des Werks</string> <string>Autor(en) des Werks</string>
</property> </property>
<property name="textAlignment">
<set>AlignLeading|AlignVCenter</set>
</property>
</column> </column>
<column> <column>
<property name="text"> <property name="text">
<string>Autor(en) des Beitrags</string> <string>Autor(en) des Beitrags</string>
</property> </property>
<property name="textAlignment">
<set>AlignLeading|AlignVCenter</set>
</property>
</column> </column>
<column> <column>
<property name="text"> <property name="text">
@@ -402,9 +525,15 @@ hinzufügen</string>
<layout class="QHBoxLayout" name="horizontalLayout_7"> <layout class="QHBoxLayout" name="horizontalLayout_7">
<item> <item>
<widget class="QTableWidget" name="elsa_statistics_table"> <widget class="QTableWidget" name="elsa_statistics_table">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="horizontalScrollBarPolicy"> <property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum> <enum>Qt::ScrollBarAlwaysOff</enum>
</property> </property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="textElideMode"> <property name="textElideMode">
<enum>Qt::ElideMiddle</enum> <enum>Qt::ElideMiddle</enum>
</property> </property>
@@ -431,6 +560,30 @@ hinzufügen</string>
</item> </item>
</layout> </layout>
</widget> </widget>
<tabstops>
<tabstop>elsa_add_new</tabstop>
<tabstop>elsa_cancel_create</tabstop>
<tabstop>elsa_prof</tabstop>
<tabstop>newProf_title</tabstop>
<tabstop>newProf_mail</tabstop>
<tabstop>newProf_telnr</tabstop>
<tabstop>elsa_date</tabstop>
<tabstop>elsa_date_today</tabstop>
<tabstop>elsa_semester</tabstop>
<tabstop>active_semester</tabstop>
<tabstop>btn_add_document_elsa</tabstop>
<tabstop>btn_open_document_elsa</tabstop>
<tabstop>seperateEntries</tabstop>
<tabstop>check_file_elsa</tabstop>
<tabstop>elsa_save</tabstop>
<tabstop>elsa_update</tabstop>
<tabstop>quote_entry</tabstop>
<tabstop>elsa_statistics</tabstop>
<tabstop>table_elsa_list</tabstop>
<tabstop>elsa_table</tabstop>
<tabstop>elsa_statistics_table</tabstop>
<tabstop>dokument_list_elsa</tabstop>
</tabstops>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@@ -1,3 +1,5 @@
from .blob import create_blob from .blob import create_blob
from .icon import Icon from .icon import Icon
from .pickles import dump_pickle, load_pickle from .pickles import dump_pickle, load_pickle
from .sortgenerator import app_sort, name_sort
from .richtext import SemesterDocument

View File

@@ -2,28 +2,51 @@ import darkdetect
from omegaconf import OmegaConf from omegaconf import OmegaConf
from PyQt6 import QtGui from PyQt6 import QtGui
import re 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.path
path = config.icon_path
class Icon: 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() dark = darkdetect.isDark()
if dark: if dark:
self.color = config.dark_color self.color = config.colors.dark
else: else:
self.color = config.light_color self.color = config.colors.light
if color:
self.color = config.colors[color]
self.icon = QtGui.QIcon() self.icon = QtGui.QIcon()
self.icon_path = path + config["icons"][icon_type] self.icon_path = path + icon
self.add_icon(self.icon_path,recolor) 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: 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): def add_icon(self, icon_path,recolor=False):
icon = self.changeColor(icon_path,recolor) icon = self.changeColor(icon_path,recolor)
@@ -38,7 +61,7 @@ class Icon:
QtGui.QIcon.State.Off, QtGui.QIcon.State.Off,
) )
def overwriteColor(self, color): def overwriteColor(self):
# take the icon, read it as bytes and change the color in fill # take the icon, read it as bytes and change the color in fill
icon = self.changeColor(self.icon_path) icon = self.changeColor(self.icon_path)
cicon = str(icon) cicon = str(icon)
@@ -49,9 +72,9 @@ class Icon:
if fill and stroke: if fill and stroke:
# replace stroke # replace stroke
newicon = icon.replace(stroke.encode(), color.encode()) newicon = icon.replace(stroke.encode(), config.color.encode())
else: else:
newicon = icon.replace(fill.encode(), color.encode()) newicon = icon.replace(fill.encode(), config.color.encode())
pixmap = QtGui.QPixmap() pixmap = QtGui.QPixmap()
pixmap.loadFromData(newicon) pixmap.loadFromData(newicon)