diff options
author | Pjotr Prins | 2016-10-31 20:31:15 +0000 |
---|---|---|
committer | Pjotr Prins | 2016-10-31 20:31:15 +0000 |
commit | 7e6fcdeab53edf0e84189e0c18cdb0ce6dd6a41c (patch) | |
tree | ff87583daefc969efc79523e4e81b4fde98b97a7 /wqflask | |
parent | a5feb593a1fb541278ec213909c4e37239934796 (diff) | |
parent | 72cbf70ee82a5a4afabc37809530f70fc6d7ea2d (diff) | |
download | genenetwork2-7e6fcdeab53edf0e84189e0c18cdb0ce6dd6a41c.tar.gz |
Merge branch 'testing' of github.com:genenetwork/genenetwork2 into testing
Diffstat (limited to 'wqflask')
-rw-r--r-- | wqflask/base/trait.py | 36 | ||||
-rw-r--r-- | wqflask/wqflask/export_traits.py | 41 | ||||
-rw-r--r-- | wqflask/wqflask/static/new/javascript/search_results.js | 53 | ||||
-rw-r--r-- | wqflask/wqflask/templates/collections/view.html | 59 | ||||
-rw-r--r-- | wqflask/wqflask/templates/gsearch_gene.html | 101 | ||||
-rw-r--r-- | wqflask/wqflask/templates/gsearch_pheno.html | 110 | ||||
-rw-r--r-- | wqflask/wqflask/templates/search_result_page.html | 129 | ||||
-rw-r--r-- | wqflask/wqflask/templates/show_trait_details.html | 8 | ||||
-rw-r--r-- | wqflask/wqflask/views.py | 12 |
9 files changed, 270 insertions, 279 deletions
diff --git a/wqflask/base/trait.py b/wqflask/base/trait.py index 32032ba7..276c624a 100644 --- a/wqflask/base/trait.py +++ b/wqflask/base/trait.py @@ -78,11 +78,37 @@ class GeneralTrait(object): """Return a dict suitable for using as json Actual turning into json doesn't happen here though""" - return dict(name=self.name, - dataset=self.dataset.name, - description=self.description_display, - mean=self.mean) - + + if self.dataset.type == "ProbeSet": + return dict(name=self.name, + symbol=self.symbol, + dataset=self.dataset.name, + description=self.description_display, + mean=self.mean, + location=self.location_repr, + lrs_score=self.LRS_score_repr, + lrs_location=self.LRS_location_repr, + additive=self.additive + ) + elif self.dataset.type == "Publish": + return dict(name=self.name, + dataset=self.dataset.name, + description=self.description_display, + authors=self.authors, + pubmed_text=self.pubmed_text, + pubmed_link=self.pubmed_link, + lrs_score=self.LRS_score_repr, + lrs_location=self.LRS_location_repr, + additive=self.additive + ) + elif self.dataset.type == "Geno": + return dict(name=self.name, + dataset=self.dataset.name, + location=self.location_repr + ) + else: + return dict() + def get_name(self): stringy = "" diff --git a/wqflask/wqflask/export_traits.py b/wqflask/wqflask/export_traits.py new file mode 100644 index 00000000..f8fce929 --- /dev/null +++ b/wqflask/wqflask/export_traits.py @@ -0,0 +1,41 @@ +from __future__ import print_function, division + +import operator +import csv +import xlsxwriter +import StringIO +import datetime + +import simplejson as json + +from pprint import pformat as pf + +def export_search_results_csv(targs): + + table_data = json.loads(targs['export_data']) + table_headers = table_data['headers'] + table_rows = table_data['rows'] + + buff = StringIO.StringIO() + writer = csv.writer(buff) + + metadata = [] + + metadata.append(["Citations: Please see www.genenetwork.org/reference.html"]) + if targs['database_name'] != "None": + metadata.append(["Database: " + targs['database_name']]) + metadata.append(["Date: " + datetime.datetime.now().strftime("%B %d, %Y")]) + metadata.append(["Time: " + datetime.datetime.now().strftime("%H:%M GMT")]) + metadata.append(["Status of data ownership: Possibly unpublished data; please see www.genenetwork.org/statusandContact.html for details on sources, ownership, and usage of these data."]) + + for metadata_row in metadata: + writer.writerow(metadata_row) + + writer.writerow(table_headers) + for trait_info in table_rows: + writer.writerow(trait_info) + + csv_data = buff.getvalue() + buff.close() + + return csv_data
\ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/search_results.js b/wqflask/wqflask/static/new/javascript/search_results.js index 746564fd..40fdff70 100644 --- a/wqflask/wqflask/static/new/javascript/search_results.js +++ b/wqflask/wqflask/static/new/javascript/search_results.js @@ -73,7 +73,6 @@ $(function() { }); $('.trait_checkbox:checkbox').change(function() { - console.log("CHANGED") change_buttons() if ($(this).is(":checked")) { @@ -108,7 +107,6 @@ $(function() { var button, buttons, item, num_checked, text, _i, _j, _k, _l, _len, _len2, _len3, _len4, _results, _results2; buttons = ["#add", "#remove"]; num_checked = $('.trait_checkbox:checked').length; - console.log("num_checked is:", num_checked); if (num_checked === 0) { for (_i = 0, _len = buttons.length; _i < _len; _i++) { button = buttons[_i]; @@ -155,10 +153,61 @@ $(function() { }); } }; + + export_traits = function() { + trait_data = get_traits_from_table("trait_table") + }; + + get_traits_from_table = function(table_name) { + trait_table = $('#'+table_name); + table_dict = {}; + + headers = []; + trait_table.find('th').each(function () { + if ($(this).data('export')){ + headers.push($(this).data('export')) + } + }); + table_dict['headers'] = headers; + + rows = []; + trait_table.find('tbody tr').each(function (i, tr) { + if (trait_table.find('input[name="searchResult"]:checked').length > 0) { + if ($(this).find('input[name="searchResult"]').is(':checked')){ + this_row = []; + $(tr).find('td').each(function(j, td){ + if ($(td).data('export')){ + this_row.push($(td).data('export')); + } + }); + rows.push(this_row); + } + } + else { + this_row = []; + $(tr).find('td').each(function(j, td){ + if ($(td).data('export')){ + this_row.push($(td).data('export')); + } + }); + rows.push(this_row); + } + }); + table_dict['rows'] = rows; + console.log("TABLEDICT:", table_dict); + + json_table_dict = JSON.stringify(table_dict); + $('input[name=export_data]').val(json_table_dict); + + $('#export_form').attr('action', '/export_traits_csv'); + $('#export_form').submit(); + }; + $("#select_all").click(select_all); $("#deselect_all").click(deselect_all); $("#invert").click(invert); $("#add").click(add); $("#remove").click(remove); + $("#export_traits").click(export_traits); $('.trait_checkbox, .btn').click(change_buttons); });
\ No newline at end of file diff --git a/wqflask/wqflask/templates/collections/view.html b/wqflask/wqflask/templates/collections/view.html index 8fc5f120..801266d3 100644 --- a/wqflask/wqflask/templates/collections/view.html +++ b/wqflask/wqflask/templates/collections/view.html @@ -4,7 +4,6 @@ <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" /> - <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" /> {% endblock %} {% block content %} <!-- Start of body --> @@ -74,20 +73,26 @@ <button class="btn" id="remove" disabled="disabled"><i class="icon-minus-sign"></i> Remove Record</button> <br /> <br /> + <form id="export_form" method="POST" action="/export_traits_csv"> + <input type="hidden" name="database_name" id="database_name" value="None"> + <input type="hidden" name="export_data" id="export_data" value=""> + <button class="btn btn-default" id="export_traits">Download CSV</button> + </form> + <br /> <div style="background-color: #eeeeee; border: 1px solid black;"> <table id="trait_table" class="table table-hover table-striped"> <thead> <tr> <th style="background-color: #eeeeee;"></th> - <th style="background-color: #eeeeee;">Index</th> - <th style="background-color: #eeeeee;">Dataset</th> - <th style="background-color: #eeeeee;">Record</th> - <th style="background-color: #eeeeee;">Description</th> - <th style="background-color: #eeeeee;">Location</th> - <th style="background-color: #eeeeee;">Mean</th> - <th style="background-color: #eeeeee;">Max LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th> - <th style="background-color: #eeeeee;">Max LRS Location</th> - <th style="background-color: #eeeeee;">Additive Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th> + <th data-export="Index" style="background-color: #eeeeee;">Index</th> + <th data-export="Dataset" style="background-color: #eeeeee;">Dataset</th> + <th data-export="Record" style="background-color: #eeeeee;">Record</th> + <th data-export="Description" style="background-color: #eeeeee;">Description</th> + <th data-export="Location" style="background-color: #eeeeee;">Location</th> + <th data-export="Mean" style="background-color: #eeeeee;">Mean</th> + <th data-export="Max LRS" style="background-color: #eeeeee;">Max LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th> + <th data-export="Max LRS Location" style="background-color: #eeeeee;">Max LRS Location</th> + <th data-export="Additive Effect" style="background-color: #eeeeee;">Additive Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th> </tr> </thead> @@ -98,9 +103,9 @@ <INPUT TYPE="checkbox" NAME="searchResult" class="checkbox trait_checkbox" VALUE="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) }}"> </TD> - <TD>{{ loop.index }}</TD> - <TD>{{ this_trait.dataset.name }}</TD> - <TD> + <TD data-export="{{ loop.index }}">{{ loop.index }}</TD> + <TD data-export="{{ this_trait.dataset.name }}">{{ this_trait.dataset.name }}</TD> + <TD data-export="{{ this_trait.name }}"> <a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset.name @@ -108,12 +113,12 @@ {{ this_trait.name }} </a> </TD> - <TD>{{ this_trait.description_display }}</TD> - <TD>{{ this_trait.location_repr }}</TD> - <TD>{{ '%0.3f' % this_trait.mean|float }}</TD> - <TD>{{ '%0.3f' % this_trait.LRS_score_repr|float }}</TD> - <TD>{{ this_trait.LRS_location_repr }}</TD> - <TD>{{ '%0.3f' % this_trait.additive|float }}</TD> + <TD data-export="{{ this_trait.description_display }}">{{ this_trait.description_display }}</TD> + <TD data-export="{{ this_trait.location_repr }}">{{ this_trait.location_repr }}</TD> + <TD data-export="{{ this_trait.mean }}">{{ '%0.3f' % this_trait.mean|float }}</TD> + <TD data-export="{{ this_trait.LRS_score_repr }}">{{ '%0.3f' % this_trait.LRS_score_repr|float }}</TD> + <TD data-export="{{ this_trait.LRS_location_repr }}">{{ this_trait.LRS_location_repr }}</TD> + <TD data-export="{{ this_trait.additive }}">{{ '%0.3f' % this_trait.additive|float }}</TD> </TR> {% endfor %} @@ -132,9 +137,6 @@ {% 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="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.html5.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script> <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.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/new/packages/DataTables/extensions/dataTables.colResize.js"></script> @@ -170,18 +172,7 @@ "width": "15%" }, { "type": "natural" } ], - "buttons": [ - { - extend: 'csvHtml5', - text: 'Download CSV', - title: 'collection', - fieldBoundary: '"', - exportOptions: { - columns: [1, 2, 3, 4, 5, 6, 7, 8, 9] - } - } - ], - "sDom": "ZRBtir", + "sDom": "ZRtir", "iDisplayLength": -1, "autoWidth": true, "bDeferRender": true, diff --git a/wqflask/wqflask/templates/gsearch_gene.html b/wqflask/wqflask/templates/gsearch_gene.html index 2d970b36..8b8a9057 100644 --- a/wqflask/wqflask/templates/gsearch_gene.html +++ b/wqflask/wqflask/templates/gsearch_gene.html @@ -2,7 +2,6 @@ {% 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/new/packages/DataTables/extensions/buttons.bootstrap.css" /> {% endblock %} {% block content %} <!-- Start of body --> @@ -20,46 +19,51 @@ <button class="btn btn-default" id="add" disabled ><span class="glyphicon glyphicon-plus-sign"></span> Add</button> <input type="text" id="searchbox" class="form-control" style="width: 180px; display: inline;" placeholder="Search This Table For ..."> <input type="text" id="select_top" class="form-control" style="width: 120px; display: inline;" placeholder="Select Top ..."> - <br /> <br /> + <form id="export_form" method="POST" action="/export_traits_csv"> + <input type="hidden" name="database_name" id="database_name" value="None"> + <input type="hidden" name="export_data" id="export_data" value=""> + <button class="btn btn-default" id="export_traits">Download CSV</button> + </form> + <br /> <div style="width: 2000px; background-color: #eeeeee; border: 1px solid black;"> <table width="2000px" id="trait_table" class="table table-hover table-striped" > <thead> <tr> <th style="background-color: #eeeeee;"></th> - <th style="background-color: #eeeeee;">Index</th> - <th style="background-color: #eeeeee;">Species</th> - <th style="background-color: #eeeeee;">Group</th> - <th style="background-color: #eeeeee;">Tissue</th> - <th style="background-color: #eeeeee;">Dataset</th> - <th style="background-color: #eeeeee;">Record</th> - <th style="background-color: #eeeeee;">Symbol</th> - <th style="background-color: #eeeeee;">Description</th> - <th style="background-color: #eeeeee;">Location</th> - <th style="background-color: #eeeeee;">Mean</th> - <th style="background-color: #eeeeee;">Max <br>LRS<a href="http://genenetwork.org/glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th> - <th style="background-color: #eeeeee;">Max LRS Location</th> - <th style="background-color: #eeeeee;">Additive<br>Effect<a href="http://genenetwork.org/glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th> + <th data-export="Index" style="background-color: #eeeeee;">Index</th> + <th data-export="Species" style="background-color: #eeeeee;">Species</th> + <th data-export="Group" style="background-color: #eeeeee;">Group</th> + <th data-export="Tissue" style="background-color: #eeeeee;">Tissue</th> + <th data-export="Dataset" style="background-color: #eeeeee;">Dataset</th> + <th data-export="Record" style="background-color: #eeeeee;">Record</th> + <th data-export="Symbol" style="background-color: #eeeeee;">Symbol</th> + <th data-export="Description" style="background-color: #eeeeee;">Description</th> + <th data-export="Location" style="background-color: #eeeeee;">Location</th> + <th data-export="Mean" style="background-color: #eeeeee;">Mean</th> + <th data-export="Max LRS" style="background-color: #eeeeee;">Max <br>LRS<a href="http://genenetwork.org/glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th> + <th data-export="Max LRS Location" style="background-color: #eeeeee;">Max LRS Location</th> + <th data-export="Additive Effect" style="background-color: #eeeeee;">Additive<br>Effect<a href="http://genenetwork.org/glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th> </tr> </thead> <tbody> {% for this_trait in trait_list %} <tr id="trait:{{ this_trait.name }}:{{ this_trait.dataset.name }}"> <td><input type="checkbox" name="searchResult" class="checkbox trait_checkbox" style="transform: scale(1.5);" value="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) }}"></td> - <td>{{ loop.index }}</td> - <td>{{ this_trait.dataset.group.species }}</td> - <td>{{ this_trait.dataset.group.name }}</td> - <td>{{ this_trait.dataset.tissue }}</td> - <td>{{ this_trait.dataset.name }}</td> - <td><a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset.name)}}">{{ this_trait.name }}</a></td> - <td>{{ this_trait.symbol }}</td> - <td>{{ this_trait.description_display }}</td> - <td align="right">{{ this_trait.location_repr }}</td> - <td align="right">{{ '%0.3f' % this_trait.mean|float }}</td> - <td align="right">{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}</td> - <td align="right">{{ this_trait.LRS_location_repr }}</td> - <td align="right">{% if this_trait.additive != "" %}{{ '%0.3f' % this_trait.additive|float }}{% else %}N/A{% endif %}</td> + <td data-export="{{ loop.index }}">{{ loop.index }}</td> + <td data-export="{{ this_trait.dataset.group.species }}">{{ this_trait.dataset.group.species }}</td> + <td data-export="{{ this_trait.dataset.group.name }}">{{ this_trait.dataset.group.name }}</td> + <td data-export="{{ this_trait.dataset.tissue }}">{{ this_trait.dataset.tissue }}</td> + <td data-export="{{ this_trait.dataset.name }}">{{ this_trait.dataset.name }}</td> + <td data-export="{{ this_trait.name }}"><a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset.name)}}">{{ this_trait.name }}</a></td> + <td data-export="{{ this_trait.symbol }}">{{ this_trait.symbol }}</td> + <td data-export="{{ this_trait.description_display }}">{{ this_trait.description_display }}</td> + <td data-export="{{ this_trait.location_repr }}" align="right">{{ this_trait.location_repr }}</td> + <td data-export="{{ '%0.3f' % this_trait.mean|float }}" align="right">{{ '%0.3f' % this_trait.mean|float }}</td> + <td data-export="{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}" align="right">{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}</td> + <td data-export="{{ this_trait.LRS_location_repr }}" align="right">{{ this_trait.LRS_location_repr }}</td> + <td data-export="{% if this_trait.additive != "" %}{{ '%0.3f' % this_trait.additive|float }}{% else %}N/A{% endif %}" align="right">{% if this_trait.additive != "" %}{{ '%0.3f' % this_trait.additive|float }}{% else %}N/A{% endif %}</td> </tr> {% endfor %} </tbody> @@ -94,9 +98,6 @@ <script language="javascript" type="text/javascript" src="/static/new/javascript/search_results.js"></script> <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.html5.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script> <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.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/new/packages/DataTables/extensions/dataTables.colReorder.js"></script> @@ -105,27 +106,12 @@ <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()); - } - } - else if (isNaN(x)) { - return x; - } - return parseFloat(x); - } - $.fn.dataTable.ext.order['dom-checkbox'] = function ( settings, col ) { return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { return $('input', td).prop('checked') ? '1' : '0'; } ); - } + }; $(document).ready( function () { @@ -138,19 +124,8 @@ console.time("Creating table"); $('#trait_table').DataTable( { "paging": false, - "buttons": [ - { - extend: 'csvHtml5', - text: 'Download CSV', - title: 'search_results', - fieldBoundary: '"', - exportOptions: { - columns: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] - } - } - ], "columns": [ - { "type": "natural" }, + { "orderDataType": "dom-checkbox" }, { "type": "natural" }, { "type": "natural" }, { "type": "natural", "width": "8%" }, @@ -165,8 +140,14 @@ { "type": "natural", "width": "8%" }, { "type": "natural" } ], + "columnDefs": [ + { + "targets": 0, + "orderDataType": "dom-checkbox" + } + ], "order": [[1, "asc" ]], - "sDom": "Btir", + "sDom": "tir", "autoWidth": false, "bDeferRender": true, "scrollY": "800px", diff --git a/wqflask/wqflask/templates/gsearch_pheno.html b/wqflask/wqflask/templates/gsearch_pheno.html index be4981bb..2f7dcaf6 100644 --- a/wqflask/wqflask/templates/gsearch_pheno.html +++ b/wqflask/wqflask/templates/gsearch_pheno.html @@ -4,7 +4,6 @@ <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" /> - <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" /> <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/dataTables.fixedHeader.css" > <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/fixedcolumns/3.0.4/css/dataTables.fixedColumns.css"> {% endblock %} @@ -25,37 +24,43 @@ <input type="text" id="select_top" class="form-control" style="width: 200px; display: inline;" placeholder="Select Top ..."> <br /> <br /> + <form id="export_form" method="POST" action="/export_traits_csv"> + <input type="hidden" name="database_name" id="database_name" value="None"> + <input type="hidden" name="export_data" id="export_data" value=""> + <button class="btn btn-default" id="export_traits">Download CSV</button> + </form> + <br /> <div style="width: 1500px; background-color: #eeeeee; border: 1px solid black;"> <table width="1500px" id="trait_table" class="table table-hover table-striped"> <thead> <tr> <th style="background-color: #eeeeee;"></th> - <th style="background-color: #eeeeee;">Index</th> - <th style="background-color: #eeeeee;">Species</th> - <th style="background-color: #eeeeee;">Group</th> - <th style="background-color: #eeeeee;">Record</th> - <th style="background-color: #eeeeee;">Description</th> - <th style="background-color: #eeeeee;">Authors</th> - <th style="background-color: #eeeeee;">Year</th> - <th style="background-color: #eeeeee; text-align: right;">Max <br>LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th> - <th style="background-color: #eeeeee;">Max LRS Location</th> - <th style="background-color: #eeeeee; text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th> + <th data-export="Index" style="background-color: #eeeeee;">Index</th> + <th data-export="Species" style="background-color: #eeeeee;">Species</th> + <th data-export="Group" style="background-color: #eeeeee;">Group</th> + <th data-export="Record" style="background-color: #eeeeee;">Record</th> + <th data-export="Description" style="background-color: #eeeeee;">Description</th> + <th data-export="Authors" style="background-color: #eeeeee;">Authors</th> + <th data-export="Year" style="background-color: #eeeeee;">Year</th> + <th data-export="LRS" style="background-color: #eeeeee; text-align: right;">Max <br>LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th> + <th data-export="LRS Location" style="background-color: #eeeeee;">Max LRS Location</th> + <th data-export="Additive Effect" style="background-color: #eeeeee; text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th> </tr> </thead> <tbody> {% for this_trait in trait_list %} <TR id="trait:{{ this_trait.name }}:{{ this_trait.dataset.name }}"> <td><INPUT TYPE="checkbox" NAME="searchResult" class="checkbox trait_checkbox" style="transform: scale(1.5);" VALUE="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) }}"></td> - <td>{{ loop.index }}</td> - <td>{{ this_trait.dataset.group.species }}</td> - <td>{{ this_trait.dataset.group.name }}</td> - <td><a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset.name)}}">{{ this_trait.name }}</a></td> - <td>{{ this_trait.description_display }}</td> - <td>{{ this_trait.authors }}</td> - <td data-order="{{ this_trait.pubmed_text }}"><a href="{{ this_trait.pubmed_link }}">{{ this_trait.pubmed_text }}</a></td> - <td align="right">{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}</td> - <td align="right">{{ this_trait.LRS_location_repr }}</td> - <td align="right">{% if this_trait.additive != "" %}{{ this_trait.additive }}{% else %}N/A{% endif %}</td> + <td data-export="{{ loop.index }}">{{ loop.index }}</td> + <td data-export="{{ this_trait.dataset.group.species }}">{{ this_trait.dataset.group.species }}</td> + <td data-export="{{ this_trait.dataset.group.name }}">{{ this_trait.dataset.group.name }}</td> + <td data-export="{{ this_trait.name }}"><a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset.name)}}">{{ this_trait.name }}</a></td> + <td data-export="{{ this_trait.description_display }}">{{ this_trait.description_display }}</td> + <td data-export="{{ this_trait.authors }}">{{ this_trait.authors }}</td> + <td data-export="{{ this_trait.pubmed_text }}" data-order="{{ this_trait.pubmed_text }}"><a href="{{ this_trait.pubmed_link }}">{{ this_trait.pubmed_text }}</a></td> + <td data-export="{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}" align="right">{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}</td> + <td data-export="{{ this_trait.LRS_location_repr }}" align="right">{{ this_trait.LRS_location_repr }}</td> + <td data-export="{% if this_trait.additive != "" %}{{ this_trait.additive }}{% else %}N/A{% endif %}" align="right">{% if this_trait.additive != "" %}{{ this_trait.additive }}{% else %}N/A{% endif %}</td> </TR> {% endfor %} </tbody> @@ -87,9 +92,6 @@ <script language="javascript" type="text/javascript" src="/static/new/javascript/search_results.js"></script> <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.html5.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script> <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.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/new/packages/DataTables/extensions/dataTables.colReorder.js"></script> @@ -98,40 +100,11 @@ <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()); - } - } - else if (isNaN(x)) { - return x; - } - return parseFloat(x); - } - - jQuery.fn.dataTableExt.oSort['cust-txt-asc'] = function (a, b) { - var x = getValue(a); - var y = getValue(b); - - if (x == 'N/A' || x == '') { - return 1; - } - else if (y == 'N/A' || y == '') { - return -1; - } - else { - 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)); + $.fn.dataTable.ext.order['dom-checkbox'] = function ( settings, col ) + { + return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { + return $('input', td).prop('checked') ? '1' : '0'; + } ); }; $(document).ready( function () { @@ -145,19 +118,8 @@ console.time("Creating table"); $('#trait_table').DataTable( { "paging": false, - "buttons": [ - { - extend: 'csvHtml5', - text: 'Download CSV', - title: 'search_results', - fieldBoundary: '"', - exportOptions: { - columns: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - } - } - ], "columns": [ - { "type": "natural" }, + { "orderDataType": "dom-checkbox" }, { "type": "natural" }, { "type": "natural" }, { "type": "natural" }, @@ -169,8 +131,14 @@ { "type": "natural", "width": "12%"}, { "type": "natural" } ], + "columnDefs": [ + { + "targets": 0, + "orderDataType": "dom-checkbox" + } + ], "order": [[1, "asc" ]], - "sDom": "Btir", + "sDom": "tir", "autoWidth": false, "bDeferRender": true, "scrollY": "800px", diff --git a/wqflask/wqflask/templates/search_result_page.html b/wqflask/wqflask/templates/search_result_page.html index 523037f8..0f5e68d7 100644 --- a/wqflask/wqflask/templates/search_result_page.html +++ b/wqflask/wqflask/templates/search_result_page.html @@ -5,7 +5,6 @@ <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/scroller/1.4.1/css/scroller.dataTables.min.css"> <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/dataTables.fixedHeader.css" > <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/fixedcolumns/3.0.4/css/dataTables.fixedColumns.css"> - <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" /> {% endblock %} {% block content %} <!-- Start of body --> @@ -13,7 +12,6 @@ 'GeneNetwork found {}.'.format(numify(results|count, "record", "records"))) }} <div class="container"> - <input type="hidden" name="uc_id" id="uc_id" value="{{ uc_id }}"> <!-- Need to customize text more for other types of searches --> @@ -41,7 +39,7 @@ {% elif word.key|lower == "position" %} with <u>target genes</u> on chromosome <strong>{% if word.search_term[0].split('chr')|length > 1 %}{{ word.search_term[0].split('chr')[1] }}{% elif word.search_term[0].split('CHR')|length > 1 %}{{ word.search_term[0].split('CHR')[1] }}{% else %}{{ word.search_term[0] }}{% endif %}</strong> between <strong>{{ word.search_term[1] }}</strong> and <strong>{{ word.search_term[2] }}</strong> Mb{% if loop.last %}.{% else %} and {% endif %} {% else %} - that match the term {{ word.search_term[0] }}. + that match the <u>TERM</u> <b>{{ word.search_term[0] }}</b>{% if loop.last %}.{% else %} and {% endif %} {% endif %} {% endfor %} </p> @@ -54,12 +52,17 @@ <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" disabled><span class="glyphicon glyphicon-plus-sign"></span> Add</button> - <!--<button class="btn btn-default"><span class="glyphicon glyphicon-download"></span> Download Table</button>--> <button id="redraw" class="btn btn-default">Reset Columns</button> <input type="text" id="searchbox" class="form-control" style="width: 200px; display: inline;" placeholder="Search This Table For ..."> <input type="text" id="select_top" class="form-control" style="width: 200px; display: inline;" placeholder="Select Top ..."> <br /> <br /> + <form id="export_form" method="POST" action="/export_traits_csv"> + <input type="hidden" name="database_name" id="database_name" value="{{ dataset.fullname }}"> + <input type="hidden" name="export_data" id="export_data" value=""> + <button class="btn btn-default" id="export_traits">Download CSV</button> + </form> + <br /> <!-- Removing this until more options are added and work correctly {% if dataset.type == 'ProbeSet' %} @@ -82,11 +85,11 @@ <th style="background-color: #eeeeee;"></th> {% for header in header_fields %} {% if header == 'Max LRS' %} - <th style="background-color: #eeeeee; text-align: right;">Max<br>LRS</th> + <th data-export="Max LRS" style="background-color: #eeeeee; text-align: right;">Max<br>LRS</th> {% elif header == 'Additive Effect' %} - <th style="background-color: #eeeeee; text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th> + <th data-export="Additive Effect" style="background-color: #eeeeee; text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th> {% else %} - <th style="background-color: #eeeeee;">{{header}}</th> + <th data-export="{{header}}" style="background-color: #eeeeee;">{{header}}</th> {% endif %} {% endfor %} </tr> @@ -97,8 +100,8 @@ <TR id="trait:{{ this_trait.name }}:{{ this_trait.dataset.name }}"> <TD><INPUT TYPE="checkbox" NAME="searchResult" class="checkbox trait_checkbox" style="transform: scale(1.5);" VALUE="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) }}"> </TD> - <TD align="right">{{ loop.index }}</TD> - <TD> + <TD data-export="{{ loop.index }}" align="right">{{ loop.index }}</TD> + <TD data-export="{{ this_trait.name }}"> <a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = dataset.name @@ -107,26 +110,26 @@ </a> </TD> {% if dataset.type == 'ProbeSet' %} - <TD>{{ this_trait.symbol }}</TD> - <TD>{{ this_trait.description_display }}</TD> - <TD>{{ this_trait.location_repr }}</TD> - <TD align="right">{{ '%0.3f' % this_trait.mean|float }}</TD> - <TD align="right">{{ '%0.3f' % this_trait.LRS_score_repr|float }}</TD> - <TD>{{ this_trait.LRS_location_repr }}</TD> - <TD align="right">{{ '%0.3f' % this_trait.additive|float }}</TD> + <TD data-export="{{ this_trait.symbol }}">{{ this_trait.symbol }}</TD> + <TD data-export="{{ this_trait.description_display }}">{{ this_trait.description_display }}</TD> + <TD data-export="{{ this_trait.location_repr }}">{{ this_trait.location_repr }}</TD> + <TD data-export="{{ '%0.3f' % this_trait.mean|float }}" align="right">{{ '%0.3f' % this_trait.mean|float }}</TD> + <TD data-export="{{ '%0.3f' % this_trait.LRS_score_repr|float }}" align="right">{{ '%0.3f' % this_trait.LRS_score_repr|float }}</TD> + <TD data-export="{{ this_trait.LRS_location_repr }}">{{ this_trait.LRS_location_repr }}</TD> + <TD data-export="{{ '%0.3f' % this_trait.additive|float }}" align="right">{{ '%0.3f' % this_trait.additive|float }}</TD> {% elif dataset.type == 'Publish' %} - <TD>{{ this_trait.description_display }}</TD> - <TD>{{ this_trait.authors }}</TD> - <TD data-sort="{{ this_trait.pubmed_text }}"> + <TD data-export="{{ this_trait.description_display }}">{{ this_trait.description_display }}</TD> + <TD data-export="{{ this_trait.authors }}">{{ this_trait.authors }}</TD> + <TD data-export="{{ this_trait.pubmed_text }}" data-sort="{{ this_trait.pubmed_text }}"> <a href="{{ this_trait.pubmed_link }}"> {{ this_trait.pubmed_text }} </a> </TD> - <TD>{{ '%0.3f' % this_trait.LRS_score_repr|float }}</TD> - <TD>{{ this_trait.LRS_location_repr }}</TD> - <TD>{{ '%0.3f' % this_trait.additive|float }}</TD> + <TD data-export="{{ '%0.3f' % this_trait.LRS_score_repr|float }}">{{ '%0.3f' % this_trait.LRS_score_repr|float }}</TD> + <TD data-export="{{ this_trait.LRS_location_repr }}">{{ this_trait.LRS_location_repr }}</TD> + <TD data-export="{{ '%0.3f' % this_trait.additive|float }}">{{ '%0.3f' % this_trait.additive|float }}</TD> {% elif dataset.type == 'Geno' %} - <TD>{{ this_trait.location_repr }}</TD> + <TD data-export="{{ this_trait.location_repr }}">{{ this_trait.location_repr }}</TD> {% endif %} </TR> {% endfor %} @@ -162,9 +165,6 @@ <script type="text/javascript" src="/static/new/javascript/search_results.js"></script> <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.html5.min.js"></script> - <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script> <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.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/new/packages/DataTables/extensions/dataTables.colResize.js"></script> @@ -172,44 +172,6 @@ <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.fixedHeader.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()); - } - } - else if (isNaN(x)) { - return x; - } - return parseFloat(x); - } - - - jQuery.fn.dataTableExt.oSort['cust-txt-asc'] = function (a, b) { - var x = getValue(a); - var y = getValue(b); - - if (x == 'N/A' || x == '') { - return 1; - } - else if (y == 'N/A' || y == '') { - return -1; - } - else { - 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) { @@ -235,18 +197,7 @@ { "type": "natural" } ], "order": [[1, "asc" ]], - "buttons": [ - { - extend: 'csvHtml5', - text: 'Download CSV', - title: 'search_results', - fieldBoundary: '"', - exportOptions: { - columns: [1, 2, 3, 4, 5, 6, 7, 8, 9] - } - } - ], - "sDom": "RZBtir", + "sDom": "RZtir", "iDisplayLength": -1, "bDeferRender": true, "bSortClasses": false, @@ -269,18 +220,7 @@ { "type": "natural" } ], "order": [[1, "asc" ]], - "buttons": [ - { - extend: 'csvHtml5', - text: 'Download CSV', - title: 'search_results', - fieldBoundary: '"', - exportOptions: { - columns: [1, 2, 3, 4, 5, 6, 7] - } - } - ], - "sDom": "RZBtir", + "sDom": "RZtir", "iDisplayLength": -1, "autoWidth": false, "bDeferRender": true, @@ -298,18 +238,7 @@ { "type": "natural", "width": "40%"} ], "order": [[1, "asc" ]], - "buttons": [ - { - extend: 'csvHtml5', - text: 'Download CSV', - title: 'search_results', - fieldBoundary: '"', - exportOptions: { - columns: [1, 2, 3] - } - } - ], - "sDom": "RZBtir", + "sDom": "RZtir", "iDisplayLength": -1, "autoWidth": true, "bDeferRender": true, diff --git a/wqflask/wqflask/templates/show_trait_details.html b/wqflask/wqflask/templates/show_trait_details.html index d5fb0cf2..017a88ae 100644 --- a/wqflask/wqflask/templates/show_trait_details.html +++ b/wqflask/wqflask/templates/show_trait_details.html @@ -51,7 +51,7 @@ <td> {% if this_trait.geneid != None %} <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=Graphics&list_uids={{ this_trait.geneid }}" title="Info from NCBI Entrez Gene"> - Gene + NCBI </a> {% endif %} @@ -61,12 +61,6 @@ </a> {% endif %} - {% if this_trait.genbankid != None %} - <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=Nucleotide&cmd=search&doptcmdl=DocSum&term={{ this_trait.genbankid }}" title="Find the original GenBank sequence used to design the probes"> - GenBank - </a> - - {% endif %} {% if this_trait.symbol != None %} <a href="http://www.genotation.org/Getd2g.pl?gene_list={{ this_trait.symbol }}" title="Related descriptive, genomic, clinical, functional and drug-therapy information"> Genotation diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 822bab9f..4f6725b3 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -33,6 +33,7 @@ import sqlalchemy from wqflask import app from flask import g, Response, request, make_response, render_template, send_from_directory, jsonify, redirect from wqflask import search_results +from wqflask import export_traits from wqflask import gsearch from wqflask import update_search_results from wqflask import docs @@ -338,6 +339,17 @@ def export_trait_csv(): mimetype='text/csv', headers={"Content-Disposition":"attachment;filename=sample_data.csv"}) +@app.route('/export_traits_csv', methods=('POST',)) +def export_traits_csv(): + """CSV file consisting of the traits from the search result page""" + logger.info("In export_traits_csv") + logger.info("request.form:", request.form) + csv_data = export_traits.export_search_results_csv(request.form) + + return Response(csv_data, + mimetype='text/csv', + headers={"Content-Disposition":"attachment;filename=trait_list.csv"}) + @app.route('/export_perm_data', methods=('POST',)) def export_perm_data(): """CSV file consisting of the permutation data for the mapping results""" |