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)
예제 #11
0
    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
예제 #12
0
 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