from dataclasses import dataclass
from lxml import objectify, etree
from typing import List
from q2_sdk.models.tip.schemas.base import TIPModel, TIPRequest
from q2_sdk.models.tip.exceptions import (
TIPModelValidationFromLxmlObjectifyException,
TIPModelParsingException,
)
from q2_sdk.models.tip.variables import TransactionTypeEnum
from q2_sdk.models.tip.schemas.ach import AchDetail
[docs]
@dataclass
class AchBatch(TIPModel):
details: List[AchDetail]
[docs]
@classmethod
def model_validate_from_elem(cls, data: etree.Element) -> "AchBatch":
if isinstance(data, objectify.ObjectifiedElement):
details = TIPModel.try_getattr_from_elem(data, "Details")
val_details = [
AchDetail.model_validate_from_elem(pair)
for pair in details.getchildren()
]
try:
return cls(details=val_details)
except AttributeError as e:
raise TIPModelParsingException(
f"Missing required attribute in obj_elem: {str(e)}"
)
raise TIPModelValidationFromLxmlObjectifyException(cls.__name__, type(data))
[docs]
@dataclass
class AchPassThruTransactionDetails(TIPModel):
"""
AchPassThruTransactionDetails TIPModel
"""
batches: List[AchBatch]
[docs]
@classmethod
def model_validate_from_elem(
cls, data: etree.Element
) -> "AchPassThruTransactionDetails":
"""
Create an AchTransactionDetails instance from XML element data.
:param data: etree Element containing ACH transaction details
:return: AchTransactionDetails instance
:raises TIPModelValidationFromLxmlObjectifyException: If data is not an ObjectifiedElement
"""
if isinstance(data, objectify.ObjectifiedElement):
batches = TIPModel.try_getattr_from_elem(data, "Batches")
val_batches = [
AchBatch.model_validate_from_elem(batch)
for batch in batches.getchildren()
]
try:
return cls(
batches=val_batches,
)
except AttributeError as e:
raise TIPModelParsingException(
f"Missing required attribute in obj_elem: {str(e)}"
)
raise TIPModelValidationFromLxmlObjectifyException(cls.__name__, type(data))
[docs]
@dataclass
class AchPassThruTIPRequest(TIPRequest):
"""
AchPassThruTIPRequest TIPRequest. TIPRequests are converted to this class when TransactionType is AchPassThru.
"""
ach: AchPassThruTransactionDetails
[docs]
@classmethod
def model_validate_from_elem(cls, data: etree.Element) -> "AchPassThruTIPRequest":
"""
Create an AchTIPRequest instance from XML element data.
:param data: etree Element containing ACH TIP request data
:return: AchTIPRequest 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(
ach=AchPassThruTransactionDetails.model_validate_from_elem(
TIPModel.try_getattr_from_elem(data, TransactionTypeEnum.Ach.value)
),
**(tip_request_dc.to_kwargs()),
)
raise TIPModelValidationFromLxmlObjectifyException(cls.__name__, type(data))