def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] print("Trying to log in: %s" % username) db = get_db() error = None user = db.execute( 'SELECT * FROM users WHERE username = ?', (username,) ).fetchone() if user is None: error = 'Incorrect username.' elif not check_password_hash(user['password'], password): error = 'Incorrect password. |%s| |%s|' % (user['password'],password) if error is None: session.clear() session['user_id'] = user['id'] print(user['id']) return redirect(url_for('home.index')) flash(error) return render_template('auth/login.html')
def register(): if request.method == 'POST': print(request.form) forename = request.form['forename'].title() surname = request.form['surname'].title() institution = request.form['institution'].lower() country = request.form['country'].title() username = request.form['email_address'] password = request.form['password'] password_redo = request.form['password_redo'] db = get_db() error = None if None in [forename,surname,institution,country,username,password,password_redo]: error = 'Please fill in all boxes' elif password!=password_redo: error = 'Passwords do not match' elif db.execute( 'SELECT id FROM user WHERE username = ?', (username,) ).fetchone() is not None: error = 'User {} is already registered.'.format(username) if error is None: db.execute( 'INSERT INTO users (username, forename, surname, password, institution, country) VALUES (?, ?, ?, ?, ?, ?)', (username, forename, surname, generate_password_hash(password), institution, country) ) db.commit() return redirect(url_for('auth.login')) flash(error) return render_template('auth/register.html')
def load_logged_in_user(): user_id = session.get('user_id') if user_id is None: g.user = None else: g.user = get_db().execute( 'SELECT * FROM users WHERE id = ?', (user_id,) ).fetchone()
def user_home(): db = get_db() data = {} sql_query = "select id,sample_name,created,status,lineage,drtype from results WHERE user_id = '%s'" % g.user[ "username"] raw_data = db.execute(sql_query).fetchall() data["num_samples"] = len(raw_data) data["top_lineage"] = Counter([x["lineage"] for x in raw_data]).most_common(1)[0][0] data["top_drtype"] = Counter([x["drtype"] for x in raw_data]).most_common(1)[0][0] return render_template('user/user_home.html', data=data)
def run_result(sample_id): db = get_db() tmp = db.execute("SELECT * FROM results WHERE id = ?", (str(sample_id), )).fetchone() if tmp == None: error = "Run does not exist" abort(404) run = dict(tmp) run["result"] = json.loads(tmp["result"]) if request.method == 'POST': json_results = run["result"] csv_strings = {} csv_strings["id"] = json_results["id"] csv_strings["date"] = run["created"] csv_strings["strain"] = json_results["sublin"] csv_strings["drtype"] = json_results["drtype"] csv_strings["dr_report"] = tbp.dict_list2csv( json_results["drug_table"], ["Drug", "Genotypic Resistance", "Mutations"] + []) csv_strings["lineage_report"] = tbp.dict_list2csv( json_results["lineage"], ["lin", "frac", "family", "spoligotype", "rd"], { "lin": "Lineage", "frac": "Estimated fraction" }) csv_strings["other_var_report"] = tbp.dict_list2csv( json_results["other_variants"], ["genome_pos", "locus_tag", "change", "freq"], { "genome_pos": "Genome Position", "locus_tag": "Locus Tag", "freq": "Estimated fraction" }) csv_strings["pipeline"] = tbp.dict_list2csv( json_results["pipline_table"], ["Analysis", "Program"]) csv_strings["version"] = json_results["tbprofiler_version"] csv_strings["db_version"] = json_results["db_version"] csv_text = tbp.load_csv(csv_strings) return Response(csv_text, mimetype="text/csv", headers={ "Content-disposition": "attachment; filename=%s.csv" % sample_id }) return render_template('results/run_result.html', run=run)
def upload(): db = get_db() if request.method == 'POST': print(request.form) error=None username = g.user['username'] if g.user else 'private' if "single_sample_submit" in request.form: platform=request.form["platform"] uniq_id = str(uuid.uuid4()) if "sample_name" in request.form: sample_name = request.form["sample_name"] if request.form["sample_name"]!="" else uniq_id else: sample_name = uniq_id if request.files['file1'].filename=="": error = "No file found for read 1, please try again!" if error==None: run_sample(db,username,uniq_id,sample_name,platform,request.files['file1'],request.files['file2']) return redirect(url_for('results.run_result', sample_id=uniq_id)) elif "multi_sample_submit" in request.form: x = request.form if request.form["r1_suffix"]!="" and request.form["r2_suffix"]!="": print("Setting suffix") r1_suffix = request.form["r1_suffix"].strip() r2_suffix = request.form["r2_suffix"].strip() elif request.form["r1_suffix"]=="" and request.form["r2_suffix"]=="": r1_suffix = "_1.fastq.gz" r2_suffix = "_2.fastq.gz" else: error = "If you would like to change the file suffix please fill in for both the forward and reverse" if error==None: files = {f.filename:f for f in list(request.files.lists())[0][1]} if len(files)%2!=0: error = "Odd number of files. There should be two files per sample, please check." if error==None: prefixes = set() for f in files.keys(): tmp1 = re.search("(.+)%s" % r1_suffix,f) tmp2 = re.search("(.+)%s" % r2_suffix,f) if tmp1==None and tmp2==None: error = "%s does not contain '_1.fastq.gz' or '_2.fastq.gz' as the file ending. Please revise your file names" % f break if tmp1: prefixes.add(tmp1.group(1)) if tmp2: prefixes.add(tmp2.group(1)) if error==None: runs = [] for p in prefixes: uniq_id = str(uuid.uuid4()) r1 = p + r1_suffix r2 = p + r2_suffix if r1 not in files: error = "%s is present in data file but not %s. Please check." % (r2,r1) if r2 not in files: error = "%s is present in data file but not %s. Please check." % (r1,r2) sample_name = p if g.user else uniq_id runs.append({"ID":uniq_id,"sample_name":sample_name,"R1":r1,"R2":r2}) if error==None: csv_text = "ID,Name,R1,R2\n" + "\n".join(["%(ID)s,%(sample_name)s,%(R1)s,%(R2)s" % d for d in runs]) for run in runs: run_sample(db,username,run["ID"],run["sample_name"],request.form["platform"],files[run["R1"]],files[run["R2"]]) return Response(csv_text,mimetype="text/csv",headers={"Content-disposition": "attachment; filename=tb-profiler-IDs.csv"}) flash(error) return render_template('upload/upload.html')
def result_table(request, user): db = get_db() if request.method == 'POST': if "search_strains_button" in request.form: sql_query = "select id,sample_name,created,status,lineage,drtype from results WHERE user_id = '%s'" % user filters = [] key_values = list(request.form.lists()) for key, values in list(request.form.lists()): if values == [""]: continue elif key == "sample_name": filters.append("( %s )" % (" OR ".join([ "sample_name = '%s'" % (run_id.strip()) for run_id in values[0].split(",") ]))) elif key == "project_id": pass # filters.append("( %s )" % (" OR ".join(["project_id = '%s'" % (run_id.strip()) for run_id in values[0].split(",")]))) elif key == "drtype": filters.append("( %s )" % (" OR ".join( ["drtype = '%s'" % (drtype) for drtype in values]))) elif key == "lineage": filters.append("( %s )" % (" OR ".join([ "lineage LIKE 'lineage%s%%'" % (lineage.strip().replace("lineage", "")) for lineage in values[0].split(",") ]))) else: pass if len(filters) > 0: sql_query = sql_query + " AND %s" % (" AND ".join(filters)) tmp = db.execute(sql_query).fetchall() return render_template('results/result_table.html', results=tmp, user=user) else: # print(request.form) if request.form["button"] == "download": ids = list(json.loads(request.form["ids"]).keys()) cmd = "select * from full_results where id in ( %s )" % ", ".join( ["'%s'" % x for x in ids]) data = db.execute(cmd).fetchall() fieldnames = [ x["name"] for x in db.execute( "PRAGMA table_info(full_results)").fetchall() ] csv_text = ",".join(fieldnames) + "\n" for row in data: csv_text = csv_text + ",".join([ '"%s"' % row[c] if (row[c] != None and row[c] != "") else '"-"' for c in fieldnames ]) + "\n" return Response(csv_text, mimetype="text/csv", headers={ "Content-disposition": "attachment; filename=result.csv" }) elif request.form["button"] == "delete": ids = list(json.loads(request.form["ids"]).keys()) cmd = "DELETE FROM results WHERE id in ( %s )" % ", ".join( ["'%s'" % x for x in ids]) db.execute(cmd) db.commit() return render_template('results/result_table.html', user=user)
def index(): db = get_db() if request.method == 'POST': return redirect(url_for('results.run_result', sample_id=request.form["sample_id"])) return render_template('home/index.html')