Ingen beskrivning

maldisoft-engine.py 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. import os
  2. from flask import Flask, session, redirect, url_for, escape, request, render_template
  3. from werkzeug import secure_filename
  4. from maldisql import *
  5. from readsample import *
  6. from dataanalysis import *
  7. app = Flask(__name__)
  8. app.config["UPLOAD_FOLDER"] = "data"
  9. def CheckINT(eid):
  10. ceid = None
  11. try:
  12. ceid = int(eid)
  13. except:
  14. return ceid
  15. return ceid
  16. def alert(msg, mtype="danger"):
  17. mhash = {"type": mtype, "msg": msg}
  18. return mhash
  19. ###############################################################################
  20. #
  21. # @app.route /
  22. #
  23. ###############################################################################
  24. @app.route('/', methods=['GET', 'POST'])
  25. def index():
  26. if not 'uid' in session:
  27. return redirect(url_for("login"))
  28. msql = maldisql()
  29. msg = []
  30. if "msg" in session:
  31. msg = session["msg"][:]
  32. session.pop("msg", None)
  33. if request.method == 'POST':
  34. if "deid" in request.form:
  35. eid = CheckINT(request.form["deid"])
  36. if eid and msql.CheckEIDOwner(eid, session["uid"]):
  37. if msql.DeleteExperiment(eid):
  38. msg.append(alert("Experiment delete successful!", "success"))
  39. else:
  40. msg.append(alert("Wrong experiment or permissions!"))
  41. experiments = msql.GetExperiments(session["uid"])
  42. col_experiments = msql.GetCollaborations(session["uid"])
  43. msql.close()
  44. return render_template("index.html", email=escape(session['email']),
  45. experiments=experiments, col_experiments=col_experiments, msg=msg)
  46. ###############################################################################
  47. #
  48. # @app.route /experiment
  49. #
  50. ###############################################################################
  51. @app.route('/experiment', methods=['GET', 'POST'])
  52. def experiment():
  53. if not 'uid' in session:
  54. return redirect(url_for("login"))
  55. # Initialize EID
  56. msg = []
  57. eid = None
  58. if "eid" in session:
  59. eid = session["eid"]
  60. msql = maldisql()
  61. if request.method == 'POST':
  62. # Create a new Experiment Fast Creation
  63. if 'expname' in request.form and 'inpeaks' in request.form and not 'eid' in request.form:
  64. result = msql.CreateExperiment(escape(request.form["expname"]), "Description here", session["uid"])
  65. print eid
  66. eid = CheckINT(result)
  67. print eid
  68. if eid:
  69. session["eid"] = eid
  70. else:
  71. session["msg"] = [alert(result)]
  72. return redirect(url_for("index"))
  73. for peak in request.form["inpeaks"].split(","):
  74. try:
  75. peak = float(peak.strip())
  76. msql.AddExperimentPeak(eid, peak)
  77. except:
  78. msg.append(alert("Peak format error it MUST be a decimal \
  79. value or a list of decimal values separated by commas"))
  80. # If EID is in the request.
  81. # anymore.
  82. if "eid" in request.form:
  83. eid = CheckINT(request.form["eid"])
  84. if eid and msql.CheckEIDOwner(eid, session["uid"]):
  85. session["eid"] = eid
  86. else:
  87. session["msg"] = [alert("You have not permission to view that experiment")]
  88. return redirect("index")
  89. if not eid:
  90. msql.close()
  91. return redirect(url_for("index"))
  92. experiment = msql.GetExperiment(eid)
  93. samples = msql.GetSamples(eid)
  94. exp_peaks = msql.GetExperimentPeaks(eid)
  95. da = dataanalysis()
  96. abundances = []
  97. for sample in samples:
  98. sample["peaks"] = msql.GetPeaks(sample["sid"])
  99. if sample["peaks"]:
  100. sample["rel_ints"] = da.computePeaksRelativeIntensity(sample["peaks"])
  101. if sample["rel_ints"]:
  102. abundances.append(sample["rel_ints"])
  103. msql.close()
  104. averages = None
  105. stdDevs = None
  106. sems = None
  107. if len(abundances) > 1:
  108. averages = da.relativeAbundanceAverage(abundances)
  109. stdDevs = da.relativeAbundanceStdDeviation(abundances, averages)
  110. sems = da.relativeAbundanceSDM(stdDevs, len(abundances))
  111. else:
  112. msg.append(alert("Wait for it! To get Averages, Standard Dev, and SEMs you \
  113. need to have more than one sample file.", "success"))
  114. return render_template("experiment.html", email=escape(session['email']),
  115. experiment=experiment, exp_peaks=exp_peaks, samples=samples, averages=averages,
  116. stdDevs=stdDevs, sems=sems, eid=eid, msg=msg)
  117. ###############################################################################
  118. #
  119. # @app.route /editExperiment
  120. #
  121. ###############################################################################
  122. @app.route('/editExperiment', methods=['GET', 'POST'])
  123. def editExperiment():
  124. if not request.method == 'POST':
  125. return redirect(url_for("index"))
  126. msg = []
  127. experiment = None
  128. exp_peaks = None
  129. name = None
  130. description = None
  131. eid = None
  132. msql = maldisql()
  133. if "eid" in session:
  134. eid = session["eid"]
  135. if eid and "name" in request.form and "description" in request.form:
  136. # Save information in database and redirect to experiment with eid
  137. result = msql.UpdateExperiment(escape(request.form["name"]), escape(request.form["description"]), eid)
  138. if not result:
  139. #msql.close()
  140. msg.append(alert("Update successful", "success"))
  141. #return redirect(url_for("experiment"), code=307)
  142. else:
  143. msg.append(alert("Experiment Info Update failed!"))
  144. if eid and "inpeaks" in request.form:
  145. for peak in request.form["inpeaks"].split(","):
  146. try:
  147. peak = float(peak.strip())
  148. msql.AddExperimentPeak(eid, peak)
  149. except:
  150. msg.append(alert("Bad peak format!"))
  151. if eid and "collaborators" in request.form:
  152. result = msql.AddExperimentCollaborator(eid, escape(request.form["collaborators"]))
  153. if type(result) in [int, long]:
  154. msg.append(alert("Collaborator added successfuly!", "success"))
  155. else:
  156. msg.append(alert(result))
  157. if eid and "remove_peak" in request.form:
  158. # Remove one peak but first check if it belongs to uid
  159. exp_peaks = msql.GetExperimentPeaks(eid)
  160. peak = CheckINT(request.form["remove_peak"])
  161. for epeak in exp_peaks:
  162. if peak == epeak["ep_id"]:
  163. if msql.RemovePeak(peak):
  164. msg.append(alert("Peak deleted successfuly!", "success"))
  165. else:
  166. msg.append(alert("Couldn't delete peak!"))
  167. break
  168. if eid and "remove_col" in request.form:
  169. collaborators = msql.GetExperimentCollaborators(eid)
  170. colid = CheckINT(request.form["remove_col"])
  171. for col in collaborators:
  172. if colid == col["ueid"]:
  173. if msql.RemoveExperimentCollaborator(colid):
  174. msg.append(alert("Collaborator removed successfuly!", "success"))
  175. else:
  176. msg.append(alert("Couldn't remove collaborator!"))
  177. break
  178. if eid:
  179. experiment = msql.GetExperiment(eid)
  180. exp_peaks = msql.GetExperimentPeaks(eid)
  181. collaborators = msql.GetExperimentCollaborators(eid)
  182. name = experiment["name"]
  183. description = experiment["description"]
  184. samples = msql.GetSamples(eid)
  185. if len(samples):
  186. samples=True
  187. msql.close()
  188. return render_template("editexperiment.html", email=escape(session['email']),
  189. name=name, description=description, exp_peaks=exp_peaks, collaborators=collaborators,
  190. samples=samples, msg=msg)
  191. ###############################################################################
  192. #
  193. # @app.route /login
  194. #
  195. ###############################################################################
  196. @app.route('/login', methods=['GET', 'POST'])
  197. def login():
  198. msg = []
  199. if request.method == 'POST':
  200. if "email" in request.form and "passwd" in request.form:
  201. msql = maldisql()
  202. uid = msql.Login(escape(request.form["email"]), escape(request.form["passwd"]))
  203. msql.close()
  204. if uid:
  205. session["uid"] = uid
  206. session["email"] = escape(request.form["email"])
  207. return redirect(url_for('index'))
  208. else:
  209. msg.append(alert("Bad username or password."))
  210. return render_template("login.html", msg=msg)
  211. ###############################################################################
  212. #
  213. # @app.route /upload
  214. #
  215. ###############################################################################
  216. @app.route('/upload', methods=['GET', 'POST'])
  217. def upload_file():
  218. if not 'uid' in session:
  219. return redirect(url_for("login"))
  220. if "eid" in request.form and CheckINT(request.form["eid"]) == session["eid"]:
  221. eid = session["eid"]
  222. if 'file' in request.files:
  223. msql = maldisql()
  224. f = request.files['file']
  225. try:
  226. import uuid
  227. uuid = str(uuid.uuid1())
  228. filename = secure_filename(f.filename)
  229. f.save("%s/%s" % (app.config["UPLOAD_FOLDER"], uuid))
  230. msql = maldisql()
  231. sid = msql.AddSample(eid, uuid, filename)
  232. except:
  233. msql.close()
  234. error = "Unexpected problem saving file"
  235. return error
  236. peaks = msql.GetExperimentPeaks(eid)
  237. # List of floats
  238. try:
  239. samples = readsample("%s/%s" % (app.config["UPLOAD_FOLDER"], uuid), ["peak", "intensity"])
  240. except:
  241. return "Couldn't read the file!"
  242. try:
  243. mda = dataanalysis()
  244. peaks_childs = mda.getPeaksFromFile(samples, [float(x["peak"]) for x in peaks])
  245. for peak in peaks_childs.keys():
  246. pid = msql.AddPeak(sid, peak)
  247. for child in peaks_childs[peak].keys():
  248. msql.AddIntensity(pid, peaks_childs[peak][child]["peak"],
  249. peaks_childs[peak][child]["intensity"])
  250. except:
  251. return "Error processing the file"
  252. # CHECK BECAUSE IF SECOND PART FAILS THERE WILL BE A FILENAME INSERTED
  253. # ANYWAYS. CHECK AND REMOVE.
  254. else:
  255. return "Error"
  256. return "OK"
  257. ###############################################################################
  258. #
  259. # @app.route /profile
  260. #
  261. ###############################################################################
  262. @app.route('/profile', methods=['GET', 'POST'])
  263. def profile():
  264. if not "uid" in session:
  265. return redirect(url_for("login"))
  266. msql = maldisql()
  267. msg = []
  268. pmsg = []
  269. if request.method == 'POST':
  270. #if request.form["name"] and request.form["last"] and request.form["email"]:
  271. if "name" in request.form and "last" in request.form and "email" in request.form:
  272. # Update data to db
  273. error = msql.UpdateUser(session["uid"], escape(request.form["email"]), escape(request.form["name"]), escape(request.form["last"]))
  274. if not error:
  275. msg.append(alert("Successful profile update", "success"))
  276. else:
  277. msg.append(alert(error))
  278. elif "pwd" in request.form and "pwd2" in request.form:
  279. # Update password
  280. if request.form["pwd"] == request.form["pwd2"]:
  281. perror = msql.UpdatePassword(escape(request.form["pwd"]), escape(session["uid"]))
  282. if not perror:
  283. pmsg.append(alert("Password change successful", "success"))
  284. else:
  285. pmsg.append(alert(perror))
  286. else:
  287. pmsg.append(alert("Passwords don't match"))
  288. # Get Profile
  289. uinfo = msql.GetUser(session["uid"])
  290. return render_template("profile.html", name=uinfo["name"], last=uinfo["last"], email=uinfo["email"], msg=msg, pmsg=pmsg)
  291. ###############################################################################
  292. #
  293. # @app.route /logout
  294. #
  295. ###############################################################################
  296. @app.route('/logout')
  297. def logout():
  298. if not 'uid' in session:
  299. return redirect(url_for("login"))
  300. # remove the username from the session if it's there
  301. session.pop('uid', None)
  302. session.pop('email', None)
  303. if "eid" in session:
  304. session.pop('eid', None)
  305. return redirect(url_for('login'))
  306. # set the secret key. keep this really secret:
  307. app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
  308. if __name__ == '__main__':
  309. app.run(host="0.0.0.0", port=8080, threaded=True, debug=True)