from typing import Optional
from lxml import objectify, etree
from dataclasses import dataclass, field
from q2_sdk.models.tip.schemas.base import TIPModel, TIPRequest
from q2_sdk.models.tip.schemas import descriptions
from q2_sdk.models.tip.exceptions import (
TIPModelValidationFromLxmlObjectifyException,
TIPModelParsingException,
)
from q2_sdk.models.tip.variables import TransactionTypeEnum, TransferDirection
[docs]
@dataclass
class FundsTransferTransactionDetails(TIPModel):
"""
FundsTransferTransactionDetails TIPModel
"""
direction: TransferDirection = field(
metadata={
"description": descriptions.FT_DIRECTION_DESCRIPTION,
}
)
originating_account: Optional[str] = field(
metadata={"description": descriptions.FT_ORIGINATING_ACCOUNT_DESCRIPTION}
)
to_account: Optional[str] = field(
metadata={
"description": descriptions.FT_TO_ACCOUNT_DESCRIPTION,
}
)
[docs]
@classmethod
def model_validate_from_elem(
cls, data: etree.Element
) -> "FundsTransferTransactionDetails":
"""
Create a FundsTransferTransactionDetails instance from XML element data.
:param data: etree Element containing funds transfer transaction details
:return: FundsTransferTransactionDetails instance
:raises TIPModelValidationFromLxmlObjectifyException: If data is not an ObjectifiedElement
"""
if isinstance(data, objectify.ObjectifiedElement):
try:
try:
originating_account = data.OriginatingAccount.text
except AttributeError:
originating_account = None
try:
to_account = data.ToAccount.text
except AttributeError:
to_account = None
return cls(
direction=TransferDirection.from_elem_str(
TIPModel.parse_str(data.Direction.text)
),
originating_account=TIPModel.parse_str_optional(
originating_account
),
to_account=TIPModel.parse_str_optional(to_account),
)
except AttributeError as e:
raise TIPModelParsingException(
f"Missing required attribute in obj_elem: {str(e)}"
)
raise TIPModelValidationFromLxmlObjectifyException(cls.__name__, type(data))
[docs]
@dataclass
class FundsTransferTIPRequest(TIPRequest):
"""
FundsTransferTIPRequest TIPRequest. TIPRequests are converted to this class when TransactionType is FundsTransfer.
"""
funds_transfer: FundsTransferTransactionDetails
[docs]
@classmethod
def model_validate_from_elem(cls, data: etree.Element) -> "FundsTransferTIPRequest":
"""
Create a FundsTransferTIPRequest instance from XML element data.
:param data: etree Element containing funds transfer TIP request data
:return: FundsTransferTIPRequest instance
:raises TIPModelValidationFromLxmlObjectifyException: If data is not an ObjectifiedElement
"""
if isinstance(data, objectify.ObjectifiedElement):
tip_request_dc = TIPRequest.model_validate_from_elem(data)
return cls(
funds_transfer=FundsTransferTransactionDetails.model_validate_from_elem(
TIPModel.try_getattr_from_elem(
data, TransactionTypeEnum.FundsTransfer.value
)
),
**(tip_request_dc.to_kwargs()),
)
raise TIPModelValidationFromLxmlObjectifyException(cls.__name__, type(data))