diff --git a/src/cutecoin/gui/wot_tab.py b/src/cutecoin/gui/wot_tab.py index 4b6bedd1fdc2901e6432592884fa16cdc376291f..9357eff6d44aafde7050e1c1bfd869851cefc816 100644 --- a/src/cutecoin/gui/wot_tab.py +++ b/src/cutecoin/gui/wot_tab.py @@ -11,7 +11,7 @@ from ucoinpy.api import bma from .certification import CertificationDialog from .add_contact import AddContactDialog from .transfer import TransferMoneyDialog - +from cutecoin.core.person import Person class WotTabWidget(QWidget, Ui_WotTabWidget): def __init__(self, account, community, password_asker, parent=None): @@ -56,36 +56,25 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): :param public_key: Public key of the identity """ - # reset graph - graph = dict() try: certifiers = self.community.request(bma.wot.CertifiersOf, {'search': public_key}) except ValueError as e: - logging.debug('bma.wot.CertifiersOf request error : ' + str(e)) + logging.debug('bma.wot.CertifiersOf request ValueError : ' + str(e)) try: - results = self.community.request(bma.wot.Lookup, {'search': public_key}) + data = self.community.request(bma.wot.Lookup, {'search': public_key}) except ValueError as e: - logging.debug('bma.wot.CertifiersOf request error : ' + str(e)) + logging.debug('bma.wot.Lookup request ValueError : ' + str(e)) return False - - #Â 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': results['results'][0]['uids'][0]['uid'], 'tooltip': public_key, 'status': node_status} - - # draw graph in qt scene - self.graphicsView.scene().update_wot(graph) + #Â 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 + graph = dict() + #Â add wallet node node_status = 0 if public_key == self.account.pubkey: @@ -188,6 +177,119 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): # 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_median_time(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 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) + return False + def reset(self): """ Reset graph scene to wallet identity @@ -236,7 +338,7 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): return False node = self.nodes[index] self.draw_graph( - node['pubkey'] + node['pubkey'] ) def sign_node(self, metadata): @@ -263,3 +365,11 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): dialog.edit_name.setText(metadata['text']) dialog.edit_pubkey.setText(metadata['id']) dialog.exec_() + + def get_block_median_time(self, number): + try: + block = self.community.get_block(number) + except Exception as e: + logging.debug('community.get_block request error : ' + str(e)) + return False + return block.mediantime