from typing import List
from lxml import objectify
from q2_sdk.models.card import Card
from q2_sdk.models.cores.mappers.card_list import BaseCardListMapper
from q2_sdk.models.cores.queries.base_query import BaseQuery
from ...Symitar.queries import GetAllCardsQuery
from ...Symitar.models import parser
ACTIVE_CARD_STATUSES = [0, 1]
[docs]
class GetAllCardsMapper(BaseCardListMapper):
[docs]
@staticmethod
def parse_returned_queries(list_of_queries: List[BaseQuery]) -> List[Card]:
assert all(isinstance(x, GetAllCardsQuery) for x in list_of_queries), (
"Queries must be all be instances of Symitar.queries.GetAllCardsQuery"
)
card_records_models = []
responses = [x.raw_core_response for x in list_of_queries]
for response in responses:
symitar_response = parser.parse(response)
root = objectify.fromstring(symitar_response.payload)
card_records = root.findall(".//CARDS/CARD")
for card in card_records:
is_cancelled = card.CARDSTATUS.pyval not in ACTIVE_CARD_STATUSES
card_records_models.append(
Card(
card.NUMBER.text,
card.CARDTYPE.text,
expiration_date=card.CARDEXPIRATIONDATE.text,
effective_date=card.CARDEFFECTIVEDATE.text,
cancelled=is_cancelled,
account_holder_name=card.findtext("CARDNAME", ""),
)
)
return card_records_models