Beispiel #1
0
    def _parse_keywords(message_body):
        """
            Parse Keywords
            - helper function for search_resource, etc
        """

        # Equivalent keywords in one list
        primary_keywords = ["get", "give", "show"]
        contact_keywords = ["email", "mobile", "facility", "clinical",
                            "security", "phone", "status", "hospital",
                            "person", "organisation"]

        pkeywords = primary_keywords + contact_keywords
        keywords = message_body.split(" ")
        pquery = []
        name = ""
        for word in keywords:
            match = None
            for key in pkeywords:
                if soundex(key) == soundex(word):
                    match = key
                    break
            if match:
                pquery.append(match)
            else:
                name = word

        return pquery, name
Beispiel #2
0
    def _parse_keywords(message_body):
        """
            Parse Keywords
            - helper function for search_resource, etc
        """

        # Equivalent keywords in one list
        primary_keywords = ["get", "give", "show"]
        contact_keywords = [
            "email", "mobile", "facility", "clinical", "security", "phone",
            "status", "hospital", "person", "organisation"
        ]

        pkeywords = primary_keywords + contact_keywords
        keywords = message_body.split(" ")
        pquery = []
        name = ""
        for word in keywords:
            match = None
            for key in pkeywords:
                if soundex(key) == soundex(word):
                    match = key
                    break
            if match:
                pquery.append(match)
            else:
                name = word

        return pquery, name
Beispiel #3
0
    def parse_person(self, pquery="", name="", sender=""):
        """
            Search for People
        """

        T = current.T
        db = current.db
        s3db = current.s3db

        result = []
        reply = ""

        # Person Search [get name person phone email]
        s3_accessible_query = current.auth.s3_accessible_query
        table = s3db.pr_person
        query = (table.deleted == False) & \
                (s3_accessible_query("read", table))
        rows = db(query).select(table.pe_id, table.first_name,
                                table.middle_name, table.last_name)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.first_name)) or \
               (_name == soundex(row.middle_name)) or \
               (_name == soundex(row.last_name)):
                presult = dict(name=row.first_name, id=row.pe_id)
                result.append(presult)

        if len(result) > 1:
            return T("Multiple Matches")
        if len(result) == 1:
            reply = result[0]["name"]
            table = s3db.pr_contact
            if "email" in pquery:
                query = (table.pe_id == result[0]["id"]) & \
                        (table.contact_method == "EMAIL") & \
                        (s3_accessible_query("read", table))
                recipient = db(query).select(table.value,
                                             orderby=table.priority,
                                             limitby=(0, 1)).first()
                if recipient:
                    reply = "%s Email->%s" % (reply, recipient.value)
                else:
                    reply = "%s 's Email Not available!" % reply
            if "phone" in pquery:
                query = (table.pe_id == result[0]["id"]) & \
                        (table.contact_method == "SMS") & \
                        (s3_accessible_query("read", table))
                recipient = db(query).select(table.value,
                                             orderby=table.priority,
                                             limitby=(0, 1)).first()
                if recipient:
                    reply = "%s Mobile->%s" % (reply, recipient.value)
                else:
                    reply = "%s 's Mobile Contact Not available!" % reply

        if len(result) == 0:
            return T("No Match")

        return reply
Beispiel #4
0
    def parse_hospital(self, pquery="", name="", sender=""):
        """
           Search for Hospitals
        """

        T = current.T
        db = current.db
        s3db = current.s3db

        result = []
        reply = ""

        #  Hospital Search [example: get name hospital facility status ]
        table = s3db.hms_hospital
        stable = s3db.hms_status
        query = (table.deleted == False) & \
                (current.auth.s3_accessible_query("read", table))
        rows = db(query).select(table.id,
                                table.name,
                                table.aka1,
                                table.aka2,
                                table.phone_emergency
                                )
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.name)) or \
               (_name == soundex(row.aka1)) or \
               (_name == soundex(row.aka2)):
                result.append(row)

        if len(result) > 1:
            return T("Multiple Matches")

        if len(result) == 1:
            hospital = result[0]
            status = db(stable.hospital_id == hospital.id).\
                                                select(limitby=(0,1)).first()
            reply = "%s %s (%s) " % (reply, hospital.name,
                                     T("Hospital"))
            if "phone" in pquery:
                reply = reply + "Phone->" + str(hospital.phone_emergency)
            if "facility" in pquery:
                 reply = reply + "Facility status " + \
                    str(stable.facility_status.represent\
                                            (status.facility_status))
            if "clinical" in pquery:
                reply = reply + "Clinical status " + \
                    str(stable.clinical_status.represent\
                                            (status.clinical_status))
            if "security" in pquery:
                reply = reply + "Security status " + \
                    str(stable.security_status.represent\
                                            (status.security_status))

        if len(result) == 0:
            return T("No Match")

        return reply
Beispiel #5
0
    def search_organisation(self, message, pquery=None, name=None):
        """
           Search for Organisations
           - can be called direct
           - can be called from search_by_keyword
        """

        message_body = message.body
        if not message_body:
            return None

        if not pquery or not name:
            pquery, name = self._parse_keywords(message_body)

        T = current.T
        db = current.db
        s3db = current.s3db

        reply = None
        result = []

        # Organization search [example: get name organisation phone]
        s3_accessible_query = current.auth.s3_accessible_query
        table = s3db.org_organisation
        query = (table.deleted == False) & \
                (s3_accessible_query("read", table))
        rows = db(query).select(table.id,
                                table.name,
                                table.phone,
                                table.acronym)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.name)) or \
               (_name == soundex(row.acronym)):
                result.append(row)

        if len(reply) == 0:
            return T("No Match")

        elif len(result) > 1:
            return T("Multiple Matches")

        else:
            # Single Match
            org = result[0]
            reply = "%s %s (%s) " % (reply, org.name,
                                     T("Organization"))
            if "phone" in pquery:
                reply = reply + "Phone->" + str(org.phone)
            if "office" in pquery:
                otable = s3db.org_office
                query = (otable.organisation_id == org.id) & \
                        (s3_accessible_query("read", otable))
                office = db(query).select(otable.address,
                                          limitby=(0, 1)).first()
                reply = reply + "Address->" + office.address

        return reply
Beispiel #6
0
    def search_organisation(self, message, pquery=None, name=None):
        """
           Search for Organisations
           - can be called direct
           - can be called from search_by_keyword
        """

        message_body = message.body
        if not message_body:
            return None

        if not pquery or not name:
            pquery, name = self._parse_keywords(message_body)

        T = current.T
        db = current.db
        s3db = current.s3db

        reply = None
        result = []

        # Organization search [example: get name organisation phone]
        s3_accessible_query = current.auth.s3_accessible_query
        table = s3db.org_organisation
        query = (table.deleted == False) & \
                (s3_accessible_query("read", table))
        rows = db(query).select(table.id,
                                table.name,
                                table.phone,
                                table.acronym)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.name)) or \
               (_name == soundex(row.acronym)):
                result.append(row)

        if len(reply) == 0:
            return T("No Match")

        elif len(result) > 1:
            return T("Multiple Matches")

        else:
            # Single Match
            org = result[0]
            reply = "%s %s (%s) " % (reply, org.name,
                                     T("Organization"))
            if "phone" in pquery:
                reply = reply + "Phone->" + str(org.phone)
            if "office" in pquery:
                otable = s3db.org_office
                query = (otable.organisation_id == org.id) & \
                        (s3_accessible_query("read", otable))
                office = db(query).select(otable.address,
                                          limitby=(0, 1)).first()
                reply = reply + "Address->" + office.address

        return reply
Beispiel #7
0
    def parse_hospital(self, pquery="", name="", sender=""):
        """
           Search for Hospitals
        """

        T = current.T
        db = current.db
        s3db = current.s3db

        result = []
        reply = ""

        #  Hospital Search [example: get name hospital facility status ]
        table = s3db.hms_hospital
        stable = s3db.hms_status
        query = (table.deleted == False) & \
                (current.auth.s3_accessible_query("read", table))
        rows = db(query).select(table.id, table.name, table.aka1, table.aka2,
                                table.phone_emergency)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.name)) or \
               (_name == soundex(row.aka1)) or \
               (_name == soundex(row.aka2)):
                result.append(row)

        if len(result) == 0:
            return T("No Match")

        elif len(result) > 1:
            return T("Multiple Matches")

        else:
            # Single Match
            hospital = result[0]
            status = db(stable.hospital_id == hospital.id).select(
                stable.facility_status,
                stable.clinical_status,
                stable.security_status,
                limitby=(0, 1)).first()
            reply = "%s %s (%s) " % (reply, hospital.name, T("Hospital"))
            if "phone" in pquery:
                reply = reply + "Phone->" + str(hospital.phone_emergency)
            if "facility" in pquery:
                reply = reply + "Facility status " + \
                   str(stable.facility_status.represent\
                                           (status.facility_status))
            if "clinical" in pquery:
                reply = reply + "Clinical status " + \
                    str(stable.clinical_status.represent\
                                            (status.clinical_status))
            if "security" in pquery:
                reply = reply + "Security status " + \
                    str(stable.security_status.represent\
                                            (status.security_status))

        return reply
Beispiel #8
0
    def search_hospital(self, message, pquery=None, name=None):
        """
           Search for Hospitals
           - can be called direct
           - can be called from search_by_keyword
        """

        message_body = message.body
        if not message_body:
            return None

        if not pquery or not name:
            pquery, name = self._parse_keywords(message_body)

        T = current.T
        db = current.db
        s3db = current.s3db

        reply = None
        result = []

        #  Hospital Search [example: get name hospital facility status ]
        table = s3db.hms_hospital
        stable = s3db.hms_status
        query = (table.deleted == False) & (current.auth.s3_accessible_query("read", table))
        rows = db(query).select(table.id, table.name, table.aka1, table.aka2, table.phone_emergency)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.name)) or (_name == soundex(row.aka1)) or (_name == soundex(row.aka2)):
                result.append(row)

        if len(result) == 0:
            return T("No Match")

        elif len(result) > 1:
            return T("Multiple Matches")

        else:
            # Single Match
            hospital = result[0]
            status = (
                db(stable.hospital_id == hospital.id)
                .select(stable.facility_status, stable.clinical_status, stable.security_status, limitby=(0, 1))
                .first()
            )
            reply = "%s %s (%s) " % (reply, hospital.name, T("Hospital"))
            if "phone" in pquery:
                reply = reply + "Phone->" + str(hospital.phone_emergency)
            if "facility" in pquery:
                reply = reply + "Facility status " + str(stable.facility_status.represent(status.facility_status))
            if "clinical" in pquery:
                reply = reply + "Clinical status " + str(stable.clinical_status.represent(status.clinical_status))
            if "security" in pquery:
                reply = reply + "Security status " + str(stable.security_status.represent(status.security_status))

        return reply
Beispiel #9
0
    def parse_org(self, pquery="", name="", sender=""):
        """
           Search for Organisations
        """

        T = current.T
        db = current.db
        s3db = current.s3db

        result = []
        reply = ""

        # Organization search [example: get name organisation phone]
        s3_accessible_query = current.auth.s3_accessible_query
        table = s3db.org_organisation
        query = (table.deleted == False) & \
                (s3_accessible_query("read", table))
        rows = db(query).select(table.id,
                                table.name,
                                table.donation_phone,
                                table.acronym)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.name)) or \
               (_name == soundex(row.acronym)):
                result.append(row)

        if len(reply) == 0:
            return T("No Match")

        elif len(result) > 1:
            return T("Multiple Matches")

        else:
            # Single Match
            org = result[0]
            reply = "%s %s (%s) " % (reply, org.name,
                                     T("Organization"))
            if "phone" in pquery:
                reply = reply + "Phone->" + str(org.donation_phone)
            if "office" in pquery:
                otable = s3db.org_office
                query = (otable.organisation_id == org.id) & \
                        (s3_accessible_query("read", otable))
                office = db(query).select(otable.address,
                                          limitby=(0, 1)).first()
                reply = reply + "Address->" + office.address

        return reply
Beispiel #10
0
    def parse_org(self, pquery="", name="", sender=""):
        """
           Search for Organisations
        """

        T = current.T
        db = current.db
        s3db = current.s3db

        result = []
        reply = ""

        # Organization search [example: get name organisation phone]
        s3_accessible_query = current.auth.s3_accessible_query
        table = s3db.org_organisation
        query = (table.deleted == False) & \
                (s3_accessible_query("read", table))
        rows = db(query).select(table.id,
                                table.name,
                                table.phone,
                                table.acronym)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.name)) or \
               (_name == soundex(row.acronym)):
                result.append(row)

        if len(reply) == 0:
            return T("No Match")

        elif len(result) > 1:
            return T("Multiple Matches")

        else:
            # Single Match
            org = result[0]
            reply = "%s %s (%s) " % (reply, org.name,
                                     T("Organization"))
            if "phone" in pquery:
                reply = reply + "Phone->" + str(org.phone)
            if "office" in pquery:
                otable = s3db.org_office
                query = (otable.organisation_id == org.id) & \
                        (s3_accessible_query("read", otable))
                office = db(query).select(otable.address,
                                          limitby=(0, 1)).first()
                reply = reply + "Address->" + office.address

        return reply
Beispiel #11
0
    def keyword_search(message="", sender=""):
        """
            1st Pass Parser for searching people, 
            hospitals and organisations.
        """

        if not message:
            return None

        T = current.T
        db = current.db
        s3db = current.s3db

        # Equivalent keywords in one list
        primary_keywords = ["get", "give", "show"]
        contact_keywords = [
            "email", "mobile", "facility", "clinical", "security", "phone",
            "status", "hospital", "person", "organisation"
        ]

        pkeywords = primary_keywords + contact_keywords
        keywords = string.split(message)
        pquery = []
        name = ""
        reply = ""
        for word in keywords:
            match = None
            for key in pkeywords:
                if soundex(key) == soundex(word):
                    match = key
                    break
            if match:
                pquery.append(match)
            else:
                name = word

        parser = S3Parsing()
        if "person" in pquery:
            reply = parser.parse_person(pquery, name, sender)
        elif "hospital" in pquery:
            reply = parser.parse_hospital(pquery, name, sender)
        elif "organisation" in pquery:
            reply = parser.parse_org(pquery, name, sender)
        else:
            reply = False
        return reply
Beispiel #12
0
    def parse_ireport(message="", sender=""):
        """
            Parse Messages directed to the IRS Module.
        """

        if not message:
            return None

        T = current.T
        db = current.db
        s3db = current.s3db
        msg = current.msg
        parser = S3Parsing()

        (lat, lon, code, text) = msg.parse_opengeosms(message)
        if code == "SI":
            reply = parser.parse_opengeosms(lat, lon, text, message, sender)
        else:
            words = string.split(message)
            message = ""
            reponse = ""
            ireport = False
            comments = False
            for word in words:
                if "SI#" in word and not ireport:
                    report = word.split("#")[1]
                    report = int(report)
                    ireport = True
                elif (soundex(word) == soundex("Yes")) and ireport \
                                                        and not comments:
                    response = True
                    comments = True
                elif soundex(word) == soundex("No") and ireport \
                                                    and not comments:
                    response = False
                    comments = True
                elif comments:
                    message += word + " "

            if ireport:
                reply = parser.parse_drequest(report, response, message,
                                              sender)
            else:
                reply = False

        return reply
Beispiel #13
0
    def keyword_search(message="", sender=""):
        """
            1st Pass Parser for searching people, 
            hospitals and organisations.
        """

        if not message:
            return None

        T = current.T
        db = current.db
        s3db = current.s3db
        
        # Equivalent keywords in one list
        primary_keywords = ["get", "give", "show"] 
        contact_keywords = ["email", "mobile", "facility", "clinical",
                            "security", "phone", "status", "hospital",
                            "person", "organisation"]

        pkeywords = primary_keywords + contact_keywords
        keywords = string.split(message)
        pquery = []
        name = ""
        reply = ""
        for word in keywords:
            match = None
            for key in pkeywords:
                if soundex(key) == soundex(word):
                    match = key
                    break
            if match:
                pquery.append(match)
            else:
                name = word

        parser = S3Parsing()                
        if "person" in pquery:
            reply = parser.parse_person(pquery, name, sender)
        elif "hospital" in pquery:
            reply = parser.parse_hospital(pquery, name, sender)
        elif "organisation" in pquery:
            reply = parser.parse_org(pquery, name, sender)
        else:
            reply = False
        return reply
Beispiel #14
0
    def parse_ireport(self, message):
        """
            Parse Messages directed to the IRS Module
            - logging new incidents
            - responses to deployment requests
        """

        message_body = message.body
        if not message_body:
            return None

        (lat, lon, code, text) = current.msg.parse_opengeosms(message_body)

        if code == "SI":
            # Create New Incident Report
            reply = self._create_ireport(lat, lon, text)
        else:
            # Is this a Response to a Deployment Request?
            words = message_body.split(" ")
            text = ""
            reponse = ""
            report_id = None
            comments = False
            for word in words:
                if "SI#" in word and not ireport:
                    report = word.split("#")[1]
                    report_id = int(report)
                elif (soundex(word) == soundex("Yes")) and report_id \
                                                        and not comments:
                    response = True
                    comments = True
                elif soundex(word) == soundex("No") and report_id \
                                                    and not comments:
                    response = False
                    comments = True
                elif comments:
                    text += word + " "

            if report_id:
                reply = self._respond_drequest(message, report_id, response,
                                               text)
            else:
                reply = None

        return reply
Beispiel #15
0
    def parse_ireport(message="", sender=""):
        """
            Parse Messages directed to the IRS Module.
        """

        if not message:
            return None

        T = current.T
        db = current.db
        s3db = current.s3db
        msg = current.msg
        parser = S3Parsing()

        (lat, lon, code, text) = msg.parse_opengeosms(message)
        if code == "SI":
            reply = parser.parse_opengeosms(lat, lon, text, message, sender)
        else:
            words = string.split(message)
            message = ""
            reponse = ""
            ireport = False
            comments = False
            for word in words:
                if "SI#" in word and not ireport:
                    report = word.split("#")[1]
                    report = int(report)
                    ireport = True
                elif (soundex(word) == soundex("Yes")) and ireport \
                                                        and not comments:
                    response = True
                    comments = True
                elif soundex(word) == soundex("No") and ireport \
                                                    and not comments:
                    response = False
                    comments = True
                elif comments:
                    message += word + " "

            if ireport:
                reply = parser.parse_drequest(report, response, message, sender)
            else:
                reply = False
                       
        return reply				    
Beispiel #16
0
    def parse_ireport(self, message):
        """
            Parse Messages directed to the IRS Module
            - logging new incidents
            - responses to deployment requests
        """

        message_body = message.body
        if not message_body:
            return None

        (lat, lon, code, text) = current.msg.parse_opengeosms(message_body)

        if code == "SI":
            # Create New Incident Report
            reply = self._create_ireport(lat, lon, text)
        else:
            # Is this a Response to a Deployment Request?
            words = message_body.split(" ")
            text = ""
            reponse = ""
            report_id = None
            comments = False
            for word in words:
                if "SI#" in word and not ireport:
                    report = word.split("#")[1]
                    report_id = int(report)
                elif (soundex(word) == soundex("Yes")) and report_id \
                                                        and not comments:
                    response = True
                    comments = True
                elif soundex(word) == soundex("No") and report_id \
                                                    and not comments:
                    response = False
                    comments = True
                elif comments:
                    text += word + " "

            if report_id:
                reply = self._respond_drequest(message, report_id, response, text)
            else:
                reply = None

        return reply
Beispiel #17
0
 def parse_1(message=""):
         """
             Parsing Workflow 1.
         """
 
         
         if not message:
             return None
 
         T = current.T
         db = current.db
         s3db = current.s3db
         s3mgr = current.manager
 
         primary_keywords = ["get", "give", "show"] # Equivalent keywords in one list
         contact_keywords = ["email", "mobile", "facility", "clinical",
                             "security", "phone", "status", "hospital",
                             "person", "organisation"]
 
         pkeywords = primary_keywords+contact_keywords
         keywords = string.split(message)
         pquery = []
         name = ""
         reply = ""
         for word in keywords:
             match = None
             for key in pkeywords:
                 if soundex(key) == soundex(word):
                     match = key
                     break
             if match:
                 pquery.append(match)
             else:
                 name = word
 
         # ---------------------------------------------------------------------
         # Person Search [get name person phone email]
         if "person" in pquery:
 
             table = s3db.pr_person
             rows = db(table.id > 0).select(table.pe_id,
                                            table.first_name,
                                            table.middle_name,
                                            table.last_name)
             for row in rows:
                 result = []
                 if (soundex(str(name)) == soundex(str(row.first_name))) or \
                    (soundex(str(name)) == soundex(str(row.middle_name))) or \
                    (soundex(str(name)) == soundex(str(row.last_name))):
                     presult = dict(name = row.first_name, id = row.pe_id)
                     result.append(presult)
                     break
 
             if len(result) > 1:
                 return T("Multiple Matches")
             if len(result) == 1:
                 reply = result[0]["name"]
                 table = s3db.pr_contact
                 if "email" in pquery:
                     query = (table.pe_id == result[0]["id"]) & \
                         (table.contact_method == "EMAIL")
                     recipient = db(query).select(table.value,
                                                  orderby = table.priority,
                                                  limitby=(0, 1)).first()
                     reply = "%s Email->%s" % (reply, recipient.value)
                 if "phone" in pquery:
                     query = (table.pe_id == result[0]["id"]) & \
                         (table.contact_method == "SMS")
                     recipient = db(query).select(table.value,
                                                  orderby = table.priority,
                                                  limitby=(0, 1)).first()
                     reply = "%s Mobile->%s" % (reply,
                                                recipient.value)
 
             if len(result) == 0:
                 return T("No Match")
 
             return reply
         return "Please provide one of the keywords - person, hospital, organisation"
Beispiel #18
0
 def parse_2(message=""):
         """
            Parsing Workflow 2. 
         """
 
         if not message:
             return None
 
         T = current.T
         db = current.db
         s3db = current.s3db
         s3mgr = current.manager
 
         primary_keywords = ["get", "give", "show"] # Equivalent keywords in one list
         contact_keywords = ["email", "mobile", "facility", "clinical",
                             "security", "phone", "status", "hospital",
                             "person", "organisation"]
 
         pkeywords = primary_keywords+contact_keywords
         keywords = string.split(message)
         pquery = []
         name = ""
         reply = ""
         for word in keywords:
             match = None
             for key in pkeywords:
                 if soundex(key) == soundex(word):
                     match = key
                     break
             if match:
                 pquery.append(match)
             else:
                 name = word
 
         # ---------------------------------------------------------------------
         #  Hospital Search [example: get name hospital facility status ]
         if "hospital" in pquery:
             table = s3db.hms_hospital
             rows = db(table.id > 0).select(table.id,
                                            table.name,
                                            table.aka1,
                                            table.aka2)
             for row in rows:
                 result = []
                 if (soundex(str(name)) == soundex(str(row.name))) or \
                    (soundex(name) == soundex(str(row.aka1))) or \
                    (soundex(name) == soundex(str(row.aka2))):
                     result.append(row)
                     break
 
 
             if len(result) > 1:
                 return T("Multiple Matches")
 
             if len(result) == 1:
                 hospital = db(table.id == result[0].id).select().first()
                 reply = "%s %s (%s) " % (reply, hospital.name,
                                          T("Hospital"))
                 if "phone" in pquery:
                     reply = reply + "Phone->" + str(hospital.phone_emergency)
                 if "facility" in pquery:
                     reply = reply + "Facility status " + str(table.facility_status.represent(hospital.facility_status))
                 if "clinical" in pquery:
                     reply = reply + "Clinical status " + str(table.clinical_status.represent(hospital.clinical_status))
                 if "security" in pquery:
                     reply = reply + "Security status " + str(table.security_status.represent(hospital.security_status))
 
             if len(result) == 0:
                 return T("No Match")
 
             return reply
         return "Please provide one of the keywords - person, hospital, organisation"
Beispiel #19
0
    def search_person(self, message, pquery=None, name=None):
        """
            Search for People
           - can be called direct
           - can be called from search_by_keyword
        """

        message_body = message.body
        if not message_body:
            return None

        if not pquery or not name:
            pquery, name = self._parse_keywords(message_body)

        T = current.T
        db = current.db
        s3db = current.s3db

        reply = None
        result = []

        # Person Search [get name person phone email]
        s3_accessible_query = current.auth.s3_accessible_query
        table = s3db.pr_person
        query = (table.deleted == False) & \
                (s3_accessible_query("read", table))
        rows = db(query).select(table.pe_id,
                                table.first_name,
                                table.middle_name,
                                table.last_name)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.first_name)) or \
               (_name == soundex(row.middle_name)) or \
               (_name == soundex(row.last_name)):
                presult = dict(name = row.first_name, id = row.pe_id)
                result.append(presult)

        if len(result) == 0:
            return T("No Match")

        elif len(result) > 1:
            return T("Multiple Matches")

        else:
            # Single Match
            reply = result[0]["name"]
            table = s3db.pr_contact
            if "email" in pquery:
                query = (table.pe_id == result[0]["id"]) & \
                        (table.contact_method == "EMAIL") & \
                        (s3_accessible_query("read", table))
                recipient = db(query).select(table.value,
                                             orderby = table.priority,
                                             limitby=(0, 1)).first()
                if recipient:
                    reply = "%s Email->%s" % (reply, recipient.value)
                else:
                    reply = "%s 's Email Not available!" % reply
            if "phone" in pquery:
                query = (table.pe_id == result[0]["id"]) & \
                        (table.contact_method == "SMS") & \
                        (s3_accessible_query("read", table))
                recipient = db(query).select(table.value,
                                             orderby = table.priority,
                                             limitby=(0, 1)).first()
                if recipient:
                    reply = "%s Mobile->%s" % (reply,
                                               recipient.value)
                else:
                    reply = "%s 's Mobile Contact Not available!" % reply

        return reply
Beispiel #20
0
    def parse_person(self, pquery="", name="", sender=""):
        """
            Search for People
        """

        T = current.T
        db = current.db
        s3db = current.s3db

        result = []
        reply = ""

        # Person Search [get name person phone email]
        s3_accessible_query = current.auth.s3_accessible_query
        table = s3db.pr_person
        query = (table.deleted == False) & \
                (s3_accessible_query("read", table))
        rows = db(query).select(table.pe_id,
                                table.first_name,
                                table.middle_name,
                                table.last_name)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.first_name)) or \
               (_name == soundex(row.middle_name)) or \
               (_name == soundex(row.last_name)):
                presult = dict(name = row.first_name, id = row.pe_id)
                result.append(presult)

        if len(result) > 1:
            return T("Multiple Matches")
        if len(result) == 1:
            reply = result[0]["name"]
            table = s3db.pr_contact
            if "email" in pquery:
                query = (table.pe_id == result[0]["id"]) & \
                        (table.contact_method == "EMAIL") & \
                        (s3_accessible_query("read", table))
                recipient = db(query).select(table.value,
                                             orderby = table.priority,
                                             limitby=(0, 1)).first()
                if recipient:
                    reply = "%s Email->%s" % (reply, recipient.value)
                else:
                    reply = "%s 's Email Not available!"%reply
            if "phone" in pquery:
                query = (table.pe_id == result[0]["id"]) & \
                        (table.contact_method == "SMS") & \
                        (s3_accessible_query("read", table))
                recipient = db(query).select(table.value,
                                             orderby = table.priority,
                                             limitby=(0, 1)).first()
                if recipient:
                    reply = "%s Mobile->%s" % (reply,
                                           recipient.value)
                else:
                    reply = "%s 's Mobile Contact Not available!"%reply

        if len(result) == 0:
            return T("No Match")

        return reply
Beispiel #21
0
 def parse_3(message=""):
         """
            Parsing Workflow 3.
         """
 
         if not message:
             return None
 
         T = current.T
         db = current.db
         s3db = current.s3db
         s3mgr = current.manager
 
         primary_keywords = ["get", "give", "show"] # Equivalent keywords in one list
         contact_keywords = ["email", "mobile", "facility", "clinical",
                             "security", "phone", "status", "hospital",
                             "person", "organisation"]
 
         pkeywords = primary_keywords+contact_keywords
         keywords = string.split(message)
         pquery = []
         name = ""
         reply = ""
         for word in keywords:
             match = None
             for key in pkeywords:
                 if soundex(key) == soundex(word):
                     match = key
                     break
             if match:
                 pquery.append(match)
             else:
                 name = word
                 
         # ---------------------------------------------------------------------
         # Organization search [example: get name organisation phone]
         if "organisation" in pquery:
             table = s3db.org_organisation
             rows = db(table.id > 0).select(table.id,
                                            table.name,
                                            table.acronym)
             for row in rows:
                 result = []
                 if (soundex(str(name)) == soundex(str(row.name))) or \
                    (soundex(str(name)) == soundex(str(row.acronym))):
                     result.append(row)
                     break
 
             if len(result) > 1:
                 return T("Multiple Matches")
 
             if len(result) == 1:
                 organisation = db(table.id == result[0].id).select().first()
                 reply = "%s %s (%s) " % (reply, organisation.name,
                                          T("Organization"))
                 if "phone" in pquery:
                     reply = reply + "Phone->" + str(organisation.donation_phone)
                 if "office" in pquery:
                     reply = reply + "Address->" + s3_get_db_field_value(tablename = "org_office",
                                                                         fieldname = "address",
                                                                         look_up_value = organisation.id)
             if len(reply) == 0:
                 return T("No Match")
 
             return reply
         return "Please provide one of the keywords - person, hospital, organisation"
Beispiel #22
0
    def search_person(self, message, pquery=None, name=None):
        """
            Search for People
           - can be called direct
           - can be called from search_resource
        """

        message_body = message.body
        if not message_body:
            return None

        if not pquery or not name:
            pquery, name = self._parse_keywords(message_body)

        T = current.T
        db = current.db
        s3db = current.s3db

        reply = None
        result = []

        # Person Search [get name person phone email]
        s3_accessible_query = current.auth.s3_accessible_query
        table = s3db.pr_person
        query = (table.deleted == False) & \
                (s3_accessible_query("read", table))
        rows = db(query).select(table.pe_id, table.first_name,
                                table.middle_name, table.last_name)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.first_name)) or \
               (_name == soundex(row.middle_name)) or \
               (_name == soundex(row.last_name)):
                presult = dict(name=row.first_name, id=row.pe_id)
                result.append(presult)

        if len(result) == 0:
            return T("No Match")

        elif len(result) > 1:
            return T("Multiple Matches")

        else:
            # Single Match
            reply = result[0]["name"]
            table = s3db.pr_contact
            if "email" in pquery:
                query = (table.pe_id == result[0]["id"]) & \
                        (table.contact_method == "EMAIL") & \
                        (s3_accessible_query("read", table))
                recipient = db(query).select(table.value,
                                             orderby=table.priority,
                                             limitby=(0, 1)).first()
                if recipient:
                    reply = "%s Email->%s" % (reply, recipient.value)
                else:
                    reply = "%s 's Email Not available!" % reply
            if "phone" in pquery:
                query = (table.pe_id == result[0]["id"]) & \
                        (table.contact_method == "SMS") & \
                        (s3_accessible_query("read", table))
                recipient = db(query).select(table.value,
                                             orderby=table.priority,
                                             limitby=(0, 1)).first()
                if recipient:
                    reply = "%s Mobile->%s" % (reply, recipient.value)
                else:
                    reply = "%s 's Mobile Contact Not available!" % reply

        return reply
Beispiel #23
0
    def search_hospital(self, message, pquery=None, name=None):
        """
           Search for Hospitals
           - can be called direct
           - can be called from search_resource
        """

        message_body = message.body
        if not message_body:
            return None

        if not pquery or not name:
            pquery, name = self._parse_keywords(message_body)

        T = current.T
        db = current.db
        s3db = current.s3db

        reply = None
        result = []

        #  Hospital Search [example: get name hospital facility status ]
        table = s3db.hms_hospital
        stable = s3db.hms_status
        query = (table.deleted == False) & \
                (current.auth.s3_accessible_query("read", table))
        rows = db(query).select(table.id, table.name, table.aka1, table.aka2,
                                table.phone_emergency)
        _name = soundex(str(name))
        for row in rows:
            if (_name == soundex(row.name)) or \
               (_name == soundex(row.aka1)) or \
               (_name == soundex(row.aka2)):
                result.append(row)

        if len(result) == 0:
            return T("No Match")

        elif len(result) > 1:
            return T("Multiple Matches")

        else:
            # Single Match
            hospital = result[0]
            status = db(stable.hospital_id == hospital.id).select(
                stable.facility_status,
                stable.clinical_status,
                stable.security_status,
                limitby=(0, 1)).first()
            reply = "%s %s (%s) " % (reply, hospital.name, T("Hospital"))
            if "phone" in pquery:
                reply = reply + "Phone->" + str(hospital.phone_emergency)
            if "facility" in pquery:
                reply = reply + "Facility status " + \
                   str(stable.facility_status.represent\
                                           (status.facility_status))
            if "clinical" in pquery:
                reply = reply + "Clinical status " + \
                    str(stable.clinical_status.represent\
                                            (status.clinical_status))
            if "security" in pquery:
                reply = reply + "Security status " + \
                    str(stable.security_status.represent\
                                            (status.security_status))

        return reply