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