From e0fa6196d300e5c176c2249c6977e4275955e356 Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Sun, 15 Mar 2015 20:10:37 +0100
Subject: [PATCH] Added uid to Node class

---
 src/cutecoin/core/net/network.py |  3 +-
 src/cutecoin/core/net/node.py    | 50 ++++++++++++++++++++++++++++----
 src/cutecoin/core/person.py      |  2 +-
 src/cutecoin/core/wallet.py      |  3 +-
 src/cutecoin/gui/network_tab.py  | 10 +++++--
 src/cutecoin/models/network.py   |  8 +----
 6 files changed, 56 insertions(+), 20 deletions(-)

diff --git a/src/cutecoin/core/net/network.py b/src/cutecoin/core/net/network.py
index 26b1948d..37990432 100644
--- a/src/cutecoin/core/net/network.py
+++ b/src/cutecoin/core/net/network.py
@@ -8,7 +8,7 @@ from .node import Node
 import logging
 import time
 
-from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot
+from PyQt5.QtCore import QObject, pyqtSignal
 
 
 class Network(QObject):
@@ -162,7 +162,6 @@ class Network(QObject):
             node.check_sync(block_max)
 
         #TODO: Offline nodes for too long have to be removed
-
         #TODO: Corrupted nodes should maybe be removed faster ?
 
         logging.debug("Nodes found : {0}".format(nodes))
diff --git a/src/cutecoin/core/net/node.py b/src/cutecoin/core/net/node.py
index 6ed23a0e..974dce8c 100644
--- a/src/cutecoin/core/net/node.py
+++ b/src/cutecoin/core/net/node.py
@@ -8,7 +8,8 @@ from ucoinpy.documents.peer import Peer, BMAEndpoint, Endpoint
 from ucoinpy.api import bma
 from ucoinpy.api.bma import ConnectionHandler
 from requests.exceptions import RequestException
-from ...tools.exceptions import InvalidNodeCurrency
+from ...tools.exceptions import InvalidNodeCurrency, PersonNotFoundError
+from ..person import Person
 import logging
 import time
 
@@ -32,12 +33,13 @@ class Node(QObject):
 
     changed = pyqtSignal()
 
-    def __init__(self, currency, endpoints, pubkey, block, state):
+    def __init__(self, currency, endpoints, uid, pubkey, block, state):
         '''
         Constructor
         '''
         super().__init__()
         self._endpoints = endpoints
+        self._uid = uid
         self._pubkey = pubkey
         self._block = block
         self._state = state
@@ -63,7 +65,7 @@ class Node(QObject):
             if peer.currency != currency:
                 raise InvalidNodeCurrency(peer.currency, currency)
 
-        node = cls(peer.currency, peer.endpoints, peer.pubkey, 0, Node.ONLINE)
+        node = cls(peer.currency, peer.endpoints, "", peer.pubkey, 0, Node.ONLINE)
         node.refresh_state()
         return node
 
@@ -80,25 +82,35 @@ class Node(QObject):
             if peer.currency != currency:
                 raise InvalidNodeCurrency(peer.currency, currency)
 
-        node = cls(peer.currency, peer.endpoints, "", 0, Node.ONLINE)
+        node = cls(peer.currency, peer.endpoints, "", "", 0, Node.ONLINE)
         node.refresh_state()
         return node
 
     @classmethod
     def from_json(cls, currency, data):
         endpoints = []
+        uid = ""
+        pubkey = ""
+
         for endpoint_data in data['endpoints']:
             endpoints.append(Endpoint.from_inline(endpoint_data))
 
         if currency in data:
             currency = data['currency']
 
-        node = cls(currency, endpoints, "", 0, Node.ONLINE)
+        if uid in data:
+            uid = data['uid']
+
+        if pubkey in data:
+            pubkey = data['pubkey']
+
+        node = cls(currency, endpoints, uid, pubkey, 0, Node.ONLINE)
         node.refresh_state()
         return node
 
     def jsonify(self):
         data = {'pubkey': self._pubkey,
+                'uid': self._uid,
                 'currency': self._currency}
         endpoints = []
         for e in self._endpoints:
@@ -130,12 +142,34 @@ class Node(QObject):
     def neighbours(self):
         return self._neighbours
 
+    @property
+    def uid(self):
+        return self._uid
+
     def check_sync(self, block):
         if self._block < block:
             self._state = Node.DESYNCED
         else:
             self._state = Node.ONLINE
 
+    def _request_uid(self):
+        uid = ""
+        try:
+            data = bma.wot.Lookup(self.endpoint.conn_handler(), self.pubkey).get()
+            timestamp = 0
+            for result in data['results']:
+                if result["pubkey"] == self.pubkey:
+                    uids = result['uids']
+                    for uid in uids:
+                        if uid["meta"]["timestamp"] > timestamp:
+                            timestamp = uid["meta"]["timestamp"]
+                            uid = uid["uid"]
+        except ValueError as e:
+            if '404' in str(e):
+                logging.debug("Error : node uid not found : {0}".format(self.pubkey))
+                uid = ""
+        return uid
+
     def refresh_state(self):
         emit_change = False
         try:
@@ -165,6 +199,8 @@ class Node(QObject):
                 self.state = Node.CORRUPTED
                 emit_change = True
             else:
+                node_uid = self._request_uid()
+
                 if block_number != self._block:
                     self._block = block_number
                     emit_change = True
@@ -173,6 +209,10 @@ class Node(QObject):
                     self._pubkey = node_pubkey
                     emit_change = True
 
+                if node_uid != self._uid:
+                    self._uid = node_uid
+                    emit_change = True
+
                 logging.debug(neighbours)
                 new_inlines = [e.inline() for n in neighbours for e in n]
                 last_inlines = [e.inline() for n in self._neighbours for e in n]
diff --git a/src/cutecoin/core/person.py b/src/cutecoin/core/person.py
index d508a10a..3dc466f0 100644
--- a/src/cutecoin/core/person.py
+++ b/src/cutecoin/core/person.py
@@ -217,7 +217,7 @@ class Person(object):
             if '400' in str(e):
                 raise MembershipNotFoundError(self.pubkey, community.name)
 
-#TODO: Manage 'OUT' memberships
+#TODO: Manage 'OUT' memberships ? Maybe ?
     @cached
     def membership(self, community):
         '''
diff --git a/src/cutecoin/core/wallet.py b/src/cutecoin/core/wallet.py
index 48ccfa6a..3589bc2a 100644
--- a/src/cutecoin/core/wallet.py
+++ b/src/cutecoin/core/wallet.py
@@ -60,7 +60,7 @@ class Cache():
     def transfers(self):
         return [t for t in self._transfers if t.state != Transfer.DROPPED]
 
-    def _parse_transaction(self, community, block_number, mediantime, tx):
+    def _parse_transaction(self, community, tx, block_number, mediantime):
 
         receivers = [o.pubkey for o in tx.outputs
                      if o.pubkey != tx.issuers[0]]
@@ -127,7 +127,6 @@ class Cache():
             transfer.check_registered(tx, block_number,
                                       block_doc.mediantime)
 
-#TODO: Refactor to reduce this method size and split it to more methods
     def refresh(self, community):
         current_block = 0
         try:
diff --git a/src/cutecoin/gui/network_tab.py b/src/cutecoin/gui/network_tab.py
index aad3e04a..ca32208b 100644
--- a/src/cutecoin/gui/network_tab.py
+++ b/src/cutecoin/gui/network_tab.py
@@ -4,8 +4,9 @@ Created on 20 févr. 2015
 @author: inso
 '''
 
+import logging
 from PyQt5.QtWidgets import QWidget
-from PyQt5.QtCore import QModelIndex, QThread
+from PyQt5.QtCore import Qt, QThread
 from ..core.watchers.network import NetworkWatcher
 from ..models.network import NetworkTableModel, NetworkFilterProxyModel
 from ..gen_resources.network_tab_uic import Ui_NetworkTabWidget
@@ -31,16 +32,19 @@ class NetworkTabWidget(QWidget, Ui_NetworkTabWidget):
         self.watcher_thread = QThread()
         self.network_watcher.moveToThread(self.watcher_thread)
         self.watcher_thread.started.connect(self.network_watcher.watch)
+        self.watcher_thread.finished.connect(self.network_watcher.stop)
+        self.watcher_thread.finished.connect(self.network_watcher.deleteLater)
+        self.watcher_thread.finished.connect(self.watcher_thread.deleteLater)
 
         community.network.nodes_changed.connect(self.refresh_nodes)
 
     def refresh_nodes(self):
         self.table_network.model().sourceModel().modelReset.emit()
+        self.table_network.sortByColumn(0, Qt.AscendingOrder)
 
     def closeEvent(self, event):
         super().closeEvent(event)
-        self.network_watcher.deleteLater()
-        self.watcher_thread.deleteLater()
+        self.watcher_thread.terminate()
 
     def showEvent(self, event):
         super().showEvent(event)
diff --git a/src/cutecoin/models/network.py b/src/cutecoin/models/network.py
index f44a7735..2be03e42 100644
--- a/src/cutecoin/models/network.py
+++ b/src/cutecoin/models/network.py
@@ -100,12 +100,6 @@ class NetworkTableModel(QAbstractTableModel):
         :param ..core.net.node.Node node: Network node
         :return:
         """
-        try:
-            person = Person.lookup(node.pubkey, self.community)
-            uid = person.name
-        except PersonNotFoundError:
-            uid = ""
-
         is_member = node.pubkey in self.community.members_pubkeys()
 
         address = ""
@@ -117,7 +111,7 @@ class NetworkTableModel(QAbstractTableModel):
             address = node.endpoint.ipv6
         port = node.endpoint.port
 
-        return node.pubkey, is_member, uid, address, port, node.block
+        return node.pubkey, is_member, node.uid, address, port, node.block
 
     def data(self, index, role):
         row = index.row()
-- 
GitLab