from lxml import objectify, etree
from typing import Optional
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
[docs]
@dataclass
class InternationalWireTransactionDetails(TIPModel):
"""
InternationalWireTransactionDetails
"""
to_account: str = field(
metadata={
"description": descriptions.IW_TO_ACCOUNT_DESCRIPTION,
}
)
intermed_swift_or_bic: Optional[str] = field(
metadata={
"description": descriptions.IW_INTERMED_SWIFT_OR_BIC_DESCRIPTION,
},
default=None,
)
swift_code_or_bic: Optional[str] = field(
metadata={
"description": descriptions.IW_SWIFT_CODE_OR_BIC_DESCRIPTION,
},
default=None,
)
iban: Optional[str] = field(
metadata={
"description": descriptions.IW_IBAN_DESCRIPTION,
},
default=None,
)
intermed_iban: Optional[str] = field(
metadata={
"description": descriptions.IW_INTERMED_IBAN_DESCRIPTION,
},
default=None,
)
recip_address_3: Optional[str] = field(
metadata={
"description": descriptions.IW_RECIP_ADDRESS_3_DESCRIPTION,
},
default=None,
)
address_1: Optional[str] = field(
metadata={
"description": descriptions.IW_ADDRESS_1_DESCRIPTION,
},
default=None,
)
address_2: Optional[str] = field(
metadata={
"description": descriptions.IW_ADDRESS_2_DESCRIPTION,
},
default=None,
)
address_3: Optional[str] = field(
metadata={
"description": descriptions.IW_ADDRESS_3_DESCRIPTION,
},
default=None,
)
intermed_address_1: Optional[str] = field(
metadata={
"description": descriptions.IW_INTERMED_ADDRESS_1_DESCRIPTION,
},
default=None,
)
intermed_address_2: Optional[str] = field(
metadata={
"description": descriptions.IW_INTERMED_ADDRESS_2_DESCRIPTION,
},
default=None,
)
intermed_address_3: Optional[str] = field(
metadata={
"description": descriptions.IW_INTERMED_ADDRESS_3_DESCRIPTION,
},
default=None,
)
[docs]
@classmethod
def model_validate_from_elem(
cls, data: etree.Element
) -> "InternationalWireTransactionDetails":
"""
Create an InternationalWireTransactionDetails instance from XML element data.
:param data: etree Element containing international wire transaction details
:return: InternationalWireTransactionDetails instance
:raises TIPModelValidationFromLxmlObjectifyException: If data is not an ObjectifiedElement
"""
if isinstance(data, objectify.ObjectifiedElement):
try:
# we do this because if the field is missing from the xml, the ObjectifiedElement
# parsed by lxml will not have the attribute at all. The TIPModel.parse_{dtype}_optional
# covers the case where the field is present in the xml but is None or empty str.
try:
intermed_swift_or_bic = data.IntermedSwiftOrBic.text
except AttributeError:
intermed_swift_or_bic = None
try:
swift_code_or_bic = data.SwiftCodeOrBic.text
except AttributeError:
swift_code_or_bic = None
try:
iban = data.IBAN.text
except AttributeError:
iban = None
try:
intermed_iban = data.IntermedIBAN.text
except AttributeError:
intermed_iban = None
try:
recip_address_3 = data.RecipAddress3.text
except AttributeError:
recip_address_3 = None
try:
address_1 = data.Address1.text
except AttributeError:
address_1 = None
try:
address_2 = data.Address2.text
except AttributeError:
address_2 = None
try:
address_3 = data.Address3.text
except AttributeError:
address_3 = None
try:
intermed_address_1 = data.IntermedAddress1.text
except AttributeError:
intermed_address_1 = None
try:
intermed_address_2 = data.IntermedAddress2.text
except AttributeError:
intermed_address_2 = None
try:
intermed_address_3 = data.IntermedAddress3.text
except AttributeError:
intermed_address_3 = None
return cls(
to_account=TIPModel.parse_str(data.ToAccount.text),
intermed_swift_or_bic=TIPModel.parse_str_optional(
intermed_swift_or_bic
),
swift_code_or_bic=TIPModel.parse_str_optional(swift_code_or_bic),
iban=TIPModel.parse_str_optional(iban),
intermed_iban=TIPModel.parse_str_optional(intermed_iban),
recip_address_3=TIPModel.parse_str_optional(recip_address_3),
address_1=TIPModel.parse_str_optional(address_1),
address_2=TIPModel.parse_str_optional(address_2),
address_3=TIPModel.parse_str_optional(address_3),
intermed_address_1=TIPModel.parse_str_optional(intermed_address_1),
intermed_address_2=TIPModel.parse_str_optional(intermed_address_2),
intermed_address_3=TIPModel.parse_str_optional(intermed_address_3),
)
except AttributeError as e:
raise TIPModelParsingException(
f"Missing required attribute in obj_elem: {str(e)}"
)
raise TIPModelValidationFromLxmlObjectifyException(cls.__name__, type(data))
[docs]
@dataclass
class InternationalWireTIPRequest(TIPRequest):
"""
InternationalWireTIPRequest TIPRequest. TIPRequests are converted to this class when TransactionType is InternationalWire.
"""
international_wire: InternationalWireTransactionDetails
[docs]
@classmethod
def model_validate_from_elem(
cls, data: etree.Element
) -> "InternationalWireTIPRequest":
"""
Create an InternationalWireTIPRequest instance from XML element data.
:param data: etree Element containing international wire TIP request data
:return: InternationalWireTIPRequest 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(
international_wire=InternationalWireTransactionDetails.model_validate_from_elem(
TIPModel.try_getattr_from_elem(
data, TransactionTypeEnum.InternationalWire.value
)
),
**(tip_request_dc.to_kwargs()),
)
raise TIPModelValidationFromLxmlObjectifyException(cls.__name__, type(data))