From b62255a70d44c98484a552ae3ff50d25a6e5393c Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Sat, 12 Sep 2015 07:59:20 +0200
Subject: [PATCH] Fix remaining bugs due to refactoring

---
 src/cutecoin/core/account.py       |  1 +
 src/cutecoin/gui/certification.py  |  8 ++++++
 src/cutecoin/gui/community_view.py | 24 ++++++++++++++++-
 src/cutecoin/gui/contact.py        |  8 +-----
 src/cutecoin/gui/identities_tab.py | 35 ++++++++++---------------
 src/cutecoin/gui/member.py         | 14 +++++++---
 src/cutecoin/gui/transfer.py       | 18 ++++++++-----
 src/cutecoin/gui/wot_tab.py        | 42 +++++++++++++++++-------------
 8 files changed, 94 insertions(+), 56 deletions(-)

diff --git a/src/cutecoin/core/account.py b/src/cutecoin/core/account.py
index 9e891be8..737db4da 100644
--- a/src/cutecoin/core/account.py
+++ b/src/cutecoin/core/account.py
@@ -20,6 +20,7 @@ from .wallet import Wallet
 from .community import Community
 from .registry import LocalState
 from ..tools.exceptions import ContactAlreadyExists
+from ..tools.decorators import asyncify
 from ..core.net.api import bma as qtbma
 from ..core.net.api.bma import PROTOCOL_VERSION
 
diff --git a/src/cutecoin/gui/certification.py b/src/cutecoin/gui/certification.py
index b90e9989..f8b8c083 100644
--- a/src/cutecoin/gui/certification.py
+++ b/src/cutecoin/gui/certification.py
@@ -35,6 +35,14 @@ class CertificationDialog(QDialog, Ui_CertificationDialog):
         for contact in certifier.contacts:
             self.combo_contact.addItem(contact['name'])
 
+    @staticmethod
+    def certify_identity(app, account, password_asker, community, identity):
+        dialog = CertificationDialog(app, account, password_asker)
+        dialog.combo_community.setCurrentText(community.name)
+        dialog.edit_pubkey.setText(identity.pubkey)
+        dialog.radio_pubkey.setChecked(True)
+        return dialog.exec_()
+
     def accept(self):
         if self.radio_contact.isChecked():
             index = self.combo_contact.currentIndex()
diff --git a/src/cutecoin/gui/community_view.py b/src/cutecoin/gui/community_view.py
index d6c78ef7..da449122 100644
--- a/src/cutecoin/gui/community_view.py
+++ b/src/cutecoin/gui/community_view.py
@@ -18,7 +18,7 @@ from .network_tab import NetworkTabWidget
 from .password_asker import PasswordAskerDialog
 from . import toast
 import asyncio
-from ..tools.exceptions import MembershipNotFoundError, LookupFailureError
+from ..tools.exceptions import MembershipNotFoundError, LookupFailureError, NoPeerAvailable
 from ..tools.decorators import asyncify
 from ..gen_resources.community_view_uic import Ui_CommunityWidget
 
@@ -35,6 +35,7 @@ class CommunityWidget(QWidget, Ui_CommunityWidget):
         """
         super().__init__()
         self.app = app
+        self.account = None
         self.community = None
         self.password_asker = None
         self.status_label = status_label
@@ -55,6 +56,8 @@ class CommunityWidget(QWidget, Ui_CommunityWidget):
         self.tab_history = TransactionsTabWidget(self.app)
 
         self.tab_network = NetworkTabWidget(self.app)
+        self.tab_identities.view_in_wot.connect(self.tab_wot.draw_graph)
+        self.tab_identities.view_in_wot.connect(lambda: self.tabs.setCurrentWidget(self.tab_wot))
 
         self.tabs.addTab(self.tab_history,
                                  QIcon(':/icons/tx_icon'),
@@ -72,8 +75,21 @@ class CommunityWidget(QWidget, Ui_CommunityWidget):
                                  QIcon(":/icons/network_icon"),
                                  self.tr("Network"))
 
+        self.button_membership.clicked.connect(self.send_membership_demand)
+
     def change_account(self, account, password_asker):
+        if self.account:
+            self.account.broadcast_error.disconnect(self.handle_broadcast_error)
+            self.account.membership_broadcasted.disconnect(self.handle_membership_broadcasted)
+            self.account.selfcert_broadcasted.disconnect(self.handle_selfcert_broadcasted)
+
         self.account = account
+
+        if self.account:
+            self.account.broadcast_error.connect(self.handle_broadcast_error)
+            self.account.membership_broadcasted.connect(self.handle_membership_broadcasted)
+            self.account.selfcert_broadcasted.connect(self.handle_selfcert_broadcasted)
+
         self.password_asker = password_asker
         self.tab_wot.change_account(account, self.password_asker)
         self.tab_identities.change_account(account, self.password_asker)
@@ -301,6 +317,12 @@ Revoking your UID can only success if it is not already validated by the network
         else:
             QMessageBox.information(self.tr("Self Certification"), self.tr("Success sending Self Certification document"))
 
+    def handle_broadcast_error(self, error, strdata):
+        if self.app.preferences['notifications']:
+            toast.display(error, strdata)
+        else:
+            QMessageBox.error(error, strdata)
+
     def changeEvent(self, event):
         """
         Intercepte LanguageChange event to translate UI
diff --git a/src/cutecoin/gui/contact.py b/src/cutecoin/gui/contact.py
index 8e26de97..bc6f550e 100644
--- a/src/cutecoin/gui/contact.py
+++ b/src/cutecoin/gui/contact.py
@@ -27,13 +27,7 @@ class ConfigureContactDialog(QDialog, Ui_ConfigureContactDialog):
         self.account = account
         self.main_window = parent
         self.index_edit = index_edit
-        if type(contact) is Person:
-            self.contact = {'name': contact.uid,
-                            'pubkey': contact.pubkey}
-        elif type(contact) is dict:
-            self.contact = contact
-        else:
-            self.contact = None
+        self.contact = contact
 
         if index_edit is not None:
             self.contact = account.contacts[index_edit]
diff --git a/src/cutecoin/gui/identities_tab.py b/src/cutecoin/gui/identities_tab.py
index 12bdffe2..58923594 100644
--- a/src/cutecoin/gui/identities_tab.py
+++ b/src/cutecoin/gui/identities_tab.py
@@ -5,7 +5,7 @@ Created on 2 févr. 2014
 """
 
 import logging
-from PyQt5.QtCore import Qt, pyqtSlot, QEvent
+from PyQt5.QtCore import Qt, pyqtSignal, QEvent
 from PyQt5.QtGui import QIcon, QCursor
 from PyQt5.QtWidgets import QWidget, QMessageBox, QAction, QMenu, QDialog, \
                             QAbstractItemView
@@ -17,6 +17,7 @@ from .transfer import TransferMoneyDialog
 from .certification import CertificationDialog
 import asyncio
 from ..core.net.api import bma as qtbma
+from ..core.registry import Identity
 from ..tools.decorators import asyncify
 
 
@@ -25,6 +26,7 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab):
     """
     classdocs
     """
+    view_in_wot = pyqtSignal(Identity)
 
     def __init__(self, app):
         """
@@ -137,33 +139,24 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab):
         if result == QDialog.Accepted:
             self.window().refresh_contacts()
 
-    def send_money_to_identity(self, person):
-        if isinstance(person, str):
-            pubkey = person
+    def send_money_to_identity(self, identity):
+        if isinstance(identity, str):
+            pubkey = identity
         else:
-            pubkey = person.pubkey
-        dialog = TransferMoneyDialog(self.app, self.account, self.password_asker)
-        dialog.edit_pubkey.setText(pubkey)
-        dialog.combo_community.setCurrentText(self.community.name)
-        dialog.radio_pubkey.setChecked(True)
-        if dialog.exec_() == QDialog.Accepted:
+            pubkey = identity.pubkey
+        result = TransferMoneyDialog.send_money_to_identity(self.app, self.account, self.password_asker,
+                                                            self.community, identity)
+        if result == QDialog.Accepted:
             currency_tab = self.window().currencies_tabwidget.currentWidget()
             currency_tab.tab_history.table_history.model().sourceModel().refresh_transfers()
 
     def certify_identity(self, identity):
-        dialog = CertificationDialog(self.app, self.account, self.password_asker)
-        dialog.combo_community.setCurrentText(self.community.name)
-        dialog.edit_pubkey.setText(identity.pubkey)
-        dialog.radio_pubkey.setChecked(True)
-        dialog.exec_()
+        CertificationDialog.certify_identity(self.app, self.account, self.password_asker,
+                                             self.community, identity)
 
     def view_wot(self):
-        person = self.sender().data()
-        # redraw WoT with this identity selected
-        self.wot_tab.draw_graph({'text': person.uid, 'id': person.pubkey})
-        # change page to WoT
-        index_wot_tab = self.tabs_information.indexOf(self.wot_tab)
-        self.tabs_information.setCurrentIndex(index_wot_tab)
+        identity = self.sender().data()
+        self.view_in_wot.emit(identity)
 
     def search_text(self):
         """
diff --git a/src/cutecoin/gui/member.py b/src/cutecoin/gui/member.py
index 3f3139ab..5dca0046 100644
--- a/src/cutecoin/gui/member.py
+++ b/src/cutecoin/gui/member.py
@@ -1,8 +1,10 @@
 import datetime
+import asyncio
 
 from PyQt5.QtWidgets import QDialog
 
 from ..core.graph import Graph
+from ..tools.decorators import asyncify
 from ..gen_resources.member_uic import Ui_DialogMember
 from ..tools.exceptions import MembershipNotFoundError
 
@@ -29,9 +31,14 @@ class MemberDialog(QDialog, Ui_DialogMember):
         self.account = account
         self.identity = identity
         self.label_uid.setText(identity.uid)
+        self.refresh()
+
+    @asyncify
+    @asyncio.coroutine
+    def refresh(self):
 
         try:
-            join_date = self.identity.get_join_date(self.community)
+            join_date = yield from self.identity.get_join_date(self.community)
         except MembershipNotFoundError:
             join_date = None
 
@@ -44,9 +51,10 @@ class MemberDialog(QDialog, Ui_DialogMember):
         graph = Graph(self.app, self.community)
         path = None
         # if selected member is not the account member...
-        if identity.pubkey != self.account.pubkey:
+        if self.identity.pubkey != self.account.pubkey:
             # add path from selected member to account member
-            path = graph.get_shortest_path_between_members(identity, self.account.identity(self.community))
+            path = yield from graph.get_shortest_path_between_members(self.identity,
+                                                                      self.account.identity(self.community))
 
         text = self.tr("""
             <table cellpadding="5">
diff --git a/src/cutecoin/gui/transfer.py b/src/cutecoin/gui/transfer.py
index 7d2991da..1258314f 100644
--- a/src/cutecoin/gui/transfer.py
+++ b/src/cutecoin/gui/transfer.py
@@ -55,6 +55,14 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog):
             self.radio_contact.setEnabled(False)
             self.radio_pubkey.setChecked(True)
 
+    @staticmethod
+    def send_money_to_identity(app, account, password_asker, community, identity):
+        dialog = TransferMoneyDialog(app, account, password_asker)
+        dialog.edit_pubkey.setText(identity.pubkey)
+        dialog.combo_community.setCurrentText(community.name)
+        dialog.radio_pubkey.setChecked(True)
+        return dialog.exec()
+
     def accept(self):
         comment = self.edit_message.text()
 
@@ -107,20 +115,18 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog):
 
     @asyncify
     @asyncio.coroutine
-    def amount_changed(self):
+    def amount_changed(self, value):
         dividend = yield from self.community.dividend()
-        amount = self.spinbox_amount.value()
-        relative = amount / dividend
+        relative = value / dividend
         self.spinbox_relative.blockSignals(True)
         self.spinbox_relative.setValue(relative)
         self.spinbox_relative.blockSignals(False)
 
     @asyncify
     @asyncio.coroutine
-    def relative_amount_changed(self):
+    def relative_amount_changed(self, value):
         dividend = yield from self.community.dividend()
-        relative = self.spinbox_relative.value()
-        amount = relative * dividend
+        amount = value * dividend
         self.spinbox_amount.blockSignals(True)
         self.spinbox_amount.setValue(amount)
         self.spinbox_amount.blockSignals(False)
diff --git a/src/cutecoin/gui/wot_tab.py b/src/cutecoin/gui/wot_tab.py
index d5fb282a..300b24fb 100644
--- a/src/cutecoin/gui/wot_tab.py
+++ b/src/cutecoin/gui/wot_tab.py
@@ -2,13 +2,18 @@
 
 import logging
 import asyncio
-from cutecoin.core.graph import Graph
+from PyQt5.QtWidgets import QWidget, QComboBox, QDialog
+from PyQt5.QtCore import pyqtSlot, QEvent, QLocale, QDateTime
+
 from ..tools.exceptions import MembershipNotFoundError
 from ..tools.decorators import asyncify
-from PyQt5.QtWidgets import QWidget, QComboBox, QLineEdit
-from PyQt5.QtCore import pyqtSlot, QEvent, QLocale, QDateTime
-from cutecoin.core.net.api import bma
-from cutecoin.core.registry import BlockchainState
+from ..core.net.api import bma
+from ..core.graph import Graph
+from ..core.registry import BlockchainState
+from .member import MemberDialog
+from .certification import CertificationDialog
+from .transfer import TransferMoneyDialog
+from .contact import ConfigureContactDialog
 from ..gen_resources.wot_tab_uic import Ui_WotTabWidget
 from cutecoin.gui.views.wot import NODE_STATUS_HIGHLIGHTED, NODE_STATUS_SELECTED, NODE_STATUS_OUT, ARC_STATUS_STRONG, \
     ARC_STATUS_WEAK
@@ -269,7 +274,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
             metadata['id'],
             BlockchainState.VALIDATED
         )
-        self.parent.identity_informations(identity)
+        dialog = MemberDialog(self.app, self.account, self.community, identity)
+        dialog.exec_()
 
     def sign_node(self, metadata):
         identity = self.app.identities_registry.from_handled_data(
@@ -277,7 +283,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
             metadata['id'],
             BlockchainState.VALIDATED
         )
-        self.parent.certify_identity(identity)
+        CertificationDialog.certify_identity(self.app, self.account, self.password_asker,
+                                             self.community, identity)
 
     def send_money_to_node(self, metadata):
         identity = self.app.identities_registry.from_handled_data(
@@ -285,23 +292,22 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
             metadata['id'],
             BlockchainState.VALIDATED
         )
-        self.parent.send_money_to_identity(identity)
+        result = TransferMoneyDialog.send_money_to_identity(self.app, self.account, self.password_asker,
+                                                            self.community, identity)
+        if result == QDialog.Accepted:
+            currency_tab = self.window().currencies_tabwidget.currentWidget()
+            currency_tab.tab_history.table_history.model().sourceModel().refresh_transfers()
 
     def add_node_as_contact(self, metadata):
         # check if contact already exists...
         if metadata['id'] == self.account.pubkey \
                 or metadata['id'] in [contact['pubkey'] for contact in self.account.contacts]:
             return False
-        self.parent.add_identity_as_contact({'name': metadata['text'],
-                                             'pubkey': metadata['id']})
-
-    def get_block_mediantime(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
+        dialog = ConfigureContactDialog(self.account, self.window(), {'name': metadata['text'],
+                                                                      'pubkey': metadata['id']})
+        result = dialog.exec_()
+        if result == QDialog.Accepted:
+            self.window().refresh_contacts()
 
     def changeEvent(self, event):
         """
-- 
GitLab