Files
SemesterapparatsManager/src/ui/widgets/welcome_wizard.py

239 lines
9.6 KiB
Python

from pathlib import Path
from typing import Any
from appdirs import AppDirs
from PySide6 import QtCore, QtWidgets
from src import settings
from src.backend import Database
from src.shared.logging import log
from .widget_sources.welcome_wizard_ui import Ui_Wizard
appdirs = AppDirs("SemesterApparatsManager", "SAM")
class WelcomeWizard(QtWidgets.QWizard, Ui_Wizard):
def __init__(self, parent=None):
super().__init__(parent)
log.info("Initializing WelcomeWizard")
self.setupUi(self)
self.btn_database.clicked.connect(self.open_database_settings)
self.btn_temp.clicked.connect(self.open_temp_settings)
self.btn_test.clicked.connect(self.test_login_data)
self.btn_create.clicked.connect(self.create_sam_user)
# mail password field
self.settings_mail_password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
self.settings_zotero_api_key.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
self.settings_openai_api_key.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
self.sam_password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
# allow user to toggle password visibility
self.settings_mail_password.setContextMenuPolicy(
QtCore.Qt.ContextMenuPolicy.CustomContextMenu
)
self.settings_zotero_api_key.setContextMenuPolicy(
QtCore.Qt.ContextMenuPolicy.CustomContextMenu
)
self.settings_openai_api_key.setContextMenuPolicy(
QtCore.Qt.ContextMenuPolicy.CustomContextMenu
)
self.sam_password.setContextMenuPolicy(
QtCore.Qt.ContextMenuPolicy.CustomContextMenu
)
self.settings_mail_password.customContextMenuRequested.connect(
lambda pos: self.toggle_password_visibility(
pos, self.settings_mail_password
)
)
self.settings_zotero_api_key.customContextMenuRequested.connect(
lambda pos: self.toggle_password_visibility(
pos, self.settings_zotero_api_key
)
)
self.settings_openai_api_key.customContextMenuRequested.connect(
lambda pos: self.toggle_password_visibility(
pos, self.settings_openai_api_key
)
)
self.sam_password.customContextMenuRequested.connect(
lambda pos: self.toggle_password_visibility(pos, self.sam_password)
)
# if button for next page is clicked, run function to store settings
self.button(QtWidgets.QWizard.WizardButton.NextButton).clicked.connect(
self.store_settings
)
self.settings_mail_use_user_name.toggled.connect(self.set_check_text)
# set initial values for checkbox, database
self.set_check_text(self.settings_mail_use_user_name.isChecked())
self.settings_database.setText(
str(settings.database.path)
if settings.database.path is not None
else str(appdirs.user_data_dir)
)
self.settings_temp.setText(
str(settings.database.temp)
if settings.database.temp is not None
else str(appdirs.user_cache_dir)
)
self.settings_database_name.setText("semesterapparate.db")
def test_login_data(self):
from src.backend import AdminCommands
log.info("Testing login data for SAM user")
db_path = (
self.settings_database.text() + "/" + self.settings_database_name.text()
)
db_path = Path(db_path).expanduser()
db = Database(db_path=db_path)
db.overwritePath(db_path)
db.initializeDatabase()
sam_users = AdminCommands(db_path=db_path).list_users()
sam_users = [user[2] for user in sam_users]
username = self.sam_username.text()
if username in sam_users:
QtWidgets.QMessageBox.information(
self,
"Information",
f"User '{username}' exists in SAM.",
)
else:
QtWidgets.QMessageBox.information(
self,
"Information",
f"User '{username}' does not exist in SAM.",
)
def create_sam_user(self):
"""Create a SAM user in the database."""
from src.backend import AdminCommands
db_path = (
self.settings_database.text() + "/" + self.settings_database_name.text()
)
db_path = Path(db_path).expanduser()
db = Database(db_path=db_path)
db.overwritePath(db_path)
db.initializeDatabase()
admin = AdminCommands(db_path=db_path)
admin.create_admin()
if not admin.create_user(self.sam_username.text(), self.sam_password.text()):
QtWidgets.QMessageBox.critical(
self,
"Error",
"Failed to create SAM user",
)
else:
QtWidgets.QMessageBox.information(
self,
"Success",
"SAM user created successfully",
)
def set_check_text(self, checked):
"""Set the text of the checkbox based on its state."""
if checked:
self.settings_mail_use_user_name.setText("Nutzername wird verwendet")
else:
self.settings_mail_use_user_name.setText("Nutzername wird nicht verwendet")
def toggle_password_visibility(self, pos: Any, field):
"""Toggle the visibility of the password field."""
if field.echoMode() == QtWidgets.QLineEdit.EchoMode.Password:
field.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal)
else:
field.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
def store_settings(self):
# database page
db_path = self.settings_database.text()
temp_path = self.settings_temp.text()
db_name = self.settings_database_name.text()
# mail page
smtp_server = self.settings_mail_smtp_server.text()
smtp_port = self.settings_mail_smtp_port.text()
mail_sender = self.settings_mail_address.text()
mail_user_name = self.settings_mail_user_name.text()
mail_password = self.settings_mail_password.text()
mail_printer_mail = self.settings_mail_printer.text()
mail_signature = self.settings_mail_signature.toPlainText()
use_user_name = self.settings_mail_use_user_name.isChecked()
# zotero page
zotero__api_key = self.settings_zotero_api_key.text()
zotero_user_id = self.settings_zotero_library_id.text()
zotero_library_type = self.settings_zotero_library_type.text()
# openai page
openai_api_key = self.settings_openai_api_key.text()
openai_model = self.settings_openai_model.currentText()
# store settings in config
settings.set_database_attr("path", db_path)
settings.set_database_attr("name", db_name)
settings.set_database_attr("temp", temp_path)
settings.set_mail_attr("smtp_server", smtp_server)
settings.set_mail_attr("port", smtp_port)
settings.set_mail_attr("sender", mail_sender)
settings.set_mail_attr("user_name", mail_user_name)
settings.set_mail_attr("password", mail_password)
settings.set_mail_attr("printer_mail", mail_printer_mail)
settings.set_mail_attr("signature", mail_signature)
settings.set_mail_attr("use_user_name", use_user_name)
settings.set_zotero_attr("api_key", zotero__api_key)
settings.set_zotero_attr("library_id", zotero_user_id)
settings.set_zotero_attr("library_type", zotero_library_type)
settings.set_openai_attr("api_key", openai_api_key)
settings.set_openai_attr("model", openai_model)
# save settings to file
# print("Saving settings...")
settings.save()
def open_database_settings(self):
# open filepicker dialog to select database file folder
file_dialog = QtWidgets.QFileDialog(self, "Select Database File")
file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.Directory)
file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.List)
file_dialog.setWindowFlags(
file_dialog.windowFlags() | QtCore.Qt.WindowType.WindowStaysOnTopHint
)
# set start dir to appdir.user_data_dir
file_dialog.setDirectory(str(appdirs.user_data_dir))
if file_dialog.exec():
selected_files = file_dialog.selectedFiles()
if selected_files:
# Do something with the selected database file
db_path = selected_files[0]
self.settings_database.setText(db_path)
def open_temp_settings(self):
# open filepicker dialog to select temporary directory
dir_dialog = QtWidgets.QFileDialog(self, "Select Temporary Directory")
dir_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.Directory)
dir_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.List)
if dir_dialog.exec():
selected_dirs = dir_dialog.selectedFiles()
if selected_dirs:
# Do something with the selected temporary directory
temp_path = selected_dirs[0]
self.settings_temp.setText(temp_path)
def launch_wizard():
"""Launch the welcome wizard."""
app = QtWidgets.QApplication.instance()
if not app:
app = QtWidgets.QApplication([])
wizard = WelcomeWizard()
# wizard.setWindowTitle("Welcome to the Semester Apparatus Manager")
# wizard.setWindowIcon(settings.Icon("welcome").icon)
wizard.setWizardStyle(QtWidgets.QWizard.WizardStyle.ModernStyle)
wizard.setStartId(0)
wizard.show()
return wizard.exec()