Ejemplo n.º 1
0
def get_workers_positive_at_facility():
    conn.connect()

    data = request.get_json()
    date_formatted = datetime.datetime.strptime(data["testDate"], "%Y-%m-%d")
    date_before = date_formatted - datetime.timedelta(days=14)
    date_before_str = date_before.strftime("%Y-%m-%d")
    query = f"""SELECT workerID, P.firstName, P.lastName
                FROM
                (SELECT healthWorkerID
                FROM workerHealthCenterMapping
                WHERE healthCenterID = {data['healthCenterID']}) as WHCM, publicHealthWorker as PHW, diagnostic as D, person as P
                WHERE 
                    WHCM.healthWorkerID = PHW.workerID and
                    D.testDate = '{data['testDate']}' and
                    PHW.medicareNumber = P.medicareNumber
        """

    conn.cursor.execute(query)

    resp = conn.cursor.fetchall()

    if resp is None:
        return {"response": "failed", "reason": "query failed"}

    res = []
    for worker in resp:
        temp = {}
        temp["sickWorker"] = worker
        workerid = worker["workerID"]
        temp["atRiskWorkers"] = get_all_at_risk_workers(
            date_before_str, data["testDate"], workerid)
        res.append(temp)

    return jsonify(res)
Ejemplo n.º 2
0
def get_region_reports():
    conn.connect()

    query = """SELECT negative_count.regionName, positive_count.count as positiveCount, negative_count.count as negativeCount
                FROM 
                (SELECT count(P.medicareNumber) as count, D.result, C.regionName
                FROM diagnostic as D, person as P, city as C
                WHERE 
                    D.result = true and
                    D.medicareNumber = P.medicareNumber and
                    P.city = C.`name`
                GROUP BY D.result, C.regionName) as positive_count,
                (SELECT count(P.medicareNumber) as count, D.result, C.regionName
                FROM diagnostic as D, person as P, city as C
                WHERE 
                    D.result = false and
                    D.medicareNumber = P.medicareNumber and
                    P.city = C.`name`
                GROUP BY D.result, C.regionName) as negative_count
                WHERE negative_count.regionName = positive_count.regionName;
        """

    conn.cursor.execute(query)

    columns = [col[0] for col in conn.cursor.description]
    rows = [dict(zip(columns, row)) for row in conn.cursor.fetchall()]

    for report in rows:
        alerts = get_single("alert", {"regionName": report["regionName"]})
        report["alertHistory"] = alerts

        for alert in alerts:
            alert.pop("regionName", None)

    return jsonify(rows)
Ejemplo n.º 3
0
def messages():
    conn.connect()

    required = [
        "startDateTime",
        "endDateTime",
    ]

    data = request.get_json()

    if any(x not in data for x in required):
        return {
            "response": "fail",
            "reason": f"Expected keys: {str(required)}"
        }

    query = (f"SELECT * FROM message "
             f"WHERE dateTime >= \"{data['startDateTime']}\" "
             f"AND dateTime <= \"{data['endDateTime']}\" ")
    conn.cursor.execute(query)

    return (jsonify(conn.cursor.fetchall()) if conn.cursor is not None else {
        "response": "failed",
        "reason": "query failed"
    })
Ejemplo n.º 4
0
def get_single(table, data, json=False, **kwargs):
    if table is None or data is None:
        return {"response": "failed", "reason": "query failed"}

    conn.connect()

    temp = ""
    for k, v in data.items():
        if isinstance(v, str):
            temp += "{} = '{}' and ".format(k, v)
        else:
            temp += "{} = {} and ".format(k, v)
    temp = temp[:-5]

    query = ("SELECT * FROM {} WHERE {}").format(table, temp)

    conn.cursor.execute(query)
    if json:
        return (jsonify(conn.cursor.fetchall())
                if conn.cursor is not None else {
                    "response": "failed",
                    "reason": "query failed"
                })
    else:
        return conn.cursor.fetchall()
Ejemplo n.º 5
0
def facilities():
    conn.connect()
    query = "SELECT * FROM publicHealthCenter"
    conn.cursor.execute(query)
    return (jsonify(conn.cursor.fetchall()) if conn.cursor is not None else {
        "response": "failed",
        "reason": "query failed"
    })
Ejemplo n.º 6
0
def set_alert_for_region():
    conn.connect()

    data = request.get_json()
    previous_alert = get_previous_alert(data["regionName"])

    if not (0 <= data["alertLevel"] < 4):
        raise Exception("invalid alert level")

    if (data["alertLevel"] + 1
            is not previous_alert) and (data["alertLevel"] - 1
                                        is not previous_alert):
        raise Exception("cannot set alert to this level")

    action_create("alert", data)

    query = f"""SELECT email FROM person p
                WHERE p.city IN (
                    SELECT name FROM city 
                        WHERE regionName = '{data["regionName"]}'
                )
        """
    conn.cursor.execute(query)
    peopleInRegion = conn.cursor.fetchall()

    query = f"""SELECT prompt FROM alertDetails
                WHERE alertLevel = '{data["alertLevel"]}'
        """
    conn.cursor.execute(query)
    alertPrompt = conn.cursor.fetchall()[0]["prompt"]

    messages = ""

    for person in peopleInRegion:
        messages += f'(\'{person["email"]}\', {previous_alert}, {data["alertLevel"]}, \'{alertPrompt}\'),'

    messages = messages[:-1]

    query = f"""INSERT INTO message 
            (
                email, oldAlertLevel, newAlertLevel, description
            )
            VALUES
            {messages}
        """
    conn.cursor.execute(query)
    conn.cnx.commit()

    return {"response": "success"}
Ejemplo n.º 7
0
def get_all(table, json=False, **kwargs):
    if table is None:
        return {"response": "failed", "reason": "query failed"}
    conn.connect()

    query = f"SELECT * FROM {table}"
    conn.cursor.execute(query)
    if json:
        return (jsonify(conn.cursor.fetchall())
                if conn.cursor is not None else {
                    "response": "failed",
                    "reason": "query failed"
                })
    else:
        return conn.cursor.fetchall()
Ejemplo n.º 8
0
def get_previous_alert(region_name):
    conn.connect()

    query = f"""SELECT DISTINCT alertLevel, date
            FROM alert
            WHERE regionName = '{region_name}'
            ORDER BY date DESC
            LIMIT 1
        """

    conn.cursor.execute(query)

    resp = conn.cursor.fetchall()[0]
    if conn.cursor is not None:
        return resp["alertLevel"]
Ejemplo n.º 9
0
def action_create(table, data, **kwargs):
    conn.connect()

    temp = ""
    values = ""
    for k, v in data.items():
        temp += "{},".format(k)
        values += "'{}',".format(v)
    temp = temp[:-1]
    values = values[:-1]

    query = ("INSERT INTO {} ({}) VALUES ({});").format(table, temp, values)

    conn.cursor.execute(query)
    conn.cnx.commit()

    return conn.cursor.lastrowid
Ejemplo n.º 10
0
def get_all_workers_at_facility(facilityID):
    conn.connect()

    query = f"""SELECT P.firstName, P.lastName, WHCM.healthWorkerID, P.medicareNumber, WHCM.healthCenterID, P.email, P.phoneNumber, P.dateOfBirth
            FROM pfc353_4.workerHealthCenterMapping as WHCM, pfc353_4.publicHealthWorker as PHW, pfc353_4.person as P
            WHERE
                healthCenterID = {facilityID} and
                WHCM.healthWorkerID = PHW.workerID and
                PHW.medicareNumber = P.medicareNumber and
                WHCM.endDate is null
        """

    conn.cursor.execute(query)
    return (jsonify(conn.cursor.fetchall()) if conn.cursor is not None else {
        "response": "failed",
        "reason": "query failed"
    })
Ejemplo n.º 11
0
def get_date(json=True):
    conn.connect()

    query = """
    SELECT MAX(date) FROM currentDate;
    """

    conn.cursor.execute(query)
    date = conn.cursor.fetchall()[0]

    if json:
        return (conn.cursor.fetchall() if conn.cursor is not None else {
            "response": "failed",
            "reason": "query failed"
        })
    else:
        return date["MAX(date)"]
Ejemplo n.º 12
0
def get_all_at_risk_workers(from_date, to_date, workerId):
    conn.connect()
    query = f"""SELECT DISTINCT PHW2.workerID, P.firstName, P.lastName
            FROM workerSchedule as WS1, workerSchedule as WS2, publicHealthWorker as PHW2, person as P
            WHERE
                WS2.workerID <> {workerId} and
                WS2.date between '{from_date}' and '{to_date}' and
                WS1.workerID = {workerId} and
                WS1.healthCenterID = WS2.healthCenterID and
                WS2.workerID = PHW2.workerID and
                PHW2.medicareNumber = P.medicareNumber;
        """

    conn.cursor.execute(query)
    return (conn.cursor.fetchall() if conn.cursor is not None else {
        "response": "failed",
        "reason": "query failed"
    })
Ejemplo n.º 13
0
def action_delete(table, data, **kwargs):
    conn.connect()

    if not exists(table, data):
        return {"response": "failed", "reason": "data exists"}

    temp = ""
    for k, v in data.items():
        if isinstance(v, str):
            temp += "{} = '{}' and ".format(k, v)
        else:
            temp += "{} = {} and ".format(k, v)
    temp = temp[:-5]

    query = ("DELETE FROM {} WHERE {};").format(table, temp)
    conn.cursor.execute(query)
    conn.cnx.commit()

    return {"response": "sucess"}
Ejemplo n.º 14
0
def increment_date():
    conn.connect()

    # get date
    current_date = get_date(json=False)

    # add next date
    next_date = current_date + datetime.timedelta(days=1)

    query = f"""
    INSERT INTO currentDate
    VALUES (DATE '{next_date}')
    """

    conn.cursor.execute(query)
    conn.cnx.commit()

    new_date = get_date(json=False)
    if new_date == next_date:
        return jsonify({"response": "success", "date": next_date})
    else:
        return {"response": "failed", "reason": "unknown"}
Ejemplo n.º 15
0
def people_at_address():
    conn.connect()

    required = [
        "address",
        "city",
        "province",
        "postalCode",
        "country",
    ]

    data = request.get_json()

    if any(x not in data for x in required):
        return {
            "response": "fail",
            "reason": f"Expected keys: {str(required)}"
        }

    query = ((""" SELECT child.firstName, child.lastName, child.dateOfBirth,
                        child.medicareNumber, child.phoneNumber, child.citizenship,
                        child.email, father.firstName as fatherFirstName,
                        father.lastName as fatherLastName,
                        mother.firstName motherFirstName, mother.lastName motherLastName
                FROM person as child
                JOIN (SELECT medicareNumber, firstName, lastName FROM person) as father on child.fatherMedicare = father.medicareNumber
                JOIN (SELECT medicareNumber, firstName, lastName FROM person) as mother on child.motherMedicare = mother.medicareNumber
                WHERE 
            """) + " AND ".join([f"{key}='{data[key]}'" for key in required]))

    print(query)
    # get people at address
    conn.cursor.execute(query)

    return (jsonify(conn.cursor.fetchall()) if conn.cursor is not None else {
        "response": "failed",
        "reason": "query failed"
    })
Ejemplo n.º 16
0
def action_edit(table, data, **kwargs):
    conn.connect()

    ids = {}
    datas = {}

    for key, value in data.items():
        if key in primary_keys[table]:
            ids[key] = value
        else:
            datas[key] = value

    if not exists(table, ids):
        return {"response": "failed", "reason": "data doesn't exist"}

    temp = ""
    for k, v in datas.items():
        if isinstance(v, str):
            temp += "{} = '{}',".format(k, v)
        else:
            temp += "{} = {},".format(k, v)
    temp = temp[:-1]

    temp2 = ""
    for k, v in ids.items():
        if isinstance(v, str):
            temp2 += "{} = '{}' and ".format(k, v)
        else:
            temp2 += "{} = {} and ".format(k, v)
    temp2 = temp2[:-5]

    query = ("UPDATE {} SET {} WHERE {};").format(table, temp, temp2)

    conn.cursor.execute(query)
    conn.cnx.commit()

    return {"response": "success"}
Ejemplo n.º 17
0
def get_all_test_results_on_specific_date():
    conn = conn.connect()
    conn.cursor = conn.conn.cursor()

    data = request.get_json()
    query = f"""SELECT P.firstName, P.lastName, P.dateOfBirth, P.phoneNumber, P.email, D.result
                FROM
                (SELECT medicareNumber, result
                    FROM diagnostic
                    WHERE testDate = '{data['testDate']}') as D, person as P
                WHERE P.medicareNumber = D.medicareNumber
                ORDER BY D.result DESC
        """

    conn.cursor.execute(query)

    return (jsonify(conn.cursor.fetchall()) if conn.cursor is not None else {
        "response": "failed",
        "reason": "query failed"
    })
Ejemplo n.º 18
0
def survey(action):
    conn.connect()
    if action == "store":
        required = [
            "medicareNumber",
            "dateOfBirth",
            "temperature",
            "symptoms",
        ]

        data = request.get_json()

        if any(x not in data for x in required):
            return {
                "response": "fail",
                "reason": f"Expected keys: {str(required)}"
            }

        query = f"""SELECT * FROM person
                WHERE medicareNumber = '{data["medicareNumber"]}'
                AND dateOfBirth = '{data["dateOfBirth"]}'
            """
        conn.cursor.execute(query)

        if len(conn.cursor.fetchall()):
            query = f"""INSERT INTO followUpForm
                    (
                        medicareNumber, temperature, fever, cough, shortnessOfBreath,
                        lossOfTaste, nausea, stomachAche, diarrhea, vomiting, headache, musclePain,
                        soreThroat, otherSymptoms
                    )
                    VALUES
                    (
                        '{data["medicareNumber"]}', {data["temperature"]}, {data["symptoms"]["fever"]},
                        {data["symptoms"]["cough"]}, {data["symptoms"]["shortnessOfBreath"]},
                        {data["symptoms"]["lossOfTaste"]}, {data["symptoms"]["nausea"]}, {data["symptoms"]["stomachAche"]},
                        {data["symptoms"]["diarrhea"]}, {data["symptoms"]["vomiting"]}, {data["symptoms"]["headache"]},
                        {data["symptoms"]["musclePain"]}, {data["symptoms"]["soreThroat"]}, '{data["symptoms"]["otherSymptoms"]}'
                    )
                """
            conn.cursor.execute(query)
            conn.cnx.commit()
            return {"response": "sucess"}
        else:
            return {
                "response": "fail",
                "reason": f"medicare + DoB don't match"
            }
    elif action == "get":
        required = [
            "medicareNumber",
            "date",
        ]

        data = request.get_json()

        if any(x not in data for x in required):
            return {
                "response": "fail",
                "reason": f"Expected keys: {str(required)}"
            }

        query = (f"SELECT * FROM followUpForm "
                 f"WHERE medicareNumber = \"{data['medicareNumber']}\" "
                 f"AND dateTime >= '{data['date']}' ")

        conn.cursor.execute(query)
        return (jsonify(conn.cursor.fetchall())
                if conn.cursor is not None else {
                    "response": "failed",
                    "reason": "query failed"
                })
Ejemplo n.º 19
0
app.route('/workers-positive-test/',
          methods=['POST'])(get_workers_positive_at_facility)

# 17. report for each region
app.route('/region/report/', methods=['GET'])(get_region_reports)

# set alert for a given region
app.route('/set-region-alert/', methods=['POST'])(set_alert_for_region)

# Get current date
app.route('/get_date/', methods=['GET'])(get_date)

# Increment date in db
app.route('/increment-date/', methods=['GET'])(increment_date)


def on_starting(server):
    print("Starting up, connecting to DB")
    conn.connect()
    print("Connection to DB failed")


def on_exit(server):
    conn.cursor.close()
    conn.cnx.close()


if __name__ == "__main__":
    conn.connect()
    app.run()
Ejemplo n.º 20
0
def on_starting(server):
    print("Starting up, connecting to DB")
    conn.connect()
    print("Connection to DB failed")