diff options
author | zsloan | 2015-07-10 20:59:22 +0000 |
---|---|---|
committer | zsloan | 2015-07-10 20:59:22 +0000 |
commit | 54f3bf0c3ceede99cede528e5d25186299c7abc2 (patch) | |
tree | a5d0eba082b0bc2e4566f80bbf27ee6e403219c6 | |
parent | 05a12410b7ee1864fede3c88f0fc823e8a2ebd6c (diff) | |
parent | aa159a17785cc415e81346963aa76f05f5f9d4ad (diff) | |
download | genenetwork2-54f3bf0c3ceede99cede528e5d25186299c7abc2.tar.gz |
Merge /home/lei/gene
-rw-r--r-- | .gitignore | 5 | ||||
-rwxr-xr-x | wqflask/wqflask/gsearch.py | 83 | ||||
-rwxr-xr-x | wqflask/wqflask/templates/gsearch.html | 63 | ||||
-rwxr-xr-x | wqflask/wqflask/templates/gsearch2.html | 55 | ||||
-rwxr-xr-x | wqflask/wqflask/templates/gsearchact.html | 137 | ||||
-rwxr-xr-x | wqflask/wqflask/templates/gsearchact2.html | 114 | ||||
-rwxr-xr-x | wqflask/wqflask/views.py | 21 |
7 files changed, 475 insertions, 3 deletions
@@ -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']) |