diff --git a/src/sakia/data/processors/certifications.py b/src/sakia/data/processors/certifications.py index 7897932797065ff114e78f45277344856e8b6c71..82e0021ff2cb646fb978627019cf24ad20296f29 100644 --- a/src/sakia/data/processors/certifications.py +++ b/src/sakia/data/processors/certifications.py @@ -1,7 +1,7 @@ import attr import asyncio from duniterpy.api import bma, errors -from duniterpy.documents import BlockUID +from duniterpy.documents import block_uid from ..connectors import BmaConnector from ..processors import NodesProcessor from ..entities import Certification, Identity diff --git a/src/sakia/gui/dialogs/certification/controller.py b/src/sakia/gui/dialogs/certification/controller.py index f7a8615a16b0831afcd0156a7c094cb19e31dd76..c656ede2529b9620d450611fa423af4852abab2a 100644 --- a/src/sakia/gui/dialogs/certification/controller.py +++ b/src/sakia/gui/dialogs/certification/controller.py @@ -80,6 +80,7 @@ class CertificationController(QObject): """ dialog = cls.create(parent, app) dialog.view.combo_pubkey.setCurrentText(connection.title()) + dialog.user_information.change_identity(identity) dialog.refresh() return await dialog.async_exec() @@ -125,7 +126,8 @@ class CertificationController(QObject): QApplication.restoreOverrideCursor() self.view.button_box.setEnabled(True) - def reject(self): + @asyncify + async def reject(self): self.view.reject() def refresh(self): diff --git a/src/sakia/gui/dialogs/transfer/controller.py b/src/sakia/gui/dialogs/transfer/controller.py index d1b3c08665ec3de25c51e97a0fa8fc0083bcb49d..3e0ba57ed6f9594fd66f6022bea52176ceaf5b7d 100644 --- a/src/sakia/gui/dialogs/transfer/controller.py +++ b/src/sakia/gui/dialogs/transfer/controller.py @@ -71,6 +71,7 @@ class TransferController(QObject): async def send_money_to_identity(cls, parent, app, connection, identity): dialog = cls.create(parent, app) dialog.view.combo_connections.setCurrentText(connection.title()) + dialog.user_information.change_identity(identity) dialog.view.edit_pubkey.setText(identity.pubkey) dialog.view.radio_pubkey.setChecked(True) diff --git a/src/sakia/gui/main_window/toolbar/model.py b/src/sakia/gui/main_window/toolbar/model.py index a7b32325fbda10afc3b9438849a4256fb36a0ae0..abf8adb0500a8f67df99214671bc8179c0067d16 100644 --- a/src/sakia/gui/main_window/toolbar/model.py +++ b/src/sakia/gui/main_window/toolbar/model.py @@ -34,7 +34,7 @@ class ToolbarModel(QObject): version_url = "" if not latest[0]: version_info = "Latest release : {version}" \ - .format(version='.'.join(latest[1])) + .format(version=latest[1]) version_url = latest[2] new_version_text = """ diff --git a/src/sakia/gui/navigation/graphs/base/controller.py b/src/sakia/gui/navigation/graphs/base/controller.py index 5d5f42eab552409931c9b0272e54bf3ff5cf812e..e1af19acbd1f9485bd71ac5a975fb3a8d638bfc0 100644 --- a/src/sakia/gui/navigation/graphs/base/controller.py +++ b/src/sakia/gui/navigation/graphs/base/controller.py @@ -62,12 +62,11 @@ class BaseGraphController(QObject): """ raise NotImplementedError("refresh not implemented") - def node_context_menu(self, pubkey): + def node_context_menu(self, identity): """ Open the node context menu - :param str pubkey: the pubkey of the node to open + :param sakia.data.entities.Identity identity: the identity of the node to open """ - identity = self.model.get_identity(pubkey) menu = ContextMenu.from_data(self.view, self.model.app, self.model.connection, (identity,)) menu.view_identity_in_wot.connect(self.draw_graph) diff --git a/src/sakia/gui/navigation/graphs/base/node.py b/src/sakia/gui/navigation/graphs/base/node.py index 33362993ed08eaf75bbfadc85da2051ce9fd83d6..f07802526c77144ced6941477173af888b6590c5 100644 --- a/src/sakia/gui/navigation/graphs/base/node.py +++ b/src/sakia/gui/navigation/graphs/base/node.py @@ -66,5 +66,5 @@ class BaseNode(QGraphicsEllipseItem): :param event: scene context menu event """ - self.scene().node_context_menu_requested.emit(self.id) + self.scene().node_context_menu_requested.emit(self.metadata['identity']) diff --git a/src/sakia/gui/navigation/graphs/base/scene.py b/src/sakia/gui/navigation/graphs/base/scene.py index 36cd72880a4def8abc332cd47f0b5c06e68aaede..3c5a46e58bddacffc84eb12d74c0a3f54527154d 100644 --- a/src/sakia/gui/navigation/graphs/base/scene.py +++ b/src/sakia/gui/navigation/graphs/base/scene.py @@ -1,10 +1,11 @@ +from sakia.data.entities import Identity from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QGraphicsScene, QGraphicsSceneContextMenuEvent class BaseScene(QGraphicsScene): # This defines signals taking string arguments - node_context_menu_requested = pyqtSignal(str) + node_context_menu_requested = pyqtSignal(Identity) node_hovered = pyqtSignal(str) node_clicked = pyqtSignal(str, dict) diff --git a/src/sakia/gui/widgets/context_menu.py b/src/sakia/gui/widgets/context_menu.py index 13072b76350a4850b8d61ef94b097cdad6a3b421..340ee2080a99b6cc3095dcb8019ca27539df8426 100644 --- a/src/sakia/gui/widgets/context_menu.py +++ b/src/sakia/gui/widgets/context_menu.py @@ -134,7 +134,6 @@ class ContextMenu(QObject): @asyncify async def send_money(self, identity): await TransferController.send_money_to_identity(None, self._app, self._connection, identity) - self._app.refresh_transfers.emit() def view_wot(self, identity): self.view_identity_in_wot.emit(identity) diff --git a/src/sakia/services/documents.py b/src/sakia/services/documents.py index 9448d1cbd99a67c3b134cf087a9ddcab9a7672c2..27bb0274f6d8c616a6aaeddfde1337aaf572a989 100644 --- a/src/sakia/services/documents.py +++ b/src/sakia/services/documents.py @@ -1,13 +1,11 @@ import asyncio import attr import logging -import jsonschema -from collections import Counter from duniterpy.key import SigningKey from duniterpy import PROTOCOL_VERSION from duniterpy.documents import BlockUID, Block, Certification, Membership, Revocation, InputSource, \ - OutputSource, SIGParameter, Unlock + OutputSource, SIGParameter, Unlock, block_uid from duniterpy.documents import Identity as IdentityDoc from duniterpy.documents import Transaction as TransactionDoc from duniterpy.documents.transaction import reduce_base @@ -142,6 +140,15 @@ class DocumentsService: """ self._logger.debug("Certdata") blockUID = self._blockchain_processor.current_buid(connection.currency) + if not identity.signature: + lookup_data = await self._bma_connector.get(connection.currency, bma.wot.lookup, + req_args={'search': identity.pubkey}) + for uid_data in next(data["uids"] for data in lookup_data["results"] if data["pubkey"] == identity.pubkey): + if uid_data["uid"] == identity.uid and block_uid(uid_data["meta"]["timestamp"]) == identity.blockstamp: + identity.signature = uid_data["self"] + break + else: + return False, "Could not find certified identity signature" certification = Certification(10, connection.currency, connection.pubkey, identity.pubkey, blockUID, None)