import re
from typing import List
from lxml import objectify
from q2_sdk.models.cores.queries.base_query import BaseQuery
from q2_sdk.models.cores.mappers.base_mapper import BaseMapper
from q2_sdk.models.demographic import (
Address,
DemographicInfo,
DriverLicense,
Phone,
PhoneType,
)
from q2_cores.exceptions import CoreException
from q2_cores.PCS.queries.demographic_info_query import DemographicInfoQuery
[docs]
class DemographicInfoMapper(BaseMapper):
[docs]
@staticmethod
def parse_returned_queries(list_of_queries: List[BaseQuery]) -> DemographicInfo:
assert len(list_of_queries) == 1
assert isinstance(list_of_queries[0], DemographicInfoQuery), (
"Query must be an instance of Summit.queries.DemographicInfoQuery"
)
response = list_of_queries[0].raw_core_response
response = re.sub(r"<\?xml+.+\?>", "", response)
root = objectify.fromstring(response)
if hasattr(root, "error"):
raise CoreException(
f"Core returned unsuccessful status: {root.error.text} - {root.message.text}"
)
member_info = root.cifinq
first_name = member_info.findtext("fname")
last_name = member_info.findtext("lname")
middle_name = member_info.findtext("mi")
ssn = "".join(
character for character in member_info.tin.text if character.isdecimal()
)
dob = member_info.findtext("d-birth")
email = member_info.findtext("internet")
phones = []
home_phone_string = member_info.findtext("h-phone")
if home_phone_string:
home_phone = Phone.build_from_str(home_phone_string, PhoneType.PERSONAL)
phones.append(home_phone)
work_phone_string = member_info.findtext("w-phone")
if work_phone_string:
work_phone = Phone.build_from_str(work_phone_string, PhoneType.BUSINESS)
phones.append(work_phone)
cell_phone_string = member_info.findtext("c-phone")
if cell_phone_string:
cell_phone = Phone.build_from_str(cell_phone_string, PhoneType.CELL)
phones.append(cell_phone)
address = Address(
member_info.findtext("st-addr"),
"",
member_info.findtext("city"),
member_info.findtext("state"),
member_info.findtext("zip"),
)
dl_num = member_info.findtext("dr-lic")
if dl_num not in ["", "MINOR"]:
drivers_license = DriverLicense(
member_info.findtext("dr-lic"), member_info.findtext("dr-st")
)
else:
drivers_license = None
return DemographicInfo(
dob,
[email],
phones,
[address],
first_name,
last_name,
ssn,
middle_name=middle_name,
driver_license=drivers_license,
)