123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- 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)
|