Ejemplo n.º 1
0
    def post(self):
        """
        Create a new biospecimen
        ---
        template:
          path:
            new_resource.yml
          properties:
            resource:
              Biospecimen
        """

        body = request.get_json(force=True)

        # Deserialize
        try:
            s = BiospecimenSchema(strict=True).load(body).data
        # Request body not valid
        except ValidationError as e:
            abort(400, 'could not create biospecimen: {}'.format(e.messages))

        # Add to and save in database
        db.session.add(s)
        db.session.commit()

        return BiospecimenSchema(201, 'biospecimen {} created'.format(
            s.kf_id)).jsonify(s), 201
Ejemplo n.º 2
0
    def patch(self, kf_id):
        """
        Update an existing biospecimen. Allows partial update of resource
        ---
        template:
          path:
            update_by_id.yml
          properties:
            resource:
              Biospecimen
        """
        sa = Biospecimen.query.get(kf_id)
        if sa is None:
            abort(404, 'could not find {} `{}`'.format('biospecimen', kf_id))

        # Partial update - validate but allow missing required fields
        body = request.get_json(force=True) or {}
        try:
            sa = BiospecimenSchema(strict=True).load(body,
                                                     instance=sa,
                                                     partial=True).data
        except ValidationError as err:
            abort(400, 'could not update biospecimen: {}'.format(err.messages))

        db.session.add(sa)
        db.session.commit()

        return BiospecimenSchema(200, 'biospecimen {} updated'.format(
            sa.kf_id)).jsonify(sa), 200
Ejemplo n.º 3
0
    def delete(self, kf_id):
        """
        Delete biospecimen by id

        Deletes a biospecimen given a Kids First id
        ---
        template:
          path:
            delete_by_id.yml
          properties:
            resource:
              Biospecimen
        """

        # Check if biospecimen exists
        sa = Biospecimen.query.get(kf_id)
        if sa is None:
            abort(404, 'could not find {} `{}`'.format('biospecimen', kf_id))

        # Save in database
        db.session.delete(sa)
        db.session.commit()

        return BiospecimenSchema(200, 'biospecimen {} deleted'.format(
            sa.kf_id)).jsonify(sa), 200
Ejemplo n.º 4
0
    def get(self, filter_params, after, limit):
        """
        Get all biospecimens
        ---
        description: Get all biospecimens
        template:
          path:
            get_list.yml
          properties:
            resource:
              Biospecimen
        """
        # Get study id, diagnosis_id and remove from model filter params
        study_id = filter_params.pop('study_id', None)
        diagnosis_id = filter_params.pop('diagnosis_id', None)

        # Apply filter params
        q = (Biospecimen.query
             .filter_by(**filter_params))

        # Apply study_id filter and diagnosis_id filter
        from dataservice.api.participant.models import Participant

        if study_id:
            q = (q.join(Participant.biospecimens)
                 .filter(Participant.study_id == study_id))
        if diagnosis_id:
            q = (q.join(BiospecimenDiagnosis)
                 .filter(BiospecimenDiagnosis.diagnosis_id == diagnosis_id))

        return (BiospecimenSchema(many=True)
                .jsonify(Pagination(q, after, limit)))
Ejemplo n.º 5
0
 def get(self, kf_id):
     """
     Get biospecimens by id
     ---
     template:
       path:
         get_by_id.yml
       properties:
         resource:
           Biospecimen
     """
     sa = Biospecimen.query.get(kf_id)
     if sa is None:
         abort(404, 'could not find {} `{}`'.format('biospecimen', kf_id))
     return BiospecimenSchema().jsonify(sa)
Ejemplo n.º 6
0
    def get(self, filter_params, after, limit):
        """
        Get all biospecimens
        ---
        description: Get all biospecimens
        template:
          path:
            get_list.yml
          properties:
            resource:
              Biospecimen
        """
        # Get and remove special filter params that are not attributes of model
        study_id = filter_params.pop('study_id', None)
        diagnosis_id = filter_params.pop('diagnosis_id', None)
        genomic_file_id = filter_params.pop('genomic_file_id', None)

        # Get and remove any list type filter params that need to be
        # handled differently than others
        duo_ids = filter_params.pop('duo_ids', None)

        # Apply filter params
        q = (Biospecimen.query.filter_by(**filter_params))

        # Apply duo_ids filter
        # Get specimens whose duo ids list includes all values in duo_ids
        if duo_ids:
            duo_ids = [id_.strip() for id_ in duo_ids[0].split(',')]
            q = q.filter(Biospecimen.duo_ids.contains(duo_ids))

        # Apply study_id filter and diagnosis_id filter
        from dataservice.api.participant.models import Participant

        if study_id:
            q = (q.join(Participant.biospecimens).filter(
                Participant.study_id == study_id))
        if diagnosis_id:
            q = (q.join(BiospecimenDiagnosis).filter(
                BiospecimenDiagnosis.diagnosis_id == diagnosis_id))
        if genomic_file_id:
            q = (q.join(BiospecimenGenomicFile).filter(
                BiospecimenGenomicFile.genomic_file_id == genomic_file_id))

        return (BiospecimenSchema(many=True).jsonify(
            Pagination(q, after, limit)))