示例#1
0
def add_samples(body):
    """
    Creates a new sample following the Sample schema,
    only adding Sample level information.

    :param body: POST request body
    :type body: object

    :returns: message, 201 on success, error code on failure
    :rtype: object, int

    .. note::
        Refer to the OpenAPI Spec for a proper schemas of Sample objects.
    """

    db_session = get_session()

    print(body)

    if not body.get("patient_id"):
        err = dict(message="No patient_id provided", code=400)
        return err, 400

    if not body.get("sample_id"):
        err = dict(message="No sample_id provided", code=400)
        return err, 400

    if not body.get("description"):
        err = dict(message="No description provided", code=400)
        return err, 400

    body["created"] = datetime.datetime.utcnow()

    try:
        orm_sample = Sample(**body)
    except TypeError as e:
        err = _report_conversion_error("sample", e, **body)
        return err, 400

    try:
        db_session.add(orm_sample)
        db_session.commit()
    except exc.IntegrityError as ie:
        if ie.args[0].find("FOREIGN KEY constraint failed"):
            db_session.rollback()
            err = _report_foreign_key("sample: " + body["sample_id"], **body)
            return err, 400

        db_session.rollback()
        err = _report_object_exists("sample: " + body["sample_id"], **body)
        return err, 400
    except ORMException as e:
        db_session.rollback()
        err = _report_write_error("sample", e, **body)
        return err, 500

    return {"code": 201, "message": "Sample successfully added"}, 201
示例#2
0
def add_segments(body):
    """
    Creates a new CNV following the CNV schema attached to an
    existing sample.

    :param body: POST request body
    :type body: object

    :returns: message, 201 on success, error code on failure
    :rtype: object, int

    .. note::
        Refer to the OpenAPI Spec for a proper schemas of CNV objects.
    """

    db_session = get_session()

    if not body.get("patient_id"):
        err = dict(message="No patient_id provided", code=400)
        return err, 400

    if not body.get("sample_id"):
        err = dict(message="No sample_id provided", code=400)
        return err, 400

    segments = body["segments"]
    for segment in segments:
        segment["sample_id"] = body["sample_id"]
        print(segment)
        try:
            orm_segment = CNV(**segment)
        except TypeError as e:
            err = _report_conversion_error("segment", e, **body)
            return err, 400

        try:
            db_session.add(orm_segment)
            db_session.commit()
        except exc.IntegrityError as ie:
            if ie.args[0].find("FOREIGN KEY constraint failed"):
                db_session.rollback()
                err = _report_foreign_key("segment: " + body["sample_id"],
                                          **body)
                return err, 400

            db_session.rollback()
            err = _report_object_exists("segment: " + body["sample_id"],
                                        **body)
            return err, 400
        except ORMException as e:
            db_session.rollback()
            err = _report_write_error("segment", e, **body)
            return err, 500

    return {"code": 201, "message": "Segments successfully added"}, 201
示例#3
0
def get_patients():
    """
    Return all individuals
    """

    db_session = get_session()

    try:
        q = db_session.query(Patient)
    except orm.ORMException as e:
        err = _report_search_failed("patient", e, patient_id="all")
        return err, 500

    patient_ids_dict = [orm.dump(p) for p in q]
    return [d["patient_id"] for d in patient_ids_dict], 200
示例#4
0
def get_samples(patient_id, tags=None, description=None):
    """
    Return samples of a patient.

    :param patient_id: Id of patient
    :type patient_id = string
    :param tags: List of tags
    :type tags: list

    :returns: samples, 200 on sucess, error code on failure
    :rtype: object, int
    """

    db_session = get_session()

    if not patient_id:
        err = dict(message="No patient_id provided", code=400)
        return err, 400

    try:
        q = db_session.query(Sample).filter_by(patient_id=patient_id)

        if tags:
            q = q.filter(or_(*[Sample.tags.contains(tag) for tag in tags]))

        if description:
            q = q.filter(Sample.description.contains(description))

    except orm.ORMException as e:
        err = _report_search_failed("sample", e, patient_id=patient_id)
        return err, 500

    response = {}
    dump = [orm.dump(p) for p in q]
    for d in dump:
        response["patient_id"] = d["patient_id"]
        samples = response.get("samples", [])
        samples_dict = dict(sample_id=d["sample_id"])
        if d.get("tags"):
            samples_dict["tags"] = d["tags"]
        samples_dict["created"] = d["created"]
        samples_dict["description"] = d["description"]
        samples.append(samples_dict)
        response["samples"] = samples

    return response, 200
示例#5
0
def add_patients(body):
    """
    Creates a new patient following the Patient schema,
    only adding Patient level information.

    :param body: POST request body
    :type body: object

    :returns: message, 201 on success, error code on failure
    :rtype: object, int

    .. note::
        Refer to the OpenAPI Spec for a proper schemas of Patient objects.
    """

    db_session = get_session()

    try:
        orm_patient = Patient(patient_id=body.get("patient_id"))
    except TypeError as e:
        err = _report_conversion_error("patient", e, **body)
        return err, 400

    try:
        db_session.add(orm_patient)
        db_session.commit()
    except exc.IntegrityError:
        db_session.rollback()
        err = _report_object_exists("patient: " + body["patient_id"], **body)
        return err, 400
    except ORMException as e:
        db_session.rollback()
        err = _report_write_error("patient", e, **body)
        return err, 500

    return {"code": 201, "message": "Patient successfully added"}, 201
示例#6
0
def get_segments(patient_id, sample_id, chromosome_number, start_position,
                 end_position):
    """
    Return segments within the specified region

    :param: patient_id: Id of patient
    :type: string
    :param: sample_id: Id of sample
    :type: string
    :param: chromosome_number: Chromosome number
    :type: string
    :param: start_position: Start position
    :type: integer
    :param: end_position: End position
    :type: integer

    :returns: segments, 200 on sucess, error code on failure
    :rtype: object, int
    """

    db_session = get_session()
    try:
        validate_uuid_string("patient_id", str(patient_id))
    except IdentifierFormatError as e:
        err = _report_search_failed(
            "cnv",
            e,
            patient_id=patient_id,
        )
        return err, 500

    if isinstance(sample_id, int):
        sample_id = str(sample_id)
    if isinstance(chromosome_number, int):
        chromosome_number = str(chromosome_number)

    try:
        q = (db_session.query(CNV).join(Sample).filter(
            CNV.chromosome_number == chromosome_number,
            Sample.sample_id == sample_id,
            Sample.patient_id == patient_id,
        ))
    except orm.ORMException as e:
        err = _report_search_failed(
            "cnv",
            e,
            patient_id=patient_id,
            sample_id=sample_id,
            chromosome_number=chromosome_number,
        )
        return err, 400

    response = []
    segments = [orm.dump(p) for p in q]
    for segment in segments:
        if ((segment["start_position"] >= start_position
             and segment["end_position"] <= end_position)
                or (segment["start_position"] <= start_position <=
                    segment["end_position"])
                or (segment["start_position"] <= end_position <=
                    segment["end_position"])
                or (start_position <= segment["start_position"]
                    and segment["end_position"] <= end_position)):
            del segment["sample_id"]
            response.append(segment)
    print(response)
    return response, 200