class StudyByStatusListEndpoint(flask_restful.Resource):
    studiesSchema = StudySchema(many=True)

    def get(self, status):
        studies = db.session.query(Study).filter_by(status=status).order_by(
            Study.last_updated.desc())
        return self.studiesSchema.dump(studies)
class StudyEndpoint(flask_restful.Resource):

    schema = StudySchema()

    def get(self, id):
        model = db.session.query(Study).filter_by(id=id).first()
        if model is None: raise RestException(RestException.NOT_FOUND)
        return self.schema.dump(model)

    def delete(self, id):
        study = db.session.query(Study).filter_by(id=id).first()

        if study is not None:
            elastic_index.remove_document(study, 'Study')

        db.session.query(StudyUser).filter_by(study_id=id).delete()
        db.session.query(StudyInvestigator).filter_by(study_id=id).delete()
        db.session.query(StudyCategory).filter_by(study_id=id).delete()
        db.session.query(Study).filter_by(id=id).delete()
        db.session.commit()
        return None

    def put(self, id):
        request_data = request.get_json()
        instance = db.session.query(Study).filter_by(id=id).first()
        try:
            updated = self.schema.load(request_data, instance=instance)
        except Exception as errors:
            raise RestException(RestException.INVALID_OBJECT, details=errors)
        updated.last_updated = datetime.datetime.utcnow()
        db.session.add(updated)
        db.session.commit()
        elastic_index.update_document(updated, 'Study')
        return self.schema.dump(updated)
class StudyByAgeEndpoint(flask_restful.Resource):
    studiesSchema = StudySchema(many=True)

    def get(self, status, age):
        # session.query(TestArr).filter(Any(2, TestArr.partners)).all()
        studies = db.session.query(Study).filter_by(status=status).filter(
            Study.ages.any(age)).order_by(Study.last_updated.desc())
        return self.studiesSchema.dump(studies)
class StudyListEndpoint(flask_restful.Resource):

    studiesSchema = StudySchema(many=True)
    studySchema = StudySchema()

    def get(self):
        studies = db.session.query(Study).all()
        return self.studiesSchema.dump(studies)

    def post(self):
        request_data = request.get_json()
        try:
            load_result = self.studySchema.load(request_data)
            db.session.add(load_result)
            db.session.commit()
            elastic_index.add_document(load_result, 'Study')
            return self.studySchema.dump(load_result)
        except ValidationError as err:
            raise RestException(RestException.INVALID_OBJECT,
                                details=load_result.errors)
Esempio n. 5
0
class RelatedResultsEndpoint(flask_restful.Resource):
    resourcesSchema = ResourceSchema(many=True)
    studiesSchema = StudySchema(many=True)

    def post(self):
        request_data = request.get_json()
        try:
            is_resource = 'resource_id' in request_data.keys()
            item_id = request_data[
                'resource_id'] if is_resource else request_data['study_id']
            model = Resource if is_resource else Study
            item = db.session.query(model).filter_by(id=item_id).first()
            results = elastic_index.more_like_this(item, max_hits=30)
        except elasticsearch.ElasticsearchException as e:
            raise RestException(RestException.ELASTIC_ERROR,
                                details=json.dumps(e))

        resource_ids = []
        study_ids = []
        max_length = 3
        for hit in results:
            if hit.type == 'study':
                same_study = ((not is_resource) and (item_id == hit.id))
                if not same_study and len(study_ids) < max_length:
                    study_ids.append(hit.id)
            else:
                same_resource = (is_resource and (item_id == hit.id))
                if not same_resource and len(resource_ids) < max_length:
                    resource_ids.append(hit.id)

        related_resources = db.session.query(Resource).filter(
            Resource.id.in_(resource_ids))
        related_studies = db.session.query(Study).filter(
            Study.id.in_(study_ids))

        return jsonify({
            'resources':
            self.resourcesSchema.dump(related_resources)[0],
            'studies':
            self.studiesSchema.dump(related_studies)[0],
        })