diff --git a/res/ui/transactions_tab.ui b/res/ui/transactions_tab.ui index 7b5f520604ea8c1dd224328f13ddc15434b6a46a..b459a6950f465ba297e35a1279cb9bd18fac0e67 100644 --- a/res/ui/transactions_tab.ui +++ b/res/ui/transactions_tab.ui @@ -14,6 +14,32 @@ <string>Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Balance</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="QLabel" name="label_balance"> + <property name="font"> + <font> + <pointsize>22</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>label_balance</string> + </property> + <property name="alignment"> + <set>Qt::AlignHCenter|Qt::AlignTop</set> + </property> + </widget> + </item> + </layout> + </widget> + </item> <item> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> @@ -75,37 +101,6 @@ </attribute> </widget> </item> - <item> - <layout class="QHBoxLayout" name="layout_balance"> - <item> - <widget class="QLabel" name="label_payment"> - <property name="text"> - <string>Payment:</string> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_deposit"> - <property name="text"> - <string>Deposit:</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_balance"> - <property name="text"> - <string>Balance:</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - </layout> - </item> </layout> </item> </layout> diff --git a/src/cutecoin/core/registry/identity.py b/src/cutecoin/core/registry/identity.py index d5930684cad896617404aa661be3abaabbf50eea..aa77a6cb782be986e1161a2e6c85076ebe1fd386 100644 --- a/src/cutecoin/core/registry/identity.py +++ b/src/cutecoin/core/registry/identity.py @@ -10,10 +10,10 @@ import asyncio from enum import Enum from ucoinpy.documents.certification import SelfCertification -from cutecoin.tools.exceptions import Error, NoPeerAvailable,\ +from ...tools.exceptions import Error, NoPeerAvailable,\ MembershipNotFoundError -from cutecoin.core.net.api import bma as qtbma -from cutecoin.core.net.api.bma import PROTOCOL_VERSION +from ..net.api import bma as qtbma +from ..net.api.bma import PROTOCOL_VERSION from PyQt5.QtCore import QObject, pyqtSignal @@ -117,6 +117,7 @@ class Identity(QObject): signature) return None + @asyncio.coroutine def get_join_date(self, community): """ Get the person join date. @@ -125,11 +126,11 @@ class Identity(QObject): :param cutecoin.core.community.Community community: The community target to request the join date :return: A datetime object """ - search = community.bma_access.get(self, qtbma.blockchain.Membership, {'search': self.pubkey}) + search = yield from community.bma_access.future_request(qtbma.blockchain.Membership, {'search': self.pubkey}) if search != qtbma.blockchain.Membership.null_value: if len(search['memberships']) > 0: membership_data = search['memberships'][0] - block = community.bma_access.get(self, qtbma.blockchain.Block, + block = yield from community.bma_access.future_request(qtbma.blockchain.Block, req_args={'number': membership_data['blockNumber']}) if block != qtbma.blockchain.Block.null_value: return block['medianTime'] @@ -137,14 +138,16 @@ class Identity(QObject): else: raise MembershipNotFoundError(self.pubkey, community.name) + @asyncio.coroutine def get_expiration_date(self, community): try: - join_block_number = self.membership(community)['blockNumber'] + membership = yield from self.membership(community) + join_block_number = membership['blockNumber'] try: - join_block = community.bma_access.get(self, qtbma.blockchain.Block, + join_block = yield from community.bma_access.future_request(qtbma.blockchain.Block, req_args={'number': join_block_number}) - parameters = community.bma_access.get(self, qtbma.blockchain.Parameters) + parameters = yield from community.bma_access.future_request(qtbma.blockchain.Parameters) if join_block != qtbma.blockchain.Block.null_value \ and parameters != qtbma.blockchain.Parameters.null_value: join_date = join_block['medianTime'] @@ -159,6 +162,7 @@ class Identity(QObject): #TODO: Manage 'OUT' memberships ? Maybe ? + @asyncio.coroutine def membership(self, community): """ Get the person last membership document. @@ -166,7 +170,7 @@ class Identity(QObject): :param cutecoin.core.community.Community community: The community target to request the join date :return: The membership data in BMA json format """ - search = community.bma_access.get(self, qtbma.blockchain.Membership, + search = yield from community.bma_access.future_request(qtbma.blockchain.Membership, {'search': self.pubkey}) if search != qtbma.blockchain.Membership.null_value: block_number = -1 @@ -182,8 +186,9 @@ class Identity(QObject): else: raise MembershipNotFoundError(self.pubkey, community.name) + @asyncio.coroutine def published_uid(self, community): - data = community.bma_access.get(self, qtbma.wot.Lookup, + data = yield from community.bma_access.future_request(qtbma.wot.Lookup, req_args={'search': self.pubkey}) if data != qtbma.wot.Lookup.null_value: timestamp = 0 @@ -200,6 +205,7 @@ class Identity(QObject): return True return False + @asyncio.coroutine def is_member(self, community): """ Check if the person is a member of a community @@ -207,11 +213,12 @@ class Identity(QObject): :param cutecoin.core.community.Community community: The community target to request the join date :return: True if the person is a member of a community """ - certifiers = community.bma_access.get(self, qtbma.wot.CertifiersOf, {'search': self.pubkey}) + certifiers = yield from community.bma_access.future_request(qtbma.wot.CertifiersOf, {'search': self.pubkey}) if certifiers != qtbma.wot.CertifiersOf.null_value: return certifiers['isMember'] return False + @asyncio.coroutine def certifiers_of(self, identities_registry, community): """ Get the list of this person certifiers @@ -220,7 +227,7 @@ class Identity(QObject): :param cutecoin.core.community.Community community: The community target to request the join date :return: The list of the certifiers of this community """ - data = community.bma_access.get(self, qtbma.wot.CertifiersOf, {'search': self.pubkey}) + data = yield from community.bma_access.future_request(qtbma.wot.CertifiersOf, {'search': self.pubkey}) certifiers = list() @@ -257,8 +264,9 @@ class Identity(QObject): certifiers.append(certifier) return certifiers + @asyncio.coroutine def unique_valid_certifiers_of(self, identities_registry, community): - certifier_list = self.certifiers_of(identities_registry, community) + certifier_list = yield from self.certifiers_of(identities_registry, community) unique_valid = [] #  add certifiers of uid for certifier in tuple(certifier_list): @@ -276,6 +284,7 @@ class Identity(QObject): unique_valid.append(certifier) return unique_valid + @asyncio.coroutine def certified_by(self, identities_registry, community): """ Get the list of persons certified by this person @@ -283,7 +292,7 @@ class Identity(QObject): :param cutecoin.core.community.Community community: The community target to request the join date :return: The list of the certified persons of this community in BMA json format """ - data = community.bma_access.get(self, qtbma.wot.CertifiedBy, {'search': self.pubkey}) + data = yield from community.bma_access.future_request(qtbma.wot.CertifiedBy, {'search': self.pubkey}) certified_list = list() if data == qtbma.wot.CertifiedBy.null_value: logging.debug('bma.wot.CertifiersOf request error') @@ -312,8 +321,9 @@ class Identity(QObject): certified_list.append(certified) return certified_list + @asyncio.coroutine def unique_valid_certified_by(self, identities_registry, community): - certified_list = self.certified_by(identities_registry, community) + certified_list = yield from self.certified_by(identities_registry, community) unique_valid = [] #  add certifiers of uid for certified in tuple(certified_list): @@ -331,8 +341,10 @@ class Identity(QObject): unique_valid.append(certified) return unique_valid + @asyncio.coroutine def membership_expiration_time(self, community): - join_block = self.membership(community)['blockNumber'] + membership = yield from self.membership(community) + join_block = membership['blockNumber'] join_date = community.get_block(join_block)['medianTime'] parameters = community.parameters expiration_date = join_date + parameters['sigValidity'] diff --git a/src/cutecoin/gui/community_view.py b/src/cutecoin/gui/community_view.py index 9a747d6ecff91a2959767a30e9ded87b4c24cb7e..186cb2a35e52c1da4015f0c7fcfe838363c6ac56 100644 --- a/src/cutecoin/gui/community_view.py +++ b/src/cutecoin/gui/community_view.py @@ -19,6 +19,7 @@ from .password_asker import PasswordAskerDialog from . import toast import asyncio from ..tools.exceptions import MembershipNotFoundError, LookupFailureError +from ..tools.decorators import asyncify from ..gen_resources.community_view_uic import Ui_CommunityWidget @@ -101,7 +102,8 @@ class CommunityWidget(QWidget, Ui_CommunityWidget): error, QMessageBox.Ok) - @pyqtSlot(int) + @asyncify + @asyncio.coroutine def refresh_block(self, block_number): """ When a new block is found, start handling data. @@ -110,8 +112,8 @@ class CommunityWidget(QWidget, Ui_CommunityWidget): logging.debug("Refresh block") self.status_info.clear() try: - person = self.app.identities_registry.find(self.app.current_account.pubkey, self.community) - expiration_time = person.membership_expiration_time(self.community) + person = yield from self.app.identities_registry.future_find(self.app.current_account.pubkey, self.community) + expiration_time = yield from person.membership_expiration_time(self.community) sig_validity = self.community.parameters['sigValidity'] warning_expiration_time = int(sig_validity / 3) will_expire_soon = (expiration_time < warning_expiration_time) @@ -126,7 +128,8 @@ class CommunityWidget(QWidget, Ui_CommunityWidget): toast.display(self.tr("Membership expiration"), self.tr("<b>Warning : Membership expiration in {0} days</b>").format(days)) - certifiers_of = person.unique_valid_certifiers_of(self.app.identities_registry, self.community) + certifiers_of = yield from person.unique_valid_certifiers_of(self.app.identities_registry, + self.community) if len(certifiers_of) < self.community.parameters['sigQty']: self.status_info.append('warning_certifications') if self.app.preferences['notifications']: @@ -184,12 +187,16 @@ class CommunityWidget(QWidget, Ui_CommunityWidget): self.status_label.setText(label_text) + @asyncify + @asyncio.coroutine def refresh_quality_buttons(self): if self.account and self.community: try: - if self.account.identity(self.community).published_uid(self.community): + published_uid = yield from self.account.identity(self.community).published_uid(self.community) + if published_uid: logging.debug("UID Published") - if self.account.identity(self.community).is_member(self.community): + is_member = yield from self.account.identity(self.community).is_member(self.community) + if is_member: self.button_membership.setText(self.tr("Renew membership")) self.button_membership.show() self.button_certification.show() diff --git a/src/cutecoin/gui/identities_tab.py b/src/cutecoin/gui/identities_tab.py index f9427bbef36e2c379e665c2467066282a7b09e95..12bdffe224b57416f35f234700333be947a30529 100644 --- a/src/cutecoin/gui/identities_tab.py +++ b/src/cutecoin/gui/identities_tab.py @@ -9,16 +9,15 @@ from PyQt5.QtCore import Qt, pyqtSlot, QEvent from PyQt5.QtGui import QIcon, QCursor from PyQt5.QtWidgets import QWidget, QMessageBox, QAction, QMenu, QDialog, \ QAbstractItemView -from cutecoin.models.identities import IdentitiesFilterProxyModel, IdentitiesTableModel +from ..models.identities import IdentitiesFilterProxyModel, IdentitiesTableModel from ..gen_resources.identities_tab_uic import Ui_IdentitiesTab -from cutecoin.gui.contact import ConfigureContactDialog -from cutecoin.gui.member import MemberDialog -from .wot_tab import WotTabWidget +from .contact import ConfigureContactDialog +from .member import MemberDialog from .transfer import TransferMoneyDialog from .certification import CertificationDialog -from . import toast import asyncio from ..core.net.api import bma as qtbma +from ..tools.decorators import asyncify class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab): @@ -53,10 +52,10 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab): self.table_identities.resizeColumnsToContents() members_action = QAction(self.tr("Members"), self) - members_action.triggered.connect(self.search_members) + members_action.triggered.connect(self._async_search_members) self.button_search.addAction(members_action) direct_connections = QAction(self.tr("Direct connections"), self) - direct_connections.triggered.connect(self.search_direct_connections) + direct_connections.triggered.connect(self._async_search_direct_connections) self.button_search.addAction(direct_connections) self.button_search.clicked.connect(self.search_text) @@ -67,18 +66,9 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab): self.community = None def change_community(self, community): - if self.community: - try: - self.account.identity(self.community).inner_data_changed.disconnect(self.handle_account_identity_change) - except TypeError as e: - if "disconnect" in str(e): - logging.debug("Disconnect failed between inner_data_changed ans handle_account_identity_changed") - pass - if community: - self.account.identity(community).inner_data_changed.connect(self.handle_account_identity_change) - self.community = community self.table_identities.model().change_community(community) + self._async_search_direct_connections() def identity_context_menu(self, point): index = self.table_identities.indexAt(point) @@ -175,27 +165,6 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab): index_wot_tab = self.tabs_information.indexOf(self.wot_tab) self.tabs_information.setCurrentIndex(index_wot_tab) - @asyncio.coroutine - def _execute_search_text(self, text): - response = yield from self.community.bma_access.future_request(qtbma.wot.Lookup, {'search': text}) - identities = [] - for identity_data in response['results']: - identity = yield from self.app.identities_registry.future_find(identity_data['pubkey'], self.community) - identities.append(identity) - - self_identity = self.account.identity(self.community) - try: - self_identity.inner_data_changed.disconnect(self.handle_account_identity_change) - self.community.inner_data_changed.disconnect(self.handle_community_change) - except TypeError as e: - if "disconnect() failed" in str(e): - pass - else: - raise - - self.edit_textsearch.clear() - self.refresh_identities(identities) - def search_text(self): """ Search text and display found identities @@ -205,67 +174,54 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab): if len(text) < 2: return False else: - asyncio.async(self._execute_search_text(text)) + asyncio.async(self._async_execute_search_text(text)) - @pyqtSlot(str) - def handle_community_change(self, origin): - logging.debug("Handle account community {0}".format(origin)) - if origin == qtbma.wot.Members: - self.search_members() + @asyncio.coroutine + def _async_execute_search_text(self, text): + response = yield from self.community.bma_access.future_request(qtbma.wot.Lookup, {'search': text}) + identities = [] + for identity_data in response['results']: + identity = yield from self.app.identities_registry.future_find(identity_data['pubkey'], self.community) + identities.append(identity) - @pyqtSlot(str) - def handle_account_identity_change(self, origin): - logging.debug("Handle account identity change {0}".format(origin)) - if origin in (str(qtbma.wot.CertifiedBy), str(qtbma.wot.CertifiersOf)): - self.search_direct_connections() + self.edit_textsearch.clear() + self.refresh_identities(identities) - def search_members(self): + @asyncify + @asyncio.coroutine + def _async_search_members(self): """ Search members of community and display found members """ - pubkeys = self.community.members_pubkeys() - identities = [] - for p in pubkeys: - identities.append(self.app.identities_registry.find(p, self.community)) - - self_identity = self.account.identity(self.community) + if self.community: + pubkeys = self.community.members_pubkeys() + identities = [] + for p in pubkeys: + identities.append(self.app.identities_registry.find(p, self.community)) - try: - self_identity.inner_data_changed.disconnect(self.handle_account_identity_change) - self.community.inner_data_changed.connect(self.handle_community_change) - except TypeError as e: - if "disconnect() failed" in str(e): - pass - else: - raise + self.edit_textsearch.clear() + self.refresh_identities(identities) - self.edit_textsearch.clear() - self.refresh_identities(identities) - - def search_direct_connections(self): + @asyncify + @asyncio.coroutine + def _async_search_direct_connections(self): """ Search members of community and display found members """ - self_identity = self.account.identity(self.community) - try: - self.community.inner_data_changed.disconnect(self.handle_community_change) - self_identity.inner_data_changed.connect(self.handle_account_identity_change) - except TypeError as e: - if "disconnect() failed" in str(e): - logging.debug("Could not disconnect community") - else: - raise - - account_connections = [] - for p in self_identity.unique_valid_certifiers_of(self.app.identities_registry, self.community): - account_connections.append(p['identity']) - certifiers_of = [p for p in account_connections] - for p in self_identity.unique_valid_certified_by(self.app.identities_registry, self.community): - account_connections.append(p['identity']) - certified_by = [p for p in account_connections - if p.pubkey not in [i.pubkey for i in certifiers_of]] - identities = certifiers_of + certified_by - self.refresh_identities(identities) + if self.account and self.community: + self_identity = self.account.identity(self.community) + account_connections = [] + certs_of = yield from self_identity.unique_valid_certifiers_of(self.app.identities_registry, self.community) + for p in certs_of: + account_connections.append(p['identity']) + certifiers_of = [p for p in account_connections] + certs_by = yield from self_identity.unique_valid_certified_by(self.app.identities_registry, self.community) + for p in certs_by: + account_connections.append(p['identity']) + certified_by = [p for p in account_connections + if p.pubkey not in [i.pubkey for i in certifiers_of]] + identities = certifiers_of + certified_by + self.refresh_identities(identities) def refresh_identities(self, identities): """ diff --git a/src/cutecoin/gui/wot_tab.py b/src/cutecoin/gui/wot_tab.py index 173daa0d72132ce0ea6ea1d85582a049b693e247..f8a022d4ec86b0b9b838d26e963e800cc9f78f50 100644 --- a/src/cutecoin/gui/wot_tab.py +++ b/src/cutecoin/gui/wot_tab.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- import logging +import asyncio from cutecoin.core.graph import Graph 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 @@ -60,6 +62,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): self.community = community self.reset() + @asyncify + @asyncio.coroutine def refresh_informations_frame(self): parameters = self.community.parameters try: @@ -72,8 +76,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): last_renewal = None expiration = None - certified = identity.unique_valid_certified_by(self.app.identities_registry, self.community) - certifiers = identity.unique_valid_certifiers_of(self.app.identities_registry, self.community) + certified = yield from identity.unique_valid_certified_by(self.app.identities_registry, self.community) + certifiers = yield from identity.unique_valid_certifiers_of(self.app.identities_registry, self.community) if last_renewal and expiration: date_renewal = QLocale.toString( QLocale(), @@ -148,6 +152,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): ) ) + @asyncify + @asyncio.coroutine def draw_graph(self, identity): """ Draw community graph centered on the identity @@ -159,22 +165,15 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): if self.community: identity_account = self.account.identity(self.community) - # Disconnect old identity - try: - if self._current_identity and self._current_identity != identity: - self._current_identity.inner_data_changed.disconnect(self.handle_identity_change) - except TypeError as e: - if "disconnect()" in str(e): - logging.debug("Disconnect of old identity failed.") - #Connect new identity if self._current_identity != identity: self._current_identity = identity - identity.inner_data_changed.connect(self.handle_identity_change) # create Identity from node metadata - certifier_list = identity.unique_valid_certifiers_of(self.app.identities_registry, self.community) - certified_list = identity.unique_valid_certified_by(self.app.identities_registry, self.community) + certifier_list = yield from identity.unique_valid_certifiers_of(self.app.identities_registry, + self.community) + certified_list = yield from identity.unique_valid_certified_by(self.app.identities_registry, + self.community) # create empty graph instance graph = Graph(self.app, self.community) @@ -221,10 +220,6 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): else: self.reset() - @pyqtSlot(str) - def handle_identity_change(self, request): - self.refresh() - def search(self): """ Search nodes when return is pressed in combobox lineEdit diff --git a/src/cutecoin/models/identities.py b/src/cutecoin/models/identities.py index 33f3032e5f657d2a417a7890952508abe0524ffc..52af9851a01f45ea599c9194fa902df19203dea2 100644 --- a/src/cutecoin/models/identities.py +++ b/src/cutecoin/models/identities.py @@ -6,10 +6,12 @@ Created on 5 févr. 2014 from ..core.net.api import bma as qtbma from ..tools.exceptions import NoPeerAvailable, MembershipNotFoundError +from ..tools.decorators import asyncify from PyQt5.QtCore import QAbstractTableModel, QSortFilterProxyModel, Qt, \ QDateTime, QModelIndex, QLocale from PyQt5.QtGui import QColor import logging +import asyncio class IdentitiesFilterProxyModel(QSortFilterProxyModel): @@ -91,7 +93,6 @@ class IdentitiesTableModel(QAbstractTableModel): self.columns_ids = ('uid', 'pubkey', 'renewed', 'expiration') self.identities_data = [] self._identities = [] - self._refresh_slots = [] def change_community(self, community): self.community = community @@ -103,16 +104,19 @@ class IdentitiesTableModel(QAbstractTableModel): """ return [i[1] for i in self.identities_data] + @asyncio.coroutine def identity_data(self, identity): try: - join_date = identity.get_join_date(self.community) - expiration_date = identity.get_expiration_date(self.community) + join_date = yield from identity.get_join_date(self.community) + expiration_date = yield from identity.get_expiration_date(self.community) except MembershipNotFoundError: join_date = None expiration_date = None return (identity.uid, identity.pubkey, join_date, expiration_date) + @asyncify + @asyncio.coroutine def refresh_identities(self, identities): """ Change the identities to display @@ -120,49 +124,15 @@ class IdentitiesTableModel(QAbstractTableModel): :param cutecoin.core.registry.IdentitiesRegistry identities: The new identities to display """ logging.debug("Refresh {0} identities".format(len(identities))) - - # We disconnect identities from their local slots - for (index, identity) in enumerate(self._identities): - identity.inner_data_changed.disconnect(self._refresh_slots[index]) - self.identities_data = [] self._identities = [] - self._refresh_slots = [] self.beginResetModel() for identity in identities: - logging.debug(identity) - - # Connection - refresh_slot = lambda req, identity=identity: self.refresh_identity(req, identity) - identity.inner_data_changed.connect(refresh_slot) - self._identities.append(identity) - self._refresh_slots.append(refresh_slot) - self.identities_data.append(self.identity_data(identity)) + data = yield from self.identity_data(identity) + self.identities_data.append(data) self.endResetModel() - def refresh_identity(self, request, identity): - """ - Refresh an identity when its inner_data changed - :param cutecoin.core.registry.Identity identity: The refreshed identity - """ - logging.debug("Refresh {0} because of {1}".format(identity, request)) - try: - index = self._identities.index(identity) - self.identities_data[index] = self.identity_data(identity) - if request == str(qtbma.wot.Lookup): - model_index_0 = self.createIndex(index, self.columns_ids.index('uid')) - model_index_max = self.createIndex(index, self.columns_ids.index('pubkey')) - self.dataChanged.emit(model_index_0, model_index_max) - elif request in (str(qtbma.blockchain.Membership), - str(qtbma.blockchain.Block), - str(qtbma.blockchain.Parameters)): - model_index_0 = self.createIndex(index, self.columns_ids.index('renewed')) - model_index_max = self.createIndex(index, self.columns_ids.index('expiration')) - self.dataChanged.emit(model_index_0, model_index_max) - except ValueError: - logging.debug("Identity {0} is not in list : {1}".format(identity, self.identities_data)) - def rowCount(self, parent): return len(self.identities_data) diff --git a/src/cutecoin/tests/gui/identities_tab/test_identities_table.py b/src/cutecoin/tests/gui/identities_tab/test_identities_table.py index af35cb0c522661bb798e5d36563576cdbd0396b9..a5f582842e130c7a6817001c0ab68742eb9166a1 100644 --- a/src/cutecoin/tests/gui/identities_tab/test_identities_table.py +++ b/src/cutecoin/tests/gui/identities_tab/test_identities_table.py @@ -6,7 +6,7 @@ import logging import time from ucoinpy.documents.peer import BMAEndpoint as PyBMAEndpoint from PyQt5.QtWidgets import QDialog -from PyQt5.QtCore import QLocale, Qt +from PyQt5.QtCore import QLocale, Qt, QPoint from PyQt5.QtTest import QTest from cutecoin.core.net.api import bma as qtbma from cutecoin.tests.mocks.bma import nice_blockchain @@ -75,10 +75,6 @@ class TestIdentitiesTable(unittest.TestCase): identities_tab.show() return future - @asyncio.coroutine - def async_open_widget(): - yield from open_widget() - def close_dialog(): if identities_tab.isVisible(): identities_tab.close() @@ -86,10 +82,12 @@ class TestIdentitiesTable(unittest.TestCase): @asyncio.coroutine def exec_test(): - yield from asyncio.sleep(1) - self.assertEqual(mock.get_request(0).method, 'GET') - self.assertEqual(mock.get_request(0).url, - '/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ') + yield from asyncio.sleep(2) + urls = [mock.get_request(i).url for i in range(0, 3)] + self.assertTrue('/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ' in urls, + msg="Not found in {0}".format(urls)) + self.assertTrue('/wot/certified-by/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ' in urls, + msg="Not found in {0}".format(urls)) # requests 1 to 3 are for getting certifiers-of and certified-by # on john, + a lookup @@ -97,15 +95,19 @@ class TestIdentitiesTable(unittest.TestCase): QTest.keyClicks(identities_tab.edit_textsearch, "doe") QTest.mouseClick(identities_tab.button_search, Qt.LeftButton) yield from asyncio.sleep(2) + self.assertEqual(mock.get_request(3).method, 'GET') + self.assertEqual(mock.get_request(3).url, + '/wot/lookup/doe') self.assertEqual(mock.get_request(4).method, 'GET') self.assertEqual(mock.get_request(4).url, - '/wot/lookup/doe') + '/wot/certifiers-of/FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn') self.assertEqual(identities_tab.table_identities.model().rowCount(), 1) + yield from asyncio.sleep(2) self.lp.call_soon(close_dialog) asyncio.async(exec_test()) self.lp.call_later(15, close_dialog) - self.lp.run_until_complete(async_open_widget()) + self.lp.run_until_complete(open_widget()) mock.delete_mock() if __name__ == '__main__': diff --git a/src/cutecoin/tools/decorators.py b/src/cutecoin/tools/decorators.py new file mode 100644 index 0000000000000000000000000000000000000000..1324e59f78cd01b90e6c2a5255ebc9a545096a8b --- /dev/null +++ b/src/cutecoin/tools/decorators.py @@ -0,0 +1,10 @@ +import asyncio +import functools + + +def asyncify(fn): + @functools.wraps(fn) + def wrapper(*args, **kwargs): + asyncio.async(asyncio.coroutine(fn)(*args, **kwargs)) + + return wrapper