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

Merge branch 'dev082' into dev

parents 7bab52c9 14cff9f9
No related branches found
No related tags found
No related merge requests found
......@@ -103,6 +103,68 @@ class Person(object):
search['sigDate'], None)
return membership
def is_member(self, community):
try:
certifiers = community.request(bma.wot.CertifiersOf, {'search': self.pubkey})
return certifiers['isMember']
except ValueError:
return False
def certifiers_of(self, community):
try:
certifiers = community.request(bma.wot.CertifiersOf, {'search': self.pubkey})
except ValueError as e:
logging.debug('bma.wot.CertifiersOf request ValueError : ' + str(e))
try:
data = community.request(bma.wot.Lookup, {'search': self.pubkey})
except ValueError as e:
logging.debug('bma.wot.Lookup request ValueError : ' + str(e))
return list()
# convert api data to certifiers list
certifiers = list()
# add certifiers of uid
for certifier in data['results'][0]['uids'][0]['others']:
# for each uid found for this pubkey...
for uid in certifier['uids']:
# add a certifier
certifier['uid'] = uid
certifier['cert_time'] = dict()
certifier['cert_time']['medianTime'] = community.get_block(certifier['meta']['block_number']).mediantime
certifiers.append(certifier)
return certifiers
except Exception as e:
logging.debug('bma.wot.CertifiersOf request error : ' + str(e))
return list()
return certifiers['certifications']
def certified_by(self, community):
try:
certified_list = community.request(bma.wot.CertifiedBy, {'search': self.pubkey})
except ValueError as e:
logging.debug('bma.wot.CertifiersOf request ValueError : ' + str(e))
try:
data = community.request(bma.wot.Lookup, {'search': self.pubkey})
except ValueError as e:
logging.debug('bma.wot.Lookup request ValueError : ' + str(e))
return list()
certified_list = list()
for certified in data['results'][0]['signed']:
certified['cert_time'] = dict()
certified['cert_time']['medianTime'] = certified['meta']['timestamp']
certified_list.append(certified)
return certified_list
except Exception as e:
logging.debug('bma.wot.CertifiersOf request error : ' + str(e))
return list()
return certified_list['certifications']
def jsonify(self):
data = {'name': self.name,
'pubkey': self.pubkey}
......
......@@ -55,7 +55,7 @@ class CommunityTabWidget(QWidget, Ui_CommunityTabWidget):
def member_context_menu(self, point):
index = self.table_community_members.indexAt(point)
model = self.table_community_members.model()
if index.row() < model.rowCount():
if index.row() < model.rowCount() and index.column() < model.columnCount() - 2:
source_index = model.mapToSource(index)
pubkey_col = model.sourceModel().columns.index('Pubkey')
pubkey_index = model.sourceModel().index(source_index.row(),
......
......@@ -5,6 +5,7 @@ Created on 31 janv. 2015
"""
import logging
import datetime
from PyQt5.QtWidgets import QWidget
from ..gen_resources.informations_tab_uic import Ui_InformationsTabWidget
......@@ -49,6 +50,7 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:.2f}</b></td><td>{:} {:}</td></tr>
<tr><td align="right"><b>{:2.2%} / {:} days</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
</table>
""".format(
self.get_referential_diff_value(block['dividend']),
......@@ -64,7 +66,9 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
self.get_referential_name(),
block['dividend'] / (block['monetaryMass'] / block['membersCount']),
params['dt'] / 86400,
'Actual growth c = UD(t)/[M(t-1)/N(t)]'
'Actual growth c = UD(t)/[M(t-1)/N(t)]',
datetime.datetime.fromtimestamp(block['medianTime'] + params['dt']).strftime("%d/%m/%Y %I:%M"),
'Next UD date and time (t+1)'
)
)
......
......@@ -57,7 +57,7 @@ class WotView(QGraphicsView):
class Scene(QGraphicsScene):
# This defines signals taking string arguments
node_clicked = pyqtSignal(str, name='nodeClicked')
node_clicked = pyqtSignal(dict, name='nodeClicked')
node_signed = pyqtSignal(dict, name='nodeSigned')
node_transaction = pyqtSignal(dict, name='nodeTransaction')
node_contact = pyqtSignal(dict, name='nodeContact')
......@@ -228,7 +228,7 @@ class Node(QGraphicsEllipseItem):
"""
if event.button() == Qt.LeftButton:
# trigger scene signal
self.scene().node_clicked.emit(self.metadata['id'])
self.scene().node_clicked.emit(self.metadata)
def hoverEnterEvent(self, event: QGraphicsSceneHoverEvent):
"""
......
......@@ -49,46 +49,43 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
self.signature_validity = self.community.get_parameters()['sigValidity']
# arc considered strong during 75% of signature validity time
self.ARC_STATUS_STRONG_time = int(self.signature_validity * 0.75)
self.draw_graph(self.account.pubkey)
def draw_graph(self, public_key):
# create node metadata from account
metadata = {'text': self.account.name, 'id': self.account.pubkey}
self.draw_graph(metadata)
def draw_graph(self, metadata):
"""
Draw community graph centered on public_key identity
Draw community graph centered on the identity
:param public_key: Public key of the identity
:param dict metadata: Graph node metadata of the identity
"""
try:
certifiers = self.community.request(bma.wot.CertifiersOf, {'search': public_key})
except ValueError as e:
logging.debug('bma.wot.CertifiersOf request ValueError : ' + str(e))
try:
data = self.community.request(bma.wot.Lookup, {'search': public_key})
except ValueError as e:
logging.debug('bma.wot.Lookup request ValueError : ' + str(e))
return False
# construct and display non member graph
self.setNonMemberGraph(public_key, data)
return False
except Exception as e:
logging.debug('bma.wot.CertifiersOf request error : ' + str(e))
return False
# create Person from node metadata
person = Person(metadata['text'], metadata['id'])
certifiers = person.certifiers_of(self.community)
# reset graph
graph = dict()
# add wallet node
node_status = 0
if public_key == self.account.pubkey:
if person.pubkey == self.account.pubkey:
node_status += NODE_STATUS_HIGHLIGHTED
if certifiers['isMember'] is False:
if person.is_member(self.community) is False:
node_status += NODE_STATUS_OUT
node_status += NODE_STATUS_SELECTED
# highlighted node (wallet)
graph[public_key] = {'id': public_key, 'arcs': list(), 'text': certifiers['uid'], 'tooltip': public_key, 'status': node_status}
# center node
graph[person.pubkey] = {
'id': person.pubkey,
'arcs': list(),
'text': person.name,
'tooltip': person.pubkey,
'status': node_status
}
# add certifiers of uid
for certifier in certifiers['certifications']:
for certifier in certifiers:
# new node
if certifier['pubkey'] not in graph.keys():
node_status = 0
......@@ -116,17 +113,17 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
else:
arc_status = ARC_STATUS_STRONG
arc = {
'id': public_key,
'id': person.pubkey,
'status': arc_status,
'tooltip': datetime.datetime.fromtimestamp(
certifier['cert_time']['medianTime'] + self.signature_validity
).strftime("%Y/%m/%d"),
).strftime("%d/%m/%Y"),
'cert_time': certifier['cert_time']['medianTime']
}
graph[certifier['pubkey']]['arcs'] = [arc]
# add certified by uid
for certified in self.community.request(bma.wot.CertifiedBy, {'search': public_key})['certifications']:
for certified in person.certified_by(self.community):
if certified['pubkey'] not in graph.keys():
node_status = 0
if certified['pubkey'] == self.account.pubkey:
......@@ -154,149 +151,37 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
'status': arc_status,
'tooltip': datetime.datetime.fromtimestamp(
certified['cert_time']['medianTime'] + self.signature_validity
).strftime("%Y/%m/%d"),
).strftime("%d/%m/%Y"),
'cert_time': certified['cert_time']['medianTime']
}
# replace old arc if this one is more recent
new_arc = True
index = 0
for a in graph[public_key]['arcs']:
# if same arc already exists...
if a['id'] == arc['id']:
# if arc more recent, dont keep old one...
if arc['cert_time'] >= a['cert_time']:
graph[public_key]['arcs'][index] = arc
new_arc = False
index += 1
# if arc not in graph...
if new_arc:
# add arc in graph
graph[public_key]['arcs'].append(arc)
# draw graph in qt scene
self.graphicsView.scene().update_wot(graph)
def setNonMemberGraph(self, public_key, data):
# reset graph
graph = dict()
# show only node of this non member (to certify him)
node_status = 0
if public_key == self.account.pubkey:
node_status += NODE_STATUS_HIGHLIGHTED
node_status += NODE_STATUS_OUT
node_status += NODE_STATUS_SELECTED
# selected node
graph[public_key] = {'id': public_key, 'arcs': list(), 'text': data['results'][0]['uids'][0]['uid'], 'tooltip': public_key, 'status': node_status}
# add certifiers of uid
for certifier in data['results'][0]['uids'][0]['others']:
# for each uid found for this pubkey...
for uid in certifier['uids']:
# new node
if certifier['pubkey'] not in graph.keys():
node_status = 0
if certifier['pubkey'] == self.account.pubkey:
node_status += NODE_STATUS_HIGHLIGHTED
if certifier['isMember'] is False:
node_status += NODE_STATUS_OUT
graph[certifier['pubkey']] = {
'id': certifier['pubkey'],
'arcs': list(),
'text': uid,
'tooltip': certifier['pubkey'],
'status': node_status
}
cert_time = self.get_block_mediantime(certifier['meta']['block_number'])
# add only valid certification...
if (time.time() - cert_time) > self.signature_validity:
continue
# keep only the latest certification
if graph[certifier['pubkey']]['arcs']:
if cert_time < graph[certifier['pubkey']]['arcs'][0]['cert_time']:
continue
# display validity status
if (time.time() - cert_time) > self.ARC_STATUS_STRONG_time:
arc_status = ARC_STATUS_WEAK
else:
arc_status = ARC_STATUS_STRONG
arc = {
'id': public_key,
'status': arc_status,
'tooltip': datetime.datetime.fromtimestamp(
cert_time + self.signature_validity
).strftime("%Y/%m/%d"),
'cert_time': cert_time
}
graph[certifier['pubkey']]['arcs'] = [arc]
# add certified by non member uid
for certified in data['results'][0]['signed']:
if certified['pubkey'] not in graph.keys():
node_status = 0
if certified['pubkey'] == self.account.pubkey:
node_status += NODE_STATUS_HIGHLIGHTED
if certified['isMember'] is False:
node_status += NODE_STATUS_OUT
graph[certified['pubkey']] = {
'id': certified['pubkey'],
'arcs': list(),
'text': certified['uid'],
'tooltip': certified['pubkey'],
'status': node_status
}
# add only valid certification...
if (time.time() - certified['meta']['timestamp']) > self.signature_validity:
continue
# display validity status
if (time.time() - certified['meta']['timestamp']) > self.ARC_STATUS_STRONG_time:
arc_status = ARC_STATUS_WEAK
else:
arc_status = ARC_STATUS_STRONG
arc = {
'id': certified['pubkey'],
'status': arc_status,
'tooltip': datetime.datetime.fromtimestamp(
certified['meta']['timestamp'] + self.signature_validity
).strftime("%Y/%m/%d"),
'cert_time': certified['meta']['timestamp']
}
# replace old arc if this one is more recent
new_arc = True
index = 0
for a in graph[public_key]['arcs']:
for a in graph[person.pubkey]['arcs']:
# if same arc already exists...
if a['id'] == arc['id']:
# if arc more recent, dont keep old one...
if arc['cert_time'] >= a['cert_time']:
graph[public_key]['arcs'][index] = arc
graph[person.pubkey]['arcs'][index] = arc
new_arc = False
index += 1
# if arc not in graph...
if new_arc:
# add arc in graph
graph[public_key]['arcs'].append(arc)
graph[person.pubkey]['arcs'].append(arc)
# draw graph in qt scene
self.graphicsView.scene().update_wot(graph)
return False
def reset(self):
"""
Reset graph scene to wallet identity
"""
metadata = {'text': self.account.name, 'id': self.account.pubkey}
self.draw_graph(
self.account.pubkey
metadata
)
def search(self):
......@@ -327,8 +212,10 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
self.comboBoxSearch.showPopup()
if len(nodes) == 1:
node = self.nodes[0]
metadata = {'id': node['pubkey'], 'text': node['uid']}
self.draw_graph(
list(nodes.keys())[0]
metadata
)
def select_node(self, index):
......@@ -338,8 +225,9 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
if index < 0 or index >= len(self.nodes):
return False
node = self.nodes[index]
metadata = {'id': node['pubkey'], 'text': node['uid']}
self.draw_graph(
node['pubkey']
metadata
)
def sign_node(self, metadata):
......
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