From c57a2728afe5aca038db4c58d573ef81f17d3500 Mon Sep 17 00:00:00 2001 From: Jiri Konecny Date: Fri, 28 Feb 2025 14:24:09 +0100 Subject: [PATCH] Add localization module API to get keyboard config This API is added so that web UI is able to read keyboard layouts without storing them to the localization module. --- .../modules/localization/localization.py | 15 ++++++++++ .../localization/localization_interface.py | 28 ++++++++++++++++++- pyanaconda/modules/localization/runtime.py | 6 ++++ .../localization/test_module_localization.py | 22 +++++++++++---- 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/pyanaconda/modules/localization/localization.py b/pyanaconda/modules/localization/localization.py index 77699b3fb92..a45622ff7e5 100644 --- a/pyanaconda/modules/localization/localization.py +++ b/pyanaconda/modules/localization/localization.py @@ -368,6 +368,21 @@ def _update_settings_from_task(self, result): self.set_vc_keymap(vc_keymap) self.set_x_layouts(x_layouts) + def get_keyboard_configuration_with_task(self): + """Get current keyboard configuration without storing it into module. + + This configuration will be used for the installation at the time of task execution. + The task is read only, the results are not stored anywhere. + + :returns: a task reading keyboard configuration + """ + task = GetMissingKeyboardConfigurationTask( + localed_wrapper=self.localed_wrapper, + x_layouts=self.x_layouts, + vc_keymap=self.vc_keymap, + ) + return task + def apply_keyboard_with_task(self): """Apply keyboard configuration to the current system. diff --git a/pyanaconda/modules/localization/localization_interface.py b/pyanaconda/modules/localization/localization_interface.py index 8ac51f05434..f9472b1ec72 100644 --- a/pyanaconda/modules/localization/localization_interface.py +++ b/pyanaconda/modules/localization/localization_interface.py @@ -18,7 +18,7 @@ # Red Hat, Inc. # -from dasbus.server.interface import dbus_interface, dbus_signal +from dasbus.server.interface import dbus_class, dbus_interface, dbus_signal from dasbus.server.property import emits_properties_changed from dasbus.typing import * # pylint: disable=wildcard-import @@ -27,6 +27,21 @@ from pyanaconda.modules.common.containers import TaskContainer from pyanaconda.modules.common.structures.keyboard_layout import KeyboardLayout from pyanaconda.modules.common.structures.language import LanguageData, LocaleData +from pyanaconda.modules.common.task import TaskInterface + + +@dbus_class +class KeyboardConfigurationTaskInterface(TaskInterface): + """Interface to get keyboard configuration data.""" + + @staticmethod + def convert_result(value): + """Convert value to publishable result. + + From: + (("us", "cs (qwerty)"), "cs-qwerty") + """ + return get_variant(List[Str], Str) @dbus_interface(LOCALIZATION.interface_name) @@ -255,6 +270,17 @@ def PopulateMissingKeyboardConfigurationWithTask(self) -> ObjPath: self.implementation.populate_missing_keyboard_configuration_with_task() ) + def GetKeyboardConfigurationWithTask(self) -> ObjPath: + """Get current keyboard configuration without storing it into module. + + This task will give you a potential configuration to be installed at the time of + task execution. The task is read only, the results are not used anywhere by + the localization module. + """ + return TaskContainer.to_object_path( + self.implementation.get_keyboard_configuration_with_task() + ) + def ApplyKeyboardWithTask(self) -> ObjPath: """Apply keyboard configuration to the current system. diff --git a/pyanaconda/modules/localization/runtime.py b/pyanaconda/modules/localization/runtime.py index ac7bbcb7998..a2d2d651bad 100644 --- a/pyanaconda/modules/localization/runtime.py +++ b/pyanaconda/modules/localization/runtime.py @@ -21,6 +21,9 @@ from pyanaconda.modules.common.errors.configuration import KeyboardConfigurationError from pyanaconda.modules.common.task import Task from pyanaconda.modules.localization.installation import write_vc_configuration +from pyanaconda.modules.localization.localization_interface import ( + KeyboardConfigurationTaskInterface, +) from pyanaconda.modules.localization.utils import get_missing_keyboard_configuration log = get_module_logger(__name__) @@ -81,6 +84,9 @@ def __init__(self, localed_wrapper, x_layouts, vc_keymap): self._x_layouts = x_layouts self._vc_keymap = vc_keymap + def for_publication(self): + return KeyboardConfigurationTaskInterface(self) + @property def name(self): return "Get missing keyboard settings." diff --git a/tests/unit_tests/pyanaconda_tests/modules/localization/test_module_localization.py b/tests/unit_tests/pyanaconda_tests/modules/localization/test_module_localization.py index d900d97e7ba..6e60eaeaab2 100644 --- a/tests/unit_tests/pyanaconda_tests/modules/localization/test_module_localization.py +++ b/tests/unit_tests/pyanaconda_tests/modules/localization/test_module_localization.py @@ -34,11 +34,11 @@ LanguageInstallationTask, ) from pyanaconda.modules.localization.localization import LocalizationService -from pyanaconda.modules.localization.localization_interface import LocalizationInterface -from pyanaconda.modules.localization.runtime import ( - ApplyKeyboardTask, - GetMissingKeyboardConfigurationTask, +from pyanaconda.modules.localization.localization_interface import ( + KeyboardConfigurationTaskInterface, + LocalizationInterface, ) +from pyanaconda.modules.localization.runtime import ApplyKeyboardTask from tests.unit_tests.pyanaconda_tests import ( PropertiesChangedCallback, check_dbus_property, @@ -349,7 +349,19 @@ def test_populate_missing_keyboard_configuration_with_task(self, publisher): task_path = self.localization_interface.PopulateMissingKeyboardConfigurationWithTask() - obj = check_task_creation(task_path, publisher, GetMissingKeyboardConfigurationTask) + obj = check_task_creation(task_path, publisher, KeyboardConfigurationTaskInterface) + assert obj.implementation._vc_keymap == 'us' + assert obj.implementation._x_layouts == ['cz', 'cz (qwerty)'] + + @patch_dbus_publish_object + def test_get_keyboard_configuration_with_task(self, publisher): + """Test GetKeyboardConfigurationWithTask.""" + self.localization_interface.VirtualConsoleKeymap = 'us' + self.localization_interface.XLayouts = ['cz', 'cz (qwerty)'] + + task_path = self.localization_interface.GetKeyboardConfigurationWithTask() + + obj = check_task_creation(task_path, publisher, KeyboardConfigurationTaskInterface) assert obj.implementation._vc_keymap == 'us' assert obj.implementation._x_layouts == ['cz', 'cz (qwerty)']