def get(self, table_id=""): """Checks if a given table exists""" con = db.get_engine(bind="summarization") if con.dialect.has_table(con, table_id): return BARUtils.success_exit(True) else: return BARUtils.success_exit(False)
def get(self, table_id, sample, gene): """Returns the value for a given gene and sample. If no sample is given returns all values for that gene""" if not BARUtils.is_arabidopsis_gene_valid(gene): return BARUtils.success_exit("Invalid gene ID"), 400 else: key = request.headers.get("X-Api-Key") if SummarizationGeneExpressionUtils.decrement_uses(key): con = db.get_engine(bind="summarization") tbl = SummarizationGeneExpressionUtils.get_table_object( table_id) if sample == "": values = {} try: rows = con.execute( tbl.select(tbl.c.Value).where(tbl.c.Gene == gene)) except SQLAlchemyError: return BARUtils.error_exit( "Internal server error"), 500 for row in rows: values.update({str(row.Sample): float(row.Value)}) else: values = [] try: rows = con.execute( tbl.select(tbl.c.Value).where( tbl.c.Sample == sample).where( tbl.c.Gene == gene)) except SQLAlchemyError: return BARUtils.error_exit( "Internal server error"), 500 [values.append(row.Value) for row in rows] return BARUtils.success_exit(values) else: return BARUtils.error_exit("Invalid API key")
def get_table_object(table_name): metadata = db.MetaData() table_object = db.Table( table_name, metadata, autoload=True, autoload_with=db.get_engine(bind="summarization"), ) return table_object
def get(self, table_id=""): """Returns the list of samples in the table with the given ID""" con = db.get_engine(bind="summarization") tbl = SummarizationGeneExpressionUtils.get_table_object(table_id) values = [] try: rows = con.execute(db.select([tbl.c.Sample]).distinct()) except SQLAlchemyError: return BARUtils.error_exit("Internal server error"), 500 [values.append(row.Sample) for row in rows] return BARUtils.success_exit(values)
def get(self, table_id="", user_string=""): """Returns all genes that contain a given string as part of their name""" con = db.get_engine(bind="summarization") tbl = SummarizationGeneExpressionUtils.get_table_object(table_id) values = [] try: rows = con.execute( db.select([tbl.c.Gene]).where( tbl.c.Gene.contains(user_string)).distinct()) except SQLAlchemyError: return BARUtils.error_exit("Internal server error"), 500 [values.append(row.Gene) for row in rows] return BARUtils.success_exit(values)
def get(self, table_id=""): """Returns the list of genes in the table with the given ID""" key = request.headers.get("x-api-key") if SummarizationGeneExpressionUtils.decrement_uses(key): con = db.get_engine(bind="summarization") tbl = SummarizationGeneExpressionUtils.get_table_object(table_id) values = [] try: rows = con.execute(db.select([tbl.c.Gene]).distinct()) except SQLAlchemyError: return BARUtils.error_exit("Internal server error"), 500 [values.append(row.Gene) for row in rows] return BARUtils.success_exit(values) else: return BARUtils.error_exit("Invalid API key")
def decrement_uses(key): """Subtracts 1 from the uses_left column of the user whose key matches the given string :param key: The user's API key """ if SummarizationGeneExpressionUtils.validate_api_key(key): tbl = SummarizationGeneExpressionUtils.get_table_object("users") con = db.get_engine(bind="summarization") try: con.execute( db.update(tbl).where(tbl.c.api_key == key).values( uses_left=(tbl.c.uses_left - 1))) db.session.commit() except SQLAlchemyError as e: error = str(e.__dict__["orig"]) return error return True else: return False
def validate_api_key(key): """Checks if a given API key is in the Users database :param key: The API key to be checked """ tbl = SummarizationGeneExpressionUtils.get_table_object("users") con = db.get_engine(bind="summarization") try: row = con.execute( db.select([tbl.c.uses_left ]).where(tbl.c.api_key == key)).first() except SQLAlchemyError as e: error = str(e.__dict__["orig"]) return error if row is None: return False else: if row.uses_left > 0: return True else: return False
def post(self): """This function adds a CSV's data to the database. This is only called by the Cromwell server after receiving the user's file.""" if request.remote_addr != "127.0.0.1": return BARUtils.error_exit("Forbidden"), 403 if request.method == "POST": key = request.headers.get("X-Api-Key") if SummarizationGeneExpressionUtils.decrement_uses(key): csv = request.get_json()["csv"] db_id = request.get_json()["uid"] df = pandas.read_csv(csv) db_id = db_id.split(".")[0] df = df.melt(id_vars=["Gene"], var_name="Sample", value_name="Value") db_id = db_id.split("/")[len(db_id.split("/")) - 1] con = db.get_engine(bind="summarization") df.to_sql(db_id, con, if_exists="append", index=True) return BARUtils.success_exit("Success") else: return BARUtils.error_exit("Invalid API key")
def get(self): """Get a user's details from the server""" if request.method == "GET": key = request.headers.get("X-Api-Key") tbl = SummarizationGeneExpressionUtils.get_table_object("users") con = db.get_engine(bind="summarization") values = [] try: rows = con.execute(db.select("*").where(tbl.c.api_key == key)) except SQLAlchemyError: return BARUtils.error_exit("Internal server error"), 500 [ values.append([ row.first_name, row.last_name, row.email, row.telephone, row.contact_type, ]) for row in rows ] return BARUtils.success_exit(values)
def post(self): if request.method == "POST": response_json = request.get_json() df = pandas.DataFrame.from_records([response_json]) con = db.get_engine(bind="summarization") try: reqs = Requests() users = Users() row_req = reqs.query.filter_by(email=df.email[0]).first() row_users = users.query.filter_by(email=df.email[0]).first() if row_req is None and row_users is None: df.to_sql("requests", con, if_exists="append", index=False) if ApiManagerUtils.send_email(): return BARUtils.success_exit("Data added, email sent") else: return BARUtils.success_exit( "Data added, email failed") else: return BARUtils.error_exit("E-mail already in use"), 409 except SQLAlchemyError: return BARUtils.error_exit("Internal server error"), 500
def post(self): """Approve a request from the database and add it to the Users table""" if request.method == "POST": response_json = request.get_json() email = response_json["email"] password = response_json["password"] if ApiManagerUtils.check_admin_pass(password): table = Requests() values = [] try: rows = table.query.filter_by(email=email).all() except SQLAlchemyError: return BARUtils.error_exit("Internal server error"), 500 key = uuid.uuid4().hex [ values.append({ "first_name": row.first_name, "last_name": row.last_name, "email": row.email, "telephone": row.telephone, "contact_type": row.contact_type, "date_added": datetime.now(), "status": "user", "api_key": key, "uses_left": 25, }) for row in rows ] df = pandas.DataFrame.from_records([values[0]]) con = db.get_engine(bind="summarization") try: df.to_sql("users", con, if_exists="append", index=False) el = table.query.filter_by(email=email).one() db.session.delete(el) except SQLAlchemyError: return BARUtils.error_exit("Internal server error"), 500 return BARUtils.success_exit(key) else: return BARUtils.error_exit("Forbidden"), 403