diff --git a/adapters/duniter_v18/certifications.py b/adapters/duniter_v18/certifications.py index 62230e88241bcc91cd72eb20edfd81cba48308ba..4497c11b63ede0ef5752c748e7127b0cc53a6f76 100644 --- a/adapters/duniter_v18/certifications.py +++ b/adapters/duniter_v18/certifications.py @@ -18,28 +18,61 @@ class LevelDBCertificationsRepository: def __iter__(self): """ - Iterate over pubkey: str, certifications: dict + Iterate over pubkey: str, issuer: dict + (with issued certifications updated to their last state) :return: """ for key, value in self.index.__iter__(): - yield key.decode("utf-8"), get_certifications_from_db_entry(value) + yield key.decode("utf-8"), get_issuer_from_db_entry(value) def get(self, pubkey: str) -> dict: """ - Return certifications dict from pubkey + Return issuer dict from pubkey :param pubkey: Identity account pubkey :return:q """ - return get_certifications_from_db_entry(self.index.get(pubkey.encode("utf-8"))) + db_entry = self.index.get(pubkey.encode("utf-8")) + return get_issuer_from_db_entry(db_entry) -def get_certifications_from_db_entry(json_string: str) -> dict: +def get_issuer_from_db_entry(json_string: str) -> dict: """ - Get certifications dict from json string + Get issuer dict from json string + (with issued certifications updated to their last state) :param json_string: Json entry :return: """ - return json.loads(json_string) + issuer = json.loads(json_string) + issuer["issued"] = get_updated_certifications_from_issuer(issuer["issued"]) + return issuer + + +def get_updated_certifications_from_issuer(issued_certifications: list) -> list: + """ + Return certifications from issuer_pubkey + + Certifications are updated to the last state for each receiver + + :param issued_certifications: Issuer issued certifications list + :return: + """ + issuer_certifications = [] + for cert in issued_certifications: + if cert["op"] == "CREATE": + receiver_pubkey = cert["receiver"] + # filter only certifications to receiver + issuer_to_receiver_certifications = [issuer_certification for issuer_certification in + issued_certifications if + issuer_certification["receiver"] == receiver_pubkey] + # update first certification properties except for None value + issuer_to_receiver_certification = { + key: value for issuer_certification in issuer_to_receiver_certifications for (key, value) in + issuer_certification.items() if + value is not None or issuer_certification == issuer_to_receiver_certifications[0]} + + issuer_certifications.append(issuer_to_receiver_certification) + + return issuer_certifications diff --git a/lib/functions.py b/lib/functions.py index 7a28e4df37cae4289965e95c170bd2f62fef85d8..548d47657c6e0587b7b0fff2060cf1c0836deef8 100644 --- a/lib/functions.py +++ b/lib/functions.py @@ -19,8 +19,8 @@ def get_wallets_data(): # Get wallets balances data wallets_repository = LevelDBWalletsRepository(os.getenv("LEVELDB_PATH", DEFAULT_LEVELDB_PATH)) wallets = {} - total_money = 0 # counter - ignored_money = 0 # counter + total_money = 0 # counter + ignored_money = 0 # counter for unlock_expression, wallet in wallets_repository: balance = wallet["balance"] if "&&" in unlock_expression: @@ -79,7 +79,7 @@ def get_identities_and_wallets(start_timestamp): print(" parse Wallets...") (wallets, total_money, ignored_money) = get_wallets_data() # add ignored money to treasury and check initial monetary mass - treasury += ignored_money # add ignored money to treasury + treasury += ignored_money # add ignored money to treasury wallet_sum = total_money + ignored_money missing_money = initial_monetary_mass - wallet_sum if missing_money != 0: @@ -119,7 +119,7 @@ def get_identities_and_wallets(start_timestamp): "owner_key": address, "balance": balance, "membership_expire_on": membership_expire_on if is_member else 0, - "next_cert_issuable_on": 0, # initialized to zero, modified later + "next_cert_issuable_on": 0, # initialized to zero, modified later "certs_received": {}, } @@ -140,11 +140,13 @@ def get_identities_and_wallets(start_timestamp): # Generate identities Ğ1v2 genesis json bloc # certs are stored per issuer in input file # certs are stored per receiver in output file - print(" parse certification...") + print(" parse certifications...") + # get certifications updated to their last state for i_pubkey, issuer in certifications_repository: i_uid = identity_names[i_pubkey] i_address = v1_pubkey_to_v2_address(i_pubkey) + # get certifications updated to their last state for cert in issuer["issued"]: # if certification expired, skip silently if cert["expired_on"] != 0: