From cb5b5b85093db88eee699afe1dc290859a3ae41c Mon Sep 17 00:00:00 2001 From: cybnon Date: Mon, 21 Nov 2022 16:33:18 +0100 Subject: [PATCH] Adapt Output class Signed-off-by: cybnon --- planetmint/backend/models/key.py | 35 ++++++++++++++ planetmint/backend/models/output.py | 68 +++++++++++++++++++-------- planetmint/backend/tarantool/query.py | 3 +- 3 files changed, 85 insertions(+), 21 deletions(-) create mode 100644 planetmint/backend/models/key.py diff --git a/planetmint/backend/models/key.py b/planetmint/backend/models/key.py new file mode 100644 index 0000000..9103d01 --- /dev/null +++ b/planetmint/backend/models/key.py @@ -0,0 +1,35 @@ +# Copyright © 2020 Interplanetary Database Association e.V., +# Planetmint and IPDB software contributors. +# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0) +# Code is Apache-2.0 and docs are CC-BY-4.0 + +from __future__ import annotations +from dataclasses import dataclass, field +from typing import Optional + +@dataclass +class Keys: + tx_id: str = "" + public_key: str = "" + + @staticmethod + def from_dict(output: dict, tx_id: str = "") -> Keys: + if output["condition"]["details"].get("subconditions") is None: + return Keys( + tx_id=tx_id, + public_key=output["condition"]["details"]["public_key"], + ) + + + @staticmethod + def from_tuple(output: tuple) -> Keys: + return Keys( + tx_id=output[0], + public_key=output[1], + ) + + def to_output_dict(self) -> dict: + return { + "tx_id": self.tx_id, + "public_keys": self.public_key, + } diff --git a/planetmint/backend/models/output.py b/planetmint/backend/models/output.py index 29b1547..c1b645d 100644 --- a/planetmint/backend/models/output.py +++ b/planetmint/backend/models/output.py @@ -5,7 +5,6 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import Optional @dataclass @@ -17,9 +16,9 @@ class SubCondition: @dataclass class ConditionDetails: type: str - public_key: str - threshold: int - sub_conditions: field(default_factory=list) + public_key: str = "" + threshold: int = 0 + sub_conditions: list[SubCondition] = field(default_factory=list) @dataclass @@ -31,24 +30,16 @@ class Condition: @dataclass class Output: id: str - public_keys: str - condition: Optional[Condition] + amount: int + condition: field(default_factory=Condition) + public_keys: str = "" @staticmethod - def from_dict(output: dict) -> Output: - return Output( - id=output["id"], - public_keys=output["public_keys"], - condition=Condition( - uri=output["condition"]["uri"], - details=ConditionDetails( - type=output["condition"]["details"]["type"], - public_key=output["condition"]["details"]["public_key"], - threshold=output["condition"]["details"]["threshold"], - sub_conditions=output["condition"]["details"]["subconditions"], - ), - ), - ) + def from_dict(output: dict, tx_id: str = "") -> Output: + if output["condition"]["details"].get("subconditions") is None: + return output_with_public_key(output, tx_id) + else: + return output_with_sub_conditions(output, tx_id) @staticmethod def from_tuple(output: tuple) -> Output: @@ -80,3 +71,40 @@ class Output: }, }, } + + +def output_with_sub_conditions(output, tx_id) -> Output: + return Output( + id=tx_id, + amount=output["amount"], + condition=Condition( + uri=output["condition"]["uri"], + details=ConditionDetails( + type=output["condition"]["details"]["type"], + threshold=output["condition"]["details"]["threshold"], + sub_conditions=[ + SubCondition( + type=sub_condition["type"], + body=sub_condition["body"], + ) + for sub_condition in output["condition"]["details"][ + "subconditions" + ] + ], + ), + ), + ) + + +def output_with_public_key(output, tx_id) -> Output: + return Output( + id=tx_id, + amount=output["amount"], + condition=Condition( + uri=output["condition"]["uri"], + details=ConditionDetails( + type=output["condition"]["details"]["type"], + public_key=output["condition"]["details"]["public_key"], + ), + ), + ) \ No newline at end of file diff --git a/planetmint/backend/tarantool/query.py b/planetmint/backend/tarantool/query.py index 85c957d..24adba3 100644 --- a/planetmint/backend/tarantool/query.py +++ b/planetmint/backend/tarantool/query.py @@ -81,6 +81,7 @@ def store_transaction_outputs(connection, output: Output, index: int): output.public_keys, output.condition, output.condition, + uuid4().hex, index ))) @@ -96,7 +97,7 @@ def store_transactions(connection, signed_transactions: list): [store_transaction_inputs(connection, Input.from_dict(input, transaction["id"]), index) for index, input in enumerate(transaction[TARANT_TABLE_INPUT])] - [store_transaction_outputs(connection, Output.from_dict(output)) for index, output in + [store_transaction_outputs(connection, Output.from_dict(output, transaction["id"])) for index, output in enumerate(transaction[TARANT_TABLE_OUTPUT])] for _key in txtuples[TARANT_TABLE_KEYS]: