Philipp Hörist pushed to branch master at gajim / gajim
Commits: 94842c27 by lovetox at 2022-05-10T21:12:50+02:00 feat: Plugins: Set error if init fails
- - - - - aa4d0354 by lovetox at 2022-05-10T21:54:13+02:00 feat: Allow users to override settings
- - - - - 195ec814 by lovetox at 2022-05-10T22:05:07+02:00 feat: Plugins: Allow users to disable plugin repository
- - - - - a496dbbb by lovetox at 2022-05-10T22:25:03+02:00 feat: Settings: Show lock icon if setting has an override
- - - - -
5 changed files:
- gajim/common/setting_values.py - gajim/common/settings.py - gajim/gtk/settings.py - gajim/plugins/pluginmanager.py - gajim/plugins/repository.py
Changes:
===================================== gajim/common/setting_values.py ===================================== @@ -105,6 +105,7 @@ class _ACCOUNT_DEFAULT: 'use_stun_server', 'use_urgency_hint', 'video_see_self', + 'plugins_repository_enabled', 'plugins_update_check', 'plugins_auto_update', 'plugins_notify_after_update', @@ -297,6 +298,7 @@ class _ACCOUNT_DEFAULT: 'preview_leftclick_action': 'open', 'preview_verify_https': True, 'preview_anonymous_muc': False, + 'plugins_repository_enabled': True, 'plugins_update_check': True, 'plugins_auto_update': False, 'plugins_notify_after_update': True,
===================================== gajim/common/settings.py ===================================== @@ -106,6 +106,8 @@ _CallbackDict = dict[tuple[str, Optional[str], Optional[JID]], list[weakref.WeakMethod[_SignalCallable]]]
+OVERRIDES_PATH = Path('/etc/gajim/app-overrides.json') +
class Settings: def __init__(self): @@ -113,6 +115,7 @@ def __init__(self): self._commit_scheduled = None
self._settings = {} + self._app_overrides: dict[str, AllSettingsT] = {} self._account_settings = {}
self._callbacks: _CallbackDict = defaultdict(list) @@ -206,6 +209,7 @@ def init(self) -> None: self._migrate_old_config() self._commit() self._migrate_database() + self._load_app_overrides()
@staticmethod def _setup_installation_defaults() -> None: @@ -217,6 +221,19 @@ def _setup_installation_defaults() -> None: # Windows and MacOS APP_SETTINGS['dev_use_message_label'] = False
+ def _load_app_overrides(self) -> None: + if not OVERRIDES_PATH.exists(): + return + + with OVERRIDES_PATH.open() as f: + try: + self._app_overrides = json.load(f) + except Exception: + log.exception('Failed to load overrides') + return + + self._settings['app'].update(self._app_overrides) + @staticmethod def _namedtuple_factory(cursor: sqlite3.Cursor, row: tuple[Any, ...]) -> NamedTuple: @@ -517,6 +534,9 @@ def _commit_settings(self, name: str, schedule: bool = True) -> None:
self._commit(schedule=schedule)
+ def has_app_override(self, setting: str) -> bool: + return setting in self._app_overrides + @overload def get_app_setting(self, setting: BoolSettings) -> bool: ... @overload @@ -544,6 +564,11 @@ def set_app_setting(self, setting: str, value: Optional[AllSettingsT]) -> None: if setting not in APP_SETTINGS: raise ValueError(f'Invalid app setting: {setting}')
+ if setting in self._app_overrides: + log.warning('Changing %s is not allowed because there exists an ' + 'override', setting) + return + default = APP_SETTINGS[setting] if not isinstance(value, type(default)) and value is not None: raise TypeError(f'Invalid type for {setting}: '
===================================== gajim/gtk/settings.py ===================================== @@ -204,6 +204,16 @@ def __init__(self, self.enabled_func = enabled_func self.setting_value = self.get_value()
+ self._locked_icon = Gtk.Image.new_from_icon_name( + 'feather-lock-symbolic', + Gtk.IconSize.MENU) + self._locked_icon.set_visible(False) + self._locked_icon.set_no_show_all(True) + self._locked_icon.set_halign(Gtk.Align.END) + self._locked_icon.set_tooltip_text(_('Setting is locked by the system')) + + self._grid.add(self._locked_icon) + description_box = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=0) description_box.set_valign(Gtk.Align.CENTER) @@ -372,6 +382,13 @@ def on_row_activated(self) -> None: raise NotImplementedError
def update_activatable(self) -> None: + if self.type_ == SettingType.CONFIG: + if app.settings.has_app_override(self.value): + self.set_activatable(False) + self.set_sensitive(False) + self._locked_icon.show() + return + if self.enabled_func is None: return
===================================== gajim/plugins/pluginmanager.py ===================================== @@ -284,8 +284,9 @@ def init_plugins(self) -> None:
try: self.activate_plugin(plugin) - except GajimPluginActivateException: - pass + except GajimPluginActivateException as error: + plugin.activatable = False + plugin.available_text = str(error)
def _load_plugin_module(self, manifest: PluginManifest
===================================== gajim/plugins/repository.py ===================================== @@ -59,8 +59,9 @@ def __init__(self) -> None:
self._download_queue: set[PluginManifest] = set()
- make_http_request('https://gajim.org/updates.json', - self._on_repository_received) + if app.settings.get('plugins_repository_enabled'): + make_http_request('https://gajim.org/updates.json', + self._on_repository_received)
@property def available(self):
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/3dd59364b924b58f5a4c077ebe5199bd...