Skip to content
Snippets Groups Projects
Commit e0fa6196 authored by inso's avatar inso
Browse files

Added uid to Node class

parent ac1d06f3
No related branches found
No related tags found
No related merge requests found
......@@ -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))
......
......@@ -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]
......
......@@ -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):
'''
......
......@@ -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:
......
......@@ -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)
......
......@@ -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()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment