Esempio n. 1
0
def validate(request_body: dict) -> Optional[str]:
    """
    Returns an error message if the /api/assessments post request
    is not valid. Else, returns None.

    :param request_body: The request body as a dict object
                        {
                            "dateAssessed": 1551447833, - required
                            "diagnosis": "patient is fine",
                            "medicationPrescribed": "tylenol",
                            "healthcareWorkerId": 2,
                            "specialInvestigations": "bcccccccccddeeeff",
                            "treatment": "b",
                            "readingId": "asdasd82314278226313803", - required
                            "followupNeeded": True, - required
                            "followupInstructions": "pls help, give lots of tylenol" - required if followupNeeded = True
                        }

    :return: An error message if request body in invalid in some way. None otherwise.
    """
    error_message = None

    # Check if required keys are present
    required_keys = [
        "readingId",
        "followupNeeded",
        "dateAssessed",
        "healthcareWorkerId",
    ]
    error_message = required_keys_present(request_body, required_keys)
    if error_message is not None:
        return error_message

    # If patient has followupNeeded set to True, make sure followupInstructions is filled in
    if request_body.get("followupNeeded") == True:
        error_message = required_keys_present(request_body,
                                              ["followupInstructions"])
    if error_message is not None:
        return error_message

    # Check that certain fields are of type string
    error_message = values_correct_type(request_body, ["readingId"], str)
    if error_message is not None:
        return error_message

    # Check that certain fields are of type int
    error_message = values_correct_type(request_body, ["dateAssessed"], int)
    if error_message is not None:
        return error_message

    return error_message
def validate_timestamp(request_body: dict) -> Optional[str]:
    """Returns error message if timestamp body is invalid,
    otherwise returns None

    :param request_body:
        {
            "from": "1546702448" -- required
            "to": "1547212259" -- required
        }

    """
    error_message = None
    required_keys = ["from", "to"]
    error_message = required_keys_present(request_body, required_keys)
    if error_message is not None:
        return error_message

    list_of_values = [request_body.get("from"), request_body.get("to")]

    for value in list_of_values:
        error_message = values_correct_type(request_body, value, str)
        if error_message is not None:
            return error_message

    return error_message
def validate_time_frame_readings(request_body: dict) -> Optional[str]:
    """
    Returns error message if the api/stats-timeframed-readings post request
    is not valid, otherwise returns None.

    :param request_body: Request as a dict object
        {
            "timeframe:{                -required
                "from": "1546702448"
                "to": "1547212259"
            }
        }
    """

    error_message = None
    # Check for required keys
    required_keys = ["timeframe"]
    error_message = required_keys_present(request_body, required_keys)
    if error_message is not None:
        return error_message

    # Check that the json is valid
    error_message = validate_timestamp(request_body.get("timeframe"))
    if error_message is not None:
        return error_message
def validate(request_body: dict) -> Optional[str]:
    """
    Returns an error message if the /api/facilities post request
    is not valid. Else, returns None.

    :param request_body: The request body as a dict object
                        {
                            "healthFacilityName": "H12", - required
                            "healthFacilityPhoneNumber": "444-444-4444",
                            "about": "Biggest hospital",
                            "facilityType": "HOSPITAL"
                        }
    :return: An error message if request body in invalid in some way. None otherwise.
    """

    error_message = None

    # Check if required keys are present
    required_keys = ["healthFacilityName"]
    error_message = required_keys_present(request_body, required_keys)
    if error_message is not None:
        return error_message

    # Check that certain fields are of type string
    error_message = values_correct_type(request_body, ["healthFacilityName"],
                                        str)
    if error_message is not None:
        return error_message

    return error_message
Esempio n. 5
0
def validate(request_body: dict) -> Optional[str]:
    """
    Returns an error message if the /api/associations post request
    is not valid. Else, returns None.

    :param request_body: The request body as a dict object
                        {
                            "patientId": 47, - required
                            "healthFacilityName": "H0000",
                            "userId": 1,
                        }
    :return: An error message if request body in invalid in some way. None otherwise.
    """
    error_message = None

    # Check if required keys are present
    required_keys = ["patientId"]
    error_message = required_keys_present(request_body, required_keys)
    if error_message is not None:
        return error_message

    return error_message
def validate(request_body: dict) -> Optional[str]:
    """
    Returns an error message if the /api/patients post request
    is not valid. Else, returns None.

    :param request_body: The request body as a dict object
                        {
                            "patientId": "123456", - required
                            "patientName": "testName", - required
                            "isPregnant": True, - required
                            "patientSex": "FEMALE", - required
                            "householdNumber": "20",
                            "dob": "1990-05-30",
                            "isExactDob: false
                            "zone": "15",
                            "villageNumber": "50",
                            "gestationalTimestamp": 1587068710, - required if isPregnant = True
                            "gestationalAgeUnit": "GESTATIONAL_AGE_UNITS_WEEKS", - required isPregnant = True
                            "drugHistory": "too much tylenol",
                            "medicalHistory": "not enough advil"
                        }
    :return: An error message if request body in invalid in some way. None otherwise.
    """
    error_message = None

    # Check if required keys are present
    required_keys = [
        "patientId",
        "patientName",
        "patientSex",
        "isPregnant",
        "dob",
        "isExactDob",
    ]
    error_message = required_keys_present(request_body, required_keys)
    if error_message is not None:
        return error_message

    # Check that certain fields are of type bool
    error_message = values_correct_type(request_body, ["isPregnant"], bool)
    if error_message is not None:
        return error_message

    # If patient is pregnant, check  if certain pregnancy related fields are present
    if request_body.get("isPregnant") == True:
        error_message = required_keys_present(
            request_body, ["gestationalTimestamp", "gestationalAgeUnit"])
    if error_message is not None:
        return error_message

    # Check if gestational age is less than or equal to 43 weeks/10 months
    if "gestationalTimestamp" in request_body:
        error_message = check_gestational_age_under_limit(
            int(request_body.get("gestationalTimestamp")))
    if error_message is not None:
        return error_message

    # Check that certain fields are of type string
    error_message = values_correct_type(request_body, ["patientName"], str)
    if error_message is not None:
        return error_message

    # Check that certain fields are of type int
    error_message = values_correct_type(request_body, ["patientId"], int)
    if error_message is not None:
        return error_message

    # Check that patientId is not over the 14 digit limit.
    if len(str(request_body.get("patientId"))) > 14:
        return "patientId is too long. Max is 14 digits."

    # Make sure the dob is in YYYY-mm-dd format
    if not is_correct_date_format(request_body.get("dob")):
        return "dob is not in the required YYYY-MM-DD format."

    return error_message
def validate(request_body: dict) -> Optional[str]:
    """
    Returns an error code and message if the /api/readings post request
    is not valid. Else, returns None.

    :param request_body: The request body as a dict object
                        {
                            "readingId": "asdasd82314278226313803", - required
                            "patientId": "123456", - required
                            "bpSystolic" : 150, - required
                            "bpDiastolic" : 150, - required
                            "heartRateBPM" : 35, - required
                            "isFlaggedForFollowup" : True,
                            "symptoms": ["Headache,Blurred vision,Bleeding,sleepy"], - required
                            "dateTimeTaken": 868545,
                            "userId": 1,
                            "followup": {
                                "dateAssessed": 1551447833,
                                "healthcareWorkerId": 2,
                                "diagnosis": "patient is fine",
                                "medicationPrescribed": "tylenol",
                                "specialInvestigations": "bcccccccccddeeeff",
                                "treatment": "b",
                                "readingId": "test3",
                                "followupNeeded": "TRUE",
                                "followupInstructions": "pls help, give lots of tylenol"
                            }
                        }
    :return: An error message if request body in invalid in some way. None otherwise.
    """
    error_message = None

    # Check if required keys are present
    required_keys = [
        "readingId",
        "patientId",
        "bpSystolic",
        "bpDiastolic",
        "heartRateBPM",
        "symptoms",
    ]
    error_message = required_keys_present(request_body, required_keys)
    if error_message is not None:
        return error_message

    # Check that certain fields are of type string
    error_message = values_correct_type(request_body, ["readingId"], str)
    if error_message is not None:
        return error_message

    # Check that certain fields are of type int
    error_message = values_correct_type(
        request_body,
        [
            "patientId",
            "bpSystolic",
            "bpDiastolic",
            "heartRateBPM",
            "userId",
        ],
        int,
    )
    if error_message is not None:
        return error_message

    # Check that certain fields are an array
    error_message = values_correct_type(request_body, ["symptoms"], list)
    if error_message is not None:
        return error_message

    # Check if the nested assessment (followup) object is valid
    if "followup" in request_body:
        error_message = validate_assessment(request_body.get("followup"))
        if error_message is not None:
            return error_message

    return error_message
def validate(request_body: dict) -> Optional[str]:
    """
    Returns an error message if the /api/referrals post request
    is not valid. Else, returns None.

    :param request_body: The request body as a dict object
                        {
                        "referralId":"e9b1d6b0-a098-4c0a-ab47-bda85a1890c7",
                        "patient":{
                                "gestationalTimestamp":two_weeks_ago,
                                "gestationalAgeUnit":"GESTATIONAL_AGE_UNITS_MONTHS",
                                "patientId":"2",
                                "patientName":"A",
                                "dob":"2000-01-01",
                                "patientSex":"FEMALE",
                                "isPregnant":True,
                                "drugHistory":"",
                                "medicalHistory":"",
                                "lastEdited":1596688734,
                                "base":1596688734,
                                "readings":[
                                    {
                                    "readingId":"0af5db8f-60b2-4c66-92d2-82aa08d31fd0",
                                    "patientId":"2",
                                    "dateTimeTaken":1596938834,
                                    "bpSystolic":55,
                                    "bpDiastolic":65,
                                    "heartRateBPM":75,
                                    "dateRecheckVitalsNeeded":1596939723,
                                    "isFlaggedForFollowup":False,
                                    "symptoms":[
                                        "Blurred vision"
                                    ],
                                    "referral":{
                                        "dateReferred":1596938834,
                                        "comment":"here is a comment",
                                        "patientId":"2",
                                        "referralHealthFacilityName":"H0000",
                                        "readingId":"0af5db8f-60b2-4c66-92d2-82aa08d31fd0",
                                        "isAssessed":False
                                    },
                                    "urineTests":{
                                        "urineTestLeuc":"-",
                                        "urineTestNit":"+",
                                        "urineTestPro":"++",
                                        "urineTestBlood":"++",
                                        "urineTestGlu":"-"
                                    },
                                    "retestOfPreviousReadingIds":""
                                    }
                                ]
                            }
                        }
    :return: An error message if request body in invalid in some way. None otherwise.
    """
    error_message = None

    # Check if required keys are present
    required_keys = ["referralId"]
    error_message = required_keys_present(request_body, required_keys)
    if error_message is not None:
        return error_message

    # Check that nested `patient` JSON is valid
    error_message = validate_patient(request_body.get("patient"))
    if error_message is not None:
        return error_message

    # Check that each element in the nested `readings` array is valid
    list_of_readings = request_body.get("patient").get("readings")

    for reading_body in list_of_readings:
        # Validate the reading itself
        error_message = validate_reading(reading_body)
        if error_message is not None:
            return error_message

        referral_body = reading_body.get("referral")

        # Check if required keys are present
        error_message = required_keys_present(
            referral_body,
            [
                "dateReferred",
                "readingId",
                "isAssessed",
                "patientId",
                "referralHealthFacilityName",
            ],
        )
        if error_message is not None:
            return error_message

        # Check that certain fields are of type int
        error_message = values_correct_type(request_body, ["dateReferred"],
                                            int)
        if error_message is not None:
            return error_message

        # Check that certain fields are of type string
        error_message = values_correct_type(request_body, ["readingId"], str)
        if error_message is not None:
            return error_message

    return error_message