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)
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], })