From d920eb002af4659770d25b276eb96566df5e669b Mon Sep 17 00:00:00 2001
From: inso <insomniak.fr@gmaiL.com>
Date: Fri, 27 Jan 2017 12:46:54 +0100
Subject: [PATCH] Fix bug #584

---
 src/sakia/data/graphs/base_graph.py     | 15 ++++++++++-----
 src/sakia/data/processors/identities.py |  2 +-
 src/sakia/services/identities.py        |  7 +++++--
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/src/sakia/data/graphs/base_graph.py b/src/sakia/data/graphs/base_graph.py
index 5e9c303f..8c3544c5 100644
--- a/src/sakia/data/graphs/base_graph.py
+++ b/src/sakia/data/graphs/base_graph.py
@@ -66,11 +66,14 @@ class BaseGraph(QObject):
         """
         # new node
         node_status = NodeStatus.NEUTRAL
-        if node_identity.pubkey == account_identity.pubkey:
-            node_status += NodeStatus.HIGHLIGHTED
-        if node_identity.member is False:
-            node_status += NodeStatus.OUT
-        return node_status
+        try:
+            if node_identity.pubkey == account_identity.pubkey:
+                node_status += NodeStatus.HIGHLIGHTED
+            if node_identity.member is False:
+                node_status += NodeStatus.OUT
+            return node_status
+        except AttributeError:
+            pass
 
     def confirmation_text(self, block_number):
         """
@@ -203,6 +206,7 @@ class BaseGraph(QObject):
                 certifier = self.identities_service.get_identity(certification.certifier)
                 if not certifier:
                     certifier = await self.identities_service.find_from_pubkey(certification.certifier)
+                    self.identities_service.insert_or_update_identity(certifier)
                 node_status = await self.node_status(certifier, account_identity)
                 self.add_certifier_node(certifier, identity, certification, node_status)
         except NoPeerAvailable as e:
@@ -222,6 +226,7 @@ class BaseGraph(QObject):
                 certified = self.identities_service.get_identity(certification.certified)
                 if not certified:
                     certified = await self.identities_service.find_from_pubkey(certification.certified)
+                    self.identities_service.insert_or_update_identity(certified)
                 node_status = await self.node_status(certified, account_identity)
                 self.add_certified_node(identity, certified, certification, node_status)
 
diff --git a/src/sakia/data/processors/identities.py b/src/sakia/data/processors/identities.py
index 1ed37605..82522528 100644
--- a/src/sakia/data/processors/identities.py
+++ b/src/sakia/data/processors/identities.py
@@ -153,7 +153,7 @@ class IdentitiesProcessor:
                                                                   req_args={'search': identity.pubkey})
                 identity_data = next((data for data in requirements_data["identities"]
                                       if data["pubkey"] == identity.pubkey))
-                identity.member = identity_data['membershipExpiresIn'] > 0 and not identity_data['outdistanced']
+                identity.member = identity_data['membershipExpiresIn'] > 0
                 identity.outdistanced = identity_data['outdistanced']
                 self.insert_or_update_identity(identity)
         except errors.DuniterError as e:
diff --git a/src/sakia/services/identities.py b/src/sakia/services/identities.py
index cdb35def..fd848371 100644
--- a/src/sakia/services/identities.py
+++ b/src/sakia/services/identities.py
@@ -377,12 +377,12 @@ class IdentitiesService(QObject):
             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 and not 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 identity.pubkey in self._connections_processor.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:
@@ -431,6 +431,9 @@ class IdentitiesService(QObject):
         """
         return await self._identities_processor.lookup(self.currency, text)
 
+    def insert_or_update_identity(self, identity):
+        return self._identities_processor.insert_or_update_identity(identity)
+
     def get_identity(self, pubkey, uid=""):
         return self._identities_processor.get_identity(self.currency, pubkey, uid)
 
-- 
GitLab