diff --git a/src/cutecoin/core/net/api/bma/access.py b/src/cutecoin/core/net/api/bma/access.py index bf1c62decba79c5ad5e9e895c0a8641275cedf99..e832b20c04a2d8ac507869c431d93305db6036bc 100644 --- a/src/cutecoin/core/net/api/bma/access.py +++ b/src/cutecoin/core/net/api/bma/access.py @@ -8,6 +8,7 @@ import json import asyncio import random + class BmaAccess(QObject): """ This class is used to access BMA API. @@ -71,10 +72,10 @@ class BmaAccess(QObject): @staticmethod def _gen_cache_key(request, req_args, get_args): return (str(request), - str(tuple(frozenset(sorted(req_args.keys())))), - str(tuple(frozenset(sorted(req_args.values())))), - str(tuple(frozenset(sorted(get_args.keys())))), - str(tuple(frozenset(sorted(get_args.values()))))) + str(tuple(frozenset(sorted(req_args.keys())))), + str(tuple(frozenset(sorted(req_args.values())))), + str(tuple(frozenset(sorted(get_args.keys())))), + str(tuple(frozenset(sorted(get_args.values()))))) def _compare_json(self, first, second): """ @@ -84,40 +85,14 @@ class BmaAccess(QObject): :return: True if the json dicts are the same :rtype: bool """ - if first is not None: - if not isinstance(first, type(second)): - return False - if isinstance(first, dict): - for key in first: - if isinstance(second, dict): - if key in second: - sec = second[key] - else: - # there are key in the first, that is not presented in the second - return False - # recursive call - return self._compare_json(first[key], sec) - else: - # second is not dict - return False - # if object is list, loop over it and check. - elif isinstance(first, list): - for (index, item) in enumerate(first): - # try to get the same index from second - sec = None - if second is not None: - try: - sec = second[index] - except (IndexError, KeyError): - # goes to difference - return False - # recursive call - return self._compare_json(first[index], sec) - # not list, not dict. check for equality - elif first != second: - return False - else: - return True + def ordered(obj): + if isinstance(obj, dict): + return sorted((k, ordered(v)) for k, v in obj.items()) + if isinstance(obj, list): + return sorted(ordered(x) for x in obj) + else: + return obj + return ordered(first) == ordered(second) def _get_from_cache(self, request, req_args, get_args): """ @@ -126,17 +101,22 @@ class BmaAccess(QObject): :param cache_key: The key :return: """ + if request == blockchain.UD: + pass + cache_key = BmaAccess._gen_cache_key(request, req_args, get_args) if cache_key in self._data.keys(): cached_data = self._data[cache_key] need_reload = False if 'metadata' in cached_data: - if str(request) not in BmaAccess.__saved_requests \ - and cached_data['metadata']['block'] < self._network.latest_block: + if 'block' not in cached_data['metadata']: + need_reload = False + elif str(request) not in BmaAccess.__saved_requests \ + and cached_data['metadata']['block'] < self._network.latest_block: need_reload = True else: need_reload = True - ret_data = self._data[cache_key]['value'] + ret_data = cached_data['value'] else: need_reload = True ret_data = request.null_value @@ -181,14 +161,15 @@ class BmaAccess(QObject): :return: The cached data :rtype: dict """ + data = self._get_from_cache(request, req_args, get_args) need_reload = data[0] ret_data = data[1] cache_key = BmaAccess._gen_cache_key(request, req_args, get_args) if need_reload: - #Move to network nstead of community - #after removing qthreads + # Move to network nstead of community + # after removing qthreads if cache_key in self._pending_requests: if caller not in self._pending_requests[cache_key]: logging.debug("New caller".format(caller)) @@ -203,6 +184,8 @@ class BmaAccess(QObject): @pyqtSlot(int, dict, dict, int) def handle_reply(self, request, req_args, get_args, tries): + if request == blockchain.UD: + pass reply = self.sender() logging.debug("Handling QtNetworkReply for {0}".format(str(request))) cache_key = BmaAccess._gen_cache_key(request, req_args, get_args) @@ -238,6 +221,7 @@ class BmaAccess(QObject): :return: The future data :rtype: dict """ + def handle_future_reply(reply): if reply.error() == QNetworkReply.NoError: strdata = bytes(reply.readAll()).decode('utf-8') diff --git a/src/cutecoin/core/registry/identity.py b/src/cutecoin/core/registry/identity.py index 746d97793cb3e578b230f48d081b1c9d353f927f..f0179cea8d345136e83e51f5c93279e8550280e5 100644 --- a/src/cutecoin/core/registry/identity.py +++ b/src/cutecoin/core/registry/identity.py @@ -193,6 +193,7 @@ class Identity(QObject): :return: The list of the certifiers of this community in BMA json format """ certifiers = community.bma_access.get(self, qtbma.wot.CertifiersOf, {'search': self.pubkey}) + if certifiers == qtbma.wot.CertifiersOf.null_value: logging.debug('bma.wot.CertifiersOf request error') data = community.bma_access.get(self, qtbma.wot.Lookup, {'search': self.pubkey}) @@ -218,8 +219,8 @@ class Identity(QObject): certifier['cert_time']['medianTime'] = community.get_block( certifier_data['meta']['block_number'])['medianTime'] certifiers.append(certifier) - return certifiers + return certifiers['certifications'] def unique_valid_certifiers_of(self, community):