Example #1
0
class PDQHandler(AbstractHandler):

    REQ_MP, RES_MP = PDQ_REQ_MP, PDQ_RES_MP
    PDQ_FIELD_NAMES = {
        '@PID.3.1': "IDENTIFIER",
        '@PID.5.1.1': 'SURNAME',
        '@PID.5.2': 'NAME',
        '@PID.7.1': 'DOB'
    }

    def __init__(self, message):
        self.dao = DAO()
        msg = parse_message(message, message_profile=self.REQ_MP)
        super(PDQHandler, self).__init__(msg)

    def _create_res(self, ack_code, patients):
        res = Message('RSP_K21', reference=self.RES_MP)
        r, q = res.msh, self.incoming_message.msh
        r.msh_5, r.msh_6 = q.msh_3, q.msh_4
        res.msh.msh_5 = self.incoming_message.msh.msh_3
        res.msh.msh_6 = self.incoming_message.msh.msh_4
        r.msh_7.ts_1 = DTM(datetime.datetime.now())
        r.msh_9 = 'RSP^K22^RSP_K21'
        r.msh_10 = uuid.uuid4().hex

        r, q = res.msa, self.incoming_message.msh
        r.msa_1 = ack_code
        r.msa_2 = q.msh_10.msh_10_1

        r, q = res.qak, self.incoming_message.qpd
        r.qak_1 = q.qpd_2
        r.qak_2 = ('OK'
                   if len(patients) > 0 else 'NF')
        r.qak_4 = str(len(patients))

        res.qpd = self.incoming_message.qpd
        g = res.add_group('rsp_k21_query_response')
        for i, p in enumerate(patients):
            s = g.add_segment('PID')
            s.pid_1 = str(i)
            s.pid_3.cx_1 = p["IDENTIFIER"]
            s.pid_3.cx_4 = "master"
            s.pid_5 = "%s^%s" % (p["SURNAME"], p["NAME"])
            s.pid_7.ts_1 = p["DATETIME_OF_BIRTH"]
            s.pid_8 = p["ADMINISTRATIVE_SEX"]
            s.pid_11.xad_3 = p["CITY"]
            s.pid_13.xtn_1 = p["PHONE"]
            s.pid_13.xtn_4 = p["EMAIL"]
            s.pid_18.cx_1 = p["ACCOUNT_NUMBER"]
            s.pid_23 = p["BIRTH_PLACE"]
        return res

    def _create_err(self, code, desc):
        res = self._create_res('AR', 'AR', [])
        res.err.err_1, res.err.err_2 = code, desc
        return res

    def reply(self):
        logger.info("Received message:\n{}".format(self.incoming_message.to_er7().replace("\r", "\n")))

        params = dict((self.PDQ_FIELD_NAMES[q.qip_1.value], q.qip_2.value)
                      for q in self.incoming_message.qpd.qpd_3
                      if q.qip_1.value in self.PDQ_FIELD_NAMES)

        logger.info("Extracted parameters: {}".format(params))

        if '' in params.values() or ('DOB' in params and not check_date(params.get('DOB'))):
            return self._create_err("100", "Invalid params")
        else:
            p = self.dao.get_data(params)

        res = self._create_res('AA', p)
        res = res.to_mllp()
        logger.info("Sending result: {}".format(res.replace("\r", "\n")))
        return res