Пример #1
0
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')
Пример #2
0
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')
Пример #3
0
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()
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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')
Пример #7
0
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)
Пример #8
0
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')