Source code for q2_cores.PCS.mappers.demographic_info

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, )