aboutsummaryrefslogtreecommitdiff
path: root/wqflask
diff options
context:
space:
mode:
Diffstat (limited to 'wqflask')
-rwxr-xr-xwqflask/base/data_set.py105
-rw-r--r--wqflask/base/species.py10
-rw-r--r--wqflask/cfg/default_settings.py2
-rw-r--r--wqflask/wqflask/correlation/show_corr_results.py7
-rw-r--r--wqflask/wqflask/search_results.py2
-rw-r--r--wqflask/wqflask/static/new/javascript/login.coffee6
-rw-r--r--wqflask/wqflask/static/new/javascript/login.js5
-rw-r--r--wqflask/wqflask/static/new/javascript/thank_you.coffee4
-rw-r--r--wqflask/wqflask/static/new/javascript/thank_you.js10
-rw-r--r--wqflask/wqflask/templates/admin/group_manager.html83
-rw-r--r--wqflask/wqflask/templates/base.html6
-rw-r--r--wqflask/wqflask/templates/security/thank_you.html8
-rw-r--r--wqflask/wqflask/user_manager.py16
-rw-r--r--wqflask/wqflask/views.py32
14 files changed, 256 insertions, 40 deletions
diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py
index 1668940c..03b24230 100755
--- a/wqflask/base/data_set.py
+++ b/wqflask/base/data_set.py
@@ -27,8 +27,12 @@ import string
import collections
import json
+import cPickle as pickle
import itertools
+from redis import Redis
+Redis = Redis()
+
from flask import Flask, g
import reaper
@@ -46,17 +50,18 @@ from pprint import pformat as pf
# Used by create_database to instantiate objects
DS_NAME_MAP = {}
-def create_dataset(dataset_name):
+def create_dataset(dataset_name, dataset_type = None):
#print("dataset_name:", dataset_name)
- query = """
- SELECT DBType.Name
- FROM DBList, DBType
- WHERE DBList.Name = '{}' and
- DBType.Id = DBList.DBTypeId
- """.format(escape(dataset_name))
- #print("query is: ", pf(query))
- dataset_type = g.db.execute(query).fetchone().Name
+ if not dataset_type:
+ query = """
+ SELECT DBType.Name
+ FROM DBList, DBType
+ WHERE DBList.Name = '{}' and
+ DBType.Id = DBList.DBTypeId
+ """.format(escape(dataset_name))
+ #print("query is: ", pf(query))
+ dataset_type = g.db.execute(query).fetchone().Name
#dataset_type = cursor.fetchone()[0]
#print("[blubber] dataset_type:", pf(dataset_type))
@@ -69,6 +74,36 @@ def create_dataset(dataset_name):
dataset_class = globals()[dataset_ob]
return dataset_class(dataset_name)
+def create_datasets_list():
+ key = "all_datasets"
+ result = Redis.get(key)
+
+ if result:
+ print("Cache hit!!!")
+ datasets = pickle.loads(result)
+
+ else:
+ datasets = list()
+ with Bench("Creating DataSets object"):
+ type_dict = {'Publish': 'PublishFreeze',
+ 'ProbeSet': 'ProbeSetFreeze',
+ 'Geno': 'GenoFreeze'}
+
+ for dataset_type in type_dict:
+ query = "SELECT Name FROM {}".format(type_dict[dataset_type])
+ for result in g.db.execute(query).fetchall():
+ #The query at the beginning of this function isn't necessary here, but still would
+ #rather just reuse it
+ print("type: {}\tname: {}".format(dataset_type, result.Name))
+ dataset = create_dataset(result.Name, dataset_type)
+ datasets.append(dataset)
+
+ Redis.set(key, pickle.dumps(datasets, pickle.HIGHEST_PROTOCOL))
+ Redis.expire(key, 60*60)
+
+ return datasets
+
+
def create_in_clause(items):
"""Create an in clause for mysql"""
in_clause = ', '.join("'{}'".format(x) for x in mescape(*items))
@@ -167,8 +202,8 @@ class DatasetGroup(object):
self.incparentsf1 = False
self.allsamples = None
-
-
+
+
def get_markers(self):
#print("self.species is:", self.species)
if self.species == "human":
@@ -222,6 +257,27 @@ class DatasetGroup(object):
self.samplelist = list(genotype.prgy)
+#class DataSets(object):
+# """Builds a list of DataSets"""
+#
+# def __init__(self):
+# self.datasets = list()
+#
+
+
+ #query = """SELECT Name FROM ProbeSetFreeze
+ # UNION
+ # SELECT Name From PublishFreeze
+ # UNION
+ # SELECT Name From GenoFreeze"""
+ #
+ #for result in g.db.execute(query).fetchall():
+ # dataset = DataSet(result.Name)
+ # self.datasets.append(dataset)
+
+#ds = DataSets()
+#print("[orange] ds:", ds.datasets)
+
class DataSet(object):
"""
DataSet class defines a dataset in webqtl, can be either Microarray,
@@ -234,6 +290,8 @@ class DataSet(object):
assert name, "Need a name"
self.name = name
self.id = None
+ self.shortname = None
+ self.fullname = None
self.type = None
self.setup()
@@ -293,7 +351,7 @@ class DataSet(object):
self.name,
self.name,
self.name))
- #print("query_args are:", query_args)
+ print("query_args are:", query_args)
#print("""
# SELECT Id, Name, FullName, ShortName
@@ -301,17 +359,17 @@ class DataSet(object):
# WHERE public > %s AND
# (Name = '%s' OR FullName = '%s' OR ShortName = '%s')
# """ % (query_args))
-
- self.id, self.name, self.fullname, self.shortname = g.db.execute("""
- SELECT Id, Name, FullName, ShortName
- FROM %s
- WHERE public > %s AND
- (Name = '%s' OR FullName = '%s' OR ShortName = '%s')
- """ % (query_args)).fetchone()
-
- #self.cursor.execute(query)
- #self.id, self.name, self.fullname, self.shortname = self.cursor.fetchone()
+ try:
+ self.id, self.name, self.fullname, self.shortname = g.db.execute("""
+ SELECT Id, Name, FullName, ShortName
+ FROM %s
+ WHERE public > %s AND
+ (Name = '%s' OR FullName = '%s' OR ShortName = '%s')
+ """ % (query_args)).fetchone()
+ except TypeError:
+ print("Dataset {} is not yet available in GeneNetwork.".format(self.name))
+ pass
class PhenotypeDataSet(DataSet):
DS_NAME_MAP['Publish'] = 'PhenotypeDataSet'
@@ -940,6 +998,5 @@ def geno_mrna_confidentiality(ob):
authorized_users) = result.fetchall()[0]
if confidential:
- # Allow confidential data later
- NoConfindetialDataForYouTodaySorry
+ return True
diff --git a/wqflask/base/species.py b/wqflask/base/species.py
index 191f4535..ebc2bfed 100644
--- a/wqflask/base/species.py
+++ b/wqflask/base/species.py
@@ -56,6 +56,7 @@ class Chromosomes(object):
InbredSet.Name = %s
Order by OrderId
""", self.dataset.group.name).fetchall()
+ print("group: ", self.dataset.group.name)
print("bike:", results)
for item in results:
@@ -68,9 +69,14 @@ class Chromosomes(object):
def set_mb_graph_interval(self):
"""Empirical megabase interval"""
+ if self.chromosomes:
+ self.mb_graph_interval = self.get_genome_mb_length()/(len(self.chromosomes)*12)
+ else:
+ self.mb_graph_interval = 1
+
#if self.chromosomes:
- assert self.chromosomes, "Have to add some code back in apparently to set it to 1"
- self.mb_graph_interval = self.get_genome_mb_length()/(len(self.chromosomes)*12)
+ #assert self.chromosomes, "Have to add some code back in apparently to set it to 1"
+ #self.mb_graph_interval = self.get_genome_mb_length()/(len(self.chromosomes)*12)
#else:
#self.mb_graph_interval = 1
diff --git a/wqflask/cfg/default_settings.py b/wqflask/cfg/default_settings.py
index 96f7f1a5..e638a9c0 100644
--- a/wqflask/cfg/default_settings.py
+++ b/wqflask/cfg/default_settings.py
@@ -13,3 +13,5 @@ SECURITY_REGISTERABLE = True
SECURITY_RECOVERABLE = True
SECURITY_EMAIL_SENDER = "no-reply@genenetwork.org"
+
+SECURITY_POST_LOGIN_VIEW = "/thank_you"
diff --git a/wqflask/wqflask/correlation/show_corr_results.py b/wqflask/wqflask/correlation/show_corr_results.py
index 03059d68..11eca936 100644
--- a/wqflask/wqflask/correlation/show_corr_results.py
+++ b/wqflask/wqflask/correlation/show_corr_results.py
@@ -203,6 +203,13 @@ class CorrelationResults(object):
# mb = trait_object.mb
# )
+
+
+ #trait_list = self.getTissueCorrelationByList( primary_trait_symbol = self.this_trait.symbol,
+ # corr_results = self.correlation_results,
+ # TissueProbeSetFreezeId = 1,
+ # method=1)
+
#XZ, 09/18/2008: get all information about the user selected database.
#target_db_name = fd.corr_dataset
#self.target_db_name = start_vars['corr_dataset']
diff --git a/wqflask/wqflask/search_results.py b/wqflask/wqflask/search_results.py
index f76af374..504a67ce 100644
--- a/wqflask/wqflask/search_results.py
+++ b/wqflask/wqflask/search_results.py
@@ -162,8 +162,6 @@ class SearchResultPage(object):
import redis
Redis = redis.Redis()
-
-
#def get_group_species_tree(self):
# self.species_groups = collections.default_dict(list)
# for key in self.results:
diff --git a/wqflask/wqflask/static/new/javascript/login.coffee b/wqflask/wqflask/static/new/javascript/login.coffee
index c49353d5..15dafd9a 100644
--- a/wqflask/wqflask/static/new/javascript/login.coffee
+++ b/wqflask/wqflask/static/new/javascript/login.coffee
@@ -13,8 +13,8 @@ $ ->
-
- $(document).on("click", ".modalize", modalize)
+ $(document).one("click", ".modalize", modalize)
+ console.log("Modalized click!!!")
form_success = (data) ->
$.colorbox(
@@ -39,4 +39,4 @@ $ ->
)
- $("form").on("submit", submit_form)
+ $("#colorbox form").on("submit", submit_form)
diff --git a/wqflask/wqflask/static/new/javascript/login.js b/wqflask/wqflask/static/new/javascript/login.js
index 6c6120ec..ce301353 100644
--- a/wqflask/wqflask/static/new/javascript/login.js
+++ b/wqflask/wqflask/static/new/javascript/login.js
@@ -14,7 +14,8 @@
}
});
};
- $(document).on("click", ".modalize", modalize);
+ $(document).one("click", ".modalize", modalize);
+ console.log("Modalized click!!!");
form_success = function(data) {
return $.colorbox({
open: true,
@@ -38,7 +39,7 @@
success: form_success
});
};
- return $("form").on("submit", submit_form);
+ return $("#colorbox form").on("submit", submit_form);
});
}).call(this);
diff --git a/wqflask/wqflask/static/new/javascript/thank_you.coffee b/wqflask/wqflask/static/new/javascript/thank_you.coffee
new file mode 100644
index 00000000..975f85c6
--- /dev/null
+++ b/wqflask/wqflask/static/new/javascript/thank_you.coffee
@@ -0,0 +1,4 @@
+$ ->
+ console.log("Starting transform")
+ $('#login_out').text('Sign out').attr('href', '/logout').removeClass('modalize')
+ console.log("Transformed to sign out I hope")
diff --git a/wqflask/wqflask/static/new/javascript/thank_you.js b/wqflask/wqflask/static/new/javascript/thank_you.js
new file mode 100644
index 00000000..2871dd2d
--- /dev/null
+++ b/wqflask/wqflask/static/new/javascript/thank_you.js
@@ -0,0 +1,10 @@
+// Generated by CoffeeScript 1.4.0
+(function() {
+
+ $(function() {
+ console.log("Starting transform");
+ $('#login_out').text('Sign out').attr('href', '/logout').removeClass('modalize');
+ return console.log("Transformed to sign out I hope");
+ });
+
+}).call(this);
diff --git a/wqflask/wqflask/templates/admin/group_manager.html b/wqflask/wqflask/templates/admin/group_manager.html
new file mode 100644
index 00000000..df3eda33
--- /dev/null
+++ b/wqflask/wqflask/templates/admin/group_manager.html
@@ -0,0 +1,83 @@
+{% extends "base.html" %}
+{% block title %}Group Manager{% endblock %}
+{% block content %}
+<!-- Start of body -->
+ <header class="jumbotron subhead" id="overview">
+ <div class="container">
+ <h1>Group Manager</h1>
+ </div>
+ </header>
+
+ <div class="container">
+ <div class="page-header">
+
+ </div>
+ <form>
+ <div class="control-group">
+ <b>Group Name: </b>
+ <div class="input-append">
+ <input type="text" name="group_name">
+ <button type="submit" class="btn btn-primary">Save</button>
+ </div>
+ </div>
+
+ <table id="dataset_list" class="table table-hover">
+ <thead>
+ <tr>
+ <th>Read</th>
+ <th>Type</th>
+ <th>ID</th>
+ <th>Name</th>
+ <th>Full Name</th>
+ </tr>
+ </thead>
+ {% for dataset in datasets %}
+ <tr>
+ <td><input type="checkbox" name="read" value="{{ dataset.type }}:{{ dataset.name }}"></td>
+ <td>{{ dataset.type }}</td>
+ <td>{{ dataset.id }}</td>
+ <td>{{ dataset.name }}</td>
+ <td>{{ dataset.fullname }}</td>
+ </tr>
+ {% endfor %}
+ </table>
+ </form>
+ </div>
+
+<!-- End of body -->
+
+{% endblock %}
+
+{% block js %}
+ <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.min.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/packages/DT_bootstrap/DT_bootstrap.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/packages/TableTools/media/js/TableTools.min.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/packages/underscore/underscore-min.js"></script>
+
+ <script type="text/javascript" charset="utf-8">
+ $(document).ready( function () {
+ console.time("Creating table");
+ $('#dataset_list').dataTable( {
+ "sDom": "Tftipr",
+ "oTableTools": {
+ "aButtons": [
+ "copy",
+ "print",
+ {
+ "sExtends": "collection",
+ "sButtonText": 'Save <span class="caret" />',
+ "aButtons": [ "csv", "xls", "pdf" ]
+ }
+ ],
+ "sSwfPath": "/static/packages/TableTools/media/swf/copy_csv_xls_pdf.swf"
+ },
+ "iDisplayLength": 50,
+ "bLengthChange": true,
+ "bDeferRender": true,
+ "bSortClasses": false
+ } );
+ console.timeEnd("Creating table");
+ });
+ </script>
+{% endblock %} \ No newline at end of file
diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html
index 741c5425..cbed5859 100644
--- a/wqflask/wqflask/templates/base.html
+++ b/wqflask/wqflask/templates/base.html
@@ -70,9 +70,9 @@
</li>
<li class="">
{% if g.identity.name=="anon" %}
- <a id="login" class="modalize" href="/login">Sign in</a>
+ <a id="login_out" class="modalize" href="/login">Sign in</a>
{% else %}
- <a href="/logout">Sign out</a>
+ <a id="login_out" href="/logout">Sign out</a>
{% endif %}
</li>
</ul>
@@ -180,7 +180,7 @@
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript" src="/static/packages/colorbox/jquery.colorbox.js"></script>
-<!-- <script type="text/javascript" src="/static/new/javascript/login.js"></script>-->
+ <script type="text/javascript" src="/static/new/javascript/login.js"></script>
{% block js %}
{% endblock %}
diff --git a/wqflask/wqflask/templates/security/thank_you.html b/wqflask/wqflask/templates/security/thank_you.html
new file mode 100644
index 00000000..dd6c7297
--- /dev/null
+++ b/wqflask/wqflask/templates/security/thank_you.html
@@ -0,0 +1,8 @@
+{% from "security/_macros.html" import render_only_errors %}
+{% include "security/_messages.html" %}
+
+<div class="security_box">
+ <h4>Thank you for signing in!</h4>
+</div>
+
+<script src="/static/new/javascript/thank_you.js"></script>
diff --git a/wqflask/wqflask/user_manager.py b/wqflask/wqflask/user_manager.py
index b8ebc71f..9e666bbd 100644
--- a/wqflask/wqflask/user_manager.py
+++ b/wqflask/wqflask/user_manager.py
@@ -13,6 +13,8 @@ from flask import Flask, g
from pprint import pformat as pf
+from base.data_set import create_datasets_list
+
#from app import db
print("globals are:", globals())
@@ -32,6 +34,20 @@ class UserManager(object):
#print("user is:", user)
self.user = model.User.query.get(self.user_id)
print("user is:", self.user)
+ datasets = create_datasets_list()
+ for dataset in datasets:
+ if not dataset.check_confidentiality():
+ continue
+ print("\n Name:", dataset.name)
+ print(" Type:", dataset.type)
+ print(" ID:", dataset.id)
+ print(" Confidential:", dataset.check_confidentiality())
+ #print(" ---> self.datasets:", self.datasets)
+
+
+class GroupsManager(object):
+ def __init__(self, kw):
+ self.datasets = create_datasets_list()
class RolesManager(object):
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index b9aa3acf..813075b8 100644
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -27,6 +27,7 @@ from flask import render_template, request, make_response, Response, Flask, g, c
from wqflask import search_results
from base.data_set import DataSet # Used by YAML in marker_regression
+from base.data_set import create_datasets_list
from wqflask.show_trait import show_trait
from wqflask.show_trait import export_trait_data
from wqflask.marker_regression import marker_regression
@@ -53,6 +54,18 @@ def connect_db():
@app.route("/")
def index_page():
print("Sending index_page")
+ #create_datasets_list()
+ #key = "all_datasets"
+ #result = Redis.get(key)
+ #if result:
+ # print("Cache hit!!!")
+ # result = pickle.loads(result)
+ #else:
+ # with Bench("Creating DataSets object"):
+ # ds = DataSets()
+ # Redis.set(key, pickle.dumps(result, pickle.HIGHEST_PROTOCOL))
+ # Redis.expire(key, 2*60)
+ #print("[orange] ds:", ds.datasets)
return render_template("index_page.html")
@app.route("/data_sharing")
@@ -87,7 +100,7 @@ def search_page():
print("key is:", pf(key))
with Bench("Loading cache"):
result = Redis.get(key)
-
+
if result:
print("Cache hit!!!")
with Bench("Loading results"):
@@ -97,9 +110,9 @@ def search_page():
print("request.args is", request.args)
the_search = search_results.SearchResultPage(request.args)
result = the_search.__dict__
-
+
print("result: ", pf(result))
- Redis.set(key, pickle.dumps(result))
+ Redis.set(key, pickle.dumps(result, pickle.HIGHEST_PROTOCOL))
Redis.expire(key, 60*60)
if result['quick']:
@@ -219,7 +232,7 @@ def marker_regression_page():
# print(" ---**--- {}: {}".format(type(template_vars.__dict__[item]), item))
#causeerror
- Redis.set(key, pickle.dumps(result))
+ Redis.set(key, pickle.dumps(result, pickle.HIGHEST_PROTOCOL))
Redis.expire(key, 60*60)
with Bench("Rendering template"):
@@ -249,11 +262,17 @@ def sharing_info_page():
return template_vars
+# Take this out or secure it before going into production
@app.route("/get_temp_data")
def get_temp_data():
temp_uuid = request.args['key']
return flask.jsonify(temp_data.TempData(temp_uuid).get_all())
+
+@app.route("/thank_you")
+def thank_you():
+ return render_template("security/thank_you.html")
+
@app.route("/manage/users")
def manage_users():
template_vars = user_manager.UsersManager()
@@ -264,6 +283,11 @@ def manage_user():
template_vars = user_manager.UserManager(request.args)
return render_template("admin/ind_user_manager.html", **template_vars.__dict__)
+@app.route("/manage/groups")
+def manage_groups():
+ template_vars = user_manager.GroupsManager(request.args)
+ return render_template("admin/group_manager.html", **template_vars.__dict__)
+
def json_default_handler(obj):
'''Based on http://stackoverflow.com/a/2680060/1175849'''