diff --git a/src/sakia/app.py b/src/sakia/app.py index de2ccd0823e9e624ae3c9a4e6e70b72f8cd7ec37..8a6b83aeafc3da17fa9dc087c4dd452b1ed034cf 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 7572ec6701371a76059c19e97e0678aecfa1c1d0..c0c46776cef664e5bf6ebaffc639075df9ad3741 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 c61b4e596aa099bcd8ec1e9d2baaf2a81a11ce83..3ec96bc9a1b77ded7e915684b16037adc00fbeaa 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 48a7d107ecff49f86b22cfa97b731aee68d64c04..2a71d8689233695e5a52628e382f6783e0ed5f5d 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 420a96242893dfd47530538bb89797eed9e3422c..1ef2753b44d89eaf6560262dd3bbb76ea9dabb2a 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 36b46be799a4440222c5041496881afa3b40db23..a827c6861d8650e3bbf8fffeb4209c18494cbfec 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 fd8483711ee5e1d4d212fe955e0204998899b8f9..d81ff1f7d0228c324a1c7201346e9000143e013a 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