diff options
author | Zachary Sloan | 2012-10-12 17:09:02 -0500 |
---|---|---|
committer | Zachary Sloan | 2012-10-12 17:09:02 -0500 |
commit | 5d8b5c7481429267b418bc27a41dcf58701e1959 (patch) | |
tree | da656c4729f3ac8c85d59c97a9bd6ab449558934 | |
parent | f44e0255f19fc581d4ae9f2ad253f01068508d90 (diff) | |
download | genenetwork2-5d8b5c7481429267b418bc27a41dcf58701e1959.tar.gz |
Finished getting trait data to export as a download prompt
Sam worked on the new index page model that uses bootstrap
-rw-r--r-- | wqflask/wqflask/show_trait/export_trait_data.py | 29 | ||||
-rwxr-xr-x | wqflask/wqflask/show_trait/show_trait.py | 3 | ||||
-rw-r--r-- | wqflask/wqflask/static/new/javascript/show_trait.coffee | 20 | ||||
-rw-r--r-- | wqflask/wqflask/static/new/javascript/show_trait.js | 10 | ||||
-rw-r--r-- | wqflask/wqflask/static/packages/bootstrap/css/docs.css | 1001 | ||||
-rw-r--r-- | wqflask/wqflask/templates/new_index_page.html | 226 | ||||
-rw-r--r-- | wqflask/wqflask/views.py | 30 |
7 files changed, 1237 insertions, 82 deletions
diff --git a/wqflask/wqflask/show_trait/export_trait_data.py b/wqflask/wqflask/show_trait/export_trait_data.py index b1444440..e5f2035d 100644 --- a/wqflask/wqflask/show_trait/export_trait_data.py +++ b/wqflask/wqflask/show_trait/export_trait_data.py @@ -1,5 +1,7 @@ from __future__ import print_function, division +import operator + import simplejson as json #import xlwt @@ -9,15 +11,24 @@ def export_sample_table(targs): #print("* keys0 args is:", targs[0].keys()) - test_export_file = open("/home/zas1024/gene/wqflask/wqflask/show_trait/export_test.txt", "w") - - for key, item in targs.iteritems(): - print("[arrow] key is:", key) + #test_export_file = open("/home/zas1024/gene/wqflask/wqflask/show_trait/export_test.txt", "w") + # + #for key, item in targs.iteritems(): + # print("[arrow] key is:", key) - sample_data = json.loads(targs['json_data']) + sample_data = json.loads(targs['export_data']) + final_sample_data = [] - print("primary_samples is:", pf(sample_data['primary_samples'])) + for sample_group in ['primary_samples', 'other_samples']: + for row in sample_data[sample_group]: + sorted_row = dict_to_sorted_list(row) + print("sorted_row is:", pf(sorted_row)) + final_sample_data.append(sorted_row) + + return final_sample_data - for key in sample_data['primary_samples'][0]: - test_export_file.write(key + ",") - test_export_file.write("\n")
\ No newline at end of file +def dict_to_sorted_list(dictionary): + sorted_list = [item for item in dictionary.iteritems()] + sorted_list = sorted(sorted_list, key=operator.itemgetter(0)) + sorted_values = [item[1] for item in sorted_list] + return sorted_values
\ No newline at end of file diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index 942ce336..86a0a992 100755 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -89,7 +89,8 @@ class ShowTrait(templatePage): otherStrainVals = '_', otherStrainVars = '_', extra_attributes = '_', - other_extra_attributes = '_' + other_extra_attributes = '_', + export_data = None ) if fd.enablevariance: diff --git a/wqflask/wqflask/static/new/javascript/show_trait.coffee b/wqflask/wqflask/static/new/javascript/show_trait.coffee index a89b29af..c7dc7c88 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.coffee +++ b/wqflask/wqflask/static/new/javascript/show_trait.coffee @@ -295,17 +295,25 @@ $ -> samples.other_samples = other_samples return samples - export_sample_table_data = -> sample_data = get_sample_table_data() console.log("sample_data is:", sample_data) json_sample_data = JSON.stringify(sample_data) console.log("json_sample_data is:", json_sample_data) - $.ajax( - url: '/export_trait_data' - type: 'POST' - data: "json_data=" + json_sample_data - ) + + $('input[name=export_data]').val(json_sample_data) + + console.log("export_data is", $('input[name=export_data]').val()) + + $('#trait_data_form').attr('action', '/export_trait_csv') + console.log("action is:", $('#trait_data_form').attr('action')) + $('#trait_data_form').submit() + + #$.ajax( + # url: '/export_trait_csv' + # type: 'POST' + # data: "json_data=" + json_sample_data + #) $('#export').click(export_sample_table_data) diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js index e4f477f3..5729eb22 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.js +++ b/wqflask/wqflask/static/new/javascript/show_trait.js @@ -339,11 +339,11 @@ console.log("sample_data is:", sample_data); json_sample_data = JSON.stringify(sample_data); console.log("json_sample_data is:", json_sample_data); - return $.ajax({ - url: '/export_trait_data', - type: 'POST', - data: "json_data=" + json_sample_data - }); + $('input[name=export_data]').val(json_sample_data); + console.log("export_data is", $('input[name=export_data]').val()); + $('#trait_data_form').attr('action', '/export_trait_csv'); + console.log("action is:", $('#trait_data_form').attr('action')); + return $('#trait_data_form').submit(); }; $('#export').click(export_sample_table_data); console.log("before registering block_outliers"); diff --git a/wqflask/wqflask/static/packages/bootstrap/css/docs.css b/wqflask/wqflask/static/packages/bootstrap/css/docs.css new file mode 100644 index 00000000..a6fff3c3 --- /dev/null +++ b/wqflask/wqflask/static/packages/bootstrap/css/docs.css @@ -0,0 +1,1001 @@ +/* Add additional stylesheets below +-------------------------------------------------- */ +/* + Bootstrap's documentation styles + Special styles for presenting Bootstrap's documentation and examples +*/ + + + +/* Body and structure +-------------------------------------------------- */ + +body { + position: relative; + padding-top: 40px; +} + +/* Code in headings */ +h3 code { + font-size: 14px; + font-weight: normal; +} + + + +/* Tweak navbar brand link to be super sleek +-------------------------------------------------- */ + +body > .navbar { + font-size: 13px; +} + +/* Change the docs' brand */ +body > .navbar .brand { + padding-right: 0; + padding-left: 0; + margin-left: 20px; + float: right; + font-weight: bold; + color: #000; + text-shadow: 0 1px 0 rgba(255,255,255,.1), 0 0 30px rgba(255,255,255,.125); + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + transition: all .2s linear; +} +body > .navbar .brand:hover { + text-decoration: none; + text-shadow: 0 1px 0 rgba(255,255,255,.1), 0 0 30px rgba(255,255,255,.4); +} + + +/* Sections +-------------------------------------------------- */ + +/* padding for in-page bookmarks and fixed navbar */ +section { + padding-top: 30px; +} +section > .page-header, +section > .lead { + color: #5a5a5a; +} +section > ul li { + margin-bottom: 5px; +} + +/* Separators (hr) */ +.bs-docs-separator { + margin: 40px 0 39px; +} + +/* Faded out hr */ +hr.soften { + height: 1px; + margin: 70px 0; + background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); + background-image: -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); + background-image: -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); + background-image: -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); + border: 0; +} + + + +/* Jumbotrons +-------------------------------------------------- */ + +/* Base class +------------------------- */ +.jumbotron { + position: relative; + padding: 40px 0; + color: #fff; + text-align: center; + text-shadow: 0 1px 3px rgba(0,0,0,.4), 0 0 30px rgba(0,0,0,.075); + background: #020031; /* Old browsers */ + background: -moz-linear-gradient(45deg, #020031 0%, #6d3353 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left bottom, right top, color-stop(0%,#020031), color-stop(100%,#6d3353)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(45deg, #020031 0%,#6d3353 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(45deg, #020031 0%,#6d3353 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(45deg, #020031 0%,#6d3353 100%); /* IE10+ */ + background: linear-gradient(45deg, #020031 0%,#6d3353 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#020031', endColorstr='#6d3353',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ + -webkit-box-shadow: inset 0 3px 7px rgba(0,0,0,.2), inset 0 -3px 7px rgba(0,0,0,.2); + -moz-box-shadow: inset 0 3px 7px rgba(0,0,0,.2), inset 0 -3px 7px rgba(0,0,0,.2); + box-shadow: inset 0 3px 7px rgba(0,0,0,.2), inset 0 -3px 7px rgba(0,0,0,.2); +} +.jumbotron h1 { + font-size: 80px; + font-weight: bold; + letter-spacing: -1px; + line-height: 1; +} +.jumbotron p { + font-size: 24px; + font-weight: 300; + line-height: 30px; + margin-bottom: 30px; +} + +/* Link styles (used on .masthead-links as well) */ +.jumbotron a { + color: #fff; + color: rgba(255,255,255,.5); + -webkit-transition: all .2s ease-in-out; + -moz-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.jumbotron a:hover { + color: #fff; + text-shadow: 0 0 10px rgba(255,255,255,.25); +} + +/* Download button */ +.masthead .btn { + padding: 14px 24px; + font-size: 24px; + font-weight: 200; + color: #fff; /* redeclare to override the `.jumbotron a` */ + border: 0; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); + -webkit-transition: none; + -moz-transition: none; + transition: none; +} +.masthead .btn:hover { + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); +} +.masthead .btn:active { + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.1); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.1); + box-shadow: inset 0 2px 4px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.1); +} + + +/* Pattern overlay +------------------------- */ +.jumbotron .container { + position: relative; + z-index: 2; +} +.jumbotron:after { + content: ''; + display: block; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: url(../img/bs-docs-masthead-pattern.png) repeat center center; + opacity: .4; +} + +/* Masthead (docs home) +------------------------- */ +.masthead { + padding: 70px 0 80px; + margin-bottom: 0; + color: #fff; +} +.masthead h1 { + font-size: 120px; + line-height: 1; + letter-spacing: -2px; +} +.masthead p { + font-size: 40px; + font-weight: 200; + line-height: 1.25; +} + +/* Textual links in masthead */ +.masthead-links { + margin: 0; + list-style: none; +} +.masthead-links li { + display: inline; + padding: 0 10px; + color: rgba(255,255,255,.25); +} + +/* Social proof buttons from GitHub & Twitter */ +.bs-docs-social { + padding: 15px 0; + text-align: center; + background-color: #f5f5f5; + border-top: 1px solid #fff; + border-bottom: 1px solid #ddd; +} + +/* Quick links on Home */ +.bs-docs-social-buttons { + margin-left: 0; + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.bs-docs-social-buttons li { + display: inline-block; + padding: 5px 8px; + line-height: 1; + *display: inline; + *zoom: 1; +} + +/* Subhead (other pages) +------------------------- */ +.subhead { + text-align: left; + border-bottom: 1px solid #ddd; +} +.subhead h1 { + font-size: 60px; +} +.subhead p { + margin-bottom: 20px; +} +.subhead .navbar { + display: none; +} + + + +/* Marketing section of Overview +-------------------------------------------------- */ + +.marketing { + text-align: center; + color: #5a5a5a; +} +.marketing h1 { + margin: 60px 0 10px; + font-size: 60px; + font-weight: 200; + line-height: 1; + letter-spacing: -1px; +} +.marketing h2 { + font-weight: 200; + margin-bottom: 5px; +} +.marketing p { + font-size: 16px; + line-height: 1.5; +} +.marketing .marketing-byline { + margin-bottom: 40px; + font-size: 20px; + font-weight: 300; + line-height: 25px; + color: #999; +} +.marketing img { + display: block; + margin: 0 auto 30px; +} + + + +/* Footer +-------------------------------------------------- */ + +.footer { + padding: 70px 0; + margin-top: 70px; + border-top: 1px solid #e5e5e5; + background-color: #f5f5f5; +} +.footer p { + margin-bottom: 0; + color: #777; +} +.footer-links { + margin: 10px 0; +} +.footer-links li { + display: inline; + margin-right: 10px; +} + + + +/* Special grid styles +-------------------------------------------------- */ + +.show-grid { + margin-top: 10px; + margin-bottom: 20px; +} +.show-grid [class*="span"] { + background-color: #eee; + text-align: center; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + min-height: 40px; + line-height: 40px; +} +.show-grid:hover [class*="span"] { + background: #ddd; +} +.show-grid .show-grid { + margin-top: 0; + margin-bottom: 0; +} +.show-grid .show-grid [class*="span"] { + background-color: #ccc; +} + + + +/* Mini layout previews +-------------------------------------------------- */ +.mini-layout { + border: 1px solid #ddd; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.075); + -moz-box-shadow: 0 1px 2px rgba(0,0,0,.075); + box-shadow: 0 1px 2px rgba(0,0,0,.075); +} +.mini-layout, +.mini-layout .mini-layout-body, +.mini-layout.fluid .mini-layout-sidebar { + height: 300px; +} +.mini-layout { + margin-bottom: 20px; + padding: 9px; +} +.mini-layout div { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.mini-layout .mini-layout-body { + background-color: #dceaf4; + margin: 0 auto; + width: 70%; +} +.mini-layout.fluid .mini-layout-sidebar, +.mini-layout.fluid .mini-layout-header, +.mini-layout.fluid .mini-layout-body { + float: left; +} +.mini-layout.fluid .mini-layout-sidebar { + background-color: #bbd8e9; + width: 20%; +} +.mini-layout.fluid .mini-layout-body { + width: 77.5%; + margin-left: 2.5%; +} + + + +/* Download page +-------------------------------------------------- */ + +.download .page-header { + margin-top: 36px; +} +.page-header .toggle-all { + margin-top: 5px; +} + +/* Space out h3s when following a section */ +.download h3 { + margin-bottom: 5px; +} +.download-builder input + h3, +.download-builder .checkbox + h3 { + margin-top: 9px; +} + +/* Fields for variables */ +.download-builder input[type=text] { + margin-bottom: 9px; + font-family: Menlo, Monaco, "Courier New", monospace; + font-size: 12px; + color: #d14; +} +.download-builder input[type=text]:focus { + background-color: #fff; +} + +/* Custom, larger checkbox labels */ +.download .checkbox { + padding: 6px 10px 6px 25px; + font-size: 13px; + line-height: 18px; + color: #555; + background-color: #f9f9f9; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} +.download .checkbox:hover { + color: #333; + background-color: #f5f5f5; +} +.download .checkbox small { + font-size: 12px; + color: #777; +} + +/* Variables section */ +#variables label { + margin-bottom: 0; +} + +/* Giant download button */ +.download-btn { + margin: 36px 0 108px; +} +#download p, +#download h4 { + max-width: 50%; + margin: 0 auto; + color: #999; + text-align: center; +} +#download h4 { + margin-bottom: 0; +} +#download p { + margin-bottom: 18px; +} +.download-btn .btn { + display: block; + width: auto; + padding: 19px 24px; + margin-bottom: 27px; + font-size: 30px; + line-height: 1; + text-align: center; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + + + +/* Misc +-------------------------------------------------- */ + +/* Make tables spaced out a bit more */ +h2 + table, +h3 + table, +h4 + table, +h2 + .row { + margin-top: 5px; +} + +/* Example sites showcase */ +.example-sites { + xmargin-left: 20px; +} +.example-sites img { + max-width: 100%; + margin: 0 auto; +} + +.scrollspy-example { + height: 200px; + overflow: auto; + position: relative; +} + + +/* Fake the :focus state to demo it */ +.focused { + border-color: rgba(82,168,236,.8); + -webkit-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); + -moz-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); + box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); + outline: 0; +} + +/* For input sizes, make them display block */ +.docs-input-sizes select, +.docs-input-sizes input[type=text] { + display: block; + margin-bottom: 9px; +} + +/* Icons +------------------------- */ +.the-icons { + margin-left: 0; + list-style: none; +} +.the-icons li { + float: left; + width: 25%; + line-height: 25px; +} +.the-icons i:hover { + background-color: rgba(255,0,0,.25); +} + +/* Example page +------------------------- */ +.bootstrap-examples p { + font-size: 13px; + line-height: 18px; +} +.bootstrap-examples .thumbnail { + margin-bottom: 9px; + background-color: #fff; +} + + + +/* Bootstrap code examples +-------------------------------------------------- */ + +/* Base class */ +.bs-docs-example { + position: relative; + margin: 15px 0; + padding: 39px 19px 14px; + *padding-top: 19px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* Echo out a label for the example */ +.bs-docs-example:after { + content: "Example"; + position: absolute; + top: -1px; + left: -1px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + background-color: #f5f5f5; + border: 1px solid #ddd; + color: #9da0a4; + -webkit-border-radius: 4px 0 4px 0; + -moz-border-radius: 4px 0 4px 0; + border-radius: 4px 0 4px 0; +} + +/* Remove spacing between an example and it's code */ +.bs-docs-example + .prettyprint { + margin-top: -20px; + padding-top: 15px; +} + +/* Tweak examples +------------------------- */ +.bs-docs-example > p:last-child { + margin-bottom: 0; +} +.bs-docs-example .table, +.bs-docs-example .progress, +.bs-docs-example .well, +.bs-docs-example .alert, +.bs-docs-example .hero-unit, +.bs-docs-example .pagination, +.bs-docs-example .navbar, +.bs-docs-example > .nav, +.bs-docs-example blockquote { + margin-bottom: 5px; +} +.bs-docs-example .pagination { + margin-top: 0; +} +.bs-navbar-top-example, +.bs-navbar-bottom-example { + z-index: 1; + padding: 0; + height: 90px; + overflow: hidden; /* cut the drop shadows off */ +} +.bs-navbar-top-example .navbar-fixed-top, +.bs-navbar-bottom-example .navbar-fixed-bottom { + margin-left: 0; + margin-right: 0; +} +.bs-navbar-top-example { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.bs-navbar-top-example:after { + top: auto; + bottom: -1px; + -webkit-border-radius: 0 4px 0 4px; + -moz-border-radius: 0 4px 0 4px; + border-radius: 0 4px 0 4px; +} +.bs-navbar-bottom-example { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.bs-navbar-bottom-example .navbar { + margin-bottom: 0; +} +form.bs-docs-example { + padding-bottom: 19px; +} + +/* Images */ +.bs-docs-example-images img { + margin: 10px; + display: inline-block; +} + +/* Tooltips */ +.bs-docs-tooltip-examples { + text-align: center; + margin: 0 0 10px; + list-style: none; +} +.bs-docs-tooltip-examples li { + display: inline; + padding: 0 10px; +} + +/* Popovers */ +.bs-docs-example-popover { + padding-bottom: 24px; + background-color: #f9f9f9; +} +.bs-docs-example-popover .popover { + position: relative; + display: block; + float: left; + width: 260px; + margin: 20px; +} + + + +/* Responsive docs +-------------------------------------------------- */ + +/* Utility classes table +------------------------- */ +.responsive-utilities th small { + display: block; + font-weight: normal; + color: #999; +} +.responsive-utilities tbody th { + font-weight: normal; +} +.responsive-utilities td { + text-align: center; +} +.responsive-utilities td.is-visible { + color: #468847; + background-color: #dff0d8 !important; +} +.responsive-utilities td.is-hidden { + color: #ccc; + background-color: #f9f9f9 !important; +} + +/* Responsive tests +------------------------- */ +.responsive-utilities-test { + margin-top: 5px; + margin-left: 0; + list-style: none; + overflow: hidden; /* clear floats */ +} +.responsive-utilities-test li { + position: relative; + float: left; + width: 25%; + height: 43px; + font-size: 14px; + font-weight: bold; + line-height: 43px; + color: #999; + text-align: center; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.responsive-utilities-test li + li { + margin-left: 10px; +} +.responsive-utilities-test span { + position: absolute; + top: -1px; + left: -1px; + right: -1px; + bottom: -1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.responsive-utilities-test span { + color: #468847; + background-color: #dff0d8; + border: 1px solid #d6e9c6; +} + + + +/* Sidenav for Docs +-------------------------------------------------- */ + +.bs-docs-sidenav { + width: 228px; + margin: 30px 0 0; + padding: 0; + background-color: #fff; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.065); + -moz-box-shadow: 0 1px 4px rgba(0,0,0,.065); + box-shadow: 0 1px 4px rgba(0,0,0,.065); +} +.bs-docs-sidenav > li > a { + display: block; + *width: 190px; + margin: 0 0 -1px; + padding: 8px 14px; + border: 1px solid #e5e5e5; +} +.bs-docs-sidenav > li:first-child > a { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} +.bs-docs-sidenav > li:last-child > a { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} +.bs-docs-sidenav > .active > a { + position: relative; + z-index: 2; + padding: 9px 15px; + border: 0; + text-shadow: 0 1px 0 rgba(0,0,0,.15); + -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1); + -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1); + box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1); +} +/* Chevrons */ +.bs-docs-sidenav .icon-chevron-right { + float: right; + margin-top: 2px; + margin-right: -6px; + opacity: .25; +} +.bs-docs-sidenav > li > a:hover { + background-color: #f5f5f5; +} +.bs-docs-sidenav a:hover .icon-chevron-right { + opacity: .5; +} +.bs-docs-sidenav .active .icon-chevron-right, +.bs-docs-sidenav .active a:hover .icon-chevron-right { + background-image: url(../img/glyphicons-halflings-white.png); + opacity: 1; +} +.bs-docs-sidenav.affix { + top: 40px; +} +.bs-docs-sidenav.affix-bottom { + position: absolute; + top: auto; + bottom: 270px; +} + + + + +/* Responsive +-------------------------------------------------- */ + +/* Desktop large +------------------------- */ +@media (min-width: 1200px) { + .bs-docs-container { + max-width: 970px; + } + .bs-docs-sidenav { + width: 258px; + } +} + +/* Desktop +------------------------- */ +@media (max-width: 980px) { + /* Unfloat brand */ + body > .navbar-fixed-top .brand { + float: left; + margin-left: 0; + padding-left: 10px; + padding-right: 10px; + } + + /* Inline-block quick links for more spacing */ + .quick-links li { + display: inline-block; + margin: 5px; + } + + /* When affixed, space properly */ + .bs-docs-sidenav { + top: 0; + margin-top: 30px; + margin-right: 0; + } +} + +/* Tablet to desktop +------------------------- */ +@media (min-width: 768px) and (max-width: 980px) { + /* Remove any padding from the body */ + body { + padding-top: 0; + } + /* Widen masthead and social buttons to fill body padding */ + .jumbotron { + margin-top: -20px; /* Offset bottom margin on .navbar */ + } + /* Adjust sidenav width */ + .bs-docs-sidenav { + width: 166px; + margin-top: 20px; + } + .bs-docs-sidenav.affix { + top: 0; + } +} + +/* Tablet +------------------------- */ +@media (max-width: 767px) { + /* Remove any padding from the body */ + body { + padding-top: 0; + } + + /* Widen masthead and social buttons to fill body padding */ + .jumbotron { + padding: 40px 20px; + margin-top: -20px; /* Offset bottom margin on .navbar */ + margin-right: -20px; + margin-left: -20px; + } + .masthead h1 { + font-size: 90px; + } + .masthead p, + .masthead .btn { + font-size: 24px; + } + .marketing .span4 { + margin-bottom: 40px; + } + .bs-docs-social { + margin: 0 -20px; + } + + /* Space out the show-grid examples */ + .show-grid [class*="span"] { + margin-bottom: 5px; + } + + /* Sidenav */ + .bs-docs-sidenav { + width: auto; + margin-bottom: 20px; + } + .bs-docs-sidenav.affix { + position: static; + width: auto; + top: 0; + } + + /* Unfloat the back to top link in footer */ + .footer { + margin-left: -20px; + margin-right: -20px; + padding-left: 20px; + padding-right: 20px; + } + .footer p { + margin-bottom: 9px; + } +} + +/* Landscape phones +------------------------- */ +@media (max-width: 480px) { + /* Remove padding above jumbotron */ + body { + padding-top: 0; + } + + /* Change up some type stuff */ + h2 small { + display: block; + } + + /* Downsize the jumbotrons */ + .jumbotron h1 { + font-size: 60px; + } + .jumbotron p, + .jumbotron .btn { + font-size: 20px; + } + .jumbotron .btn { + display: block; + margin: 0 auto; + } + + /* center align subhead text like the masthead */ + .subhead h1, + .subhead p { + text-align: center; + } + + /* Marketing on home */ + .marketing h1 { + font-size: 40px; + } + + /* center example sites */ + .example-sites { + margin-left: 0; + } + .example-sites > li { + float: none; + display: block; + max-width: 280px; + margin: 0 auto 18px; + text-align: center; + } + .example-sites .thumbnail > img { + max-width: 270px; + } + + /* Do our best to make tables work in narrow viewports */ + table code { + white-space: normal; + word-wrap: break-word; + word-break: break-all; + } + + /* Modal example */ + .modal-example .modal { + position: relative; + top: auto; + right: auto; + bottom: auto; + left: auto; + } + + /* Unfloat the back to top in footer to prevent odd text wrapping */ + .footer .pull-right { + float: none; + } +} diff --git a/wqflask/wqflask/templates/new_index_page.html b/wqflask/wqflask/templates/new_index_page.html index 85c63b3f..b415daee 100644 --- a/wqflask/wqflask/templates/new_index_page.html +++ b/wqflask/wqflask/templates/new_index_page.html @@ -1,91 +1,199 @@ +<!DOCTYPE html> +<html lang="en"> <head> <title>GeneNetwork</title> <link REL="stylesheet" TYPE="text/css" href="/static/packages/bootstrap/css/bootstrap.min.css" /> + <link REL="stylesheet" TYPE="text/css" href="/static/packages/bootstrap/css/bootstrap-responsive.min.css" /> + <link REL="stylesheet" TYPE="text/css" href="/static/packages/bootstrap/css/docs.css" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> <script src="/static/packages/bootstrap/js/bootstrap.min.js"></script> </head> <body> - <div class="container"> + <div class="hero-unit"> + <h1>Gene Network</h1> + <p class="lead">Open Source Bioinformatics Website For Systems Genetics</p> + </div> - <div class="hero-unit"> - <h1>Gene Network</h1> - </div> - <div> - <form method="get" action="/search" name="SEARCHFORM"> - <fieldset> - <legend>Select and Search</legend> - <label for="species">Species:</label> - <select name="species" size="1" id="species" onchange="fillOptions('species');"> - </select> - - <div class="input-append"> - <label for="cross">Group: </label> - <select name="cross" id="cross" onchange="fillOptions('cross');"> - </select> - <i class="icon-question-sign"></i> - <!--<input type="button" class="btn" value="Info" onclick=--> - <!-- "javascript:crossinfo();" />--> + + <div class="container"> + <div class="row"> + <div class="span3 bs-docs-sidebar"> + <ul class="nav nav-list bs-docs-sidenav"> + <li><a href="#search_section"><i class="icon-chevron-right"></i> Search</a></li> + <li><a href="#getting_started_section"><i class="icon-chevron-right"></i> Getting Started</a></li> + <li><a href="#advanced_section"><i class="icon-chevron-right"></i> Advanced Commands</a></li> + <li><a href="#html-template"><i class="icon-chevron-right"></i> How To Use</a></li> + <li><a href="#examples"><i class="icon-chevron-right"></i> History</a></li> + <li><a href="#what-next"><i class="icon-chevron-right"></i> Mirrors and Other Sites</a></li> + </ul> + </div> + + <div class="span9"> + <section id="search_section"> + <div class="page-header"> + <h1>Select and Search</h1> </div> + <form method="get" action="/search" name="SEARCHFORM"> + <fieldset> + <!--<legend>Select and Search</legend>--> + <label for="species">Species:</label> + <select name="species" size="1" id="species" onchange="fillOptions('species');"> + </select> + + <div class="input-append"> + <label for="cross">Group: </label> + <select name="cross" id="cross" onchange="fillOptions('cross');"> + </select> + <!--<i class="icon-question-sign"></i>--> + <input type="button" class="btn" value="Info" onclick= + "javascript:crossinfo();" /> + </div> + + + <label for="type">Type:</label> + <select name="tissue" id="tissue" onchange= + "fillOptions('tissue');"></select> + + + <div class="input-append"> + <label for="database">Database:</label> + <select name="database" id="database"> + </select> <input type="button" class="btn" value="Info" name="info_database" /> + </div> + <!-- USER HELP --> + + + <!--<p >Databases marked with <b>**</b>--> + <!-- suffix are not public yet.<br>--> + <!-- Access requires <a href="/account.html" target=--> + <!-- "_blank" class="fs14">user login</a>.</p>--> + <!-- GET ANY SEARCH --> - <label for="type">Type:</label> - <select name="tissue" id="tissue" onchange= - "fillOptions('tissue');"></select> + <label for="tfor">Search:</label> + <input class="search-query" + id="tfor" name="ORkeyword" + type="text" maxlength="500"> - <div class="input-append"> - <label for="database">Database:</label> - <select name="database" id="database"> - </select> <input type="button" class="btn" value="Info" name="info_database" /> + <!-- GET ANY HELP --> + + </p>Enter terms, genes, ID numbers in the + <b>Search</b> field.<br> + Use <b>*</b> or <b>?</b> wildcards (Cyp*a?, + synap*).<br> + Use <b>quotes</b> for terms such as <i>"tyrosine + kinase"</i>.</p> + + <!-- SEARCH, MAKE DEFAULT, ADVANCED SEARCH --> + + + <input id="btsearch" type="submit" + class="btn btn-primary" value="Search"> + + <input type= + "button" class="btn" value="Make Default" onclick= + "setDefault(this.form);"> + + <input type="button" class= + "btn" value="Advanced Search" onclick= + "javascript:window.open('/index3.html', '_self');"> + + <input type="hidden" name="FormID" value="searchResult"> <input type= + "hidden" name="RISet" value="BXD"> + </fieldset> + </form> + </section> + + <section id="getting_started_section"> + <div class="page-header"> + <h1>Getting Started</h1> </div> - <!-- USER HELP --> + <ol style="font-size:12px;font-family:verdana;color:black"> + <li>Select <b>Species</b> (or select All)</li> + + <li>Select <b>Group</b> (a specific sample)</li> - <!--<p >Databases marked with <b>**</b>--> - <!-- suffix are not public yet.<br>--> - <!-- Access requires <a href="/account.html" target=--> - <!-- "_blank" class="fs14">user login</a>.</p>--> + <li>Select <b>Type</b> of data: - <!-- GET ANY SEARCH --> + <ul> + <li>Phenotype (traits)</li> - <label for="tfor">Search:</label> + <li>Genotype (markers)</li> - <input class="search-query" - id="tfor" name="ORkeyword" - type="text" maxlength="500"> + <li>Expression (mRNAs)</li> + </ul> + </li> - <!-- GET ANY HELP --> + <li>Select a <b>Database</b></li> - </p>Enter terms, genes, ID numbers in the - <b>Search</b> field.<br> - Use <b>*</b> or <b>?</b> wildcards (Cyp*a?, - synap*).<br> - Use <b>quotes</b> for terms such as <i>"tyrosine - kinase"</i>.</p> + <li>Enter terms in the search field: words, + genes, ID numbers, probes, advanced search commands</li> - <!-- SEARCH, MAKE DEFAULT, ADVANCED SEARCH --> + <li>Click on the <b>Search</b> button</li> + <li>Optional: Use the <b>Make Default</b> button to save your preferences</li> + </ol> - <input id="btsearch" type="submit" - class="btn btn-primary" value="Search"> + <h3>For more information, read our <a href="http://www.genenetwork.org/index4.html" target="_blank">User's Guide</a>.</h3> - <input type= - "button" class="btn" value="Make Default" onclick= - "setDefault(this.form);"> + </section> - <input type="button" class= - "btn" value="Advanced Search" onclick= - "javascript:window.open('/index3.html', '_self');"> - <input type="hidden" name="FormID" value="searchResult"> <input type= - "hidden" name="RISet" value="BXD"> - </fieldset> - </form> + <section id="advanced_section"> + <div class="page-header"> + <h1>Advanced Commands</h1> + </div> + + <p>You can also do more advanced + searches. Copy these examples + into the search field:</p> + + <ul> + <li><b>POSITION=(chr1 25 30)</b> finds genes, markers, or transcripts on + chromosome 1 between 25 and 30 Mb.</li> + + <li><b>MEAN=(15 16) LRS=(23 46)</b> in the <b>Combined</b> field finds + highly expressed genes (15 to 16 log2 units) AND with peak <a href= + "http://www.genenetwork.org/glossary.html#L" target="_blank">LRS</a> + linkage between 23 and 46.</li> + + <li><b>RIF=mitochondrial</b> searches RNA databases for <a href= + "http://www.ncbi.nlm.nih.gov/projects/GeneRIF/GeneRIFhelp.html" target="_blank"> + GeneRIF</a> links.</li> + + <li><b>WIKI=nicotine</b> searches <a href= + "http://www.genenetwork.org/webqtl/main.py?FormID=geneWiki" target="_blank"> + GeneWiki</a> for genes that you or other users have annotated + with the word <i>nicotine</i>.</li> + + <li><b>GO:0045202</b> searches for synapse-associated genes listed in the + <a href="http://www.godatabase.org/cgi-bin/amigo/go.cgi" target="_blank"> + Gene Ontology + </a>.</li> + + <li><b>GO:0045202 LRS=(9 99 Chr4 122 155) cisLRS=(9 999 10)</b> + finds synapse-associated genes with <a href= + "http://www.genenetwork.org/glossary.html#E" target="_blank"> + cis eQTL</a> on Chr 4 from 122 and 155 Mb with LRS scores + between 9 and 999.</li> + + <li><b>RIF=diabetes LRS=(9 999 Chr2 100 105) transLRS=(9 999 10)</b> + finds diabetes-associated transcripts with peak <a href= + "http://www.genenetwork.org/glossary.html#E" target="_blank"> + trans eQTLs</a> on Chr 2 between 100 and 105 Mb with LRS + scores between 9 and 999.</li> + </ul> + </section> + + </div> </div> </div> - <!--<script src="/javascript/selectDatasetMenu.js"--> - <!--type="text/javascript">--> - <!--</script>--> + <!--<script src="/javascript/selectDatasetMenu.js"--> + <!--type="text/javascript">--> + <!--</script>--> </body> +</html> diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 7210a1de..94768c9f 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -7,7 +7,7 @@ import flask from wqflask import app -from flask import render_template, request +from flask import render_template, request, make_response, Response from wqflask import search_results from wqflask.show_trait import show_trait @@ -87,11 +87,37 @@ def show_trait_page(): print("show_trait template_vars:", pf(template_vars.__dict__)) return render_template("show_trait.html", **template_vars.__dict__) + +@app.route('/export_trait_csv', methods=('POST',)) +def export_trait_csv(): + """CSV file consisting of the sample data from the trait data and analysis page""" + print("In export_trait_csv") + print("request.form:", request.form) + sample_data = export_trait_data.export_sample_table(request.form) + + print("sample_data - type: %s -- size: %s" % (type(sample_data), len(sample_data))) + + def generate(sample_data): + for row in sample_data: + print(','.join(row) + '\n') + yield ','.join(row) + '\n' + + print("generated data:", pf(generate(sample_data))) + + #print(pf(Response(generate(sample_data), + # mimetype='text/plain', + # headers={"Content-Disposition": + # "attachment;filename=test.csv"}))) + + return Response(generate(sample_data), + mimetype='text/csv', + headers={"Content-Disposition":"attachment;filename=test.csv"}) + + @app.route("/export_trait_data", methods=('POST',)) def export_sample_table(): """CSV file consisting of the sample data from the trait data and analysis page""" print("In export_sample_table") - print("request.args:", request.args) print("request.form:", request.form) template_vars = export_trait_data.export_sample_table(request.form) |