From 02fe59d6d5d68ca5280980f528c0444173275fee Mon Sep 17 00:00:00 2001 From: inso <insomniak.fr@gmaiL.com> Date: Fri, 27 Jan 2017 13:20:35 +0100 Subject: [PATCH] Fix issue #585 --- src/sakia/app.py | 1 + src/sakia/gui/navigation/controller.py | 10 ++++++++ .../gui/navigation/graphs/wot/controller.py | 1 + .../gui/navigation/identities/controller.py | 4 ++- src/sakia/gui/navigation/model.py | 14 +++++++++++ .../gui/navigation/txhistory/controller.py | 1 + src/sakia/services/identities.py | 25 ++++++++++--------- 7 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/sakia/app.py b/src/sakia/app.py index de2ccd08..8a6b83ae 100644 --- a/src/sakia/app.py +++ b/src/sakia/app.py @@ -51,6 +51,7 @@ class Application(QObject): referential_changed = pyqtSignal() sources_refreshed = pyqtSignal() new_blocks_handled = pyqtSignal() + view_in_wot = pyqtSignal(Connection, Identity) qapp = attr.ib() loop = attr.ib() diff --git a/src/sakia/gui/navigation/controller.py b/src/sakia/gui/navigation/controller.py index 7572ec67..c0c46776 100644 --- a/src/sakia/gui/navigation/controller.py +++ b/src/sakia/gui/navigation/controller.py @@ -62,8 +62,18 @@ class NavigationController(QObject): model.setParent(navigation) navigation.init_navigation() app.new_connection.connect(navigation.add_connection) + app.view_in_wot.connect(navigation.view_in_wot) return navigation + def view_in_wot(self, connection, _): + raw_data = self.model.get_raw_data('Wot', connection=connection) + if raw_data: + widget = raw_data['widget'] + if self.view.stacked_widget.indexOf(widget) != -1: + self.view.stacked_widget.setCurrentWidget(widget) + self.view.current_view_changed.emit(raw_data) + return + def parse_node(self, node_data): if 'component' in node_data: component_class = self.components[node_data['component']] diff --git a/src/sakia/gui/navigation/graphs/wot/controller.py b/src/sakia/gui/navigation/graphs/wot/controller.py index c61b4e59..3ec96bc9 100644 --- a/src/sakia/gui/navigation/graphs/wot/controller.py +++ b/src/sakia/gui/navigation/graphs/wot/controller.py @@ -39,6 +39,7 @@ class WotController(BaseGraphController): search_user = SearchUserController.create(wot, app) wot.view.set_search_user(search_user.view) app.identity_changed.connect(wot.handle_identity_change) + app.view_in_wot.connect(lambda c, i: wot.center_on_identity(i) if c == connection else None) search_user.identity_selected.connect(wot.center_on_identity) search_user.view.button_reset.clicked.connect(wot.reset) return wot diff --git a/src/sakia/gui/navigation/identities/controller.py b/src/sakia/gui/navigation/identities/controller.py index 48a7d107..2a71d868 100644 --- a/src/sakia/gui/navigation/identities/controller.py +++ b/src/sakia/gui/navigation/identities/controller.py @@ -5,6 +5,7 @@ from PyQt5.QtCore import QObject, pyqtSignal from sakia.errors import NoPeerAvailable from duniterpy.api import errors +from sakia.data.entities import Identity from sakia.decorators import once_at_a_time, asyncify from sakia.gui.widgets.context_menu import ContextMenu from .model import IdentitiesModel @@ -15,7 +16,7 @@ class IdentitiesController(QObject): """ The navigation panel """ - view_in_wot = pyqtSignal(object) + view_in_wot = pyqtSignal(Identity) def __init__(self, parent, view, model, password_asker=None): """ @@ -40,6 +41,7 @@ class IdentitiesController(QObject): model = IdentitiesModel(None, app, connection, blockchain_service, identities_service) identities = cls(parent, view, model) model.setParent(identities) + identities.view_in_wot.connect(lambda i: app.view_in_wot.emit(connection, i)) return identities def identity_context_menu(self, point): diff --git a/src/sakia/gui/navigation/model.py b/src/sakia/gui/navigation/model.py index 420a9624..1ef2753b 100644 --- a/src/sakia/gui/navigation/model.py +++ b/src/sakia/gui/navigation/model.py @@ -115,6 +115,20 @@ class NavigationModel(QObject): def current_data(self, key): return self._current_data.get(key, None) + def _lookup_raw_data(self, raw_data, component, **kwargs): + if raw_data['component'] == component: + for k in kwargs: + if raw_data['misc'].get(k, None) == kwargs[k]: + return raw_data + for c in raw_data.get('children', []): + children_data = self._lookup_raw_data(c, component, **kwargs) + if children_data: + return children_data + + def get_raw_data(self, component, **kwargs): + for data in self.navigation: + return self._lookup_raw_data(data, component, **kwargs) + def current_connection(self): if self._current_data: return self._current_data['misc'].get('connection', None) diff --git a/src/sakia/gui/navigation/txhistory/controller.py b/src/sakia/gui/navigation/txhistory/controller.py index 36b46be7..a827c686 100644 --- a/src/sakia/gui/navigation/txhistory/controller.py +++ b/src/sakia/gui/navigation/txhistory/controller.py @@ -42,6 +42,7 @@ class TxHistoryController(QObject): model.setParent(txhistory) app.referential_changed.connect(txhistory.refresh_balance) app.sources_refreshed.connect(txhistory.refresh_balance) + txhistory.view_in_wot.connect(lambda i: app.view_in_wot.emit(connection, i)) return txhistory def refresh_minimum_maximum(self): diff --git a/src/sakia/services/identities.py b/src/sakia/services/identities.py index fd848371..d81ff1f7 100644 --- a/src/sakia/services/identities.py +++ b/src/sakia/services/identities.py @@ -372,18 +372,19 @@ class IdentitiesService(QObject): try: requirements = await self._bma_connector.get(self.currency, bma.wot.requirements, req_args={'search': identity.pubkey}) - identity_data = requirements['identities'][0] - identity.uid = identity_data["uid"] - identity.blockstamp = block_uid(identity_data["meta"]["timestamp"]) - identity.timestamp = await self._blockchain_processor.timestamp(self.currency, identity.blockstamp.number) - identity.outdistanced = identity_data["outdistanced"] - identity.member = identity_data["membershipExpiresIn"] > 0 - median_time = self._blockchain_processor.time(self.currency) - expiration_time = self._blockchain_processor.parameters(self.currency).ms_validity - identity.membership_timestamp = median_time - (expiration_time - identity_data["membershipExpiresIn"]) - # We save connections pubkeys - if self._identities_processor.get_identity(self.currency, identity.pubkey, identity.uid): - self._identities_processor.insert_or_update_identity(identity) + for identity_data in requirements['identities']: + if not identity.uid or identity.uid == identity_data["uid"]: + identity.uid = identity_data["uid"] + identity.blockstamp = block_uid(identity_data["meta"]["timestamp"]) + identity.timestamp = await self._blockchain_processor.timestamp(self.currency, identity.blockstamp.number) + identity.outdistanced = identity_data["outdistanced"] + identity.member = identity_data["membershipExpiresIn"] > 0 + median_time = self._blockchain_processor.time(self.currency) + expiration_time = self._blockchain_processor.parameters(self.currency).ms_validity + identity.membership_timestamp = median_time - (expiration_time - identity_data["membershipExpiresIn"]) + # We save connections pubkeys + if self._identities_processor.get_identity(self.currency, identity.pubkey, identity.uid): + self._identities_processor.insert_or_update_identity(identity) except errors.DuniterError as e: if e.ucode == errors.NO_MEMBER_MATCHING_PUB_OR_UID: pass -- GitLab