[feature] new 'restore' custom action

This commit is contained in:
Vinícius Moreira
2020-05-09 14:52:01 -03:00
parent 4bc4481e00
commit 7f4f2c805c
17 changed files with 106 additions and 27 deletions

View File

@@ -4,7 +4,10 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [0.9.3] 2020 ## [0.9.3] 2020-05
### Features
- new **restore** action to restore bauh settings and cache through the 'custom actions' button (**+**). It is equivalent to the command `bauh --reset`.
### Fixes ### Fixes
- Arch - Arch
- 'clean cache' operation was not working in some scenarios - 'clean cache' operation was not working in some scenarios

View File

@@ -312,7 +312,7 @@ class SoftwareManager(ABC):
""" """
pass pass
def clear_data(self): def clear_data(self, logs: bool = True):
""" """
Removes all data created by the SoftwareManager instance Removes all data created by the SoftwareManager instance
""" """

View File

@@ -7,7 +7,7 @@ from bauh.api.constants import CACHE_PATH
class CustomSoftwareAction: class CustomSoftwareAction:
def __init__(self, i18_label_key: str, i18n_status_key: str, icon_path: str, manager_method: str, requires_root: bool, manager: "SoftwareManager" = None, backup: bool = False): def __init__(self, i18_label_key: str, i18n_status_key: str, icon_path: str, manager_method: str, requires_root: bool, manager: "SoftwareManager" = None, backup: bool = False, refresh: bool = True):
""" """
:param i18_label_key: the i18n key that will be used to display the action name :param i18_label_key: the i18n key that will be used to display the action name
:param i18n_status_key: the i18n key that will be used to display the action name being executed :param i18n_status_key: the i18n key that will be used to display the action name being executed
@@ -16,6 +16,7 @@ class CustomSoftwareAction:
:param manager: the instance that will execute the action ( optional ) :param manager: the instance that will execute the action ( optional )
:param backup: if a system backup should be performed before executing the action :param backup: if a system backup should be performed before executing the action
:param requires_root: :param requires_root:
:param refresh: if the a full app refresh should be done if the action succeeds
""" """
self.i18_label_key = i18_label_key self.i18_label_key = i18_label_key
self.i18n_status_key = i18n_status_key self.i18n_status_key = i18n_status_key
@@ -24,6 +25,7 @@ class CustomSoftwareAction:
self.requires_root = requires_root self.requires_root = requires_root
self.manager = manager self.manager = manager
self.backup = backup self.backup = backup
self.refresh = refresh
def __hash__(self): def __hash__(self):
return self.i18_label_key.__hash__() + self.i18n_status_key.__hash__() + self.manager_method.__hash__() return self.i18_label_key.__hash__() + self.i18n_status_key.__hash__() + self.manager_method.__hash__()

View File

@@ -613,15 +613,19 @@ class AppImageManager(SoftwareManager):
return [] return []
def clear_data(self): def clear_data(self, logs: bool = True):
for f in glob.glob('{}/*.db'.format(LOCAL_PATH)): for f in glob.glob('{}/*.db'.format(LOCAL_PATH)):
try: try:
print('[bauh][appimage] Deleting {}'.format(f)) if logs:
print('[bauh][appimage] Deleting {}'.format(f))
os.remove(f) os.remove(f)
print('{}[bauh][appimage] {} deleted{}'.format(Fore.YELLOW, f, Fore.RESET))
if logs:
print('{}[bauh][appimage] {} deleted{}'.format(Fore.YELLOW, f, Fore.RESET))
except: except:
print('{}[bauh][appimage] An exception has happened when deleting {}{}'.format(Fore.RED, f, Fore.RESET)) if logs:
traceback.print_exc() print('{}[bauh][appimage] An exception has happened when deleting {}{}'.format(Fore.RED, f, Fore.RESET))
traceback.print_exc()
def get_settings(self, screen_width: int, screen_height: int) -> ViewComponent: def get_settings(self, screen_width: int, screen_height: int) -> ViewComponent:
config = read_config() config = read_config()

View File

@@ -944,16 +944,19 @@ class WebApplicationManager(SoftwareManager):
def get_screenshots(self, pkg: SoftwarePackage) -> List[str]: def get_screenshots(self, pkg: SoftwarePackage) -> List[str]:
pass pass
def clear_data(self): def clear_data(self, logs: bool = True):
if os.path.exists(ENV_PATH): if os.path.exists(ENV_PATH):
print('[bauh][web] Deleting directory {}'.format(ENV_PATH)) if logs:
print('[bauh][web] Deleting directory {}'.format(ENV_PATH))
try: try:
shutil.rmtree(ENV_PATH) shutil.rmtree(ENV_PATH)
print('{}[bauh][web] Directory {} deleted{}'.format(Fore.YELLOW, ENV_PATH, Fore.RESET)) if logs:
print('{}[bauh][web] Directory {} deleted{}'.format(Fore.YELLOW, ENV_PATH, Fore.RESET))
except: except:
print('{}[bauh][web] An exception has happened when deleting {}{}'.format(Fore.RED, ENV_PATH, Fore.RESET)) if logs:
traceback.print_exc() print('{}[bauh][web] An exception has happened when deleting {}{}'.format(Fore.RED, ENV_PATH, Fore.RESET))
traceback.print_exc()
def get_settings(self, screen_width: int, screen_height: int) -> ViewComponent: def get_settings(self, screen_width: int, screen_height: int) -> ViewComponent:
config = read_config() config = read_config()

View File

@@ -14,8 +14,11 @@ from bauh.api.abstract.model import SoftwarePackage, PackageUpdate, PackageHisto
from bauh.api.abstract.view import ViewComponent, TabGroupComponent from bauh.api.abstract.view import ViewComponent, TabGroupComponent
from bauh.api.exception import NoInternetException from bauh.api.exception import NoInternetException
from bauh.commons import internet from bauh.commons import internet
from bauh.commons.html import bold
from bauh.view.core.settings import GenericSettingsManager from bauh.view.core.settings import GenericSettingsManager
from bauh.view.core.update import check_for_update from bauh.view.core.update import check_for_update
from bauh.view.util import resource
from bauh.view.util.util import clean_app_files, restart_app
RE_IS_URL = re.compile(r'^https?://.+') RE_IS_URL = re.compile(r'^https?://.+')
@@ -47,6 +50,13 @@ class GenericSoftwareManager(SoftwareManager):
self.config = config self.config = config
self.settings_manager = settings_manager self.settings_manager = settings_manager
self.http_client = context.http_client self.http_client = context.http_client
self.extra_actions = [CustomSoftwareAction(i18_label_key='action.reset',
i18n_status_key='action.reset.status',
manager_method='reset',
manager=self,
icon_path=resource.get_path('img/logo.svg'),
requires_root=False,
refresh=False)]
def reset_cache(self): def reset_cache(self):
if self._available_cache is not None: if self._available_cache is not None:
@@ -473,10 +483,25 @@ class GenericSoftwareManager(SoftwareManager):
return res return res
def get_custom_actions(self) -> List[CustomSoftwareAction]: def reset(self, root_password: str, watcher: ProcessWatcher) -> bool:
if self.managers: body = '<p>{}</p><p>{}</p>'.format(self.i18n['action.reset.body_1'].format(bold(self.context.app_name)),
actions = [] self.i18n['action.reset.body_2'])
if watcher.request_confirmation(title=self.i18n['action.reset'],
body=body,
confirmation_label=self.i18n['proceed'].capitalize(),
deny_label=self.i18n['cancel'].capitalize()):
try:
clean_app_files(managers=self.managers, logs=False)
restart_app()
except:
return False
return True
def get_custom_actions(self) -> List[CustomSoftwareAction]:
actions = []
if self.managers:
working_managers = [] working_managers = []
for man in self.managers: for man in self.managers:
@@ -492,7 +517,8 @@ class GenericSoftwareManager(SoftwareManager):
if man_actions: if man_actions:
actions.extend(man_actions) actions.extend(man_actions)
return actions actions.extend(self.extra_actions)
return actions
def _fill_sizes(self, man: SoftwareManager, pkgs: List[SoftwarePackage]): def _fill_sizes(self, man: SoftwareManager, pkgs: List[SoftwarePackage]):
ti = time.time() ti = time.time()

View File

@@ -874,7 +874,7 @@ class CustomAction(AsyncAction):
if self.custom_action.backup: if self.custom_action.backup:
app_config = read_config() app_config = read_config()
if not self.request_backup(app_config, None, self.i18n, self.root_pwd): if not self.request_backup(app_config, None, self.i18n, self.root_pwd):
self.notify_finished({'success': False, 'pkg': self.pkg}) self.notify_finished({'success': False, 'pkg': self.pkg, 'action': self.custom_action})
self.pkg = None self.pkg = None
self.custom_action = None self.custom_action = None
self.root_pwd = None self.root_pwd = None
@@ -889,7 +889,7 @@ class CustomAction(AsyncAction):
success = False success = False
self.signal_output.emit(self.i18n['internet.required']) self.signal_output.emit(self.i18n['internet.required'])
self.notify_finished({'success': success, 'pkg': self.pkg}) self.notify_finished({'success': success, 'pkg': self.pkg, 'action': self.custom_action})
self.pkg = None self.pkg = None
self.custom_action = None self.custom_action = None
self.root_pwd = None self.root_pwd = None

View File

@@ -1226,7 +1226,8 @@ class ManageWindow(QWidget):
def _finish_custom_action(self, res: dict): def _finish_custom_action(self, res: dict):
self.finish_action() self.finish_action()
if res['success']: if res['success']:
self.refresh_packages(pkg_types={res['pkg'].model.__class__} if res['pkg'] else None) if res['action'].refresh:
self.refresh_packages(pkg_types={res['pkg'].model.__class__} if res['pkg'] else None)
else: else:
self.checkbox_console.setChecked(True) self.checkbox_console.setChecked(True)

View File

@@ -60,6 +60,10 @@ action.history.no_history.title=No history
action.info.tooltip=Feu clic aquí per a veure informació sobre aquesta aplicació action.info.tooltip=Feu clic aquí per a veure informació sobre aquesta aplicació
action.not_allowed=Action not allowed action.not_allowed=Action not allowed
action.request_reboot.title=System restart action.request_reboot.title=System restart
action.reset=Restore
action.reset.status=Restoring
action.reset.body_1=This operation will restore {} default settings and clean its cache.
action.reset.body_2=It will be restarted after the operation is finished.
action.run.tooltip=Feu clic aquí per a iniciar laplicació action.run.tooltip=Feu clic aquí per a iniciar laplicació
action.screenshots.tooltip=Feu clic aquí per a veure imatges daquesta aplicació action.screenshots.tooltip=Feu clic aquí per a veure imatges daquesta aplicació
action.settings.tooltip=Feu clic aquí per a obrir accions addicionals action.settings.tooltip=Feu clic aquí per a obrir accions addicionals

View File

@@ -60,6 +60,10 @@ action.history.no_history.title=No history
action.info.tooltip=Informationen über diese Anwendung anzeigen action.info.tooltip=Informationen über diese Anwendung anzeigen
action.not_allowed=Action not allowed action.not_allowed=Action not allowed
action.request_reboot.title=System restart action.request_reboot.title=System restart
action.reset=Restore
action.reset.status=Restoring
action.reset.body_1=This operation will restore {} default settings and clean its cache.
action.reset.body_2=It will be restarted after the operation is finished.
action.run.tooltip=Die Anwendung ausführen action.run.tooltip=Die Anwendung ausführen
action.screenshots.tooltip=Fotos der Anwendung anzeigen action.screenshots.tooltip=Fotos der Anwendung anzeigen
action.settings.tooltip=Weitere Optionen anzeigen action.settings.tooltip=Weitere Optionen anzeigen

View File

@@ -60,6 +60,10 @@ action.history.no_history.title=No history
action.info.tooltip=Click here to see information about this application action.info.tooltip=Click here to see information about this application
action.not_allowed=Action not allowed action.not_allowed=Action not allowed
action.request_reboot.title=System restart action.request_reboot.title=System restart
action.reset=Restore
action.reset.status=Restoring
action.reset.body_1=This operation will restore {} default settings and clean its cache.
action.reset.body_2=It will be restarted after the operation is finished.
action.run.tooltip=Click here to launch this application action.run.tooltip=Click here to launch this application
action.screenshots.tooltip=Click here to see some pictures of this application action.screenshots.tooltip=Click here to see some pictures of this application
action.settings.tooltip=Click here to open extra actions action.settings.tooltip=Click here to open extra actions

View File

@@ -60,6 +60,10 @@ action.history.no_history.title=No history
action.info.tooltip=Pulse aquí para ver información sobre esta aplicación action.info.tooltip=Pulse aquí para ver información sobre esta aplicación
action.not_allowed=Acción no permitida action.not_allowed=Acción no permitida
action.request_reboot.title=Reinicio de sistema action.request_reboot.title=Reinicio de sistema
action.reset=Restaurar
action.reset.status=Restaurando
action.reset.body_1=Esta operación restaurará las configuraciónes de {} y limpiará su caché.
action.reset.body_2=Él será reiniciado una vez que la operación esté terminada.
action.run.tooltip=Pulse aquí para iniciar la aplicación action.run.tooltip=Pulse aquí para iniciar la aplicación
action.screenshots.tooltip=Pulse aquí para ver algunas fotos de esta aplicación action.screenshots.tooltip=Pulse aquí para ver algunas fotos de esta aplicación
action.settings.tooltip=Pulse aquí para abrir acciones adicionales action.settings.tooltip=Pulse aquí para abrir acciones adicionales

View File

@@ -60,6 +60,10 @@ action.history.no_history.title=No history
action.info.tooltip=Clicca qui per vedere informazioni su questa applicazione action.info.tooltip=Clicca qui per vedere informazioni su questa applicazione
action.not_allowed=Action not allowed action.not_allowed=Action not allowed
action.request_reboot.title=System restart action.request_reboot.title=System restart
action.reset=Restore
action.reset.status=Restoring
action.reset.body_1=This operation will restore {} default settings and clean its cache.
action.reset.body_2=It will be restarted after the operation is finished.
action.run.tooltip=Fai clic qui per avviare questa applicazione action.run.tooltip=Fai clic qui per avviare questa applicazione
action.screenshots.tooltip=Clicca qui per vedere alcune immagini di questa applicazione action.screenshots.tooltip=Clicca qui per vedere alcune immagini di questa applicazione
action.settings.tooltip=Fai clic qui per aprire ulteriori azioni action.settings.tooltip=Fai clic qui per aprire ulteriori azioni

View File

@@ -60,6 +60,10 @@ action.history.no_history.title=Sem histórico
action.info.tooltip=Clique aqui para ver informações sobre este aplicativo action.info.tooltip=Clique aqui para ver informações sobre este aplicativo
action.not_allowed=Ação não permitida action.not_allowed=Ação não permitida
action.request_reboot.title=Reinicialização de sistema action.request_reboot.title=Reinicialização de sistema
action.reset=Restaurar
action.reset.status=Restaurando
action.reset.body_1=Essa operação restaurará as configurações padrões e limpará o cache do {}.
action.reset.body_2=Ele será reinicializado após a operação ser concluída.
action.run.tooltip=Clique aqui para iniciar esse aplicativo action.run.tooltip=Clique aqui para iniciar esse aplicativo
action.screenshots.tooltip=Clique aqui para ver algumas fotos desse aplicativo action.screenshots.tooltip=Clique aqui para ver algumas fotos desse aplicativo
action.settings.tooltip=Clique aqui para abrir ações adicionais action.settings.tooltip=Clique aqui para abrir ações adicionais

View File

@@ -60,6 +60,10 @@ action.history.no_history.title=No history
action.info.tooltip=Нажмите здесь, чтобы посмотреть информацию об этом приложении action.info.tooltip=Нажмите здесь, чтобы посмотреть информацию об этом приложении
action.not_allowed=Действие не допускается action.not_allowed=Действие не допускается
action.request_reboot.title=System restart action.request_reboot.title=System restart
action.reset=Restore
action.reset.status=Restoring
action.reset.body_1=This operation will restore {} default settings and clean its cache.
action.reset.body_2=It will be restarted after the operation is finished.
action.run.tooltip=Нажмите здесь, чтобы запустить это приложение action.run.tooltip=Нажмите здесь, чтобы запустить это приложение
action.screenshots.tooltip=Нажмите здесь, чтобы увидеть некоторые скриншоты этого приложения action.screenshots.tooltip=Нажмите здесь, чтобы увидеть некоторые скриншоты этого приложения
action.settings.tooltip=Нажмите здесь, чтобы открыть дополнительные действия action.settings.tooltip=Нажмите здесь, чтобы открыть дополнительные действия

View File

@@ -60,6 +60,10 @@ action.history.no_history.title=Geçmiş yok
action.info.tooltip=Uygulama bilgilerini görmek için buraya tıkla action.info.tooltip=Uygulama bilgilerini görmek için buraya tıkla
action.not_allowed=Eyleme izin verilmiyor action.not_allowed=Eyleme izin verilmiyor
action.request_reboot.title=Sistemi yeniden başlat action.request_reboot.title=Sistemi yeniden başlat
action.reset=Restore
action.reset.status=Restoring
action.reset.body_1=This operation will restore {} default settings and clean its cache.
action.reset.body_2=It will be restarted after the operation is finished.
action.run.tooltip=Uygulamayı başlatmak için burayı tıkla action.run.tooltip=Uygulamayı başlatmak için burayı tıkla
action.screenshots.tooltip=Bu uygulamanın bazı resimlerini görmek için buraya tıklayın action.screenshots.tooltip=Bu uygulamanın bazı resimlerini görmek için buraya tıklayın
action.settings.tooltip=Extra eylemleri açmak için buraya tıkla action.settings.tooltip=Extra eylemleri açmak için buraya tıkla

View File

@@ -56,20 +56,28 @@ def get_distro():
return 'unknown' return 'unknown'
def clean_app_files(managers: List[SoftwareManager]): def clean_app_files(managers: List[SoftwareManager], logs: bool = True):
print('[bauh] Cleaning configuration and cache files')
if logs:
print('[bauh] Cleaning configuration and cache files')
for path in (CACHE_PATH, CONFIG_PATH): for path in (CACHE_PATH, CONFIG_PATH):
print('[bauh] Deleting directory {}'.format(path)) if logs:
print('[bauh] Deleting directory {}'.format(path))
if os.path.exists(path): if os.path.exists(path):
try: try:
shutil.rmtree(path) shutil.rmtree(path)
print('{}[bauh] Directory {} deleted{}'.format(Fore.YELLOW, path, Fore.RESET)) if logs:
print('{}[bauh] Directory {} deleted{}'.format(Fore.YELLOW, path, Fore.RESET))
except: except:
print('{}[bauh] An exception has happened when deleting {}{}'.format(Fore.RED, path, Fore.RESET)) if logs:
traceback.print_exc() print('{}[bauh] An exception has happened when deleting {}{}'.format(Fore.RED, path, Fore.RESET))
traceback.print_exc()
if managers: if managers:
for m in managers: for m in managers:
m.clear_data() m.clear_data()
print('[bauh] Cleaning finished') if logs:
print('[bauh] Cleaning finished')