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): ...@@ -103,6 +103,68 @@ class Person(object):
search['sigDate'], None) search['sigDate'], None)
return membership 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): def jsonify(self):
data = {'name': self.name, data = {'name': self.name,
'pubkey': self.pubkey} 'pubkey': self.pubkey}
......
...@@ -55,7 +55,7 @@ class CommunityTabWidget(QWidget, Ui_CommunityTabWidget): ...@@ -55,7 +55,7 @@ class CommunityTabWidget(QWidget, Ui_CommunityTabWidget):
def member_context_menu(self, point): def member_context_menu(self, point):
index = self.table_community_members.indexAt(point) index = self.table_community_members.indexAt(point)
model = self.table_community_members.model() 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) source_index = model.mapToSource(index)
pubkey_col = model.sourceModel().columns.index('Pubkey') pubkey_col = model.sourceModel().columns.index('Pubkey')
pubkey_index = model.sourceModel().index(source_index.row(), pubkey_index = model.sourceModel().index(source_index.row(),
......
...@@ -5,6 +5,7 @@ Created on 31 janv. 2015 ...@@ -5,6 +5,7 @@ Created on 31 janv. 2015
""" """
import logging import logging
import datetime
from PyQt5.QtWidgets import QWidget from PyQt5.QtWidgets import QWidget
from ..gen_resources.informations_tab_uic import Ui_InformationsTabWidget from ..gen_resources.informations_tab_uic import Ui_InformationsTabWidget
...@@ -49,6 +50,7 @@ class InformationsTabWidget(QWidget, 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>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:.2f}</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>{:2.2%} / {:} days</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
</table> </table>
""".format( """.format(
self.get_referential_diff_value(block['dividend']), self.get_referential_diff_value(block['dividend']),
...@@ -64,7 +66,9 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): ...@@ -64,7 +66,9 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
self.get_referential_name(), self.get_referential_name(),
block['dividend'] / (block['monetaryMass'] / block['membersCount']), block['dividend'] / (block['monetaryMass'] / block['membersCount']),
params['dt'] / 86400, 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): ...@@ -57,7 +57,7 @@ class WotView(QGraphicsView):
class Scene(QGraphicsScene): class Scene(QGraphicsScene):
# This defines signals taking string arguments # 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_signed = pyqtSignal(dict, name='nodeSigned')
node_transaction = pyqtSignal(dict, name='nodeTransaction') node_transaction = pyqtSignal(dict, name='nodeTransaction')
node_contact = pyqtSignal(dict, name='nodeContact') node_contact = pyqtSignal(dict, name='nodeContact')
...@@ -228,7 +228,7 @@ class Node(QGraphicsEllipseItem): ...@@ -228,7 +228,7 @@ class Node(QGraphicsEllipseItem):
""" """
if event.button() == Qt.LeftButton: if event.button() == Qt.LeftButton:
# trigger scene signal # trigger scene signal
self.scene().node_clicked.emit(self.metadata['id']) self.scene().node_clicked.emit(self.metadata)
def hoverEnterEvent(self, event: QGraphicsSceneHoverEvent): def hoverEnterEvent(self, event: QGraphicsSceneHoverEvent):
""" """
......
...@@ -49,46 +49,43 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): ...@@ -49,46 +49,43 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
self.signature_validity = self.community.get_parameters()['sigValidity'] self.signature_validity = self.community.get_parameters()['sigValidity']
# arc considered strong during 75% of signature validity time # arc considered strong during 75% of signature validity time
self.ARC_STATUS_STRONG_time = int(self.signature_validity * 0.75) 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: # create Person from node metadata
certifiers = self.community.request(bma.wot.CertifiersOf, {'search': public_key}) person = Person(metadata['text'], metadata['id'])
except ValueError as e: certifiers = person.certifiers_of(self.community)
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
# reset graph # reset graph
graph = dict() graph = dict()
# add wallet node # add wallet node
node_status = 0 node_status = 0
if public_key == self.account.pubkey: if person.pubkey == self.account.pubkey:
node_status += NODE_STATUS_HIGHLIGHTED 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_OUT
node_status += NODE_STATUS_SELECTED node_status += NODE_STATUS_SELECTED
# highlighted node (wallet) # center node
graph[public_key] = {'id': public_key, 'arcs': list(), 'text': certifiers['uid'], 'tooltip': public_key, 'status': node_status} graph[person.pubkey] = {
'id': person.pubkey,
'arcs': list(),
'text': person.name,
'tooltip': person.pubkey,
'status': node_status
}
# add certifiers of uid # add certifiers of uid
for certifier in certifiers['certifications']: for certifier in certifiers:
# new node # new node
if certifier['pubkey'] not in graph.keys(): if certifier['pubkey'] not in graph.keys():
node_status = 0 node_status = 0
...@@ -116,17 +113,17 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): ...@@ -116,17 +113,17 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
else: else:
arc_status = ARC_STATUS_STRONG arc_status = ARC_STATUS_STRONG
arc = { arc = {
'id': public_key, 'id': person.pubkey,
'status': arc_status, 'status': arc_status,
'tooltip': datetime.datetime.fromtimestamp( 'tooltip': datetime.datetime.fromtimestamp(
certifier['cert_time']['medianTime'] + self.signature_validity certifier['cert_time']['medianTime'] + self.signature_validity
).strftime("%Y/%m/%d"), ).strftime("%d/%m/%Y"),
'cert_time': certifier['cert_time']['medianTime'] 'cert_time': certifier['cert_time']['medianTime']
} }
graph[certifier['pubkey']]['arcs'] = [arc] graph[certifier['pubkey']]['arcs'] = [arc]
# add certified by uid # 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(): if certified['pubkey'] not in graph.keys():
node_status = 0 node_status = 0
if certified['pubkey'] == self.account.pubkey: if certified['pubkey'] == self.account.pubkey:
...@@ -154,149 +151,37 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): ...@@ -154,149 +151,37 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
'status': arc_status, 'status': arc_status,
'tooltip': datetime.datetime.fromtimestamp( 'tooltip': datetime.datetime.fromtimestamp(
certified['cert_time']['medianTime'] + self.signature_validity certified['cert_time']['medianTime'] + self.signature_validity
).strftime("%Y/%m/%d"), ).strftime("%d/%m/%Y"),
'cert_time': certified['cert_time']['medianTime'] 'cert_time': certified['cert_time']['medianTime']
} }
# replace old arc if this one is more recent # replace old arc if this one is more recent
new_arc = True new_arc = True
index = 0 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
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']:
# if same arc already exists... # if same arc already exists...
if a['id'] == arc['id']: if a['id'] == arc['id']:
# if arc more recent, dont keep old one... # if arc more recent, dont keep old one...
if arc['cert_time'] >= a['cert_time']: if arc['cert_time'] >= a['cert_time']:
graph[public_key]['arcs'][index] = arc graph[person.pubkey]['arcs'][index] = arc
new_arc = False new_arc = False
index += 1 index += 1
# if arc not in graph... # if arc not in graph...
if new_arc: if new_arc:
# add arc in graph # add arc in graph
graph[public_key]['arcs'].append(arc) graph[person.pubkey]['arcs'].append(arc)
# draw graph in qt scene # draw graph in qt scene
self.graphicsView.scene().update_wot(graph) self.graphicsView.scene().update_wot(graph)
return False
def reset(self): def reset(self):
""" """
Reset graph scene to wallet identity Reset graph scene to wallet identity
""" """
metadata = {'text': self.account.name, 'id': self.account.pubkey}
self.draw_graph( self.draw_graph(
self.account.pubkey metadata
) )
def search(self): def search(self):
...@@ -327,8 +212,10 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): ...@@ -327,8 +212,10 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
self.comboBoxSearch.showPopup() self.comboBoxSearch.showPopup()
if len(nodes) == 1: if len(nodes) == 1:
node = self.nodes[0]
metadata = {'id': node['pubkey'], 'text': node['uid']}
self.draw_graph( self.draw_graph(
list(nodes.keys())[0] metadata
) )
def select_node(self, index): def select_node(self, index):
...@@ -338,8 +225,9 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): ...@@ -338,8 +225,9 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
if index < 0 or index >= len(self.nodes): if index < 0 or index >= len(self.nodes):
return False return False
node = self.nodes[index] node = self.nodes[index]
metadata = {'id': node['pubkey'], 'text': node['uid']}
self.draw_graph( self.draw_graph(
node['pubkey'] metadata
) )
def sign_node(self, 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