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

Network table showing current network status

parent 9ecada30
No related branches found
No related tags found
No related merge requests found
...@@ -18,6 +18,18 @@ ...@@ -18,6 +18,18 @@
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QTableView" name="table_network"> <widget class="QTableView" name="table_network">
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<attribute name="horizontalHeaderShowSortIndicator" stdset="0"> <attribute name="horizontalHeaderShowSortIndicator" stdset="0">
<bool>true</bool> <bool>true</bool>
</attribute> </attribute>
......
...@@ -9,6 +9,7 @@ from ucoinpy import PROTOCOL_VERSION ...@@ -9,6 +9,7 @@ from ucoinpy import PROTOCOL_VERSION
from ucoinpy.documents.peer import Peer, Endpoint, BMAEndpoint from ucoinpy.documents.peer import Peer, Endpoint, BMAEndpoint
from ucoinpy.documents.block import Block from ucoinpy.documents.block import Block
from ..tools.exceptions import NoPeerAvailable from ..tools.exceptions import NoPeerAvailable
from .network.node import Node
import logging import logging
import inspect import inspect
import hashlib import hashlib
...@@ -80,6 +81,7 @@ class Community(object): ...@@ -80,6 +81,7 @@ class Community(object):
''' '''
self.currency = currency self.currency = currency
self.peers = [p for p in peers if p.currency == currency] self.peers = [p for p in peers if p.currency == currency]
self._nodes = [Node.from_peer(p) for p in peers]
self._cache = Cache(self) self._cache = Cache(self)
self._cache.refresh() self._cache.refresh()
...@@ -243,6 +245,10 @@ class Community(object): ...@@ -243,6 +245,10 @@ class Community(object):
logging.debug("Peers found : {0}".format(peers)) logging.debug("Peers found : {0}".format(peers))
return peers return peers
@property
def nodes(self):
return self._nodes
def get_block(self, number=None): def get_block(self, number=None):
if number is None: if number is None:
data = self.request(bma.blockchain.Current) data = self.request(bma.blockchain.Current)
......
'''
Created on 21 févr. 2015
@author: inso
'''
from ucoinpy.documents.peer import Peer, BMAEndpoint
from ucoinpy.api import bma
from ...core.person import Person
from ...tools.exceptions import PersonNotFoundError
class Node(object):
'''
classdocs
'''
def __init__(self, endpoint, pubkey, block):
'''
Constructor
'''
self._endpoint = endpoint
self._pubkey = pubkey
self._block = block
@classmethod
def from_peer(cls, peer):
e = next((e for e in peer.endpoints if type(e) is BMAEndpoint))
informations = bma.network.Peering(e.conn_handler()).get()
try:
block = bma.blockchain.Current(e.conn_handler()).get()
block_number = block["number"]
except ValueError as e:
if '404' in e:
block_number = 0
node_pubkey = informations["pubkey"]
return cls(e, node_pubkey, block_number)
@property
def pubkey(self):
return self._pubkey
@property
def endpoint(self):
return self._endpoint
@property
def block(self):
return self._block
...@@ -21,7 +21,7 @@ class NetworkTabWidget(QWidget, Ui_NetworkTabWidget): ...@@ -21,7 +21,7 @@ class NetworkTabWidget(QWidget, Ui_NetworkTabWidget):
super().__init__() super().__init__()
self.setupUi(self) self.setupUi(self)
model = NetworkTableModel(community) model = NetworkTableModel(community)
proxy = NetworkFilterProxyModel() proxy = NetworkFilterProxyModel(self)
proxy.setSourceModel(model) proxy.setSourceModel(model)
self.table_network.setModel(proxy) self.table_network.setModel(proxy)
......
...@@ -5,14 +5,10 @@ Created on 5 févr. 2014 ...@@ -5,14 +5,10 @@ Created on 5 févr. 2014
''' '''
import logging import logging
from ..core.transfer import Transfer, Received
from ..core.person import Person from ..core.person import Person
from ..tools.exceptions import PersonNotFoundError from ..tools.exceptions import PersonNotFoundError
from ucoinpy.documents.peer import BMAEndpoint
from ucoinpy.api import bma from ucoinpy.api import bma
from PyQt5.QtCore import QAbstractTableModel, Qt, QVariant, QSortFilterProxyModel, \ from PyQt5.QtCore import QAbstractTableModel, Qt, QVariant, QSortFilterProxyModel
QDateTime
from PyQt5.QtGui import QFont, QColor
class NetworkFilterProxyModel(QSortFilterProxyModel): class NetworkFilterProxyModel(QSortFilterProxyModel):
...@@ -35,6 +31,19 @@ class NetworkFilterProxyModel(QSortFilterProxyModel): ...@@ -35,6 +31,19 @@ class NetworkFilterProxyModel(QSortFilterProxyModel):
right_data = self.sourceModel().data(right, Qt.DisplayRole) right_data = self.sourceModel().data(right, Qt.DisplayRole)
return (left_data < right_data) return (left_data < right_data)
def headerData(self, section, orientation, role):
if role != Qt.DisplayRole:
return QVariant()
header_names = {'pubkey': 'Pubkey',
'is_member': 'Membre',
'uid': 'UID',
'address': 'Address',
'port': 'Port',
'current_block': 'Block'}
type = self.sourceModel().headerData(section, orientation, role)
return header_names[type]
def data(self, index, role): def data(self, index, role):
source_index = self.mapToSource(index) source_index = self.mapToSource(index)
source_data = self.sourceModel().data(source_index, role) source_data = self.sourceModel().data(source_index, role)
...@@ -54,30 +63,49 @@ class NetworkTableModel(QAbstractTableModel): ...@@ -54,30 +63,49 @@ class NetworkTableModel(QAbstractTableModel):
super().__init__(parent) super().__init__(parent)
self.community = community self.community = community
self.column_types = ( self.column_types = (
'pubkey',
'is_member',
'uid',
'address', 'address',
'port' 'port',
'current_block'
) )
@property @property
def peers(self): def nodes(self):
return self.community.peers return self.community.nodes
def rowCount(self, parent): def rowCount(self, parent):
return len(self.peers) return len(self.nodes)
def columnCount(self, parent): def columnCount(self, parent):
return len(self.column_types) return len(self.column_types)
def headerData(self, section, orientation, role): def headerData(self, section, orientation, role):
if role != Qt.DisplayRole:
return QVariant()
return self.column_types[section] return self.column_types[section]
def data_peer(self, peer): def data_node(self, node):
e = next((e for e in peer.endpoints if type(e) is BMAEndpoint)) try:
informations = bma.network.peering.Peers(e.conn_handler()).get() person = Person.lookup(node.pubkey, self.community)
if e.server: uid = person.name
address = e.server except PersonNotFoundError:
elif e.ipv4: uid = ""
address = e.port
is_member = node.pubkey in self.community.members_pubkeys()
address = ""
if node.endpoint.server:
address = node.endpoint.server
elif node.endpoint.ipv4:
address = node.endpoint.ipv4
elif node.endpoint.ipv6:
address = node.endpoint.ipv6
port = node.endpoint.port
return (node.pubkey, is_member, uid, address, port, node.block)
def data(self, index, role): def data(self, index, role):
row = index.row() row = index.row()
...@@ -86,9 +114,9 @@ class NetworkTableModel(QAbstractTableModel): ...@@ -86,9 +114,9 @@ class NetworkTableModel(QAbstractTableModel):
if not index.isValid(): if not index.isValid():
return QVariant() return QVariant()
peer = self.peers[row] node = self.nodes[row]
if role == Qt.DisplayRole: if role == Qt.DisplayRole:
return self.data_peer(peer)[col] return self.data_node(node)[col]
def flags(self, index): def flags(self, index):
return Qt.ItemIsSelectable | Qt.ItemIsEnabled return Qt.ItemIsSelectable | Qt.ItemIsEnabled
......
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