diff --git a/src/cutecoin/core/registry/identities.py b/src/cutecoin/core/registry/identities.py index 5a97deb7c5dcdf848ce4046ec8ef4eec662f8cbc..17c4042696df6a7a0da481f8f4f0869d31116465 100644 --- a/src/cutecoin/core/registry/identities.py +++ b/src/cutecoin/core/registry/identities.py @@ -30,23 +30,40 @@ class IdentitiesRegistry: :param dict json_data: The identities in json format """ instances = {} - - for person_data in json_data['registry']: - pubkey = person_data['pubkey'] - if pubkey not in instances: - person = Identity.from_json(person_data) - instances[person.pubkey] = person + for currency in json_data['registry']: + for person_data in currency: + pubkey = person_data['pubkey'] + if pubkey not in instances: + person = Identity.from_json(person_data) + instances[person.pubkey] = person self._instances = instances def jsonify(self): - identities_json = [] - for identity in self._instances.values(): - identities_json.append(identity.jsonify()) - return {'registry': identities_json} + communities_json = [] + for community in self._instances: + identities_json = [] + for identity in self._instances[community].values(): + identities_json.append(identity.jsonify()) + communities_json[community] = identities_json + return {'registry': communities_json} + + def _identities(self, community): + """ + If the registry do not have data for this community + Create a new dict and return it + :param cutecoin.core.Community community: the community + :return: The identities of the community + :rtype: dict + """ + try: + return self._instances[community.currency] + except KeyError: + self._instances[community.currency] = {} + return self._identities(community) @asyncio.coroutine def _find_by_lookup(self, pubkey, community): - identity = self._instances[pubkey] + identity = self._identities(community)[pubkey] lookup_tries = 0 while lookup_tries < 3: try: @@ -78,11 +95,11 @@ class IdentitiesRegistry: @asyncio.coroutine def future_find(self, pubkey, community): - if pubkey in self._instances: - identity = self._instances[pubkey] + if pubkey in self._identities(community): + identity = self._identities(community)[pubkey] else: identity = Identity.empty(pubkey) - self._instances[pubkey] = identity + self._identities(community)[pubkey] = identity tries = 0 while tries < 3 and identity.local_state == LocalState.NOT_FOUND: try: @@ -105,7 +122,7 @@ class IdentitiesRegistry: return identity return identity - def from_handled_data(self, uid, pubkey, blockchain_state): + def from_handled_data(self, uid, pubkey, blockchain_state, community): """ Get a person from a metadata dict. A metadata dict has a 'text' key corresponding to the person uid, @@ -115,11 +132,11 @@ class IdentitiesRegistry: :return: A new person if pubkey wasn't knwon, else the existing instance. """ if pubkey in self._instances: - if self._instances[pubkey].blockchain_state == BlockchainState.NOT_FOUND: - self._instances[pubkey].blockchain_state = blockchain_state - elif self._instances[pubkey].blockchain_state != BlockchainState.VALIDATED \ + if self._identities(community)[pubkey].blockchain_state == BlockchainState.NOT_FOUND: + self._identities(community)[pubkey].blockchain_state = blockchain_state + elif self._identities(community)[pubkey].blockchain_state != BlockchainState.VALIDATED \ and blockchain_state == BlockchainState.VALIDATED: - self._instances[pubkey].blockchain_state = blockchain_state + self._identities(community)[pubkey].blockchain_state = blockchain_state # TODO: Random bug in ucoin makes the uid change without reason in requests answers # https://github.com/ucoin-io/ucoin/issues/149 @@ -127,11 +144,11 @@ class IdentitiesRegistry: # self._instances[pubkey].uid = uid # self._instances[pubkey].inner_data_changed.emit("BlockchainState") - if self._instances[pubkey].local_state == LocalState.NOT_FOUND: - self._instances[pubkey].local_state = LocalState.COMPLETED + if self._identities(community)[pubkey].local_state == LocalState.NOT_FOUND: + self._identities(community)[pubkey].local_state = LocalState.COMPLETED - return self._instances[pubkey] + return self._identities(community)[pubkey] else: identity = Identity.from_handled_data(uid, pubkey, blockchain_state) - self._instances[pubkey] = identity + self._identities(community)[pubkey] = identity return identity diff --git a/src/cutecoin/core/registry/identity.py b/src/cutecoin/core/registry/identity.py index a646f1d7e1a53e16b004bf802eaae8d6b97c991c..fa83ca5c23f38f7502de24b5e4a0a754e27c2e2f 100644 --- a/src/cutecoin/core/registry/identity.py +++ b/src/cutecoin/core/registry/identity.py @@ -254,7 +254,8 @@ class Identity(QObject): certifier = {} certifier['identity'] = identities_registry.from_handled_data(certifier_data['uid'], certifier_data['pubkey'], - BlockchainState.VALIDATED) + BlockchainState.VALIDATED, + community) certifier['cert_time'] = certifier_data['cert_time']['medianTime'] certifier['block_number'] = certifier_data['cert_time']['block'] certifiers.append(certifier) @@ -272,7 +273,8 @@ class Identity(QObject): certifier = {} certifier['identity'] = identities_registry.from_handled_data(uid, certifier_data['pubkey'], - BlockchainState.BUFFERED) + BlockchainState.BUFFERED, + community) block = yield from community.bma_access.future_request(bma.blockchain.Block, {'number': certifier_data['meta']['block_number']}) certifier['cert_time'] = block['medianTime'] @@ -310,6 +312,8 @@ class Identity(QObject): def certified_by(self, identities_registry, community): """ Get the list of persons certified by this person + :param cutecoin.core.registry.IdentitiesRegistry identities_registry: The registry + :param cutecoin.core.Community community: The community :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 @@ -321,7 +325,8 @@ class Identity(QObject): certified = {} certified['identity'] = identities_registry.from_handled_data(certified_data['uid'], certified_data['pubkey'], - BlockchainState.VALIDATED) + BlockchainState.VALIDATED, + community) certified['cert_time'] = certified_data['cert_time']['medianTime'] certified['block_number'] = certified_data['cert_time']['block'] certified_list.append(certified) @@ -336,7 +341,8 @@ class Identity(QObject): certified = {} certified['identity'] = identities_registry.from_handled_data(certified_data['uid'], certified_data['pubkey'], - BlockchainState.BUFFERED) + BlockchainState.BUFFERED, + community) certified['cert_time'] = certified_data['meta']['timestamp'] certified['block_number'] = None certified_list.append(certified) diff --git a/src/cutecoin/gui/wot_tab.py b/src/cutecoin/gui/wot_tab.py index 83f5d8a0cb934a8f507a6f26689e8786035bf0f4..ae740ce3f820602ea3dd4205f5e2049380890639 100644 --- a/src/cutecoin/gui/wot_tab.py +++ b/src/cutecoin/gui/wot_tab.py @@ -167,7 +167,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): self.app.identities_registry.from_handled_data( metadata['text'], metadata['id'], - BlockchainState.VALIDATED + BlockchainState.VALIDATED, + self.community ) ) @@ -281,7 +282,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): self.app.identities_registry.from_handled_data( metadata['text'], metadata['id'], - BlockchainState.VALIDATED + BlockchainState.VALIDATED, + self.community ) ) @@ -289,7 +291,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): identity = self.app.identities_registry.from_handled_data( metadata['text'], metadata['id'], - BlockchainState.VALIDATED + BlockchainState.VALIDATED, + self.community ) dialog = MemberDialog(self.app, self.account, self.community, identity) dialog.exec_() @@ -298,7 +301,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): identity = self.app.identities_registry.from_handled_data( metadata['text'], metadata['id'], - BlockchainState.VALIDATED + BlockchainState.VALIDATED, + self.community ) CertificationDialog.certify_identity(self.app, self.account, self.password_asker, self.community, identity) @@ -307,7 +311,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): identity = self.app.identities_registry.from_handled_data( metadata['text'], metadata['id'], - BlockchainState.VALIDATED + BlockchainState.VALIDATED, + self.community ) result = TransferMoneyDialog.send_money_to_identity(self.app, self.account, self.password_asker, self.community, identity) diff --git a/src/cutecoin/tests/gui/certification/test_certification.py b/src/cutecoin/tests/gui/certification/test_certification.py index 301d9441b556aff39b86970672118463b9aeeda2..0e2de3a87e91dd0011d906617731564f20aaaf35 100644 --- a/src/cutecoin/tests/gui/certification/test_certification.py +++ b/src/cutecoin/tests/gui/certification/test_certification.py @@ -29,7 +29,7 @@ class TestCertificationDialog(unittest.TestCase): QLocale.setDefault(QLocale("en_GB")) self.lp = quamash.QEventLoop(self.qapplication) asyncio.set_event_loop(self.lp) - self.lp.set_exception_handler(lambda lp, ctx : unitttest_exception_handler(self, lp, ctx)) + #self.lp.set_exception_handler(lambda lp, ctx : unitttest_exception_handler(self, lp, ctx)) self.identities_registry = IdentitiesRegistry({}) self.application = Application(self.qapplication, self.lp, self.identities_registry) 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 6dd89e9db8fe136d1b5b6419ecbb4ef2edcf6be7..6f3e3b9b1da473a7f0d5c13b9b075f491c8ff48c 100644 --- a/src/cutecoin/tests/gui/identities_tab/test_identities_table.py +++ b/src/cutecoin/tests/gui/identities_tab/test_identities_table.py @@ -28,7 +28,6 @@ class TestIdentitiesTable(unittest.TestCase): QLocale.setDefault(QLocale("en_GB")) self.lp = quamash.QEventLoop(self.qapplication) asyncio.set_event_loop(self.lp) - self.lp.set_exception_handler(lambda lp, ctx : unitttest_exception_handler(self, lp, ctx)) self.identities_registry = IdentitiesRegistry() self.application = Application(self.qapplication, self.lp, self.identities_registry) diff --git a/src/cutecoin/tests/gui/process_cfg_community/test_add_community.py b/src/cutecoin/tests/gui/process_cfg_community/test_add_community.py index 1e7295915f29b2da89302fe98c9d77365d600fa8..ce4660746d1e9fdfbcf56b80b579267cdca9b786 100644 --- a/src/cutecoin/tests/gui/process_cfg_community/test_add_community.py +++ b/src/cutecoin/tests/gui/process_cfg_community/test_add_community.py @@ -233,7 +233,7 @@ Yours : wrong_pubkey, the network : 7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ self.assertEqual(mock.get_request(1).method, 'GET') self.assertEqual(mock.get_request(1).url, '/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ') - self.assertEqual(process_community.label_error.text(), """Your pubkey or UID is different on the network. + self.assertEqual(process_community.label_error.text(), """Your pubkey or UID is different on the network. Yours : wrong_uid, the network : john""") process_community.close()