from typing import List
from lxml import objectify
from nameparser import HumanName
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.Summit.queries import DemographicInfoQuery
[docs]
class BuildDemographicInfoMapper(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
root = objectify.fromstring(response)
status_code = root.findtext(".//{*}Status/{*}StatusCode")
status_desc = root.findtext(".//{*}Status/{*}StatusDesc")
if status_code != "00":
raise CoreException(
f"Core returned unsuccessful status: {status_code} - {status_desc}"
)
member_result_node = root.find(".//{*}MemberResults")
dob = member_result_node.BirthDate.text
email = member_result_node.Email.text
home_phone = Phone(
member_result_node.PhoneAC.text,
member_result_node.Phone.text,
PhoneType.PERSONAL,
)
work_phone = Phone(
member_result_node.WorkPhoneAC.text,
member_result_node.WorkPhone.text,
PhoneType.BUSINESS,
extension=member_result_node.WorkPhoneExt.text,
)
phones = [home_phone, work_phone]
address = Address(
member_result_node.AddressLine1.text,
member_result_node.AddressLine2.text,
member_result_node.City.text,
member_result_node.State.text,
member_result_node.ZipCode.text,
)
full_name = member_result_node.MemberName.text
human_name = HumanName(full_name)
first_name = human_name.first
last_name = human_name.last
middle_name = human_name.middle
title = human_name.title
ssn = member_result_node.SSN.text
drivers_license = DriverLicense(
member_result_node.DriverLicenseNum.text,
member_result_node.DriverLicenseState.text,
)
return DemographicInfo(
dob,
[email],
phones,
[address],
first_name,
last_name,
ssn,
middle_name=middle_name,
title=title,
driver_license=drivers_license,
)