From 0c6c8bdabf20bab97f6cea8a8b88f1659ed72bee Mon Sep 17 00:00:00 2001 From: dw-0 Date: Fri, 27 Dec 2024 15:21:57 +0100 Subject: [PATCH] feat: add completion-message to moonraker removal process Signed-off-by: Dominik Willner --- kiauh/components/klipper/klipper_remove.py | 13 +++-- .../klipper/menus/klipper_remove_menu.py | 9 ++-- .../moonraker/menus/moonraker_remove_menu.py | 53 ++++++++----------- .../components/moonraker/moonraker_remove.py | 53 ++++++++++++++----- kiauh/core/menus/utils/__init__.py | 0 kiauh/core/menus/utils/menu_utils.py | 13 +++++ 6 files changed, 88 insertions(+), 53 deletions(-) create mode 100644 kiauh/core/menus/utils/__init__.py create mode 100644 kiauh/core/menus/utils/menu_utils.py diff --git a/kiauh/components/klipper/klipper_remove.py b/kiauh/components/klipper/klipper_remove.py index 05b2957..f376e40 100644 --- a/kiauh/components/klipper/klipper_remove.py +++ b/kiauh/components/klipper/klipper_remove.py @@ -46,11 +46,14 @@ def run_klipper_removal( Logger.print_info("No Klipper Services installed! Skipped ...") if (remove_dir or remove_env) and unit_file_exists("klipper", suffix="service"): - completion_msg.text = [ - "Some Klipper services are still installed:", - f"● '{KLIPPER_DIR}' was not removed, even though selected for removal.", - f"● '{KLIPPER_ENV_DIR}' was not removed, even though selected for removal.", - ] + completion_msg.text.extend( + [ + "\n\n", + "Some Klipper services are still installed:", + f"● '{KLIPPER_DIR}' was not removed.", + f"● '{KLIPPER_ENV_DIR}' was not removed.", + ] + ) else: if remove_dir: Logger.print_status("Removing Klipper local repository ...") diff --git a/kiauh/components/klipper/menus/klipper_remove_menu.py b/kiauh/components/klipper/menus/klipper_remove_menu.py index 7f3760f..6beb7d2 100644 --- a/kiauh/components/klipper/menus/klipper_remove_menu.py +++ b/kiauh/components/klipper/menus/klipper_remove_menu.py @@ -14,6 +14,7 @@ from typing import Type from components.klipper import klipper_remove from core.menus import FooterType, Option from core.menus.base_menu import BaseMenu +from core.menus.utils.menu_utils import get_checkbox_state from core.types.color import Color @@ -47,11 +48,9 @@ class KlipperRemoveMenu(BaseMenu): } def print_menu(self) -> None: - checked = f"[{Color.apply('x', Color.CYAN)}]" - unchecked = "[ ]" - o1 = checked if self.remove_klipper_service else unchecked - o2 = checked if self.remove_klipper_dir else unchecked - o3 = checked if self.remove_klipper_env else unchecked + o1 = get_checkbox_state(self.remove_klipper_service) + o2 = get_checkbox_state(self.remove_klipper_dir) + o3 = get_checkbox_state(self.remove_klipper_env) sel_state = f"{'Select'if not self.select_state else 'Deselect'} everything" menu = textwrap.dedent( f""" diff --git a/kiauh/components/moonraker/menus/moonraker_remove_menu.py b/kiauh/components/moonraker/menus/moonraker_remove_menu.py index 39db4b5..38c4583 100644 --- a/kiauh/components/moonraker/menus/moonraker_remove_menu.py +++ b/kiauh/components/moonraker/menus/moonraker_remove_menu.py @@ -12,8 +12,9 @@ import textwrap from typing import Type from components.moonraker import moonraker_remove -from core.menus import Option +from core.menus import FooterType, Option from core.menus.base_menu import BaseMenu +from core.menus.utils.menu_utils import get_checkbox_state from core.types.color import Color @@ -21,14 +22,17 @@ from core.types.color import Color class MoonrakerRemoveMenu(BaseMenu): def __init__(self, previous_menu: Type[BaseMenu] | None = None): super().__init__() + self.title = "Remove Moonraker" self.title_color = Color.RED self.previous_menu: Type[BaseMenu] | None = previous_menu + self.footer_type = FooterType.BACK + self.remove_moonraker_service = False self.remove_moonraker_dir = False self.remove_moonraker_env = False self.remove_moonraker_polkit = False - self.selection_state = False + self.select_state = False def set_previous_menu(self, previous_menu: Type[BaseMenu] | None) -> None: from core.menus.remove_menu import RemoveMenu @@ -46,19 +50,18 @@ class MoonrakerRemoveMenu(BaseMenu): } def print_menu(self) -> None: - checked = f"[{Color.apply('x', Color.CYAN)}]" - unchecked = "[ ]" - o1 = checked if self.remove_moonraker_service else unchecked - o2 = checked if self.remove_moonraker_dir else unchecked - o3 = checked if self.remove_moonraker_env else unchecked - o4 = checked if self.remove_moonraker_polkit else unchecked + o1 = get_checkbox_state(self.remove_moonraker_service) + o2 = get_checkbox_state(self.remove_moonraker_dir) + o3 = get_checkbox_state(self.remove_moonraker_env) + o4 = get_checkbox_state(self.remove_moonraker_polkit) + sel_state = f"{'Select'if not self.select_state else 'Deselect'} everything" menu = textwrap.dedent( f""" ╟───────────────────────────────────────────────────────╢ ║ Enter a number and hit enter to select / deselect ║ ║ the specific option for removal. ║ ╟───────────────────────────────────────────────────────╢ - ║ a) {self._get_selection_state_str():37} ║ + ║ a) {sel_state:49} ║ ╟───────────────────────────────────────────────────────╢ ║ 1) {o1} Remove Service ║ ║ 2) {o2} Remove Local Repository ║ @@ -72,11 +75,11 @@ class MoonrakerRemoveMenu(BaseMenu): print(menu, end="") def toggle_all(self, **kwargs) -> None: - self.selection_state = not self.selection_state - self.remove_moonraker_service = self.selection_state - self.remove_moonraker_dir = self.selection_state - self.remove_moonraker_env = self.selection_state - self.remove_moonraker_polkit = self.selection_state + self.select_state = not self.select_state + self.remove_moonraker_service = self.select_state + self.remove_moonraker_dir = self.select_state + self.remove_moonraker_env = self.select_state + self.remove_moonraker_polkit = self.select_state def toggle_remove_moonraker_service(self, **kwargs) -> None: self.remove_moonraker_service = not self.remove_moonraker_service @@ -97,32 +100,20 @@ class MoonrakerRemoveMenu(BaseMenu): and not self.remove_moonraker_env and not self.remove_moonraker_polkit ): - print( - Color.apply( - "Nothing selected! Select options to remove first.", Color.RED - ) - ) + msg = "Nothing selected! Select options to remove first." + print(Color.apply(msg, Color.RED)) return - moonraker_remove.run_moonraker_removal( + completion_msg = moonraker_remove.run_moonraker_removal( self.remove_moonraker_service, self.remove_moonraker_dir, self.remove_moonraker_env, self.remove_moonraker_polkit, ) + self.message_service.set_message(completion_msg) self.remove_moonraker_service = False self.remove_moonraker_dir = False self.remove_moonraker_env = False self.remove_moonraker_polkit = False - - self._go_back() - - def _get_selection_state_str(self) -> str: - return ( - "Select everything" if not self.selection_state else "Deselect everything" - ) - - def _go_back(self, **kwargs) -> None: - if self.previous_menu is not None: - self.previous_menu().run() + self.select_state = False diff --git a/kiauh/components/moonraker/moonraker_remove.py b/kiauh/components/moonraker/moonraker_remove.py index 214bdff..31982b7 100644 --- a/kiauh/components/moonraker/moonraker_remove.py +++ b/kiauh/components/moonraker/moonraker_remove.py @@ -16,6 +16,8 @@ from components.moonraker import MOONRAKER_DIR, MOONRAKER_ENV_DIR from components.moonraker.moonraker import Moonraker from core.instance_manager.instance_manager import InstanceManager from core.logger import Logger +from core.services.message_service import Message +from core.types.color import Color from utils.fs_utils import run_remove_routines from utils.input_utils import get_selection_input from utils.instance_utils import get_instances @@ -27,7 +29,12 @@ def run_moonraker_removal( remove_dir: bool, remove_env: bool, remove_polkit: bool, -) -> None: +) -> Message: + completion_msg = Message( + title="Moonraker Removal Process completed", + color=Color.GREEN, + ) + instances = get_instances(Moonraker) if remove_service: @@ -35,27 +42,45 @@ def run_moonraker_removal( if instances: instances_to_remove = select_instances_to_remove(instances) remove_instances(instances_to_remove) + instance_names = [i.service_file_path.stem for i in instances_to_remove] + txt = f"● Moonraker instances removed: {', '.join(instance_names)}" + completion_msg.text.append(txt) else: Logger.print_info("No Moonraker Services installed! Skipped ...") delete_remaining: bool = remove_polkit or remove_dir or remove_env if delete_remaining and unit_file_exists("moonraker", suffix="service"): - Logger.print_info("There are still other Moonraker services installed") - Logger.print_info( - "● Moonraker PolicyKit rules were not removed.", prefix=False + completion_msg.text.extend( + [ + "\n\n", + "Some Moonraker services are still installed:", + "● Moonraker PolicyKit rules were not removed.", + f"● '{MOONRAKER_DIR}' was not removed.", + f"● '{MOONRAKER_ENV_DIR}' was not removed.", + ] ) - Logger.print_info(f"● '{MOONRAKER_DIR}' was not removed.", prefix=False) - Logger.print_info(f"● '{MOONRAKER_ENV_DIR}' was not removed.", prefix=False) else: if remove_polkit: Logger.print_status("Removing all Moonraker policykit rules ...") - remove_polkit_rules() + if remove_polkit_rules(): + completion_msg.text.append("● Moonraker PolicyKit rules removed") if remove_dir: Logger.print_status("Removing Moonraker local repository ...") - run_remove_routines(MOONRAKER_DIR) + if run_remove_routines(MOONRAKER_DIR): + completion_msg.text.append("● Moonraker local repository removed") if remove_env: Logger.print_status("Removing Moonraker Python environment ...") - run_remove_routines(MOONRAKER_ENV_DIR) + if run_remove_routines(MOONRAKER_ENV_DIR): + completion_msg.text.append("● Moonraker Python environment removed") + + if completion_msg.text: + completion_msg.text.insert(0, "The following actions were performed:") + else: + completion_msg.color = Color.YELLOW + completion_msg.centered = True + completion_msg.text = ["Nothing to remove."] + + return completion_msg def select_instances_to_remove( @@ -97,19 +122,23 @@ def remove_instances( delete_moonraker_env_file(instance) -def remove_polkit_rules() -> None: +def remove_polkit_rules() -> bool: if not MOONRAKER_DIR.exists(): log = "Cannot remove policykit rules. Moonraker directory not found." Logger.print_warn(log) - return + return False try: cmd = [f"{MOONRAKER_DIR}/scripts/set-policykit-rules.sh", "--clear"] - run(cmd, stderr=PIPE, stdout=DEVNULL, check=True) + result = run(cmd, stderr=PIPE, stdout=DEVNULL, check=True) + if result.returncode != 0: + raise CalledProcessError(result.returncode, cmd) except CalledProcessError as e: Logger.print_error(f"Error while removing policykit rules: {e}") + return False Logger.print_ok("Policykit rules successfully removed!") + return True def delete_moonraker_env_file(instance: Moonraker): diff --git a/kiauh/core/menus/utils/__init__.py b/kiauh/core/menus/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/kiauh/core/menus/utils/menu_utils.py b/kiauh/core/menus/utils/menu_utils.py new file mode 100644 index 0000000..7087804 --- /dev/null +++ b/kiauh/core/menus/utils/menu_utils.py @@ -0,0 +1,13 @@ +# ======================================================================= # +# Copyright (C) 2020 - 2024 Dominik Willner # +# # +# This file is part of KIAUH - Klipper Installation And Update Helper # +# https://github.com/dw-0/kiauh # +# # +# This file may be distributed under the terms of the GNU GPLv3 license # +# ======================================================================= # +from core.types.color import Color + + +def get_checkbox_state(checked: bool) -> str: + return f"[{Color.apply('x', Color.CYAN)}]" if checked else "[ ]"