import os from flask import Flask, session, redirect, url_for, escape, request, render_template from werkzeug import secure_filename from maldisql import * from readsample import * from dataanalysis import * app = Flask(__name__) app.config["UPLOAD_FOLDER"] = "data" def CheckINT(eid): ceid = None try: ceid = int(eid) except: return ceid return ceid def alert(msg, mtype="danger"): mhash = {"type": mtype, "msg": msg} return mhash ############################################################################### # # @app.route / # ############################################################################### @app.route('/', methods=['GET', 'POST']) def index(): if not 'uid' in session: return redirect(url_for("login")) msql = maldisql() msg = [] if "msg" in session: msg = session["msg"][:] session.pop("msg", None) if request.method == 'POST': if "deid" in request.form: eid = CheckINT(request.form["deid"]) if eid and msql.CheckEIDOwner(eid, session["uid"]): if msql.DeleteExperiment(eid): msg.append(alert("Experiment delete successful!", "success")) else: msg.append(alert("Wrong experiment or permissions!")) experiments = msql.GetExperiments(session["uid"]) col_experiments = msql.GetCollaborations(session["uid"]) msql.close() return render_template("index.html", email=escape(session['email']), experiments=experiments, col_experiments=col_experiments, msg=msg) ############################################################################### # # @app.route /experiment # ############################################################################### @app.route('/experiment', methods=['GET', 'POST']) def experiment(): if not 'uid' in session: return redirect(url_for("login")) # Initialize EID msg = [] eid = None if "eid" in session: eid = session["eid"] msql = maldisql() if request.method == 'POST': # Create a new Experiment Fast Creation if 'expname' in request.form and 'inpeaks' in request.form and not 'eid' in request.form: result = msql.CreateExperiment(escape(request.form["expname"]), "Description here", session["uid"]) print eid eid = CheckINT(result) print eid if eid: session["eid"] = eid else: session["msg"] = [alert(result)] return redirect(url_for("index")) for peak in request.form["inpeaks"].split(","): try: peak = float(peak.strip()) msql.AddExperimentPeak(eid, peak) except: msg.append(alert("Peak format error it MUST be a decimal \ value or a list of decimal values separated by commas")) # If EID is in the request. # anymore. if "eid" in request.form: eid = CheckINT(request.form["eid"]) if eid and msql.CheckEIDOwner(eid, session["uid"]): session["eid"] = eid else: session["msg"] = [alert("You have not permission to view that experiment")] return redirect("index") if not eid: msql.close() return redirect(url_for("index")) experiment = msql.GetExperiment(eid) samples = msql.GetSamples(eid) exp_peaks = msql.GetExperimentPeaks(eid) da = dataanalysis() abundances = [] for sample in samples: sample["peaks"] = msql.GetPeaks(sample["sid"]) if sample["peaks"]: sample["rel_ints"] = da.computePeaksRelativeIntensity(sample["peaks"]) if sample["rel_ints"]: abundances.append(sample["rel_ints"]) msql.close() averages = None stdDevs = None sems = None if len(abundances) > 1: averages = da.relativeAbundanceAverage(abundances) stdDevs = da.relativeAbundanceStdDeviation(abundances, averages) sems = da.relativeAbundanceSDM(stdDevs, len(abundances)) else: msg.append(alert("Wait for it! To get Averages, Standard Dev, and SEMs you \ need to have more than one sample file.", "success")) return render_template("experiment.html", email=escape(session['email']), experiment=experiment, exp_peaks=exp_peaks, samples=samples, averages=averages, stdDevs=stdDevs, sems=sems, eid=eid, msg=msg) ############################################################################### # # @app.route /editExperiment # ############################################################################### @app.route('/editExperiment', methods=['GET', 'POST']) def editExperiment(): if not request.method == 'POST': return redirect(url_for("index")) msg = [] experiment = None exp_peaks = None name = None description = None eid = None msql = maldisql() if "eid" in session: eid = session["eid"] if eid and "name" in request.form and "description" in request.form: # Save information in database and redirect to experiment with eid result = msql.UpdateExperiment(escape(request.form["name"]), escape(request.form["description"]), eid) if not result: #msql.close() msg.append(alert("Update successful", "success")) #return redirect(url_for("experiment"), code=307) else: msg.append(alert("Experiment Info Update failed!")) if eid and "inpeaks" in request.form: for peak in request.form["inpeaks"].split(","): try: peak = float(peak.strip()) msql.AddExperimentPeak(eid, peak) except: msg.append(alert("Bad peak format!")) if eid and "collaborators" in request.form: result = msql.AddExperimentCollaborator(eid, escape(request.form["collaborators"])) if type(result) in [int, long]: msg.append(alert("Collaborator added successfuly!", "success")) else: msg.append(alert(result)) if eid and "remove_peak" in request.form: # Remove one peak but first check if it belongs to uid exp_peaks = msql.GetExperimentPeaks(eid) peak = CheckINT(request.form["remove_peak"]) for epeak in exp_peaks: if peak == epeak["ep_id"]: if msql.RemovePeak(peak): msg.append(alert("Peak deleted successfuly!", "success")) else: msg.append(alert("Couldn't delete peak!")) break if eid and "remove_col" in request.form: collaborators = msql.GetExperimentCollaborators(eid) colid = CheckINT(request.form["remove_col"]) for col in collaborators: if colid == col["ueid"]: if msql.RemoveExperimentCollaborator(colid): msg.append(alert("Collaborator removed successfuly!", "success")) else: msg.append(alert("Couldn't remove collaborator!")) break if eid: experiment = msql.GetExperiment(eid) exp_peaks = msql.GetExperimentPeaks(eid) collaborators = msql.GetExperimentCollaborators(eid) name = experiment["name"] description = experiment["description"] samples = msql.GetSamples(eid) if len(samples): samples=True msql.close() return render_template("editexperiment.html", email=escape(session['email']), name=name, description=description, exp_peaks=exp_peaks, collaborators=collaborators, samples=samples, msg=msg) ############################################################################### # # @app.route /login # ############################################################################### @app.route('/login', methods=['GET', 'POST']) def login(): msg = [] if request.method == 'POST': if "email" in request.form and "passwd" in request.form: msql = maldisql() uid = msql.Login(escape(request.form["email"]), escape(request.form["passwd"])) msql.close() if uid: session["uid"] = uid session["email"] = escape(request.form["email"]) return redirect(url_for('index')) else: msg.append(alert("Bad username or password.")) return render_template("login.html", msg=msg) ############################################################################### # # @app.route /upload # ############################################################################### @app.route('/upload', methods=['GET', 'POST']) def upload_file(): if not 'uid' in session: return redirect(url_for("login")) if "eid" in request.form and CheckINT(request.form["eid"]) == session["eid"]: eid = session["eid"] if 'file' in request.files: msql = maldisql() f = request.files['file'] try: import uuid uuid = str(uuid.uuid1()) filename = secure_filename(f.filename) f.save("%s/%s" % (app.config["UPLOAD_FOLDER"], uuid)) msql = maldisql() sid = msql.AddSample(eid, uuid, filename) except: msql.close() error = "Unexpected problem saving file" return error peaks = msql.GetExperimentPeaks(eid) # List of floats try: samples = readsample("%s/%s" % (app.config["UPLOAD_FOLDER"], uuid), ["peak", "intensity"]) except: return "Couldn't read the file!" try: mda = dataanalysis() peaks_childs = mda.getPeaksFromFile(samples, [float(x["peak"]) for x in peaks]) for peak in peaks_childs.keys(): pid = msql.AddPeak(sid, peak) for child in peaks_childs[peak].keys(): msql.AddIntensity(pid, peaks_childs[peak][child]["peak"], peaks_childs[peak][child]["intensity"]) except: return "Error processing the file" # CHECK BECAUSE IF SECOND PART FAILS THERE WILL BE A FILENAME INSERTED # ANYWAYS. CHECK AND REMOVE. else: return "Error" return "OK" ############################################################################### # # @app.route /profile # ############################################################################### @app.route('/profile', methods=['GET', 'POST']) def profile(): if not "uid" in session: return redirect(url_for("login")) msql = maldisql() msg = [] pmsg = [] if request.method == 'POST': #if request.form["name"] and request.form["last"] and request.form["email"]: if "name" in request.form and "last" in request.form and "email" in request.form: # Update data to db error = msql.UpdateUser(session["uid"], escape(request.form["email"]), escape(request.form["name"]), escape(request.form["last"])) if not error: msg.append(alert("Successful profile update", "success")) else: msg.append(alert(error)) elif "pwd" in request.form and "pwd2" in request.form: # Update password if request.form["pwd"] == request.form["pwd2"]: perror = msql.UpdatePassword(escape(request.form["pwd"]), escape(session["uid"])) if not perror: pmsg.append(alert("Password change successful", "success")) else: pmsg.append(alert(perror)) else: pmsg.append(alert("Passwords don't match")) # Get Profile uinfo = msql.GetUser(session["uid"]) return render_template("profile.html", name=uinfo["name"], last=uinfo["last"], email=uinfo["email"], msg=msg, pmsg=pmsg) ############################################################################### # # @app.route /logout # ############################################################################### @app.route('/logout') def logout(): if not 'uid' in session: return redirect(url_for("login")) # remove the username from the session if it's there session.pop('uid', None) session.pop('email', None) if "eid" in session: session.pop('eid', None) return redirect(url_for('login')) # set the secret key. keep this really secret: app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' if __name__ == '__main__': app.run(host="0.0.0.0", port=8080, threaded=True, debug=True)