about summary refs log tree commit diff
diff options
context:
space:
mode:
authorzsloan2015-07-10 20:59:22 +0000
committerzsloan2015-07-10 20:59:22 +0000
commit54f3bf0c3ceede99cede528e5d25186299c7abc2 (patch)
treea5d0eba082b0bc2e4566f80bbf27ee6e403219c6
parent05a12410b7ee1864fede3c88f0fc823e8a2ebd6c (diff)
parentaa159a17785cc415e81346963aa76f05f5f9d4ad (diff)
downloadgenenetwork2-54f3bf0c3ceede99cede528e5d25186299c7abc2.tar.gz
Merge /home/lei/gene
-rw-r--r--.gitignore5
-rwxr-xr-xwqflask/wqflask/gsearch.py83
-rwxr-xr-xwqflask/wqflask/templates/gsearch.html63
-rwxr-xr-xwqflask/wqflask/templates/gsearch2.html55
-rwxr-xr-xwqflask/wqflask/templates/gsearchact.html137
-rwxr-xr-xwqflask/wqflask/templates/gsearchact2.html114
-rwxr-xr-xwqflask/wqflask/views.py21
7 files changed, 475 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
index 1108f228..1ab1e727 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,9 +2,8 @@
 *.pyc
 *.orig
 *.bak
+*.cross
 *~
 web/new_genotypes/HSNIH.json
-*.cross
-*webqtlConfig.py
 wqflask/secure_server.py
-
+wqflask/base/webqtlConfig.py
diff --git a/wqflask/wqflask/gsearch.py b/wqflask/wqflask/gsearch.py
new file mode 100755
index 00000000..706a3655
--- /dev/null
+++ b/wqflask/wqflask/gsearch.py
@@ -0,0 +1,83 @@
+from __future__ import absolute_import, print_function, division
+
+from flask import Flask, g
+
+class GSearch(object):
+
+	# http://gn2_lei.genenetwork.org/gsearch?species=mouse&group=BXD&search_terms=shh
+	def __init__(self, kw):
+		if 'species' in kw and 'group' in kw:
+			self.species = kw['species']
+			self.group = kw['group']
+			self.terms = kw['terms']
+			sql = """
+				SELECT InbredSet.`Id`
+				FROM InbredSet,Species
+				WHERE InbredSet.`Name` LIKE "%s"
+				AND InbredSet.`SpeciesId`=Species.`Id`
+				AND Species.`Name` LIKE "%s"
+				""" % (self.group, self.species)
+			dbre = g.db.execute(sql).fetchone()
+			self.inbredset_id = dbre[0]
+			sql = """
+				SELECT DISTINCT 0,
+				Tissue.`Name` AS tissue_name,
+				ProbeSetFreeze.FullName AS probesetfreeze_fullname,
+				ProbeSet.Name AS probeset_name,
+				ProbeSet.Symbol AS probeset_symbol,
+				ProbeSet.`description` AS probeset_description,
+				ProbeSet.Chr AS chr,
+				ProbeSet.Mb AS mb,
+				ProbeSetXRef.Mean AS mean,
+				ProbeSetXRef.LRS AS lrs,
+				ProbeSetXRef.`Locus` AS locus,
+				ProbeSetXRef.`pValue` AS pvalue,
+				ProbeSetXRef.`additive` AS additive
+				FROM InbredSet, ProbeSetXRef, ProbeSet, ProbeFreeze, ProbeSetFreeze, Tissue
+				WHERE ProbeFreeze.InbredSetId=%s
+				AND ProbeFreeze.`TissueId`=Tissue.`Id`
+				AND ProbeSetFreeze.ProbeFreezeId=ProbeFreeze.Id
+				AND ( MATCH (ProbeSet.Name,ProbeSet.description,ProbeSet.symbol,alias,GenbankId, UniGeneId, Probe_Target_Description) AGAINST ('%s' IN BOOLEAN MODE) )
+				AND ProbeSet.Id = ProbeSetXRef.ProbeSetId
+				AND ProbeSetXRef.ProbeSetFreezeId=ProbeSetFreeze.Id
+				ORDER BY tissue_name, probesetfreeze_fullname, probeset_name
+				LIMIT 1000
+				""" % (self.inbredset_id, self.terms)
+			self.results = g.db.execute(sql).fetchall()
+		elif 'species' in kw:
+			self.species = kw['species']
+			self.terms = kw['terms']
+			sql = """
+				SELECT Species.`Id`
+				FROM Species
+				WHERE Species.`Name` LIKE "%s"
+				""" % (self.species)
+			dbre = g.db.execute(sql).fetchone()
+			self.species_id = dbre[0]
+			sql = """
+				SELECT DISTINCT 0,
+				InbredSet.`Name` AS inbredset_name,
+				Tissue.`Name` AS tissue_name,
+				ProbeSetFreeze.FullName AS probesetfreeze_fullname,
+				ProbeSet.Name AS probeset_name,
+				ProbeSet.Symbol AS probeset_symbol,
+				ProbeSet.`description` AS probeset_description,
+				ProbeSet.Chr AS chr,
+				ProbeSet.Mb AS mb,
+				ProbeSetXRef.Mean AS mean,
+				ProbeSetXRef.LRS AS lrs,
+				ProbeSetXRef.`Locus` AS locus,
+				ProbeSetXRef.`pValue` AS pvalue,
+				ProbeSetXRef.`additive` AS additive
+				FROM InbredSet, ProbeSetXRef, ProbeSet, ProbeFreeze, ProbeSetFreeze, Tissue
+				WHERE InbredSet.`SpeciesId`=%s
+				AND ProbeFreeze.InbredSetId=InbredSet.`Id`
+				AND ProbeFreeze.`TissueId`=Tissue.`Id`
+				AND ProbeSetFreeze.ProbeFreezeId=ProbeFreeze.Id
+				AND ( MATCH (ProbeSet.Name,ProbeSet.description,ProbeSet.symbol,alias,GenbankId, UniGeneId, Probe_Target_Description) AGAINST ('%s' IN BOOLEAN MODE) )
+				AND ProbeSet.Id = ProbeSetXRef.ProbeSetId
+				AND ProbeSetXRef.ProbeSetFreezeId=ProbeSetFreeze.Id
+				ORDER BY inbredset_name, tissue_name, probesetfreeze_fullname, probeset_name
+				LIMIT 1000
+				""" % (self.species_id, self.terms)
+			self.results = g.db.execute(sql).fetchall()
diff --git a/wqflask/wqflask/templates/gsearch.html b/wqflask/wqflask/templates/gsearch.html
new file mode 100755
index 00000000..28301515
--- /dev/null
+++ b/wqflask/wqflask/templates/gsearch.html
@@ -0,0 +1,63 @@
+{% extends "base.html" %}
+{% block title %}GeneNetwork{% endblock %}
+{% block content %}
+<!-- Start of body -->
+
+    <div class="container-fluid">
+        
+        {{ flash_me() }}
+        
+        <div class="row" style="width: 1200px !important;">
+
+            <div class="col-xs-5 col-xs-5">
+                <section id="search">
+                    <div class="page-header">
+                        <h1>Global Search</h1>
+                    </div>
+                    <form method="get" action="/gsearchact" name="SEARCHFORM">
+                        <fieldset>
+                            <div style="padding: 20px" class="form-horizontal">
+
+                                <div class="form-group">
+                                    <label for="species" class="col-xs-1 control-label" style="width: 65px !important;">Species:</label>
+                                    <div class="col-xs-4 controls">
+                                        <select name="species" id="species" class="form-control selectpicker span3" style="width: 300px !important;"></select>
+                                    </div>
+                                </div>
+
+                                <div class="form-group">
+                                    <label for="group" class="col-xs-1 control-label" style="width: 65px !important;">Group:</label>
+                                    <div class="col-xs-4 controls input-append">
+                                        <select name="group" id="group" class="form-control selectpicker span3" style="width: 300px !important;"></select>
+                                        <i class="icon-question-sign"></i>
+                                    </div>
+                                </div>
+
+                                <div class="form-group">
+                                    <label for="tfor" class="col-xs-1 control-label" style="width: 65px !important;">Search:</label>
+                                    <div class="col-xs-10 controls">
+                                        <textarea name="terms" rows="2" class="form-control search-query" style="width: 450px !important;" id="tfor"></textarea>
+                                    </div>
+                                </div>
+
+                                <!--  SEARCH, MAKE DEFAULT, ADVANCED SEARCH -->
+
+                                <div class="form-group">
+
+                                    <div class="col-xs-3 controls" style="width: 100px !important;">
+                                        <input id="btsearch" type="submit" class="btn btn-primary form-control" value="Search">
+                                    </div>
+                                </div>
+                            </div>
+                        </fieldset>
+                    </form>
+                </section>
+            </div>
+        </div>
+    </div>
+
+{%endblock%}
+
+{% block js %}
+    <script src="/static/new/javascript/dataset_select_menu.js"></script>
+{% endblock %}
\ No newline at end of file
diff --git a/wqflask/wqflask/templates/gsearch2.html b/wqflask/wqflask/templates/gsearch2.html
new file mode 100755
index 00000000..430bf889
--- /dev/null
+++ b/wqflask/wqflask/templates/gsearch2.html
@@ -0,0 +1,55 @@
+{% extends "base.html" %}
+{% block title %}GeneNetwork{% endblock %}
+{% block content %}
+<!-- Start of body -->
+
+    <div class="container-fluid">
+        
+        {{ flash_me() }}
+        
+        <div class="row" style="width: 1200px !important;">
+
+            <div class="col-xs-5 col-xs-5">
+                <section id="search">
+                    <div class="page-header">
+                        <h1>Global Search</h1>
+                    </div>
+                    <form method="get" action="/gsearchact2" name="SEARCHFORM">
+                        <fieldset>
+                            <div style="padding: 20px" class="form-horizontal">
+
+                                <div class="form-group">
+                                    <label for="species" class="col-xs-1 control-label" style="width: 65px !important;">Species:</label>
+                                    <div class="col-xs-4 controls">
+                                        <select name="species" id="species" class="form-control selectpicker span3" style="width: 300px !important;"></select>
+                                    </div>
+                                </div>
+
+                                <div class="form-group">
+                                    <label for="tfor" class="col-xs-1 control-label" style="width: 65px !important;">Search:</label>
+                                    <div class="col-xs-10 controls">
+                                        <textarea name="terms" rows="2" class="form-control search-query" style="width: 450px !important;" id="tfor"></textarea>
+                                    </div>
+                                </div>
+
+                                <!--  SEARCH, MAKE DEFAULT, ADVANCED SEARCH -->
+
+                                <div class="form-group">
+
+                                    <div class="col-xs-3 controls" style="width: 100px !important;">
+                                        <input id="btsearch" type="submit" class="btn btn-primary form-control" value="Search">
+                                    </div>
+                                </div>
+                            </div>
+                        </fieldset>
+                    </form>
+                </section>
+            </div>
+        </div>
+    </div>
+
+{%endblock%}
+
+{% block js %}
+    <script src="/static/new/javascript/dataset_select_menu.js"></script>
+{% endblock %}
\ No newline at end of file
diff --git a/wqflask/wqflask/templates/gsearchact.html b/wqflask/wqflask/templates/gsearchact.html
new file mode 100755
index 00000000..295ad2fd
--- /dev/null
+++ b/wqflask/wqflask/templates/gsearchact.html
@@ -0,0 +1,137 @@
+{% extends "base.html" %}
+{% block title %}Search Results{% endblock %}
+{% block css %}
+    <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
+    <link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" />
+    <link rel="stylesheet" type="text/css" href="/static/packages/TableTools/media/css/TableTools.css" />
+{% endblock %}
+{% block content %}
+<!-- Start of body -->
+
+    <div class="container">
+
+        <p>To study a record, click on its ID below.<br />Check records below and click Add button to add to selection.</p>
+
+        <div>
+            <br />
+            <button class="btn btn-default" id="select_all"><span class="glyphicon glyphicon-ok"></span> Select All</button>
+            <button class="btn btn-default" id="deselect_all"><span class="glyphicon glyphicon-remove"></span> Deselect All</button>
+            <button class="btn btn-default" id="invert"><span class="glyphicon glyphicon-resize-vertical"></span> Invert</button>
+            <button class="btn btn-default" id="add"><span class="glyphicon glyphicon-plus-sign"></span> Add</button>
+            <button class="btn btn-primary pull-right"><span class="glyphicon glyphicon-download"></span> Download Table</button>
+            <br />
+            <br />
+            <table class="table table-hover table-striped" id="trait_table">
+                <thead>
+                    <tr>
+						<th></th>
+						<th>Index</th>
+						<th>Tissue</th>
+						<th>Dataset</th>
+						<th>Record</th>
+						<th>Symbol</th>
+						<th>Description</th>
+						<th>Chr</th>
+						<th>Mb</th>
+						<th>Mean</th>
+						<th>Max LRS</th>
+						<th>Locus</th>
+						<th>Pvalue</th>
+						<th>Additive</th>
+                    </tr>
+                </thead>
+
+                <tbody>
+                    {% for this_trait in results %}
+                    <TR>
+						<td><input type="checkbox"></td>
+						<td>{{ loop.index }}</td>
+                        {% for item in this_trait[1:] %}
+							<TD>{{ item }}</TD>
+						{% endfor %}
+                    </TR>
+                {% endfor %}
+                </tbody>
+
+            </table>
+        </div>
+    </div>
+
+<!-- End of body -->
+
+{% endblock %}
+
+{% block js %}
+    <script type="text/javascript" src="/static/new/javascript/search_results.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/new/packages/DataTables/js/dataTables.naturalSort.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 type="text/javascript" charset="utf-8">
+        function getValue(x) {
+            if (x.indexOf('input') >= 0) {
+                if ($(x).val() == 'x') {
+                    return 0
+                }
+                else {
+                   return parseFloat($(x).val());
+                }
+            }
+            return parseFloat(x);
+        }
+            
+        jQuery.fn.dataTableExt.oSort['cust-txt-asc'] = function (a, b) {
+            var x = getValue(a);
+            var y = getValue(b);
+            return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+        };
+            
+        jQuery.fn.dataTableExt.oSort['cust-txt-desc'] = function (a, b) {
+            var x = getValue(a);
+            var y = getValue(b);
+            return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+        };
+
+
+        $(document).ready( function () {
+            
+            $('#trait_table tr').click(function(event) {
+                if (event.target.type !== 'checkbox') {
+                    $(':checkbox', this).trigger('click');
+                }
+            });
+
+            console.time("Creating table");
+            $('#trait_table').dataTable( {
+                "aoColumns": [
+					{ "bSortable": false },
+                    { "bSortable": true },
+                    { "sType": "natural" },
+                    { "sType": "natural" },
+                    { "sType": "natural", "sWidth": "35%"  },
+                    { "sType": "natural", "sWidth": "15%"  },
+                    { "sType": "cust-txt" },
+                    { "sType": "natural", "sWidth": "12%"  },
+					{ "sType": "natural", "sWidth": "12%"  },
+					{ "sType": "natural", "sWidth": "12%"  },
+					{ "sType": "natural", "sWidth": "12%"  },
+					{ "sType": "natural", "sWidth": "12%"  },
+                    { "sType": "natural", "sWidth": "15%"  },
+                    { "sType": "cust-txt" }
+                ],
+              
+                "sDom": "tir",
+                "iDisplayLength": -1,
+                "autoWidth": true,
+                "bLengthChange": true,
+                "bDeferRender": true,
+                "bSortClasses": false
+            } );
+
+            console.timeEnd("Creating table");
+        });
+        
+    </script>
+    
+{% endblock %}
diff --git a/wqflask/wqflask/templates/gsearchact2.html b/wqflask/wqflask/templates/gsearchact2.html
new file mode 100755
index 00000000..d99bfadc
--- /dev/null
+++ b/wqflask/wqflask/templates/gsearchact2.html
@@ -0,0 +1,114 @@
+{% extends "base.html" %}
+{% block title %}Search Results{% endblock %}
+{% block css %}
+    <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
+    <link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" />
+    <link rel="stylesheet" type="text/css" href="/static/packages/TableTools/media/css/TableTools.css" />
+{% endblock %}
+{% block content %}
+<!-- Start of body -->
+
+    <div class="container">
+
+        <p>To study a record, click on its ID below.<br />Check records below and click Add button to add to selection.</p>
+
+        <div>
+            <br />
+            <button class="btn btn-default" id="select_all"><span class="glyphicon glyphicon-ok"></span> Select All</button>
+            <button class="btn btn-default" id="deselect_all"><span class="glyphicon glyphicon-remove"></span> Deselect All</button>
+            <button class="btn btn-default" id="invert"><span class="glyphicon glyphicon-resize-vertical"></span> Invert</button>
+            <button class="btn btn-default" id="add"><span class="glyphicon glyphicon-plus-sign"></span> Add</button>
+            <button class="btn btn-primary pull-right"><span class="glyphicon glyphicon-download"></span> Download Table</button>
+            <br />
+            <br />
+            <table class="table table-hover table-striped" id='' style="width: 100%;">
+                <thead>
+                    <tr>
+						<th>Group</th>
+						<th>Tissue</th>
+						<th>Dataset</th>
+						<th>Record</th>
+						<th>Symbol</th>
+						<th>Description</th>
+						<th>Chr</th>
+						<th>Mb</th>
+						<th>Mean</th>
+						<th>Max LRS</th>
+						<th>Locus</th>
+						<th>Pvalue</th>
+						<th>Additive</th>
+                    </tr>
+                </thead>
+
+                <tbody>
+                    {% for this_trait in results %}
+                    <TR>
+                        {% for item in this_trait[1:] %}
+							<TD>{{ item }}</TD>
+						{% endfor %}
+                    </TR>
+                {% endfor %}
+                </tbody>
+
+            </table>
+        </div>
+    </div>
+
+<!-- End of body -->
+
+{% endblock %}
+
+{% block js %}
+    <script type="text/javascript" src="/static/new/javascript/search_results.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/new/packages/DataTables/js/dataTables.naturalSort.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 type="text/javascript" charset="utf-8">
+        function getValue(x) {
+            if (x.indexOf('input') >= 0) {
+                if ($(x).val() == 'x') {
+                    return 0
+                }
+                else {
+                   return parseFloat($(x).val());
+                }
+            }
+            return parseFloat(x);
+        }
+            
+        jQuery.fn.dataTableExt.oSort['cust-txt-asc'] = function (a, b) {
+            var x = getValue(a);
+            var y = getValue(b);
+            return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+        };
+            
+        jQuery.fn.dataTableExt.oSort['cust-txt-desc'] = function (a, b) {
+            var x = getValue(a);
+            var y = getValue(b);
+            return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+        };
+
+
+        $(document).ready( function () {
+            
+	     /*num_columns = $('#trait_table').find('tr:first th').length;
+
+            nul_cols = []
+	     for (i=0; i<num_columns - 1, i++) {
+                $('#trait_table > tbody > tr').each(function() {
+                    if ($(this).find('td:eq(i)').html()){
+                        continue;
+                    }
+                });
+                nul_cols.push(i)
+	     }*/
+
+            console.time("Creating table");
+            console.timeEnd("Creating table");
+        });
+        
+    </script>
+    
+{% endblock %}
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index 09bf2270..e00c3e80 100755
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -33,6 +33,7 @@ from flask import (render_template, request, make_response, Response,
                    Flask, g, config, jsonify, redirect, url_for)
 
 from wqflask import search_results
+from wqflask import gsearch
 from wqflask import docs
 from wqflask import news
 from base.data_set import DataSet    # Used by YAML in marker_regression
@@ -154,6 +155,26 @@ def search_page():
         else:
             return render_template("search_error.html")
 
+@app.route("/gsearch", methods=('GET',))
+def gsearchreq():
+    return render_template("gsearch.html")
+
+@app.route("/gsearchact", methods=('GET',))
+def gsearchact():
+    print("request.args is", request.args)
+    result = gsearch.GSearch(request.args).__dict__
+    return render_template("gsearchact.html", **result)
+
+@app.route("/gsearch2", methods=('GET',))
+def gsearchreq2():
+    return render_template("gsearch2.html")
+
+@app.route("/gsearchact2", methods=('GET',))
+def gsearchact2():
+    print("request.args is", request.args)
+    result = gsearch.GSearch(request.args).__dict__
+    return render_template("gsearchact2.html", **result)
+	
 @app.route("/docedit")
 def docedit():
     doc = docs.Docs(request.args['entry'])