fix: not internet connection scenario when reading installed and searching

This commit is contained in:
Vinicius Moreira
2019-09-24 12:26:33 -03:00
parent 3c51046668
commit e56ecc8f49
14 changed files with 160 additions and 72 deletions

View File

@@ -8,6 +8,8 @@ from bauh.api.abstract.controller import SoftwareManager, SearchResult, Applicat
from bauh.api.abstract.disk import DiskCacheLoader
from bauh.api.abstract.handler import ProcessWatcher
from bauh.api.abstract.model import SoftwarePackage, PackageUpdate, PackageHistory, PackageSuggestion, PackageAction
from bauh.api.exception import NoInternetException
from bauh.commons import internet
SUGGESTIONS_LIMIT = 5
@@ -93,27 +95,30 @@ class GenericSoftwareManager(SoftwareManager):
res = SearchResult([], [], 0)
norm_word = word.strip().lower()
disk_loader = self.disk_loader_factory.new()
disk_loader.start()
if internet.is_available(self.context.http_client, self.context.logger):
norm_word = word.strip().lower()
disk_loader = self.disk_loader_factory.new()
disk_loader.start()
threads = []
threads = []
for man in self.managers:
t = Thread(target=self._search, args=(norm_word, man, disk_loader, res))
t.start()
threads.append(t)
for man in self.managers:
t = Thread(target=self._search, args=(norm_word, man, disk_loader, res))
t.start()
threads.append(t)
for t in threads:
t.join()
for t in threads:
t.join()
if disk_loader:
disk_loader.stop_working()
disk_loader.join()
if disk_loader:
disk_loader.stop_working()
disk_loader.join()
res.installed = self._sort(res.installed, norm_word)
res.new = self._sort(res.new, norm_word)
res.total = len(res.installed) + len(res.new)
res.installed = self._sort(res.installed, norm_word)
res.new = self._sort(res.new, norm_word)
res.total = len(res.installed) + len(res.new)
else:
raise NoInternetException()
tf = time.time()
self.logger.info('Took {0:.2f} seconds'.format(tf - ti))
@@ -130,10 +135,21 @@ class GenericSoftwareManager(SoftwareManager):
def can_work(self) -> bool:
return True
def read_installed(self, disk_loader: DiskCacheLoader = None, limit: int = -1, only_apps: bool = False, pkg_types: Set[Type[SoftwarePackage]] = None) -> SearchResult:
def _is_internet_available(self, res: dict):
res['available'] = internet.is_available(self.context.http_client, self.context.logger)
def _get_internet_check(self, res: dict) -> Thread:
t = Thread(target=self._is_internet_available, args=(res,))
t.start()
return t
def read_installed(self, disk_loader: DiskCacheLoader = None, limit: int = -1, only_apps: bool = False, pkg_types: Set[Type[SoftwarePackage]] = None, internet_available: bool = None) -> SearchResult:
ti = time.time()
self._wait_to_be_ready()
internet_available = {}
thread_internet_check = self._get_internet_check(internet_available)
res = SearchResult([], None, 0)
disk_loader = None
@@ -145,8 +161,9 @@ class GenericSoftwareManager(SoftwareManager):
disk_loader = self.disk_loader_factory.new()
disk_loader.start()
thread_internet_check.join()
mti = time.time()
man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None)
man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=internet_available['available'])
mtf = time.time()
self.logger.info(man.__class__.__name__ + " took {0:.2f} seconds".format(mtf - mti))
@@ -163,8 +180,9 @@ class GenericSoftwareManager(SoftwareManager):
disk_loader = self.disk_loader_factory.new()
disk_loader.start()
thread_internet_check.join()
mti = time.time()
man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None)
man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=internet_available['available'])
mtf = time.time()
self.logger.info(man.__class__.__name__ + " took {0:.2f} seconds".format(mtf - mti))
@@ -310,7 +328,7 @@ class GenericSoftwareManager(SoftwareManager):
suggestions.extend(man_sugs)
def list_suggestions(self, limit: int) -> List[PackageSuggestion]:
if self.managers:
if self.managers and internet.is_available(self.context.http_client, self.context.logger):
suggestions, threads = [], []
for man in self.managers:
t = Thread(target=self._fill_suggestions, args=(suggestions, man, SUGGESTIONS_LIMIT))

View File

@@ -1,3 +1,4 @@
import re
import time
from datetime import datetime, timedelta
from typing import List, Type, Set
@@ -14,6 +15,8 @@ from bauh.api.exception import NoInternetException
from bauh.view.qt import commons
from bauh.view.qt.view_model import PackageView
RE_VERSION_IN_NAME = re.compile(r'\s+version\s+[\w\.]+\s*$')
class AsyncAction(QThread, ProcessWatcher):
@@ -87,7 +90,10 @@ class UpdateSelectedApps(AsyncAction):
if self.apps_to_update:
updated, updated_types = 0, set()
for app in self.apps_to_update:
self.change_status('{} {} {}...'.format(self.locale_keys['manage_window.status.upgrading'], app.model.name, app.model.version))
name = app.model.name if not RE_VERSION_IN_NAME.findall(app.model.name) else app.model.name.split('version')[0].strip()
self.change_status('{} {} {}...'.format(self.locale_keys['manage_window.status.upgrading'], name, app.model.version))
success = bool(self.manager.update(app.model, self.root_password, self))
if not success:
@@ -223,14 +229,18 @@ class SearchPackages(AsyncAction):
self.manager = manager
def run(self):
apps_found = []
search_res = {'pkgs_found': [], 'error': None}
if self.word:
res = self.manager.search(self.word)
apps_found.extend(res.installed)
apps_found.extend(res.new)
self.notify_finished(apps_found)
self.word = None
try:
res = self.manager.search(self.word)
search_res['pkgs_found'].extend(res.installed)
search_res['pkgs_found'].extend(res.new)
except NoInternetException:
search_res['error'] = 'internet.required'
finally:
self.notify_finished(search_res)
self.word = None
class InstallPackage(AsyncAction):

View File

@@ -846,10 +846,14 @@ class ManageWindow(QWidget):
self.thread_search.word = word
self.thread_search.start()
def _finish_search(self, pkgs_found: List[SoftwarePackage]):
def _finish_search(self, res: dict):
self.finish_action()
self.ref_bt_upgrade.setVisible(False)
self.update_pkgs(pkgs_found, as_installed=False, ignore_updates=True)
if not res['error']:
self.ref_bt_upgrade.setVisible(False)
self.update_pkgs(res['pkgs_found'], as_installed=False, ignore_updates=True)
else:
dialog.show_message(title=self.i18n['warning'].capitalize(), body=self.i18n[res['error']], type_=MessageType.WARNING)
def install(self, pkg: PackageView):
pwd = None

View File

@@ -1,4 +1,4 @@
manage_window.title=Applications Manager
manage_window.title=my applications
manage_window.columns.latest_version=Latest Version
manage_window.columns.update=Upgrade ?
manage_window.apps_table.row.actions.info=Information

View File

@@ -1,4 +1,4 @@
manage_window.title=Administrador de Aplicativos
manage_window.title=mis aplicativos
manage_window.columns.latest_version=Ultima Versión
manage_window.columns.update=Actualizar ?
manage_window.columns.installed=Instalado

View File

@@ -1,4 +1,4 @@
manage_window.title=Gerenciador de Aplicativos
manage_window.title=meus aplicativos
manage_window.columns.latest_version=Última Versão
manage_window.columns.update=Atualizar ?
manage_window.columns.installed=Instalado