diff --git a/src/sakia/gui/navigation/controller.py b/src/sakia/gui/navigation/controller.py
index 873677558c8c761d664e507906e4391a56bfad23..14f359340b07562f9066b0d73365458abc662cad 100644
--- a/src/sakia/gui/navigation/controller.py
+++ b/src/sakia/gui/navigation/controller.py
@@ -64,6 +64,7 @@ class NavigationController(QObject):
navigation.init_navigation()
app.new_connection.connect(navigation.add_connection)
app.view_in_wot.connect(navigation.open_wot_view)
+ app.identity_changed.connect(navigation.handle_identity_change)
return navigation
def open_network_view(self, _):
@@ -112,6 +113,11 @@ class NavigationController(QObject):
self.view.set_model(self.model)
+ def handle_identity_change(self, identity):
+ node = self.model.handle_identity_change(identity)
+ if node:
+ self.view.update_connection(node)
+
def handle_view_change(self, raw_data):
"""
Handle view change
diff --git a/src/sakia/gui/navigation/identity/controller.py b/src/sakia/gui/navigation/identity/controller.py
index cc796ac000486a033fb5f4ff7e467083dca304fa..142729495dcacca553a7c9eec638a1706463c208 100644
--- a/src/sakia/gui/navigation/identity/controller.py
+++ b/src/sakia/gui/navigation/identity/controller.py
@@ -62,6 +62,7 @@ class IdentityController(QObject):
view.set_table_identities_model(table_model)
view.table_certifiers.customContextMenuRequested['QPoint'].connect(identity.identity_context_menu)
identity.view_in_wot.connect(app.view_in_wot)
+ app.identity_changed.connect(identity.handle_identity_change)
return identity
def identity_context_menu(self, point):
diff --git a/src/sakia/gui/navigation/model.py b/src/sakia/gui/navigation/model.py
index 825b277bacaa1ca7f948461a045c73bd9bd0f6cc..d77cfcd046355b6007fddfca0737811c8ee24ae8 100644
--- a/src/sakia/gui/navigation/model.py
+++ b/src/sakia/gui/navigation/model.py
@@ -23,6 +23,15 @@ class NavigationModel(QObject):
self._current_data = None
self._contacts_processor = ContactsProcessor.instanciate(self.app)
+ def handle_identity_change(self, identity):
+ for node in self.navigation[3]['children']:
+ if node['component'] == "Informations":
+ connection = node["misc"]["connection"]
+ if connection.pubkey == identity.pubkey and connection.uid == identity.uid:
+ icon = self.identity_icon(connection)
+ node["icon"] = icon
+ return node
+
def init_navigation_data(self):
self.navigation = [
{
@@ -80,14 +89,10 @@ class NavigationModel(QObject):
else:
title = connection.title()
if connection.uid:
- if self.identity_is_member(connection):
- icon = ':/icons/member'
- else:
- icon = ':/icons/not_member'
node = {
'title': title,
'component': "Informations",
- 'icon': icon,
+ 'icon': self.identity_icon(connection),
'dependencies': {
'blockchain_service': self.app.blockchain_service,
'identities_service': self.app.identities_service,
@@ -135,6 +140,12 @@ class NavigationModel(QObject):
return node
+ def identity_icon(self, connection):
+ if self.identity_is_member(connection):
+ return ':/icons/member'
+ else:
+ return ':/icons/not_member'
+
def view_in_wot(self, connection):
identity = self.app.identities_service.get_identity(connection.pubkey, connection.uid)
self.app.view_in_wot.emit(identity)
@@ -231,4 +242,4 @@ class NavigationModel(QObject):
@staticmethod
def copy_pubkey_to_clipboard_with_crc(connection):
clipboard = QApplication.clipboard()
- clipboard.setText(str(CRCPubkey.from_pubkey(connection.pubkey)))
\ No newline at end of file
+ clipboard.setText(str(CRCPubkey.from_pubkey(connection.pubkey)))
diff --git a/src/sakia/gui/navigation/view.py b/src/sakia/gui/navigation/view.py
index 80124e08814fa0233755138688e6f2a3a6215d3c..a5159d6fb6c0cfb94dc96540d67dee49eeac0b66 100644
--- a/src/sakia/gui/navigation/view.py
+++ b/src/sakia/gui/navigation/view.py
@@ -49,3 +49,6 @@ class NavigationView(QFrame, Ui_Navigation):
def add_connection(self, raw_data):
self.tree_view.model().insert_node(raw_data)
self.tree_view.expandAll()
+
+ def update_connection(self, raw_data):
+ self.tree_view.model().modelReset.emit()
diff --git a/src/sakia/services/identities.py b/src/sakia/services/identities.py
index 36650aef0d10fcd01dbbbb020e5e30baf6f43657..efa457ff6298d8a53eb08d3c408d84a54eca0838 100644
--- a/src/sakia/services/identities.py
+++ b/src/sakia/services/identities.py
@@ -67,6 +67,9 @@ class IdentitiesService(QObject):
return 0
def _get_connections_identities(self):
+ """
+ :rtype: List of sakia.data.entities.Identity
+ """
connections = self._connections_processor.connections_with_uids(self.currency)
identities = []
for c in connections:
@@ -278,6 +281,21 @@ class IdentitiesService(QObject):
for idty in identities:
self._identities_processor.insert_or_update_identity(idty)
+ def _parse_median_time(self, block):
+ """
+ Parse revoked pubkeys found in a block and refresh local data
+
+ :param duniterpy.documents.Block block: the block received
+ :return: list of identities updated
+ """
+ identities = []
+ connections_identities = self._get_connections_identities()
+ parameters = self._blockchain_processor.parameters(block.currency)
+ for idty in connections_identities:
+ if idty.member and idty.membership_timestamp + parameters.ms_validity < block.mediantime:
+ identities.append(idty)
+ return identities
+
def _parse_revocations(self, block):
"""
Parse revoked pubkeys found in a block and refresh local data
@@ -423,6 +441,7 @@ class IdentitiesService(QObject):
need_refresh += self._parse_identities(block)
need_refresh += self._parse_memberships(block)
need_refresh += await self._parse_certifications(block)
+ need_refresh += self._parse_median_time(block)
return set(need_refresh)
async def handle_new_blocks(self, blocks):