diff --git a/src/fime/config.py b/src/fime/config.py index 6efe275..39e0859 100644 --- a/src/fime/config.py +++ b/src/fime/config.py @@ -1,4 +1,5 @@ from configparser import ConfigParser +from enum import StrEnum from io import StringIO from pathlib import Path @@ -17,9 +18,23 @@ def dequotify(string): return string +class AuthMethods(StrEnum): + TOKEN = "token" + COOKIES = "cookies" + + +class Browsers(StrEnum): + AUTO = "auto" + FIREFOX = "firefox" + CHROME = "chrome" + CHROMIUM = "chromium" + EDGE = "edge" + OPERA = "opera" + + class Config: def __init__(self): - self._configparser = ConfigParser() + self._configparser = ConfigParser(interpolation=None) config_dir_path = Path(QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.AppConfigLocation)) self.config_path = config_dir_path / "fime.conf" if self.config_path.exists(): @@ -47,7 +62,27 @@ class Config: self._configparser["DEFAULT"]["jira_url"] = f'"{value}"' @property - def jira_token(self): + def auth_mode(self) -> AuthMethods: + if self.jira_token: + fallback = AuthMethods.TOKEN.value + else: + fallback = AuthMethods.COOKIES.value + return dequotify(self._configparser.get("DEFAULT", "auth_mode", fallback=fallback)).lower() + + @auth_mode.setter + def auth_mode(self, value: AuthMethods): + self._configparser["DEFAULT"]["auth_mode"] = f'"{value.value}"' + + @property + def cookie_source(self) -> Browsers: + return dequotify(self._configparser.get("DEFAULT", "cookie_source", fallback=Browsers.AUTO.value)).lower() + + @cookie_source.setter + def cookie_source(self, value: Browsers): + self._configparser["DEFAULT"]["cookie_source"] = f'"{value.value}"' + + @property + def jira_token(self) -> str: return dequotify(self._configparser.get("DEFAULT", "jira_token", fallback="")) @jira_token.setter diff --git a/src/fime/settings.py b/src/fime/settings.py index edc3470..f31ca6e 100644 --- a/src/fime/settings.py +++ b/src/fime/settings.py @@ -5,8 +5,14 @@ try: except ImportError: from PySide2 import QtCore, QtGui, QtWidgets -from fime.config import Config +from fime.config import Config, AuthMethods, Browsers +AUTH_METHODS_PRESENTATION = { + AuthMethods.TOKEN: "Jira Access Token", + AuthMethods.COOKIES: "Browser Cookies", +} + +AUTH_METHODS_VALUE = {v: k for k, v in AUTH_METHODS_PRESENTATION.items()} class Settings(QtWidgets.QDialog): def __init__(self, config: Config, parent, *args, **kwargs): @@ -27,34 +33,51 @@ class Settings(QtWidgets.QDialog): self.jira_url_edit = QtWidgets.QLineEdit() settings_layout.addWidget(self.jira_url_edit, 0, 1) - jira_token_label = QtWidgets.QLabel() - jira_token_label.setText("Jira Personal Access Token
see here for how to get one") - jira_token_label.setTextFormat(QtCore.Qt.RichText) - jira_token_label.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction) - jira_token_label.setOpenExternalLinks(True) - settings_layout.addWidget(jira_token_label, 1, 0) + auth_method_label = QtWidgets.QLabel() + auth_method_label.setText("Authentication method") + settings_layout.addWidget(auth_method_label, 1, 0) + self.auth_method_combo_box = QtWidgets.QComboBox() + for am in AuthMethods: + self.auth_method_combo_box.addItem(AUTH_METHODS_PRESENTATION[am]) + self.auth_method_combo_box.currentTextChanged.connect(self._auth_method_update) + settings_layout.addWidget(self.auth_method_combo_box, 1, 1, QtCore.Qt.AlignRight) + + self.jira_token_label = QtWidgets.QLabel() + self.jira_token_label.setText("Jira Personal Access Token
see here for how to get one") + self.jira_token_label.setTextFormat(QtCore.Qt.RichText) + self.jira_token_label.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction) + self.jira_token_label.setOpenExternalLinks(True) + settings_layout.addWidget(self.jira_token_label, 2, 0) self.jira_token_edit = QtWidgets.QLineEdit() - settings_layout.addWidget(self.jira_token_edit, 1, 1) + settings_layout.addWidget(self.jira_token_edit, 2, 1) + + self.cookie_source_label = QtWidgets.QLabel() + self.cookie_source_label.setText("Cookie source browser") + settings_layout.addWidget(self.cookie_source_label, 2, 0) + self.cookie_source_combo_box = QtWidgets.QComboBox() + for b in Browsers: + self.cookie_source_combo_box.addItem(b.capitalize()) + settings_layout.addWidget(self.cookie_source_combo_box, 2, 1, QtCore.Qt.AlignRight) tray_theme_label = QtWidgets.QLabel() tray_theme_label.setText("Tray theme") - settings_layout.addWidget(tray_theme_label, 2, 0) + settings_layout.addWidget(tray_theme_label, 3, 0) self.tray_theme_combo_box = QtWidgets.QComboBox() self.tray_theme_combo_box.addItem("Light") self.tray_theme_combo_box.addItem("Dark") - settings_layout.addWidget(self.tray_theme_combo_box, 2, 1, QtCore.Qt.AlignRight) + settings_layout.addWidget(self.tray_theme_combo_box, 3, 1, QtCore.Qt.AlignRight) flip_menu_label = QtWidgets.QLabel() flip_menu_label.setText("Flip menu") - settings_layout.addWidget(flip_menu_label, 3, 0) + settings_layout.addWidget(flip_menu_label, 4, 0) self.flip_menu_check_box = QtWidgets.QCheckBox() - settings_layout.addWidget(self.flip_menu_check_box, 3, 1, QtCore.Qt.AlignRight) + settings_layout.addWidget(self.flip_menu_check_box, 4, 1, QtCore.Qt.AlignRight) import_auto_change_task_label = QtWidgets.QLabel() import_auto_change_task_label.setText("Automatically select task as active task\nafter task import") - settings_layout.addWidget(import_auto_change_task_label, 4, 0) + settings_layout.addWidget(import_auto_change_task_label, 5, 0) self.import_auto_change_task_check_box = QtWidgets.QCheckBox() - settings_layout.addWidget(self.import_auto_change_task_check_box, 4, 1, QtCore.Qt.AlignRight) + settings_layout.addWidget(self.import_auto_change_task_check_box, 5, 1, QtCore.Qt.AlignRight) self.ok_button = QtWidgets.QPushButton() self.ok_button.setText("OK") @@ -77,19 +100,39 @@ class Settings(QtWidgets.QDialog): def showEvent(self, _): self.jira_url_edit.setText(self.config.jira_url) + self.auth_method_combo_box.setCurrentText(AUTH_METHODS_PRESENTATION[self.config.auth_mode]) self.jira_token_edit.setText(self.config.jira_token) + self.cookie_source_combo_box.setCurrentText(self.config.cookie_source.capitalize()) self.tray_theme_combo_box.setCurrentText(self.config.tray_theme.capitalize()) self.flip_menu_check_box.setChecked(self.config.flip_menu) self.import_auto_change_task_check_box.setChecked(self.config.import_auto_change_task) + self._auth_method_update() def _accepted(self): self.config.jira_url = self.jira_url_edit.text() + self.config.auth_mode = AUTH_METHODS_VALUE[self.auth_method_combo_box.currentText()] self.config.jira_token = self.jira_token_edit.text() + self.config.cookie_source = Browsers(self.cookie_source_combo_box.currentText().lower()) self.config.tray_theme = self.tray_theme_combo_box.currentText() self.config.flip_menu = self.flip_menu_check_box.isChecked() self.config.import_auto_change_task = self.import_auto_change_task_check_box.isChecked() self.config.save() + def _auth_method_update(self): + match AUTH_METHODS_VALUE[self.auth_method_combo_box.currentText()]: + case AuthMethods.TOKEN: + self.jira_token_label.show() + self.jira_token_edit.show() + self.cookie_source_label.hide() + self.cookie_source_combo_box.hide() + case AuthMethods.COOKIES: + self.jira_token_label.hide() + self.jira_token_edit.hide() + self.cookie_source_label.show() + self.cookie_source_combo_box.show() + case _: + raise AssertionError("unhandled auth method") + # only for dev/debug if __name__ == "__main__":