├── webapp ├── __init__.py ├── cron │ ├── crontab │ └── crontab.example ├── modules │ └── __init__.py ├── static │ ├── 403.html │ ├── 404.html │ ├── 500.html │ ├── favicon.ico │ ├── images │ │ ├── logo.png │ │ ├── Github.png │ │ ├── gitter.png │ │ ├── spinner.gif │ │ ├── twitter.png │ │ ├── facebook.png │ │ ├── gplus-32.png │ │ ├── banner-dev.gif │ │ ├── banner-staging.gif │ │ ├── tree-view-tips.png │ │ ├── phylopic-vignette.png │ │ ├── Logo_Google_groups.png │ │ ├── mini-opentree-logo.png │ │ ├── tree-view-ancestors.png │ │ ├── tree-view-edge-info.png │ │ ├── tree-view-node-info.png │ │ ├── tree-view-node-jump.png │ │ ├── glyphicons-halflings.png │ │ ├── tree-view-dotted-paths.png │ │ ├── tree-view-node-sizes.png │ │ ├── tree-view-solid-paths.png │ │ └── glyphicons-halflings-white.png │ ├── img │ │ ├── glyphicons-halflings.png │ │ └── glyphicons-halflings-white.png │ ├── js │ │ ├── argus │ │ │ ├── browser.html │ │ │ ├── nameresults.html │ │ │ ├── format.css │ │ │ └── index.html │ │ ├── web2py_bootstrap.js │ │ ├── bootstrap-transition.js │ │ ├── html5shiv.js │ │ ├── share.js │ │ └── bootstrap-alert.js │ ├── robots.txt │ ├── css │ │ ├── jquery.splitter.css │ │ └── calendar.css │ └── statistics │ │ └── ott.json ├── views │ ├── __init__.py │ ├── generic.json │ ├── generic.xml │ ├── plugin_localcomments │ │ └── grid.html │ ├── generic.pdf │ ├── default │ │ ├── about.html │ │ ├── user.html │ │ └── error.html │ ├── generic.rss │ ├── plugin_tagging │ │ └── index.html │ ├── about │ │ ├── credits.html │ │ ├── materials_and_methods.html │ │ ├── developer_resources.html │ │ ├── the_synthetic_tree.html │ │ └── the_source_tree_manager.html │ ├── generic.html │ ├── generic.jsonp │ ├── generic.ics │ ├── study │ │ └── index.html │ ├── web2py_ajax.html │ ├── generic.load │ ├── synthview │ │ └── index.html │ └── treeview │ │ └── index.html ├── models │ ├── db_wizard.py │ ├── db_wizard_populate.py │ ├── menu.py │ ├── plugin_comments.py │ ├── 0.py │ └── plugin_tagging.py ├── .gitignore ├── controllers │ ├── subtrees.py │ ├── synthview.py │ ├── treeview.py │ ├── contact.py │ └── plugin_tagging.py ├── ABOUT ├── languages │ ├── plural-en.py │ ├── plural-ru.py │ ├── plural-uk.py │ └── plural-cs.py ├── web2py.routes.example.py ├── LICENSE └── routes.py ├── curator ├── __init__.py ├── cron │ ├── crontab │ └── crontab.example ├── modules │ └── __init__.py ├── static │ ├── 403.html │ ├── 404.html │ ├── 500.html │ ├── js │ │ ├── tnrs │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ └── README.md │ │ ├── web2py_bootstrap.js │ │ ├── bootstrap-transition.js │ │ ├── html5shiv.js │ │ ├── knockout-bootstrap.min.js │ │ ├── share.js │ │ └── bootstrap-alert.js │ ├── jQuery-File-Upload-9.5.2 │ │ ├── .gitignore │ │ ├── server │ │ │ ├── node │ │ │ │ ├── .gitignore │ │ │ │ ├── public │ │ │ │ │ └── files │ │ │ │ │ │ └── .gitignore │ │ │ │ └── package.json │ │ │ ├── gae-go │ │ │ │ ├── static │ │ │ │ │ ├── robots.txt │ │ │ │ │ └── favicon.ico │ │ │ │ └── app.yaml │ │ │ ├── gae-python │ │ │ │ ├── static │ │ │ │ │ ├── robots.txt │ │ │ │ │ └── favicon.ico │ │ │ │ └── app.yaml │ │ │ └── php │ │ │ │ ├── files │ │ │ │ ├── .gitignore │ │ │ │ └── .htaccess │ │ │ │ └── index.php │ │ ├── img │ │ │ ├── loading.gif │ │ │ └── progressbar.gif │ │ ├── css │ │ │ ├── style.css │ │ │ ├── jquery.fileupload-ui-noscript.css │ │ │ ├── demo-ie8.css │ │ │ ├── jquery.fileupload-noscript.css │ │ │ ├── jquery.fileupload.css │ │ │ ├── jquery.fileupload-ui.css │ │ │ └── demo.css │ │ ├── cors │ │ │ ├── result.html │ │ │ └── postmessage.html │ │ ├── Gruntfile.js │ │ ├── blueimp-file-upload.jquery.json │ │ ├── package.json │ │ ├── bower.json │ │ ├── CONTRIBUTING.md │ │ └── js │ │ │ └── main.js │ ├── images │ │ ├── cc-zero.png │ │ ├── facebook.png │ │ ├── favicon.ico │ │ ├── favicon.png │ │ ├── gplus-32.png │ │ ├── twitter.png │ │ ├── GitHub-Mark-32px.png │ │ ├── tools │ │ │ ├── miapa-icon.png │ │ │ ├── miapa-icon.xcf │ │ │ ├── treemachine-icon.png │ │ │ └── treemachine-icon.xcf │ │ ├── glyphicons-halflings.png │ │ ├── glyphicons-halflings-white.png │ │ ├── tree-viewer-legend-ingroup.png │ │ ├── tree-viewer-legend-layers.xcf │ │ ├── study-status-under-revision.png │ │ ├── tree-viewer-legend-outgroup.png │ │ ├── tree-viewer-legend-tips-layers.xcf │ │ ├── tree-viewer-legend-tips-normal.png │ │ ├── tree-viewer-legend-tips-duplicate.png │ │ ├── tree-viewer-legend-tips-exemplar.png │ │ ├── tree-viewer-legend-tips-unmapped.png │ │ ├── tree-viewer-legend-conflict-resolves.png │ │ ├── tree-viewer-legend-internal-normal.png │ │ ├── tree-viewer-legend-tips-non-exemplar.png │ │ ├── tree-viewer-legend-internal-ambiguous.png │ │ ├── tree-viewer-legend-conflict-supported-by.png │ │ ├── tree-viewer-legend-conflict-undetermined.png │ │ └── tree-viewer-legend-conflict-conflicts-with.png │ ├── img │ │ ├── glyphicons-halflings.png │ │ └── glyphicons-halflings-white.png │ └── css │ │ ├── dialog-polyfill.css │ │ ├── bootstrap-tagsinput.css │ │ └── calendar.css ├── views │ ├── __init__.py │ ├── generic.json │ ├── generic.xml │ ├── generic.pdf │ ├── generic.rss │ ├── generic.html │ ├── generic.ics │ ├── web2py_ajax.html │ ├── default │ │ ├── user.html │ │ ├── error.html │ │ └── dashboard.html │ └── generic.load ├── test │ ├── .gitignore │ ├── testMerge.py │ ├── test2nexml.py │ ├── testString2nexml.py │ ├── testNoTreesString2nexml.py │ └── test.sh ├── progress.log ├── ABOUT ├── .gitignore ├── languages │ ├── plural-en.py │ ├── plural-ru.py │ ├── plural-uk.py │ └── plural-cs.py ├── controllers │ ├── tnrs.py │ └── supporting_files.py ├── install-ncl.sh ├── LICENSE └── routes.example.py ├── .gitattributes ├── less ├── custom-responsive.less ├── bootstrap │ ├── img │ │ ├── glyphicons-halflings.png │ │ └── glyphicons-halflings-white.png │ ├── js │ │ ├── .jshintrc │ │ ├── tests │ │ │ ├── server.js │ │ │ ├── unit │ │ │ │ ├── bootstrap-transition.js │ │ │ │ ├── bootstrap-phantom.js │ │ │ │ ├── bootstrap-affix.js │ │ │ │ ├── bootstrap-scrollspy.js │ │ │ │ └── bootstrap-alert.js │ │ │ ├── index.html │ │ │ └── phantom.js │ │ ├── bootstrap-transition.js │ │ └── bootstrap-alert.js │ └── less │ │ ├── layouts.less │ │ ├── component-animations.less │ │ ├── utilities.less │ │ ├── grid.less │ │ ├── breadcrumbs.less │ │ ├── responsive-768px-979px.less │ │ ├── hero-unit.less │ │ ├── wells.less │ │ ├── responsive-1200px-min.less │ │ ├── close.less │ │ ├── accordion.less │ │ ├── pager.less │ │ ├── media.less │ │ ├── scaffolding.less │ │ ├── responsive.less │ │ ├── thumbnails.less │ │ ├── code.less │ │ ├── alerts.less │ │ ├── bootstrap.less │ │ ├── responsive-utilities.less │ │ ├── tooltip.less │ │ ├── labels-badges.less │ │ ├── modals.less │ │ └── tests │ │ └── forms-responsive.html ├── twitter-bootstrap-v2.3.2-0-gd9b502d.zip ├── custom-bootstrap.less └── custom-other.less ├── requirements.txt ├── .gitignore ├── taxonomy └── cgi-bin │ └── Makefile ├── TESTS.md ├── mirror-files.opentreeoflife.org.sh ├── LICENSE.txt ├── mirror-supporting-files.sh ├── argus-json-notes.txt └── SITE.routes.py /webapp/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /curator/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /curator/cron/crontab: -------------------------------------------------------------------------------- 1 | #crontab -------------------------------------------------------------------------------- /webapp/cron/crontab: -------------------------------------------------------------------------------- 1 | #crontab -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.jar binary 2 | -------------------------------------------------------------------------------- /curator/modules/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /curator/static/403.html: -------------------------------------------------------------------------------- 1 | 403 2 | -------------------------------------------------------------------------------- /curator/static/404.html: -------------------------------------------------------------------------------- 1 | 404 2 | -------------------------------------------------------------------------------- /curator/static/500.html: -------------------------------------------------------------------------------- 1 | 500 2 | -------------------------------------------------------------------------------- /curator/views/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /webapp/modules/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /webapp/static/403.html: -------------------------------------------------------------------------------- 1 | 403 2 | -------------------------------------------------------------------------------- /webapp/static/404.html: -------------------------------------------------------------------------------- 1 | 404 2 | -------------------------------------------------------------------------------- /webapp/static/500.html: -------------------------------------------------------------------------------- 1 | 500 2 | -------------------------------------------------------------------------------- /webapp/views/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /curator/cron/crontab.example: -------------------------------------------------------------------------------- 1 | #crontab -------------------------------------------------------------------------------- /curator/test/.gitignore: -------------------------------------------------------------------------------- 1 | .out.* 2 | -------------------------------------------------------------------------------- /webapp/cron/crontab.example: -------------------------------------------------------------------------------- 1 | #crontab -------------------------------------------------------------------------------- /curator/progress.log: -------------------------------------------------------------------------------- 1 | [2013-10-02 16:18:27] START 2 | -------------------------------------------------------------------------------- /curator/static/js/tnrs/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /curator/ABOUT: -------------------------------------------------------------------------------- 1 | Write something about this app. 2 | Developed with web2py. 3 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | node_modules 4 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/node/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/node/public/files/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /webapp/views/generic.json: -------------------------------------------------------------------------------- 1 | {{from gluon.serializers import json}}{{=XML(json(response._vars))}} 2 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/gae-go/static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /curator/views/generic.json: -------------------------------------------------------------------------------- 1 | {{from gluon.serializers import json}}{{=XML(json(response._vars))}} 2 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/gae-python/static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/php/files/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | !.htaccess 4 | -------------------------------------------------------------------------------- /curator/views/generic.xml: -------------------------------------------------------------------------------- 1 | {{from gluon.serializers import xml}}{{=XML(xml(response._vars,quote=False))}} 2 | -------------------------------------------------------------------------------- /webapp/models/db_wizard.py: -------------------------------------------------------------------------------- 1 | ### we prepend t_ to tablenames and f_ to fieldnames for disambiguity 2 | 3 | -------------------------------------------------------------------------------- /webapp/views/generic.xml: -------------------------------------------------------------------------------- 1 | {{from gluon.serializers import xml}}{{=XML(xml(response._vars,quote=False))}} 2 | -------------------------------------------------------------------------------- /less/custom-responsive.less: -------------------------------------------------------------------------------- 1 | @import "bootstrap/less/responsive.less"; 2 | @import "custom-variables.less"; 3 | -------------------------------------------------------------------------------- /webapp/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/favicon.ico -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | python-dateutil==2.2 3 | locket==0.1.1 4 | bleach 5 | jwcrypto==0.9.1 6 | python_jwt 7 | -------------------------------------------------------------------------------- /webapp/static/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/logo.png -------------------------------------------------------------------------------- /webapp/static/images/Github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/Github.png -------------------------------------------------------------------------------- /webapp/static/images/gitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/gitter.png -------------------------------------------------------------------------------- /webapp/static/images/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/spinner.gif -------------------------------------------------------------------------------- /webapp/static/images/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/twitter.png -------------------------------------------------------------------------------- /curator/static/images/cc-zero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/cc-zero.png -------------------------------------------------------------------------------- /curator/static/images/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/facebook.png -------------------------------------------------------------------------------- /curator/static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/favicon.ico -------------------------------------------------------------------------------- /curator/static/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/favicon.png -------------------------------------------------------------------------------- /curator/static/images/gplus-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/gplus-32.png -------------------------------------------------------------------------------- /curator/static/images/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/twitter.png -------------------------------------------------------------------------------- /webapp/.gitignore: -------------------------------------------------------------------------------- 1 | private/janrain.key 2 | config 3 | databases 4 | cache 5 | sessions 6 | errors 7 | sessions 8 | uploads 9 | -------------------------------------------------------------------------------- /webapp/static/images/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/facebook.png -------------------------------------------------------------------------------- /webapp/static/images/gplus-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/gplus-32.png -------------------------------------------------------------------------------- /webapp/static/images/banner-dev.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/banner-dev.gif -------------------------------------------------------------------------------- /webapp/views/plugin_localcomments/grid.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 |

Feedback moderation

4 | 5 | {{= grid }} 6 | -------------------------------------------------------------------------------- /webapp/static/images/banner-staging.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/banner-staging.gif -------------------------------------------------------------------------------- /webapp/static/images/tree-view-tips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/tree-view-tips.png -------------------------------------------------------------------------------- /curator/static/images/GitHub-Mark-32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/GitHub-Mark-32px.png -------------------------------------------------------------------------------- /curator/static/images/tools/miapa-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tools/miapa-icon.png -------------------------------------------------------------------------------- /curator/static/images/tools/miapa-icon.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tools/miapa-icon.xcf -------------------------------------------------------------------------------- /webapp/static/images/phylopic-vignette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/phylopic-vignette.png -------------------------------------------------------------------------------- /webapp/static/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /curator/static/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /less/bootstrap/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/less/bootstrap/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /less/twitter-bootstrap-v2.3.2-0-gd9b502d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/less/twitter-bootstrap-v2.3.2-0-gd9b502d.zip -------------------------------------------------------------------------------- /webapp/static/images/Logo_Google_groups.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/Logo_Google_groups.png -------------------------------------------------------------------------------- /webapp/static/images/mini-opentree-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/mini-opentree-logo.png -------------------------------------------------------------------------------- /webapp/static/images/tree-view-ancestors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/tree-view-ancestors.png -------------------------------------------------------------------------------- /webapp/static/images/tree-view-edge-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/tree-view-edge-info.png -------------------------------------------------------------------------------- /webapp/static/images/tree-view-node-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/tree-view-node-info.png -------------------------------------------------------------------------------- /webapp/static/images/tree-view-node-jump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/tree-view-node-jump.png -------------------------------------------------------------------------------- /curator/static/images/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/glyphicons-halflings.png -------------------------------------------------------------------------------- /webapp/models/db_wizard_populate.py: -------------------------------------------------------------------------------- 1 | from gluon.contrib.populate import populate 2 | if db(db.auth_user).isempty(): 3 | populate(db.auth_user,10) 4 | -------------------------------------------------------------------------------- /webapp/static/images/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/glyphicons-halflings.png -------------------------------------------------------------------------------- /webapp/static/images/tree-view-dotted-paths.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/tree-view-dotted-paths.png -------------------------------------------------------------------------------- /webapp/static/images/tree-view-node-sizes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/tree-view-node-sizes.png -------------------------------------------------------------------------------- /webapp/static/images/tree-view-solid-paths.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/tree-view-solid-paths.png -------------------------------------------------------------------------------- /curator/static/images/tools/treemachine-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tools/treemachine-icon.png -------------------------------------------------------------------------------- /curator/static/images/tools/treemachine-icon.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tools/treemachine-icon.xcf -------------------------------------------------------------------------------- /curator/static/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /less/bootstrap/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/less/bootstrap/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /webapp/static/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /curator/static/images/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-ingroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-ingroup.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-layers.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-layers.xcf -------------------------------------------------------------------------------- /webapp/static/images/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/webapp/static/images/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /curator/static/images/study-status-under-revision.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/study-status-under-revision.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-outgroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-outgroup.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-tips-layers.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-tips-layers.xcf -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-tips-normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-tips-normal.png -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/jQuery-File-Upload-9.5.2/img/loading.gif -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-tips-duplicate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-tips-duplicate.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-tips-exemplar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-tips-exemplar.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-tips-unmapped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-tips-unmapped.png -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/img/progressbar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/jQuery-File-Upload-9.5.2/img/progressbar.gif -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-conflict-resolves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-conflict-resolves.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-internal-normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-internal-normal.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-tips-non-exemplar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-tips-non-exemplar.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-internal-ambiguous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-internal-ambiguous.png -------------------------------------------------------------------------------- /less/custom-bootstrap.less: -------------------------------------------------------------------------------- 1 | @import "bootstrap/less/bootstrap.less"; 2 | @import "custom-variables.less"; 3 | @import "custom-other.less"; 4 | @import "bootstrap/less/utilities.less"; 5 | -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-conflict-supported-by.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-conflict-supported-by.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-conflict-undetermined.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-conflict-undetermined.png -------------------------------------------------------------------------------- /curator/static/images/tree-viewer-legend-conflict-conflicts-with.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/images/tree-viewer-legend-conflict-conflicts-with.png -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/gae-go/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/jQuery-File-Upload-9.5.2/server/gae-go/static/favicon.ico -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/gae-python/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenTreeOfLife/opentree/HEAD/curator/static/jQuery-File-Upload-9.5.2/server/gae-python/static/favicon.ico -------------------------------------------------------------------------------- /curator/.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | private/ 3 | private/GITHUB_CLIENT_SECRET 4 | cache/ 5 | errors/ 6 | sessions/ 7 | uploads/ 8 | databases/ 9 | backup/ 10 | tmp/ 11 | *.class 12 | *~ 13 | *.DS_Store 14 | build-ncl-static 15 | ncl 16 | -------------------------------------------------------------------------------- /webapp/static/js/argus/browser.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /webapp/controllers/subtrees.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ### required - do no delete 4 | def user(): return dict(form=auth()) 5 | def download(): return response.download(request,db) 6 | def call(): return service() 7 | ### end requires 8 | 9 | def index(): 10 | return dict() 11 | 12 | -------------------------------------------------------------------------------- /less/bootstrap/js/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "validthis": true, 3 | "laxcomma" : true, 4 | "laxbreak" : true, 5 | "browser" : true, 6 | "eqnull" : true, 7 | "debug" : true, 8 | "devel" : true, 9 | "boss" : true, 10 | "expr" : true, 11 | "asi" : true 12 | } -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/gae-go/app.yaml: -------------------------------------------------------------------------------- 1 | application: jquery-file-upload 2 | version: 2 3 | runtime: go 4 | api_version: go1 5 | 6 | handlers: 7 | - url: /(favicon\.ico|robots\.txt) 8 | static_files: static/\1 9 | upload: static/(.*) 10 | expiration: '1d' 11 | - url: /.* 12 | script: _go_app 13 | -------------------------------------------------------------------------------- /webapp/models/menu.py: -------------------------------------------------------------------------------- 1 | response.title = settings.title 2 | response.subtitle = settings.subtitle 3 | response.meta.author = '%(author)s <%(author_email)s>' % settings 4 | response.meta.keywords = settings.keywords 5 | response.meta.description = settings.description 6 | response.menu = [ 7 | (T('Index'),URL('default','index')==URL(),URL('default','index'),[]), 8 | ] -------------------------------------------------------------------------------- /curator/views/generic.pdf: -------------------------------------------------------------------------------- 1 | {{ 2 | import os 3 | from gluon.contrib.generics import pdf_from_html 4 | filename = '%s/%s.html' % (request.controller,request.function) 5 | if os.path.exists(os.path.join(request.folder,'views',filename)): 6 | html=response.render(filename) 7 | else: 8 | html=BODY(BEAUTIFY(response._vars)).xml() 9 | pass 10 | =pdf_from_html(html) 11 | }} 12 | -------------------------------------------------------------------------------- /webapp/views/generic.pdf: -------------------------------------------------------------------------------- 1 | {{ 2 | import os 3 | from gluon.contrib.generics import pdf_from_html 4 | filename = '%s/%s.html' % (request.controller,request.function) 5 | if os.path.exists(os.path.join(request.folder,'views',filename)): 6 | html=response.render(filename) 7 | else: 8 | html=BODY(BEAUTIFY(response._vars)).xml() 9 | pass 10 | =pdf_from_html(html) 11 | }} 12 | -------------------------------------------------------------------------------- /webapp/ABOUT: -------------------------------------------------------------------------------- 1 | The goal of the Open Tree of Life project is to make phylogenetic knowledge more accessible. This site will allow you to explore previously published tree estimates and synthetic estimates of phylogenies that are created from many datasets. You can help make the system more comprehensive by uploading trees or linking trees in the system to the data on which they are based. 2 | -------------------------------------------------------------------------------- /webapp/views/default/about.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 |

Materials and methods

4 | 5 |

6 | Where the source trees came from. 7 | 8 |

9 | Where the taxonomies came from. 10 | 11 |

12 | Method for combining the taxonomies. 13 | 14 |

15 | Explanation of algorithm for synthesizing the tree. 16 | 17 |

What we mean by "open"

18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/gae-python/app.yaml: -------------------------------------------------------------------------------- 1 | application: jquery-file-upload 2 | version: 1 3 | runtime: python27 4 | api_version: 1 5 | threadsafe: true 6 | 7 | builtins: 8 | - deferred: on 9 | 10 | handlers: 11 | - url: /(favicon\.ico|robots\.txt) 12 | static_files: static/\1 13 | upload: static/(.*) 14 | expiration: '1d' 15 | - url: /.* 16 | script: main.app 17 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/css/style.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | /* 3 | * jQuery File Upload Plugin CSS Example 8.8.2 4 | * https://github.com/blueimp/jQuery-File-Upload 5 | * 6 | * Copyright 2013, Sebastian Tschan 7 | * https://blueimp.net 8 | * 9 | * Licensed under the MIT license: 10 | * http://www.opensource.org/licenses/MIT 11 | */ 12 | 13 | body { 14 | padding-top: 60px; 15 | } 16 | -------------------------------------------------------------------------------- /webapp/languages/plural-en.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | { 3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...], 4 | 'account': ['accounts'], 5 | 'book': ['books'], 6 | 'is': ['are'], 7 | 'man': ['men'], 8 | 'miss': ['misses'], 9 | 'person': ['people'], 10 | 'quark': ['quarks'], 11 | 'shop': ['shops'], 12 | 'this': ['these'], 13 | 'was': ['were'], 14 | 'woman': ['women'], 15 | } 16 | -------------------------------------------------------------------------------- /less/bootstrap/js/tests/server.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Simple connect server for phantom.js 3 | * Adapted from Modernizr 4 | */ 5 | 6 | var connect = require('connect') 7 | , http = require('http') 8 | , fs = require('fs') 9 | , app = connect() 10 | .use(connect.static(__dirname + '/../../')); 11 | 12 | http.createServer(app).listen(3000); 13 | 14 | fs.writeFileSync(__dirname + '/pid.txt', process.pid, 'utf-8') -------------------------------------------------------------------------------- /less/bootstrap/less/layouts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Layouts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Container (centered, fixed-width layouts) 7 | .container { 8 | .container-fixed(); 9 | } 10 | 11 | // Fluid layouts (left aligned, with sidebar, min- & max-width content) 12 | .container-fluid { 13 | padding-right: @gridGutterWidth; 14 | padding-left: @gridGutterWidth; 15 | .clearfix(); 16 | } -------------------------------------------------------------------------------- /curator/views/generic.rss: -------------------------------------------------------------------------------- 1 | {{ 2 | ### 3 | # response._vars contains the dictionary returned by the controller action 4 | # for this to work the action must return something like 5 | # 6 | # dict(title=...,link=...,description=...,created_on='...',items=...) 7 | # 8 | # items is a list of dictionaries each with title, link, description, pub_date. 9 | ### 10 | from gluon.serializers import rss}}{{=XML(rss(response._vars))}} 11 | -------------------------------------------------------------------------------- /webapp/views/generic.rss: -------------------------------------------------------------------------------- 1 | {{ 2 | ### 3 | # response._vars contains the dictionary returned by the controller action 4 | # for this to work the action must return something like 5 | # 6 | # dict(title=...,link=...,description=...,created_on='...',items=...) 7 | # 8 | # items is a list of dictionaries each with title, link, description, pub_date. 9 | ### 10 | from gluon.serializers import rss}}{{=XML(rss(response._vars))}} 11 | -------------------------------------------------------------------------------- /curator/languages/plural-en.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | { 3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...], 4 | 'account': ['accounts'], 5 | 'book': ['books'], 6 | 'is': ['are'], 7 | 'man': ['men'], 8 | 'miss': ['misses'], 9 | 'person': ['people'], 10 | 'quark': ['quarks'], 11 | 'row': ['rows'], 12 | 'shop': ['shops'], 13 | 'this': ['these'], 14 | 'was': ['were'], 15 | 'woman': ['women'], 16 | } 17 | -------------------------------------------------------------------------------- /webapp/views/plugin_tagging/index.html: -------------------------------------------------------------------------------- 1 |
2 | {{=form.custom.begin}} 3 | {{for link in links:}} 4 | {{=link.tag.name[:-1]}}({{=link.tag.links}}) 5 | 6 | {{pass}} 7 | {{if links:}}{{pass}} 8 | 9 | 10 | {{=form.custom.end}} 11 |
12 | -------------------------------------------------------------------------------- /less/bootstrap/less/component-animations.less: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | 6 | .fade { 7 | opacity: 0; 8 | .transition(opacity .15s linear); 9 | &.in { 10 | opacity: 1; 11 | } 12 | } 13 | 14 | .collapse { 15 | position: relative; 16 | height: 0; 17 | overflow: hidden; 18 | .transition(height .35s ease); 19 | &.in { 20 | height: auto; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /webapp/views/about/credits.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 |
3 |

Credits

4 | See about for full credits 5 |

Comments

6 | {{=plugin_localcomments(filter='url',url=request.url)}} 7 | 8 |
9 | 10 | 13 | -------------------------------------------------------------------------------- /curator/test/testMerge.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import sys, requests, uuid, json, codecs 3 | url, filepath = sys.argv[1:3] 4 | #inp = json.load() 5 | data = {'nexson': codecs.open(filepath, 'rU', encoding='utf-8').read()} 6 | r = requests.post(url, data=data) 7 | try: 8 | blob = r.json() 9 | print json.dumps(blob,indent=1, sort_keys=True) 10 | except: 11 | print r.text 12 | if 200 != r.status_code: 13 | sys.exit(r.status_code) 14 | -------------------------------------------------------------------------------- /webapp/static/js/argus/nameresults.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Node start point select form 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /less/bootstrap/js/tests/unit/bootstrap-transition.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("bootstrap-transition") 4 | 5 | test("should be defined on jquery support object", function () { 6 | ok($.support.transition !== undefined, 'transition object is defined') 7 | }) 8 | 9 | test("should provide an end object", function () { 10 | ok($.support.transition ? $.support.transition.end : true, 'end string is defined') 11 | }) 12 | 13 | }) -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/php/index.php: -------------------------------------------------------------------------------- 1 | welcome|admin|app)\b.*', r'\g'), 8 | (r'(.*)', r'opentree'), 9 | (r'/?(.*)', r'opentree')) 10 | -------------------------------------------------------------------------------- /less/bootstrap/less/utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Quick floats 7 | .pull-right { 8 | float: right; 9 | } 10 | .pull-left { 11 | float: left; 12 | } 13 | 14 | // Toggling content 15 | .hide { 16 | display: none; 17 | } 18 | .show { 19 | display: block; 20 | } 21 | 22 | // Visibility 23 | .invisible { 24 | visibility: hidden; 25 | } 26 | 27 | // For Affix plugin 28 | .affix { 29 | position: fixed; 30 | } 31 | -------------------------------------------------------------------------------- /webapp/views/generic.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | {{""" 3 | 4 | You should not modify this file. 5 | It is used as default when a view is not provided for your controllers 6 | 7 | """}} 8 |

{{=' '.join(x.capitalize() for x in request.function.split('_'))}}

9 | {{if len(response._vars)==1:}} 10 | {{=BEAUTIFY(response._vars.values()[0])}} 11 | {{elif len(response._vars)>1:}} 12 | {{=BEAUTIFY(response._vars)}} 13 | {{pass}} 14 | {{if request.is_local:}} 15 | {{=response.toolbar()}} 16 | {{pass}} 17 | -------------------------------------------------------------------------------- /curator/views/generic.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | {{""" 3 | 4 | You should not modify this file. 5 | It is used as default when a view is not provided for your controllers 6 | 7 | """}} 8 |

{{=' '.join(x.capitalize() for x in request.function.split('_'))}}

9 | {{if len(response._vars)==1:}} 10 | {{=BEAUTIFY(response._vars.values()[0])}} 11 | {{elif len(response._vars)>1:}} 12 | {{=BEAUTIFY(response._vars)}} 13 | {{pass}} 14 | {{if request.is_local:}} 15 | {{=response.toolbar()}} 16 | {{pass}} 17 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/css/jquery.fileupload-ui-noscript.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | /* 3 | * jQuery File Upload UI Plugin NoScript CSS 8.8.5 4 | * https://github.com/blueimp/jQuery-File-Upload 5 | * 6 | * Copyright 2012, Sebastian Tschan 7 | * https://blueimp.net 8 | * 9 | * Licensed under the MIT license: 10 | * http://www.opensource.org/licenses/MIT 11 | */ 12 | 13 | .fileinput-button i, 14 | .fileupload-buttonbar .delete, 15 | .fileupload-buttonbar .toggle { 16 | display: none; 17 | } 18 | -------------------------------------------------------------------------------- /webapp/controllers/synthview.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from opentreewebapputil import get_opentree_api_base_urls 3 | 4 | ### required - do no delete 5 | def user(): return dict(form=auth()) 6 | def download(): return response.download(request,db) 7 | def call(): return service() 8 | ### end requires 9 | def index(): 10 | context_dict = get_opentree_api_base_urls(request) 11 | context_dict['tree_id'] = request.vars.get('tree') 12 | context_dict['node_id'] = request.vars.get('node') 13 | return context_dict 14 | 15 | -------------------------------------------------------------------------------- /webapp/controllers/treeview.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from opentreewebapputil import get_opentree_api_base_urls 3 | 4 | ### required - do no delete 5 | def user(): return dict(form=auth()) 6 | def download(): return response.download(request,db) 7 | def call(): return service() 8 | ### end requires 9 | def index(): 10 | context_dict = get_opentree_api_base_urls(request) 11 | context_dict['tree_id'] = request.vars.get('tree') 12 | context_dict['node_id'] = request.vars.get('node') 13 | return context_dict 14 | 15 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/css/demo-ie8.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | /* 3 | * jQuery File Upload Demo CSS Fixes for IE<9 1.0.0 4 | * https://github.com/blueimp/jQuery-File-Upload 5 | * 6 | * Copyright 2013, Sebastian Tschan 7 | * https://blueimp.net 8 | * 9 | * Licensed under the MIT license: 10 | * http://www.opensource.org/licenses/MIT 11 | */ 12 | 13 | .navigation { 14 | list-style: none; 15 | padding: 0; 16 | margin: 1em 0; 17 | } 18 | .navigation li { 19 | display: inline; 20 | margin-right: 10px; 21 | } 22 | -------------------------------------------------------------------------------- /curator/test/test2nexml.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import sys, requests, uuid, json 3 | url, filepath = sys.argv[1:3] 4 | if len(sys.argv) > 3: 5 | inp = sys.argv[3] 6 | else: 7 | inp = 'nexus' 8 | files = {'file':open(filepath, 'rU')} 9 | data = {'inputFormat': inp, 10 | 'idPrefix':''} 11 | r = requests.post(url, files=files, data=data) 12 | try: 13 | blob = r.json() 14 | print json.dumps(blob,indent=1, sort_keys=True) 15 | except: 16 | print r.text 17 | if 200 != r.status_code: 18 | sys.exit(r.status_code) 19 | -------------------------------------------------------------------------------- /less/bootstrap/less/grid.less: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | 6 | // Fixed (940px) 7 | #grid > .core(@gridColumnWidth, @gridGutterWidth); 8 | 9 | // Fluid (940px) 10 | #grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth); 11 | 12 | // Reset utility classes due to specificity 13 | [class*="span"].hide, 14 | .row-fluid [class*="span"].hide { 15 | display: none; 16 | } 17 | 18 | [class*="span"].pull-right, 19 | .row-fluid [class*="span"].pull-right { 20 | float: right; 21 | } 22 | -------------------------------------------------------------------------------- /curator/languages/plural-ru.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | { 3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...], 4 | 'выбрана': ['выбраны','выбрано'], 5 | 'запись': ['записи','записей'], 6 | 'изменена': ['изменены','изменено'], 7 | 'строка': ['строки','строк'], 8 | 'удалена': ['удалены','удалено'], 9 | 'день': ['дня', 'дней'], 10 | 'месяц': ['месяца','месяцев'], 11 | 'неделю': ['недели','недель'], 12 | 'год': ['года','лет'], 13 | 'час': ['часа','часов'], 14 | 'минуту': ['минуты','минут'], 15 | 'секунду': ['секунды','секунд'], 16 | } 17 | -------------------------------------------------------------------------------- /webapp/languages/plural-ru.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | { 3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...], 4 | 'выбрана': ['выбраны','выбрано'], 5 | 'запись': ['записи','записей'], 6 | 'изменена': ['изменены','изменено'], 7 | 'строка': ['строки','строк'], 8 | 'удалена': ['удалены','удалено'], 9 | 'день': ['дня', 'дней'], 10 | 'месяц': ['месяца','месяцев'], 11 | 'неделю': ['недели','недель'], 12 | 'год': ['года','лет'], 13 | 'час': ['часа','часов'], 14 | 'минуту': ['минуты','минут'], 15 | 'секунду': ['секунды','секунд'], 16 | } 17 | -------------------------------------------------------------------------------- /less/bootstrap/less/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: 8px 15px; 8 | margin: 0 0 @baseLineHeight; 9 | list-style: none; 10 | background-color: #f5f5f5; 11 | .border-radius(@baseBorderRadius); 12 | > li { 13 | display: inline-block; 14 | .ie7-inline-block(); 15 | text-shadow: 0 1px 0 @white; 16 | > .divider { 17 | padding: 0 5px; 18 | color: #ccc; 19 | } 20 | } 21 | > .active { 22 | color: @grayLight; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /less/bootstrap/less/responsive-768px-979px.less: -------------------------------------------------------------------------------- 1 | // 2 | // Responsive: Tablet to desktop 3 | // -------------------------------------------------- 4 | 5 | 6 | @media (min-width: 768px) and (max-width: 979px) { 7 | 8 | // Fixed grid 9 | #grid > .core(@gridColumnWidth768, @gridGutterWidth768); 10 | 11 | // Fluid grid 12 | #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768); 13 | 14 | // Input grid 15 | #grid > .input(@gridColumnWidth768, @gridGutterWidth768); 16 | 17 | // No need to reset .thumbnails here since it's the same @gridGutterWidth 18 | 19 | } 20 | -------------------------------------------------------------------------------- /webapp/views/generic.jsonp: -------------------------------------------------------------------------------- 1 | {{ 2 | ### 3 | # response._vars contains the dictionary returned by the controller action 4 | ### 5 | try: 6 | from gluon.serializers import json 7 | result = "%s(%s)" % (request.vars['callback'], json(response._vars)) 8 | response.write(result, escape=False) 9 | response.headers['Content-Type'] = 'application/jsonp' 10 | except (TypeError, ValueError): 11 | raise HTTP(405, 'JSON serialization error') 12 | except ImportError: 13 | raise HTTP(405, 'JSON not available') 14 | except: 15 | raise HTTP(405, 'JSON error') 16 | }} -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/css/jquery.fileupload-noscript.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | /* 3 | * jQuery File Upload Plugin NoScript CSS 1.2.0 4 | * https://github.com/blueimp/jQuery-File-Upload 5 | * 6 | * Copyright 2013, Sebastian Tschan 7 | * https://blueimp.net 8 | * 9 | * Licensed under the MIT license: 10 | * http://www.opensource.org/licenses/MIT 11 | */ 12 | 13 | .fileinput-button input { 14 | position: static; 15 | opacity: 1; 16 | filter: none; 17 | font-size: inherit; 18 | direction: inherit; 19 | } 20 | .fileinput-button span { 21 | display: none; 22 | } 23 | -------------------------------------------------------------------------------- /webapp/controllers/contact.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from opentreewebapputil import (get_opentree_api_endpoints, 3 | fetch_current_TNRS_context_names) 4 | 5 | ### required - do no delete 6 | def user(): return dict(form=auth()) 7 | def download(): return response.download(request,db) 8 | def call(): return service() 9 | ### end requires 10 | 11 | default_view_dict = get_opentree_api_endpoints(request) 12 | default_view_dict['taxonSearchContextNames'] = fetch_current_TNRS_context_names(request) 13 | 14 | def index(): 15 | return default_view_dict 16 | 17 | -------------------------------------------------------------------------------- /webapp/views/generic.ics: -------------------------------------------------------------------------------- 1 | {{ 2 | ### 3 | # response._vars contains the dictionary returned by the controller action 4 | # Assuming something like: 5 | # 6 | # db.define_table('event', 7 | # Field('title'), 8 | # Field('start_datetime','datetime'), 9 | # Field('stop_datetime','datetime')) 10 | # events = db(db.event).select() 11 | # 12 | # Aor this to work the action must return something like 13 | # 14 | # dict(events=events, title='title',link=URL('action'),timeshift=0) 15 | # 16 | ### 17 | from gluon.serializers import ics}}{{=XML(ics(**response._vars))}} 18 | -------------------------------------------------------------------------------- /curator/views/generic.ics: -------------------------------------------------------------------------------- 1 | {{ 2 | ### 3 | # response._vars contains the dictionary returned by the controller action 4 | # Assuming something like: 5 | # 6 | # db.define_table('event', 7 | # Field('title'), 8 | # Field('start_datetime','datetime'), 9 | # Field('stop_datetime','datetime')) 10 | # events = db(db.event).select() 11 | # 12 | # Aor this to work the action must return something like 13 | # 14 | # dict(events=events, title='title',link=URL('action'),timeshift=0) 15 | # 16 | ### 17 | from gluon.serializers import ics}}{{=XML(ics(**response._vars))}} 18 | -------------------------------------------------------------------------------- /curator/languages/plural-uk.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | { 3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...], 4 | 'байт': ['байти','байтів'], 5 | 'годину': ['години','годин'], 6 | 'елемент': ['елементи','елементів'], 7 | 'запис': ['записи','записів'], 8 | 'поцілювання': ['поцілювання','поцілювань'], 9 | 'рядок': ['рядки','рядків'], 10 | 'секунду': ['секунди','секунд'], 11 | 'схибнення': ['схибнення','схибнень'], 12 | 'хвилину': ['хвилини','хвилин'], 13 | 'день': ['дні', 'днів'], 14 | 'місяць': ['місяці','місяців'], 15 | 'тиждень': ['тижні','тижнів'], 16 | 'рік': ['роки','років'], 17 | } 18 | -------------------------------------------------------------------------------- /webapp/languages/plural-uk.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | { 3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...], 4 | 'байт': ['байти','байтів'], 5 | 'годину': ['години','годин'], 6 | 'елемент': ['елементи','елементів'], 7 | 'запис': ['записи','записів'], 8 | 'поцілювання': ['поцілювання','поцілювань'], 9 | 'рядок': ['рядки','рядків'], 10 | 'секунду': ['секунди','секунд'], 11 | 'схибнення': ['схибнення','схибнень'], 12 | 'хвилину': ['хвилини','хвилин'], 13 | 'день': ['дні', 'днів'], 14 | 'місяць': ['місяці','місяців'], 15 | 'тиждень': ['тижні','тижнів'], 16 | 'рік': ['роки','років'], 17 | } 18 | -------------------------------------------------------------------------------- /less/bootstrap/less/hero-unit.less: -------------------------------------------------------------------------------- 1 | // 2 | // Hero unit 3 | // -------------------------------------------------- 4 | 5 | 6 | .hero-unit { 7 | padding: 60px; 8 | margin-bottom: 30px; 9 | font-size: 18px; 10 | font-weight: 200; 11 | line-height: @baseLineHeight * 1.5; 12 | color: @heroUnitLeadColor; 13 | background-color: @heroUnitBackground; 14 | .border-radius(6px); 15 | h1 { 16 | margin-bottom: 0; 17 | font-size: 60px; 18 | line-height: 1; 19 | color: @heroUnitHeadingColor; 20 | letter-spacing: -1px; 21 | } 22 | li { 23 | line-height: @baseLineHeight * 1.5; // Reset since we specify in type.less 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /curator/test/testString2nexml.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import sys, requests, uuid 3 | url, filepath = sys.argv[1:3] 4 | if len(sys.argv) > 3: 5 | inp = sys.argv[3] 6 | else: 7 | inp = 'nexus' 8 | content = open(filepath, 'rU').read() 9 | data = {'inputFormat': inp, 10 | 'idPrefix': '', 11 | 'dataDeposit': 'http://example.org', 12 | 'content': content, 13 | } 14 | r = requests.post(url, data=data) 15 | try: 16 | blob = r.json() 17 | print json.dumps(blob['data'],indent=1, sort_keys=True) 18 | print 'uploadid =', blob['uploadid'] 19 | except: 20 | print r.text 21 | if 200 != r.status_code: 22 | sys.exit(r.status_code) 23 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/cors/result.html: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | 17 | jQuery Iframe Transport Plugin Redirect Page 18 | 19 | 20 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /webapp/views/study/index.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 | {{for el in study_status_list:}} 4 | 5 | {{if not el['has_status']:}} 6 | 18 | {{else:}} 19 | 20 | {{pass}} 21 | {{pass}} 22 |
{{=A(el['study_id'], _href=el['status_link'])}}{{=el['message']}} 7 | {{try: 8 | mll = el['message_link_list'] 9 | except: 10 | mll = [] 11 | pass 12 | if mll: 13 | for linkname, link in mll:}} 14 | {{=A(linkname, _href=link)}} 15 | {{pass}} 16 | {{pass}} 17 | {{=el['message']}}
-------------------------------------------------------------------------------- /less/bootstrap/less/wells.less: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: @wellBackground; 12 | border: 1px solid darken(@wellBackground, 7%); 13 | .border-radius(@baseBorderRadius); 14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-large { 23 | padding: 24px; 24 | .border-radius(@borderRadiusLarge); 25 | } 26 | .well-small { 27 | padding: 9px; 28 | .border-radius(@borderRadiusSmall); 29 | } 30 | -------------------------------------------------------------------------------- /webapp/languages/plural-cs.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | { 3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...], 4 | 'vteřina': ['vteřiny', 'vteřin'], 5 | 'vteřinou': ['vteřinami', 'vteřinami'], 6 | 'minuta': ['minuty', 'minut'], 7 | 'minutou': ['minutami', 'minutami'], 8 | 'hodina': ['hodiny','hodin'], 9 | 'hodinou': ['hodinami','hodinami'], 10 | 'den': ['dny','dnů'], 11 | 'dnem': ['dny','dny'], 12 | 'týden': ['týdny','týdnů'], 13 | 'týdnem': ['týdny','týdny'], 14 | 'měsíc': ['měsíce','měsíců'], 15 | 'měsícem': ['měsíci','měsíci'], 16 | 'rok': ['roky','let'], 17 | 'rokem': ['roky','lety'], 18 | 'záznam': ['záznamy', 'záznamů'], 19 | 'soubor': ['soubory', 'souborů'] 20 | } 21 | -------------------------------------------------------------------------------- /curator/languages/plural-cs.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | { 3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...], 4 | 'vteřina': ['vteřiny', 'vteřin'], 5 | 'vteřinou': ['vteřinami', 'vteřinami'], 6 | 'minuta': ['minuty', 'minut'], 7 | 'minutou': ['minutami', 'minutami'], 8 | 'hodina': ['hodiny','hodin'], 9 | 'hodinou': ['hodinami','hodinami'], 10 | 'den': ['dny','dnů'], 11 | 'dnem': ['dny','dny'], 12 | 'týden': ['týdny','týdnů'], 13 | 'týdnem': ['týdny','týdny'], 14 | 'měsíc': ['měsíce','měsíců'], 15 | 'měsícem': ['měsíci','měsíci'], 16 | 'rok': ['roky','let'], 17 | 'rokem': ['roky','lety'], 18 | 'záznam': ['záznamy', 'záznamů'], 19 | 'soubor': ['soubory', 'souborů'] 20 | } 21 | -------------------------------------------------------------------------------- /less/bootstrap/less/responsive-1200px-min.less: -------------------------------------------------------------------------------- 1 | // 2 | // Responsive: Large desktop and up 3 | // -------------------------------------------------- 4 | 5 | 6 | @media (min-width: 1200px) { 7 | 8 | // Fixed grid 9 | #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200); 10 | 11 | // Fluid grid 12 | #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200); 13 | 14 | // Input grid 15 | #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200); 16 | 17 | // Thumbnails 18 | .thumbnails { 19 | margin-left: -@gridGutterWidth1200; 20 | } 21 | .thumbnails > li { 22 | margin-left: @gridGutterWidth1200; 23 | } 24 | .row-fluid .thumbnails { 25 | margin-left: 0; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /taxonomy/cgi-bin/Makefile: -------------------------------------------------------------------------------- 1 | QUERY=name=Opisthokonta 2 | 3 | test: 4 | @QUERY_STRING=$(QUERY) python ./browse.py | grep Holozoa 5 | 6 | # For testing on OS X with the apple built-in apache installation 7 | # (enable with 'sudo apachectl start') 8 | local-install: 9 | cp -p browse.py /Library/WebServer/CGI-Executables/browse 10 | 11 | # Browse locally (assumes OS X 'open' command) 12 | local-browse: 13 | open http://localhost/cgi-bin/browse?$(QUERY) 14 | 15 | # Install to some remote system 16 | REMOTE=varela.csail.mit.edu 17 | install: 18 | scp -p browse.py $(REMOTE):/usr/lib/cgi-bin/browse 19 | 20 | # Browse on remote system (assumes OS X 'open' command) 21 | browse: 22 | open http://$(REMOTE)/cgi-bin/browse?$(QUERY) 23 | 24 | -------------------------------------------------------------------------------- /less/bootstrap/less/close.less: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: 20px; 9 | font-weight: bold; 10 | line-height: @baseLineHeight; 11 | color: @black; 12 | text-shadow: 0 1px 0 rgba(255,255,255,1); 13 | .opacity(20); 14 | &:hover, 15 | &:focus { 16 | color: @black; 17 | text-decoration: none; 18 | cursor: pointer; 19 | .opacity(40); 20 | } 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | button.close { 27 | padding: 0; 28 | cursor: pointer; 29 | background: transparent; 30 | border: 0; 31 | -webkit-appearance: none; 32 | } -------------------------------------------------------------------------------- /less/bootstrap/less/accordion.less: -------------------------------------------------------------------------------- 1 | // 2 | // Accordion 3 | // -------------------------------------------------- 4 | 5 | 6 | // Parent container 7 | .accordion { 8 | margin-bottom: @baseLineHeight; 9 | } 10 | 11 | // Group == heading + body 12 | .accordion-group { 13 | margin-bottom: 2px; 14 | border: 1px solid #e5e5e5; 15 | .border-radius(@baseBorderRadius); 16 | } 17 | .accordion-heading { 18 | border-bottom: 0; 19 | } 20 | .accordion-heading .accordion-toggle { 21 | display: block; 22 | padding: 8px 15px; 23 | } 24 | 25 | // General toggle styles 26 | .accordion-toggle { 27 | cursor: pointer; 28 | } 29 | 30 | // Inner needs the styles because you can't animate properly with any styles on the element 31 | .accordion-inner { 32 | padding: 9px 15px; 33 | border-top: 1px solid #e5e5e5; 34 | } 35 | -------------------------------------------------------------------------------- /curator/test/testNoTreesString2nexml.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import sys, requests, uuid 3 | url, filepath = sys.argv[1:3] 4 | if len(sys.argv) > 3: 5 | inp = sys.argv[3] 6 | else: 7 | inp = 'nexus' 8 | content = open(filepath, 'rU').read() 9 | data = {'inputFormat': inp, 10 | 'idPrefix': '', 11 | 'dataDeposit': 'http://example.org', 12 | 'content': content, 13 | } 14 | r = requests.post(url, data=data) 15 | try: 16 | blob = r.json() 17 | print json.dumps(blob['data'],indent=1, sort_keys=True) 18 | print 'uploadid =', blob['uploadid'] 19 | except: 20 | print r.text 21 | if 200 != r.status_code: 22 | sys.exit(r.status_code) 23 | try: 24 | trees = blob['data']['nexml']['trees'] 25 | sys.exit('Unexpected trees found!') 26 | except Exception: 27 | pass 28 | -------------------------------------------------------------------------------- /curator/static/css/dialog-polyfill.css: -------------------------------------------------------------------------------- 1 | dialog { 2 | position: absolute; 3 | left: 0; right: 0; 4 | width: -moz-fit-content; 5 | width: -webkit-fit-content; 6 | width: fit-content; 7 | height: -moz-fit-content; 8 | height: -webkit-fit-content; 9 | height: fit-content; 10 | margin: auto; 11 | border: solid; 12 | padding: 1em; 13 | background: white; 14 | color: black; 15 | display: block; 16 | } 17 | 18 | dialog:not([open]) { 19 | display: none; 20 | } 21 | 22 | dialog + .backdrop { 23 | position: fixed; 24 | top: 0; right: 0; bottom: 0; left: 0; 25 | background: rgba(0,0,0,0.1); 26 | } 27 | 28 | ._dialog_overlay { 29 | position: fixed; 30 | top: 0; right: 0; bottom: 0; left: 0; 31 | } 32 | 33 | dialog.fixed { 34 | position: fixed; 35 | top: 50%; 36 | transform: translate(0, -50%); 37 | } -------------------------------------------------------------------------------- /less/bootstrap/js/tests/unit/bootstrap-phantom.js: -------------------------------------------------------------------------------- 1 | // Logging setup for phantom integration 2 | // adapted from Modernizr 3 | 4 | QUnit.begin = function () { 5 | console.log("Starting test suite") 6 | console.log("================================================\n") 7 | } 8 | 9 | QUnit.moduleDone = function (opts) { 10 | if (opts.failed === 0) { 11 | console.log("\u2714 All tests passed in '" + opts.name + "' module") 12 | } else { 13 | console.log("\u2716 " + opts.failed + " tests failed in '" + opts.name + "' module") 14 | } 15 | } 16 | 17 | QUnit.done = function (opts) { 18 | console.log("\n================================================") 19 | console.log("Tests completed in " + opts.runtime + " milliseconds") 20 | console.log(opts.passed + " tests of " + opts.total + " passed, " + opts.failed + " failed.") 21 | } -------------------------------------------------------------------------------- /webapp/models/plugin_comments.py: -------------------------------------------------------------------------------- 1 | db.define_table('plugin_comments_comment', 2 | Field('tablename',readable=False,writable=False), 3 | Field('record_id','integer',readable=False,writable=False), 4 | Field('parent_node','integer',readable=False,writable=False), 5 | Field('body'), 6 | Field('deleted','boolean',default=False,readable=False,writable=False), 7 | Field('votes','integer',default=1,readable=False,writable=False), 8 | Field('created_by',db.auth_user,default=auth.user_id,readable=False,writable=False), 9 | Field('created_on','datetime',default=request.now,readable=False,writable=False)) 10 | 11 | def plugin_comments(tablanme='0',record_id=0): 12 | return LOAD('plugin_comments',args=[tablanme,record_id]) 13 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/php/files/.htaccess: -------------------------------------------------------------------------------- 1 | # The following directives force the content-type application/octet-stream 2 | # and force browsers to display a download dialog for non-image files. 3 | # This prevents the execution of script files in the context of the website: 4 | ForceType application/octet-stream 5 | Header set Content-Disposition attachment 6 | 7 | ForceType none 8 | Header unset Content-Disposition 9 | 10 | 11 | # The following directive prevents browsers from MIME-sniffing the content-type. 12 | # This is an important complement to the ForceType directive above: 13 | Header set X-Content-Type-Options nosniff 14 | 15 | # Uncomment the following lines to prevent unauthorized download of files: 16 | #AuthName "Authorization required" 17 | #AuthType Basic 18 | #require valid-user 19 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/css/jquery.fileupload.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | /* 3 | * jQuery File Upload Plugin CSS 1.3.0 4 | * https://github.com/blueimp/jQuery-File-Upload 5 | * 6 | * Copyright 2013, Sebastian Tschan 7 | * https://blueimp.net 8 | * 9 | * Licensed under the MIT license: 10 | * http://www.opensource.org/licenses/MIT 11 | */ 12 | 13 | .fileinput-button { 14 | position: relative; 15 | overflow: hidden; 16 | } 17 | .fileinput-button input { 18 | position: absolute; 19 | top: 0; 20 | right: 0; 21 | margin: 0; 22 | opacity: 0; 23 | -ms-filter: 'alpha(opacity=0)'; 24 | font-size: 200px; 25 | direction: ltr; 26 | cursor: pointer; 27 | } 28 | 29 | /* Fixes for IE < 8 */ 30 | @media screen\9 { 31 | .fileinput-button input { 32 | filter: alpha(opacity=0); 33 | font-size: 100%; 34 | height: 100%; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /webapp/views/web2py_ajax.html: -------------------------------------------------------------------------------- 1 | 8 | {{ 9 | response.files.insert(0,URL('static','js/jquery.js')) 10 | response.files.insert(1,URL('static','css/calendar.css')) 11 | response.files.insert(2,URL('static','js/calendar.js')) 12 | response.files.insert(3,URL('static','js/web2py.js')) 13 | response.include_meta() 14 | response.include_files() 15 | }} 16 | -------------------------------------------------------------------------------- /curator/views/web2py_ajax.html: -------------------------------------------------------------------------------- 1 | 8 | {{ 9 | response.files.insert(0,URL('static','js/jquery.js')) 10 | response.files.insert(1,URL('static','css/calendar.css')) 11 | response.files.insert(2,URL('static','js/calendar.js')) 12 | response.files.insert(3,URL('static','js/web2py.js')) 13 | response.include_meta() 14 | response.include_files() 15 | }} 16 | -------------------------------------------------------------------------------- /less/bootstrap/js/tests/unit/bootstrap-affix.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("bootstrap-affix") 4 | 5 | test("should provide no conflict", function () { 6 | var affix = $.fn.affix.noConflict() 7 | ok(!$.fn.affix, 'affix was set back to undefined (org value)') 8 | $.fn.affix = affix 9 | }) 10 | 11 | test("should be defined on jquery object", function () { 12 | ok($(document.body).affix, 'affix method is defined') 13 | }) 14 | 15 | test("should return element", function () { 16 | ok($(document.body).affix()[0] == document.body, 'document.body returned') 17 | }) 18 | 19 | test("should exit early if element is not visible", function () { 20 | var $affix = $('
').affix() 21 | $affix.data('affix').checkPosition() 22 | ok(!$affix.hasClass('affix'), 'affix class was not added') 23 | }) 24 | 25 | }) -------------------------------------------------------------------------------- /less/bootstrap/less/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | margin: @baseLineHeight 0; 8 | list-style: none; 9 | text-align: center; 10 | .clearfix(); 11 | } 12 | .pager li { 13 | display: inline; 14 | } 15 | .pager li > a, 16 | .pager li > span { 17 | display: inline-block; 18 | padding: 5px 14px; 19 | background-color: #fff; 20 | border: 1px solid #ddd; 21 | .border-radius(15px); 22 | } 23 | .pager li > a:hover, 24 | .pager li > a:focus { 25 | text-decoration: none; 26 | background-color: #f5f5f5; 27 | } 28 | .pager .next > a, 29 | .pager .next > span { 30 | float: right; 31 | } 32 | .pager .previous > a, 33 | .pager .previous > span { 34 | float: left; 35 | } 36 | .pager .disabled > a, 37 | .pager .disabled > a:hover, 38 | .pager .disabled > a:focus, 39 | .pager .disabled > span { 40 | color: @grayLight; 41 | background-color: #fff; 42 | cursor: default; 43 | } -------------------------------------------------------------------------------- /webapp/static/js/argus/format.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Arial, Helvetica, sans-serif; 3 | 4 | } input { 5 | display: inline; 6 | 7 | } form { 8 | display: inline; 9 | 10 | } .results { 11 | list-style: none; 12 | padding: 0; 13 | margin: 0; 14 | 15 | } .results ul { 16 | list-style: none; 17 | padding: 0 0 0 12px; 18 | margin: 0; 19 | margin: 0 0 1.5em 0; 20 | 21 | } .results ul li { 22 | display: block; 23 | padding: 2px 0 2px 0; 24 | margin: 0; 25 | 26 | } .results ul li span { 27 | display: inline-block; 28 | position: relative; 29 | width: 8em; 30 | padding: 0 0 0 1em; 31 | 32 | } .results ul li span.matchname { 33 | width: 10em; 34 | 35 | } .highlight { 36 | background: #fcf4ff; 37 | 38 | } .label { 39 | font-weight: bold; 40 | font-size: 0.9em; 41 | color: #999; 42 | padding: 0em 0 0.5em 0; 43 | 44 | } #treesearch { 45 | padding: 1em 0 0 0; 46 | 47 | } 48 | -------------------------------------------------------------------------------- /webapp/static/robots.txt: -------------------------------------------------------------------------------- 1 | # blocking all bots site-wide 2 | User-agent: * 3 | # N.B. 'Allow' is not supported by all crawlers, but captures our intent here. 4 | # Block the main tree viewer, but index About pages 5 | Disallow: /opentree/ 6 | Disallow: /default/ 7 | Allow: /about/ 8 | Allow: /contact 9 | # Index visible information for published studies 10 | Allow: /curator/study/view/ 11 | Disallow: /curator/study/edit/ 12 | Disallow: /curator/study/create/ 13 | # Block access to APIs, if found here 14 | Disallow: /phylesystem/ 15 | Disallow: /treemachine/ 16 | Disallow: /taxomachine/ 17 | Disallow: /taxonomy/ 18 | Disallow: /oti/ 19 | Disallow: /api/ 20 | Disallow: /cached/ 21 | # Block access to admin pages, login, logout 22 | Disallow: /admin/ 23 | Disallow: /user/ 24 | Disallow: /v3/ 25 | Disallow: /v2/ 26 | Disallow: /v1/ 27 | Crawl-delay: 60 28 | # Problem cases maybe: 29 | # GET /curator/study/view/pg_400 - baidu 30 | # GET /curator/study/view/pg_754?tab=trees&tree=tree1392 - ahrefs 31 | -------------------------------------------------------------------------------- /curator/views/default/user.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 |

{{=T( request.args(0).replace('_',' ').capitalize() )}}

3 |
4 | {{ 5 | if request.args(0)=='login': 6 | if not 'register' in auth.settings.actions_disabled: 7 | form.add_button(T('Register'),URL(args='register', vars={'_next': request.vars._next} if request.vars._next else None),_class='btn') 8 | pass 9 | if not 'request_reset_password' in auth.settings.actions_disabled: 10 | form.add_button(T('Lost Password'),URL(args='request_reset_password'),_class='btn') 11 | pass 12 | pass 13 | =form 14 | }} 15 |
16 | 24 | -------------------------------------------------------------------------------- /curator/views/generic.load: -------------------------------------------------------------------------------- 1 | {{''' 2 | # License: Public Domain 3 | # Author: Iceberg at 21cn dot com 4 | 5 | With this generic.load file, you can use same function to serve two purposes. 6 | 7 | = regular action 8 | - ajax callback (when called with .load) 9 | 10 | Example modified from http://www.web2py.com/AlterEgo/default/show/252: 11 | 12 | def index(): 13 | return dict( 14 | part1='hello world', 15 | part2=LOAD(url=URL(r=request,f='auxiliary.load'),ajax=True)) 16 | 17 | def auxiliary(): 18 | form=SQLFORM.factory(Field('name')) 19 | if form.accepts(request.vars): 20 | response.flash = 'ok' 21 | return dict(message="Hello %s" % form.vars.name) 22 | return dict(form=form) 23 | 24 | Notice: 25 | 26 | - no need to set response.headers['web2py-response-flash'] 27 | - no need to return a string 28 | even if the function is called via ajax. 29 | 30 | '''}}{{if len(response._vars)==1:}}{{=response._vars.values()[0]}}{{else:}}{{=BEAUTIFY(response._vars)}}{{pass}} -------------------------------------------------------------------------------- /webapp/views/default/user.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 |

{{=T( request.args(0).replace('_',' ').capitalize() )}}

3 |
4 | {{ 5 | if request.args(0)=='login': 6 | if not 'register' in auth.settings.actions_disabled: 7 | form.add_button(T('Register'),URL(args='register', vars={'_next': request.vars._next} if request.vars._next else None),_class='btn') 8 | pass 9 | if not 'request_reset_password' in auth.settings.actions_disabled: 10 | form.add_button(T('Lost Password'),URL(args='request_reset_password'),_class='btn') 11 | pass 12 | pass 13 | =form 14 | }} 15 |
16 | 24 | -------------------------------------------------------------------------------- /webapp/views/generic.load: -------------------------------------------------------------------------------- 1 | {{''' 2 | # License: Public Domain 3 | # Author: Iceberg at 21cn dot com 4 | 5 | With this generic.load file, you can use same function to serve two purposes. 6 | 7 | = regular action 8 | - ajax callback (when called with .load) 9 | 10 | Example modified from http://www.web2py.com/AlterEgo/default/show/252: 11 | 12 | def index(): 13 | return dict( 14 | part1='hello world', 15 | part2=LOAD(url=URL(r=request,f='auxiliary.load'),ajax=True)) 16 | 17 | def auxiliary(): 18 | form=SQLFORM.factory(Field('name')) 19 | if form.accepts(request.vars): 20 | response.flash = 'ok' 21 | return dict(message="Hello %s" % form.vars.name) 22 | return dict(form=form) 23 | 24 | Notice: 25 | 26 | - no need to set response.headers['web2py-response-flash'] 27 | - no need to return a string 28 | even if the function is called via ajax. 29 | 30 | '''}}{{if len(response._vars)==1:}}{{=response._vars.values()[0]}}{{else:}}{{=BEAUTIFY(response._vars)}}{{pass}} -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/Gruntfile.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery File Upload Gruntfile 3 | * https://github.com/blueimp/jQuery-File-Upload 4 | * 5 | * Copyright 2013, Sebastian Tschan 6 | * https://blueimp.net 7 | * 8 | * Licensed under the MIT license: 9 | * http://www.opensource.org/licenses/MIT 10 | */ 11 | 12 | /*global module */ 13 | 14 | module.exports = function (grunt) { 15 | 'use strict'; 16 | 17 | grunt.initConfig({ 18 | jshint: { 19 | options: { 20 | jshintrc: '.jshintrc' 21 | }, 22 | all: [ 23 | 'Gruntfile.js', 24 | 'js/cors/*.js', 25 | 'js/*.js', 26 | 'server/node/server.js', 27 | 'test/test.js' 28 | ] 29 | } 30 | }); 31 | 32 | grunt.loadNpmTasks('grunt-contrib-jshint'); 33 | grunt.loadNpmTasks('grunt-bump-build-git'); 34 | grunt.registerTask('test', ['jshint']); 35 | grunt.registerTask('default', ['test']); 36 | 37 | }; 38 | -------------------------------------------------------------------------------- /less/custom-other.less: -------------------------------------------------------------------------------- 1 | // Swatch 2.3.2 2 | // Bootswatch 3 | // ----------------------------------------------------- 4 | 5 | 6 | // TYPOGRAPHY 7 | // ----------------------------------------------------- 8 | 9 | // SCAFFOLDING 10 | // ----------------------------------------------------- 11 | 12 | // NAVBAR 13 | // ----------------------------------------------------- 14 | 15 | // NAV 16 | // ----------------------------------------------------- 17 | 18 | // BUTTONS 19 | // ----------------------------------------------------- 20 | 21 | // TABLES 22 | // ----------------------------------------------------- 23 | 24 | // FORMS 25 | // ----------------------------------------------------- 26 | 27 | // DROPDOWNS 28 | // ----------------------------------------------------- 29 | 30 | // ALERTS, LABELS, BADGES 31 | // ----------------------------------------------------- 32 | 33 | // MISC 34 | // ----------------------------------------------------- 35 | 36 | // MEDIA QUERIES 37 | // ----------------------------------------------------- 38 | 39 | -------------------------------------------------------------------------------- /webapp/static/js/argus/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Node start point select form 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |

17 | Search for taxonomic names (separate names with commas):
18 | 19 |

20 |
21 |
22 |

23 | Enter a tree string to perform TNRS name-matching on its tips:
24 |
25 | 26 |

27 |
28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /curator/controllers/tnrs.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ######################################################################### 4 | ## Basic support for a batch name-resolution tool (web app) 5 | ## - index() shows a simple tool (single-page app) 6 | ######################################################################### 7 | 8 | from applications.opentree.modules.opentreewebapputil import( 9 | get_opentree_api_endpoints, 10 | fetch_current_TNRS_context_names, 11 | get_maintenance_info) 12 | 13 | # N.B. This module is shared with tree-browser app, which is aliased as 14 | # 'opentree'. Any name changes will be needed here as well! 15 | 16 | def index(): 17 | """ 18 | Offer creation (or uploading) of a name-mapping dataset 19 | """ 20 | 21 | response.view = 'tnrs.html' 22 | view_dict = get_opentree_api_endpoints(request) 23 | #view_dict['message'] = "This would appear at bottom of page.." 24 | view_dict['maintenance_info'] = get_maintenance_info(request) 25 | view_dict['taxonSearchContextNames'] = fetch_current_TNRS_context_names(request) 26 | return view_dict 27 | 28 | -------------------------------------------------------------------------------- /less/bootstrap/less/media.less: -------------------------------------------------------------------------------- 1 | // Media objects 2 | // Source: http://stubbornella.org/content/?p=497 3 | // -------------------------------------------------- 4 | 5 | 6 | // Common styles 7 | // ------------------------- 8 | 9 | // Clear the floats 10 | .media, 11 | .media-body { 12 | overflow: hidden; 13 | *overflow: visible; 14 | zoom: 1; 15 | } 16 | 17 | // Proper spacing between instances of .media 18 | .media, 19 | .media .media { 20 | margin-top: 15px; 21 | } 22 | .media:first-child { 23 | margin-top: 0; 24 | } 25 | 26 | // For images and videos, set to block 27 | .media-object { 28 | display: block; 29 | } 30 | 31 | // Reset margins on headings for tighter default spacing 32 | .media-heading { 33 | margin: 0 0 5px; 34 | } 35 | 36 | 37 | // Media image alignment 38 | // ------------------------- 39 | 40 | .media > .pull-left { 41 | margin-right: 10px; 42 | } 43 | .media > .pull-right { 44 | margin-left: 10px; 45 | } 46 | 47 | 48 | // Media list variation 49 | // ------------------------- 50 | 51 | // Undo default ul/ol styles 52 | .media-list { 53 | margin-left: 0; 54 | list-style: none; 55 | } 56 | -------------------------------------------------------------------------------- /curator/install-ncl.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -x 3 | if ! test -d ncl 4 | then 5 | git clone https://github.com/mtholder/ncl.git || exit 6 | cd ncl || exit 7 | sh bootstrap.sh || exit 8 | cd .. 9 | else 10 | cd ncl || exit 11 | git pull origin master || exit 12 | cd .. 13 | fi 14 | 15 | export NCL_INSTALL_DIR="${PWD}/private" 16 | if ! test -d build-ncl-static 17 | then 18 | mkdir build-ncl-static || exit 19 | fi 20 | cd build-ncl-static || exit 21 | if ! test -f Makefile 22 | then 23 | ../ncl/configure --enable-static --disable-shared --prefix="${NCL_INSTALL_DIR}" --with-constfuncs=yes || exit 24 | fi 25 | make -j2 || exit 26 | #make check || exit 27 | make install || exit 28 | #make installcheck || exit 29 | cd .. 30 | 31 | # If the config file does not appear to have been configured for 32 | # the NCLconverter tool, add the relevant settings... 33 | if ! grep '^\[external\]' private/config > /dev/null 34 | then 35 | echo '[external]' >> private/config 36 | echo "dir=${NCL_INSTALL_DIR}/scratch" >> private/config 37 | echo "2nexml=${NCL_INSTALL_DIR}/bin/NCLconverter" >> private/config 38 | fi 39 | -------------------------------------------------------------------------------- /less/bootstrap/less/scaffolding.less: -------------------------------------------------------------------------------- 1 | // 2 | // Scaffolding 3 | // -------------------------------------------------- 4 | 5 | 6 | // Body reset 7 | // ------------------------- 8 | 9 | body { 10 | margin: 0; 11 | font-family: @baseFontFamily; 12 | font-size: @baseFontSize; 13 | line-height: @baseLineHeight; 14 | color: @textColor; 15 | background-color: @bodyBackground; 16 | } 17 | 18 | 19 | // Links 20 | // ------------------------- 21 | 22 | a { 23 | color: @linkColor; 24 | text-decoration: none; 25 | } 26 | a:hover, 27 | a:focus { 28 | color: @linkColorHover; 29 | text-decoration: underline; 30 | } 31 | 32 | 33 | // Images 34 | // ------------------------- 35 | 36 | // Rounded corners 37 | .img-rounded { 38 | .border-radius(6px); 39 | } 40 | 41 | // Add polaroid-esque trim 42 | .img-polaroid { 43 | padding: 4px; 44 | background-color: #fff; 45 | border: 1px solid #ccc; 46 | border: 1px solid rgba(0,0,0,.2); 47 | .box-shadow(0 1px 3px rgba(0,0,0,.1)); 48 | } 49 | 50 | // Perfect circle 51 | .img-circle { 52 | .border-radius(500px); // crank the border-radius so it works with most reasonably sized images 53 | } 54 | -------------------------------------------------------------------------------- /curator/test/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -x 3 | if test -z $CURATOR_DOMAIN 4 | then 5 | export CURATOR_DOMAIN="http://127.0.0.1:8000" 6 | fi 7 | python testMerge.py ${CURATOR_DOMAIN}/curator/default/merge_otus merge-input.v1.2.json >.out.merge.json || exit 8 | python testString2nexml.py ${CURATOR_DOMAIN}/curator/default/to_nexson avian_ovomucoids.tre newick >.out.saot.newick.txt|| exit 9 | python testString2nexml.py ${CURATOR_DOMAIN}/curator/default/to_nexson avian_ovomucoids.nex >.out.saon.def.txt || exit 10 | python testNoTreesString2nexml.py ${CURATOR_DOMAIN}/curator/default/to_nexson avian_ovomucoids_no_trees.nex >.out.saontn.def.txt || exit 11 | python test2nexml.py "${CURATOR_DOMAIN}/curator/default/to_nexson?nexml2json=1.2" avian_ovomucoids.tre newick >.out.aot.v1.2.0.txt || exit 12 | python test2nexml.py "${CURATOR_DOMAIN}/curator/default/to_nexson?nexml2json=1.0" avian_ovomucoids.tre newick >.out.aot.v1.0.0.txt || exit 13 | python test2nexml.py "${CURATOR_DOMAIN}/curator/default/to_nexson?nexml2json=0.0" avian_ovomucoids.tre newick >.out.aot.v0.0.0.txt || exit 14 | python test2nexml.py ${CURATOR_DOMAIN}/curator/default/to_nexson avian_ovomucoids.nex >.out.aon.def.txt || exit 15 | -------------------------------------------------------------------------------- /webapp/models/0.py: -------------------------------------------------------------------------------- 1 | from gluon.storage import Storage 2 | settings = Storage() 3 | 4 | settings.migrate = True 5 | settings.title = 'opentree' 6 | settings.subtitle = 'front page of web site and web services associated with the Open Tree of Life project' 7 | settings.author = 'Open Tree of Life developers' 8 | settings.author_email = 'mtholder@gmail.com' 9 | settings.keywords = 'bioinformatics, evolutionary biology, phylogenetics' 10 | settings.description = 'The goal of the Open Tree of Life project is to make phylogenetic knowledge more accessible. This site will allow you to explore previously published tree estimates and synthetic estimates of phylogenies that are created from many datasets. You can help make the system more comprehensive by uploading trees or linking trees in the system to the data on which they are based.' 11 | settings.database_uri = 'sqlite://storage.sqlite' 12 | settings.security_key = 'c424b180-c7ef-49cd-82c4-4ab21945bb48' 13 | settings.email_server = 'localhost' 14 | settings.email_sender = 'you@example.com' 15 | settings.email_login = '' 16 | settings.login_method = 'local' 17 | settings.login_config = '' 18 | settings.plugins = ['wiki', 'comments', 'tagging'] 19 | -------------------------------------------------------------------------------- /curator/static/css/bootstrap-tagsinput.css: -------------------------------------------------------------------------------- 1 | .bootstrap-tagsinput { 2 | background-color: #fff; 3 | border: 1px solid #ccc; 4 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 5 | display: inline-block; 6 | padding: 4px 6px; 7 | margin-bottom: 10px; 8 | color: #555; 9 | vertical-align: middle; 10 | border-radius: 4px; 11 | max-width: 100%; 12 | line-height: 22px; 13 | } 14 | .bootstrap-tagsinput input { 15 | border: none; 16 | box-shadow: none; 17 | outline: none; 18 | background-color: transparent; 19 | padding: 0; 20 | margin: 0; 21 | width: auto !important; 22 | max-width: inherit; 23 | } 24 | .bootstrap-tagsinput input:focus { 25 | border: none; 26 | box-shadow: none; 27 | } 28 | .bootstrap-tagsinput .tag { 29 | margin-right: 2px; 30 | color: white; 31 | } 32 | .bootstrap-tagsinput .tag [data-role="remove"] { 33 | margin-left: 8px; 34 | cursor: pointer; 35 | } 36 | .bootstrap-tagsinput .tag [data-role="remove"]:after { 37 | content: "x"; 38 | padding: 0px 2px; 39 | } 40 | .bootstrap-tagsinput .tag [data-role="remove"]:hover { 41 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 42 | } 43 | .bootstrap-tagsinput .tag [data-role="remove"]:hover:active { 44 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 45 | } 46 | -------------------------------------------------------------------------------- /less/bootstrap/less/responsive.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Responsive v2.3.2 3 | * 4 | * Copyright 2012 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 9 | */ 10 | 11 | 12 | // Responsive.less 13 | // For phone and tablet devices 14 | // ------------------------------------------------------------- 15 | 16 | 17 | // REPEAT VARIABLES & MIXINS 18 | // ------------------------- 19 | // Required since we compile the responsive stuff separately 20 | 21 | @import "variables.less"; // Modify this for custom colors, font-sizes, etc 22 | @import "mixins.less"; 23 | 24 | 25 | // RESPONSIVE CLASSES 26 | // ------------------ 27 | 28 | @import "responsive-utilities.less"; 29 | 30 | 31 | // MEDIA QUERIES 32 | // ------------------ 33 | 34 | // Large desktops 35 | @import "responsive-1200px-min.less"; 36 | 37 | // Tablets to regular desktops 38 | @import "responsive-768px-979px.less"; 39 | 40 | // Phones to portrait tablets and narrow desktops 41 | @import "responsive-767px-max.less"; 42 | 43 | 44 | // RESPONSIVE NAVBAR 45 | // ------------------ 46 | 47 | // From 979px and below, show a button to toggle navbar contents 48 | @import "responsive-navbar.less"; 49 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/server/node/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blueimp-file-upload-node", 3 | "version": "2.1.0", 4 | "title": "jQuery File Upload Node.js example", 5 | "description": "Node.js implementation example of a file upload handler for jQuery File Upload.", 6 | "keywords": [ 7 | "file", 8 | "upload", 9 | "cross-domain", 10 | "cross-site", 11 | "node" 12 | ], 13 | "homepage": "https://github.com/blueimp/jQuery-File-Upload", 14 | "author": { 15 | "name": "Sebastian Tschan", 16 | "url": "https://blueimp.net" 17 | }, 18 | "maintainers": [ 19 | { 20 | "name": "Sebastian Tschan", 21 | "url": "https://blueimp.net" 22 | } 23 | ], 24 | "repository": { 25 | "type": "git", 26 | "url": "git://github.com/blueimp/jQuery-File-Upload.git" 27 | }, 28 | "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues", 29 | "licenses": [ 30 | { 31 | "type": "MIT", 32 | "url": "http://www.opensource.org/licenses/MIT" 33 | } 34 | ], 35 | "dependencies": { 36 | "formidable": ">=1.0.11", 37 | "node-static": ">=0.6.5", 38 | "imagemagick": ">=0.1.3" 39 | }, 40 | "main": "server.js" 41 | } 42 | -------------------------------------------------------------------------------- /less/bootstrap/js/tests/unit/bootstrap-scrollspy.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("bootstrap-scrollspy") 4 | 5 | test("should provide no conflict", function () { 6 | var scrollspy = $.fn.scrollspy.noConflict() 7 | ok(!$.fn.scrollspy, 'scrollspy was set back to undefined (org value)') 8 | $.fn.scrollspy = scrollspy 9 | }) 10 | 11 | test("should be defined on jquery object", function () { 12 | ok($(document.body).scrollspy, 'scrollspy method is defined') 13 | }) 14 | 15 | test("should return element", function () { 16 | ok($(document.body).scrollspy()[0] == document.body, 'document.body returned') 17 | }) 18 | 19 | test("should switch active class on scroll", function () { 20 | var sectionHTML = '
' 21 | , $section = $(sectionHTML).append('#qunit-fixture') 22 | , topbarHTML ='
' 23 | + '
' 24 | + '
' 25 | + '

Bootstrap

' 26 | + '' 29 | + '
' 30 | + '
' 31 | + '
' 32 | , $topbar = $(topbarHTML).scrollspy() 33 | 34 | ok($topbar.find('.active', true)) 35 | }) 36 | 37 | }) -------------------------------------------------------------------------------- /TESTS.md: -------------------------------------------------------------------------------- 1 | To test the OTU mapping features, use [Whitmore, 2013 on devtree](http://devtree.opentreeoflife.org/curator/study/edit/pg_2628?tab=otu-mapping). This has a number of non-standard taxon labels which should fail the standard "quick" mapping tool. Then try "Fuzzy matches" on the first few OTUs. Some (like _Sarcophaga mediterranea_) will fail to get even a fuzzy match, but most will return a list of possible matches. Clicking any match will accept it, just as if a single match had been accepted with the "check" button. Clicking the "X" rejects all the suggested matches. 2 | 3 | Once you see a list of possible matches, click the "key" link to see a popup explaining the colors and opacity. Mousing over any match in a list will show the same information. 4 | 5 | Back in the synth-tree viewer, you can confirm the presence of working taxon search (context list appears) on the [Contact page.](http://devtree.opentreeoflife.org/contact) 6 | 7 | Other changes (to visualization and resource downloads) should be available for review on **files.opentreeoflife.org**, since these are generally deployed immediately from the local repo, by the person who made the changes. 8 | 9 | There is a test script for the `to_nexson` method (the service that converts and imports studies from uploaded files or pasted text) in [curator/test/test.sh](https://github.com/OpenTreeOfLife/opentree/blob/master/curator/test/test.sh). 10 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/css/jquery.fileupload-ui.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | /* 3 | * jQuery File Upload UI Plugin CSS 9.0.0 4 | * https://github.com/blueimp/jQuery-File-Upload 5 | * 6 | * Copyright 2010, Sebastian Tschan 7 | * https://blueimp.net 8 | * 9 | * Licensed under the MIT license: 10 | * http://www.opensource.org/licenses/MIT 11 | */ 12 | 13 | .fileupload-buttonbar .btn, 14 | .fileupload-buttonbar .toggle { 15 | margin-bottom: 5px; 16 | } 17 | .progress-animated .progress-bar, 18 | .progress-animated .bar { 19 | background: url("../img/progressbar.gif") !important; 20 | filter: none; 21 | } 22 | .fileupload-process { 23 | float: right; 24 | display: none; 25 | } 26 | .fileupload-processing .fileupload-process, 27 | .files .processing .preview { 28 | display: block; 29 | width: 32px; 30 | height: 32px; 31 | background: url("../img/loading.gif") center no-repeat; 32 | background-size: contain; 33 | } 34 | .files audio, 35 | .files video { 36 | max-width: 300px; 37 | } 38 | 39 | @media (max-width: 767px) { 40 | .fileupload-buttonbar .toggle, 41 | .files .toggle, 42 | .files .btn span { 43 | display: none; 44 | } 45 | .files .name { 46 | width: 80px; 47 | word-wrap: break-word; 48 | } 49 | .files audio, 50 | .files video { 51 | max-width: 80px; 52 | } 53 | .files img, 54 | .files canvas { 55 | max-width: 100%; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /curator/static/js/web2py_bootstrap.js: -------------------------------------------------------------------------------- 1 | // this code improves bootstrap menus and adds dropdown support 2 | jQuery(function(){ 3 | jQuery('.nav>li>a').each(function(){ 4 | if(jQuery(this).parent().find('ul').length) 5 | jQuery(this).attr({'class':'dropdown-toggle','data-toggle':'dropdown'}).append(''); 6 | }); 7 | jQuery('.nav li li').each(function(){ 8 | if(jQuery(this).find('ul').length) 9 | jQuery(this).addClass('dropdown-submenu'); 10 | }); 11 | function hoverMenu(){ 12 | var wid = document.documentElement.clientWidth; //faster than $(window).width() and cross browser 13 | if (wid>=980){ 14 | jQuery('ul.nav a.dropdown-toggle').parent().hover(function(){ 15 | mi = jQuery(this).addClass('open'); 16 | mi.children('.dropdown-menu').stop(true, true).delay(200).fadeIn(400); 17 | }, function(){ 18 | mi = jQuery(this); 19 | mi.children('.dropdown-menu').stop(true, true).delay(200).fadeOut(function(){mi.removeClass('open')}); 20 | }); 21 | }; 22 | } 23 | hoverMenu(); // first page load 24 | jQuery(window).resize(hoverMenu); // on resize event 25 | jQuery('ul.nav li.dropdown a').click(function(){window.location=jQuery(this).attr('href');}); 26 | // make all buttons bootstrap buttons 27 | jQuery('button, form input[type="submit"], form input[type="button"]').addClass('btn'); 28 | }); 29 | -------------------------------------------------------------------------------- /webapp/static/js/web2py_bootstrap.js: -------------------------------------------------------------------------------- 1 | // this code improves bootstrap menus and adds dropdown support 2 | jQuery(function(){ 3 | jQuery('.nav>li>a').each(function(){ 4 | if(jQuery(this).parent().find('ul').length) 5 | jQuery(this).attr({'class':'dropdown-toggle','data-toggle':'dropdown'}).append(''); 6 | }); 7 | jQuery('.nav li li').each(function(){ 8 | if(jQuery(this).find('ul').length) 9 | jQuery(this).addClass('dropdown-submenu'); 10 | }); 11 | function hoverMenu(){ 12 | var wid = document.documentElement.clientWidth; //faster than $(window).width() and cross browser 13 | if (wid>=980){ 14 | jQuery('ul.nav a.dropdown-toggle').parent().hover(function(){ 15 | mi = jQuery(this).addClass('open'); 16 | mi.children('.dropdown-menu').stop(true, true).delay(200).fadeIn(400); 17 | }, function(){ 18 | mi = jQuery(this); 19 | mi.children('.dropdown-menu').stop(true, true).delay(200).fadeOut(function(){mi.removeClass('open')}); 20 | }); 21 | }; 22 | } 23 | hoverMenu(); // first page load 24 | jQuery(window).resize(hoverMenu); // on resize event 25 | jQuery('ul.nav li.dropdown a').click(function(){window.location=jQuery(this).attr('href');}); 26 | // make all buttons bootstrap buttons 27 | jQuery('button, form input[type="submit"], form input[type="button"]').addClass('btn'); 28 | }); 29 | -------------------------------------------------------------------------------- /webapp/views/default/error.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 | {{ # set error message and suggestions based on the response status 4 | # TODO: Customize messages for other codes? see http://en.wikipedia.org/wiki/List_of_HTTP_status_codes 5 | 6 | msg = "Sorry, something went wrong." 7 | suggestion = 'Please try the links or search above. If you still can\'t find what you\'re looking for, contact us and we\'ll help to sort things out.' 8 | 9 | if response.status == 404: 10 | msg = "Sorry, we couldn't find this page." 11 | elif response.status == 500: 12 | msg = "Sorry, there was a server error." 13 | elif response.status == 403: 14 | msg = "Sorry, you're not allowed to see that." 15 | suggestion = 'Please log into the site and try again. If you still can\'t find what you\'re looking for, contact us and we\'ll help to sort things out.' 16 | pass 17 | }} 18 | 19 |
20 | 21 | {{= response.status }} 22 |

23 | {{= msg }} 24 |

25 | 26 |
27 | {{= XML(suggestion) }} 28 |
29 | 30 |
31 | -------------------------------------------------------------------------------- /webapp/static/css/jquery.splitter.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * StyleSheet for JQuery Spliter Plugin 3 | * Copyright (C) 2010 Jakub Jankiewicz 4 | * 5 | * Same license as plugin 6 | */ 7 | .spliter_panel { 8 | position: relative; 9 | } 10 | .spliter_panel .vspliter { 11 | background-color: grey; 12 | cursor: col-resize; 13 | z-index:900; 14 | width: 4px; 15 | position: absolute !important; 16 | } 17 | 18 | .spliter_panel .hspliter { 19 | background-color: #5F5F5F; 20 | cursor: row-resize; 21 | z-index: 800; 22 | height: 4px; 23 | position: absolute !important; 24 | } 25 | .spliter_panel .vspliter, .spliter_panel .left_panel, .spliter_panel .right_panel, 26 | .spliter_panel .hspliter, .spliter_panel .top_panel, .spliter_panel .bottom_panel { 27 | position: relative; 28 | overflow: auto; 29 | } 30 | .spliter_panel .vspliter, .spliter_panel .left_panel, .spliter_panel .right_panel { 31 | height: 100%; 32 | } 33 | .spliter_panel .hspliter, .spliter_panel .top_panel, .spliter_panel .bottom_panel { 34 | width: 100%; 35 | } 36 | .spliter_panel .top_panel, .spliter_panel .left_panel, .spliter_panel .vspliter { 37 | top: 0; 38 | } 39 | .spliter_panel .top_panel, .spliter_panel .bottom_panel, .spliter_panel .left_panel, .spliter_panel .hspliter { 40 | left: 0; 41 | } 42 | .spliter_panel .bottom_panel { 43 | bottom: 0; 44 | } 45 | .spliter_panel .right_panel { 46 | right: 0; 47 | } 48 | -------------------------------------------------------------------------------- /less/bootstrap/less/thumbnails.less: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files 7 | 8 | // Make wrapper ul behave like the grid 9 | .thumbnails { 10 | margin-left: -@gridGutterWidth; 11 | list-style: none; 12 | .clearfix(); 13 | } 14 | // Fluid rows have no left margin 15 | .row-fluid .thumbnails { 16 | margin-left: 0; 17 | } 18 | 19 | // Float li to make thumbnails appear in a row 20 | .thumbnails > li { 21 | float: left; // Explicity set the float since we don't require .span* classes 22 | margin-bottom: @baseLineHeight; 23 | margin-left: @gridGutterWidth; 24 | } 25 | 26 | // The actual thumbnail (can be `a` or `div`) 27 | .thumbnail { 28 | display: block; 29 | padding: 4px; 30 | line-height: @baseLineHeight; 31 | border: 1px solid #ddd; 32 | .border-radius(@baseBorderRadius); 33 | .box-shadow(0 1px 3px rgba(0,0,0,.055)); 34 | .transition(all .2s ease-in-out); 35 | } 36 | // Add a hover/focus state for linked versions only 37 | a.thumbnail:hover, 38 | a.thumbnail:focus { 39 | border-color: @linkColor; 40 | .box-shadow(0 1px 4px rgba(0,105,214,.25)); 41 | } 42 | 43 | // Images and captions 44 | .thumbnail > img { 45 | display: block; 46 | max-width: 100%; 47 | margin-left: auto; 48 | margin-right: auto; 49 | } 50 | .thumbnail .caption { 51 | padding: 9px; 52 | color: @gray; 53 | } 54 | -------------------------------------------------------------------------------- /webapp/models/plugin_tagging.py: -------------------------------------------------------------------------------- 1 | if not 'db' in globals(): 2 | raise HTTP(500,"plugin _tagging requires 'db' and 'auth'") 3 | 4 | db.define_table('plugin_tagging_tag', 5 | Field('name'), 6 | Field('links','integer',default=0,writable=False), 7 | Field('created_by',db.auth_user,writable=False,readable=False), 8 | Field('created_on','datetime',default=request.now,writable=False,readable=False), 9 | format='%(name)s') 10 | 11 | db.plugin_tagging_tag.created_by.default=(auth.user and auth.user.id) or 0 12 | 13 | db.define_table('plugin_tagging_link', 14 | Field('tag',db.plugin_tagging_tag), 15 | Field('table_name'), 16 | Field('record_id','integer')) 17 | 18 | db.define_table('plugin_tagging_subscription', 19 | Field('auth_user',db.auth_user), 20 | Field('tag',db.plugin_tagging_tag)) 21 | 22 | 23 | db.plugin_tagging_tag.name.requires = IS_NOT_EMPTY() 24 | db.plugin_tagging_link.tag.requires = IS_IN_DB(db,'plugin_tagging_tag.id','%(name)s') 25 | 26 | 27 | def plugin_tagging(table_name=None,record_id=0): 28 | """ 29 | You can tag a record of a table by embedding this:: 30 | 31 | {{=tag('mytable',45)}} 32 | 33 | where 'mytable' is a table name and 45 is a record id. 34 | It will display a tagging widget. 35 | """ 36 | return LOAD('plugin_tagging',args=(table_name,record_id),ajax=True) 37 | 38 | def plugin_tagging_cloud(): 39 | return LOAD('plugin_tagging','tag_cloud') 40 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/css/demo.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | /* 3 | * jQuery File Upload Demo CSS 1.1.0 4 | * https://github.com/blueimp/jQuery-File-Upload 5 | * 6 | * Copyright 2013, Sebastian Tschan 7 | * https://blueimp.net 8 | * 9 | * Licensed under the MIT license: 10 | * http://www.opensource.org/licenses/MIT 11 | */ 12 | 13 | body { 14 | max-width: 750px; 15 | margin: 0 auto; 16 | padding: 1em; 17 | font-family: "Lucida Grande", "Lucida Sans Unicode", Arial, sans-serif; 18 | font-size: 1em; 19 | line-height: 1.4em; 20 | background: #222; 21 | color: #fff; 22 | -webkit-text-size-adjust: 100%; 23 | -ms-text-size-adjust: 100%; 24 | } 25 | a { 26 | color: orange; 27 | text-decoration: none; 28 | } 29 | img { 30 | border: 0; 31 | vertical-align: middle; 32 | } 33 | h1 { 34 | line-height: 1em; 35 | } 36 | blockquote { 37 | padding: 0 0 0 15px; 38 | margin: 0 0 20px; 39 | border-left: 5px solid #eee; 40 | } 41 | table { 42 | width: 100%; 43 | margin: 10px 0; 44 | } 45 | 46 | .fileupload-progress { 47 | margin: 10px 0; 48 | } 49 | .fileupload-progress .progress-extended { 50 | margin-top: 5px; 51 | } 52 | .error { 53 | color: red; 54 | } 55 | 56 | @media (min-width: 481px) { 57 | .navigation { 58 | list-style: none; 59 | padding: 0; 60 | } 61 | .navigation li { 62 | display: inline-block; 63 | } 64 | .navigation li:not(:first-child):before { 65 | content: "| "; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /mirror-files.opentreeoflife.org.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This script can be run periodically (cronjob, etc) to capture a remote copy 4 | # of all files in the current files.opentreeoflife.org 5 | # The smaller files in this domain are in GitHub, so our main interest here is 6 | # to keep safe copies of the larger files. 7 | 8 | # sensible defaults for hostname, path to local mirror, etc. 9 | [ "x$FILES_HOST" != x ] || FILES_HOST=ot10 10 | 11 | # NOTE that you'll need to define $FILES_HOST in local ~/.ssh/config to connect via SSH, e.g. 12 | # host ot10 13 | # Hostname ot10.opentreeoflife.org 14 | # Port 22 15 | # ... 16 | 17 | # Create a local mirror folder with this hostname, if not found. 18 | [ "x$LOCAL_MIRROR" != x ] || LOCAL_MIRROR=../files-domain-mirror/$FILES_HOST 19 | 20 | if ! test -d $LOCAL_MIRROR 21 | then 22 | mkdir -p $LOCAL_MIRROR || exit 23 | fi 24 | 25 | # Save one previous version (incl. deleted files) in a second folder. 26 | # N.B. this is *relative* to $LOCAL_MIRROR above! 27 | ## [ "x$LOCAL_BACKUPDIR" != x ] || LOCAL_BACKUPDIR=../$FILES_HOST-older 28 | # TODO: To save the previous version of any changed or deleted files, testore the --backup and --backup-dir options here: 29 | ## rsync --progress --compress --archive --backup --backup-dir=$LOCAL_BACKUPDIR --delete $FILES_HOST:files.opentreeoflife.org $LOCAL_MIRROR 30 | rsync --progress --compress --archive --delete $FILES_HOST:files.opentreeoflife.org $LOCAL_MIRROR 31 | 32 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013, Jonathan Rees 2 | Copyright (c) 2013, Mark Holder 3 | Copyright (c) 2013, Jim Allman 4 | Copyright (c) 2013, Stephen Smith 5 | 6 | All rights reserved. 7 | 8 | Redistribution and use in source and binary forms, with or without 9 | modification, are permitted provided that the following conditions are met: 10 | 11 | Redistributions of source code must retain the above copyright notice, this 12 | list of conditions and the following disclaimer. 13 | 14 | Redistributions in binary form must reproduce the above copyright notice, 15 | this list of conditions and the following disclaimer in the documentation 16 | and/or other materials provided with the distribution. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /curator/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013, Jonathan Rees 2 | Copyright (c) 2013, Mark Holder 3 | Copyright (c) 2013, Jim Allman 4 | Copyright (c) 2013, Stephen Smith 5 | 6 | All rights reserved. 7 | 8 | Redistribution and use in source and binary forms, with or without 9 | modification, are permitted provided that the following conditions are met: 10 | 11 | Redistributions of source code must retain the above copyright notice, this 12 | list of conditions and the following disclaimer. 13 | 14 | Redistributions in binary form must reproduce the above copyright notice, 15 | this list of conditions and the following disclaimer in the documentation 16 | and/or other materials provided with the distribution. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /webapp/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013, Jonathan Rees 2 | Copyright (c) 2013, Mark Holder 3 | Copyright (c) 2013, Jim Allman 4 | Copyright (c) 2013, Stephen Smith 5 | 6 | All rights reserved. 7 | 8 | Redistribution and use in source and binary forms, with or without 9 | modification, are permitted provided that the following conditions are met: 10 | 11 | Redistributions of source code must retain the above copyright notice, this 12 | list of conditions and the following disclaimer. 13 | 14 | Redistributions in binary form must reproduce the above copyright notice, 15 | this list of conditions and the following disclaimer in the documentation 16 | and/or other materials provided with the distribution. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /less/bootstrap/less/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and blocK) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | pre { 9 | padding: 0 3px 2px; 10 | #font > #family > .monospace; 11 | font-size: @baseFontSize - 2; 12 | color: @grayDark; 13 | .border-radius(3px); 14 | } 15 | 16 | // Inline code 17 | code { 18 | padding: 2px 4px; 19 | color: #d14; 20 | background-color: #f7f7f9; 21 | border: 1px solid #e1e1e8; 22 | white-space: nowrap; 23 | } 24 | 25 | // Blocks of code 26 | pre { 27 | display: block; 28 | padding: (@baseLineHeight - 1) / 2; 29 | margin: 0 0 @baseLineHeight / 2; 30 | font-size: @baseFontSize - 1; // 14px to 13px 31 | line-height: @baseLineHeight; 32 | word-break: break-all; 33 | word-wrap: break-word; 34 | white-space: pre; 35 | white-space: pre-wrap; 36 | background-color: #f5f5f5; 37 | border: 1px solid #ccc; // fallback for IE7-8 38 | border: 1px solid rgba(0,0,0,.15); 39 | .border-radius(@baseBorderRadius); 40 | 41 | // Make prettyprint styles more spaced out for readability 42 | &.prettyprint { 43 | margin-bottom: @baseLineHeight; 44 | } 45 | 46 | // Account for some code outputs that place code tags in pre tags 47 | code { 48 | padding: 0; 49 | color: inherit; 50 | white-space: pre; 51 | white-space: pre-wrap; 52 | background-color: transparent; 53 | border: 0; 54 | } 55 | } 56 | 57 | // Enable scrollable blocks of code 58 | .pre-scrollable { 59 | max-height: 340px; 60 | overflow-y: scroll; 61 | } -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/blueimp-file-upload.jquery.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blueimp-file-upload", 3 | "version": "9.5.2", 4 | "title": "jQuery File Upload", 5 | "author": { 6 | "name": "Sebastian Tschan", 7 | "url": "https://blueimp.net" 8 | }, 9 | "licenses": [ 10 | { 11 | "type": "MIT", 12 | "url": "http://www.opensource.org/licenses/MIT" 13 | } 14 | ], 15 | "dependencies": { 16 | "jquery": ">=1.6" 17 | }, 18 | "description": "File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.", 19 | "keywords": [ 20 | "jquery", 21 | "file", 22 | "upload", 23 | "widget", 24 | "multiple", 25 | "selection", 26 | "drag", 27 | "drop", 28 | "progress", 29 | "preview", 30 | "cross-domain", 31 | "cross-site", 32 | "chunk", 33 | "resume", 34 | "gae", 35 | "go", 36 | "python", 37 | "php", 38 | "bootstrap" 39 | ], 40 | "homepage": "https://github.com/blueimp/jQuery-File-Upload", 41 | "docs": "https://github.com/blueimp/jQuery-File-Upload/wiki", 42 | "demo": "http://blueimp.github.io/jQuery-File-Upload/", 43 | "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues", 44 | "maintainers": [ 45 | { 46 | "name": "Sebastian Tschan", 47 | "url": "https://blueimp.net" 48 | } 49 | ] 50 | } 51 | -------------------------------------------------------------------------------- /mirror-supporting-files.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This script can be run periodically (cronjob, etc) to capture a remote copy 4 | # of the supporting files folder in any instance(s) of the Open Tree of Life curation app. 5 | 6 | # sensible defaults for hostname, path to local mirror, etc. 7 | [ "x$CURATION_HOST" != x ] || CURATION_HOST=devtree.opentreeoflife.org 8 | 9 | # NOTE that you'll need to define $CURATION_HOST in local ~/.ssh/config to connect via SSH, e.g. 10 | # host ot11 devtree.opentreeoflife.org 11 | # Hostname ot11.opentreeoflife.org 12 | # Port 22 13 | # ... 14 | 15 | # Create a local mirror folder with this hostname, if not found. 16 | [ "x$LOCAL_MIRROR" != x ] || LOCAL_MIRROR=../supporting-files-mirror/$CURATION_HOST 17 | 18 | if ! test -d $LOCAL_MIRROR 19 | then 20 | mkdir -p $LOCAL_MIRROR || exit 21 | fi 22 | 23 | # Save one previous version (incl. deleted files) in a second folder. 24 | # N.B. this is *relative* to $LOCAL_MIRROR above! 25 | [ "x$LOCAL_BACKUPDIR" != x ] || LOCAL_BACKUPDIR=../$CURATION_HOST-older 26 | 27 | rsync --progress --compress --archive --backup --backup-dir=$LOCAL_BACKUPDIR/uploads/ --delete $CURATION_HOST:/home/opentree/repo/opentree/curator/uploads/ $LOCAL_MIRROR/uploads 28 | 29 | rsync --progress --compress --archive --backup --backup-dir=$LOCAL_BACKUPDIR/scratch/ --delete $CURATION_HOST:/home/opentree/repo/opentree/curator/private/scratch/ $LOCAL_MIRROR/scratch 30 | 31 | rsync --progress --compress --archive --backup --backup-dir=$LOCAL_BACKUPDIR/peyotl-scratch --delete $CURATION_HOST:/home/opentree/repo/peyotl/scratch/ $LOCAL_MIRROR/peyotl-scratch 32 | -------------------------------------------------------------------------------- /curator/views/default/error.html: -------------------------------------------------------------------------------- 1 | {{ # clear the title and subtitle, if found 2 | response.title = "" 3 | response.subtitle = "" 4 | }} 5 | {{extend 'layout.html'}} 6 | 7 | {{ # set error message and suggestions based on the response status 8 | # TODO: Customize messages for other codes? see http://en.wikipedia.org/wiki/List_of_HTTP_status_codes 9 | 10 | msg = "Sorry, something went wrong." 11 | suggestion = 'Please try the links or search above. If you still can\'t find what you\'re looking for, contact us and we\'ll help to sort things out.' 12 | 13 | if response.status == 404: 14 | msg = "Sorry, we couldn't find this page." 15 | elif response.status == 500: 16 | msg = "Sorry, there was a server error." 17 | elif response.status == 403: 18 | msg = "Sorry, you're not allowed to see that." 19 | suggestion = 'Please log into the site and try again. If you still can\'t find what you\'re looking for, contact us and we\'ll help to sort things out.' 20 | pass 21 | }} 22 | 23 |
24 | 25 | {{= response.status }} 26 |

27 | {{= msg }} 28 |

29 | 30 |
31 | {{ # REMINDER: web2py's sanitize can't handle Unicode! }} 32 | {{= XML(suggestion, sanitize=False) }} 33 |
34 | 35 |
36 | 37 | -------------------------------------------------------------------------------- /curator/routes.example.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This is an app-specific example router 4 | # 5 | # This simple router is used for setting languages from app/languages directory 6 | # as a part of the application path: app//controller/function 7 | # Language from default.py or 'en' (if the file is not found) is used as 8 | # a default_language 9 | # 10 | # See /router.example.py for parameter's detail 11 | #------------------------------------------------------------------------------------- 12 | # To enable this route file you must do the steps: 13 | # 14 | # 1. rename /router.example.py to routes.py 15 | # 2. rename this APP/routes.example.py to APP/routes.py 16 | # (where APP - is your application directory) 17 | # 3. restart web2py (or reload routes in web2py admin interfase) 18 | # 19 | # YOU CAN COPY THIS FILE TO ANY APLLICATION'S ROOT DIRECTORY WITHOUT CHANGES! 20 | 21 | from fileutils import abspath 22 | from languages import read_possible_languages 23 | 24 | possible_languages = read_possible_languages(abspath('applications', app)) 25 | #NOTE! app - is an application based router's parameter with name of an 26 | # application. E.g.'welcome' 27 | 28 | routers = { 29 | app: dict( 30 | default_language = possible_languages['default'][0], 31 | languages = [lang for lang in possible_languages 32 | if lang != 'default'] 33 | ) 34 | } 35 | 36 | #NOTE! To change language in your application using these rules add this line 37 | #in one of your models files: 38 | # if request.uri_language: T.force(request.uri_language) 39 | -------------------------------------------------------------------------------- /curator/views/default/dashboard.html: -------------------------------------------------------------------------------- 1 | {{left_sidebar_enabled,right_sidebar_enabled=False,False}} 2 | {{response.title = "Study Curator"}} 3 | {{response.subtitle = "Building the tree, one study at a time"}} 4 | {{extend 'layout.html'}} 5 | 6 |
7 |
8 | {{if 'message' in globals():}} 9 |

{{=message}}

10 | {{pass}} 11 | 12 |
13 | {filtered list of my studies} 14 |
15 | {{= A('Example study one', _href=URL(c='study',f='edit',args=[10])) }}   <== CLICK THIS LINK 16 |
17 |
18 | {list of my source trees?} 19 |
20 |
21 |
22 |
23 | 24 |
25 | 26 |
27 | {recent curation activity} 28 |
29 |
30 |
31 | {areas of interest} 32 |
33 |
34 |
35 |
36 | 37 |
38 | 39 | {{block right_sidebar}} 40 | {{=A(T("Administrative Interface"), _href=URL('admin','default','index'), _class='btn', 41 | _style='margin-top: 1em;')}} 42 |
{{=T("Don't know what to do?")}}
43 | 48 | {{end}} 49 | -------------------------------------------------------------------------------- /webapp/routes.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # adapted from router.example.py 4 | # 5 | # NOTE that this requires a parametric router in the web2py root directory. 6 | # Let's keep all the important stuff here, and just copy a minimal router 7 | # (SITE.routes.py) into the site root. 8 | 9 | # NOTE that this (app-specific) routes.py file mainly defines a router by the 10 | # same name. More general settings must be done in the main routes.py alongside 11 | # the web2py/applications/ directory 12 | # root_static (for favicon.ico, robots.txt, etc) 13 | # routes_onerror (defines error pages per app, per error code, or defaults) 14 | # domain (maps domain names and ports to particular app) 15 | # See SITE.routes.py for recommended settings. 16 | 17 | routers = dict( 18 | 19 | opentree=dict( 20 | # convert dashes (hyphens) in URLs to underscores in web2py controller+action names 21 | map_hyphen=True, 22 | 23 | default_controller='default', 24 | 25 | # whitelist of known functions in the default controller, to decipher ambiguous URLs 26 | functions=[ 27 | 'index', 28 | 'error', 29 | 'download_subtree', 30 | 'fetch_current_synthetic_tree_ids', 31 | 'fetch_current_TNRS_context_name', 32 | 'phylopic_proxy', 33 | 'user', # implicit? inherited? and needed for login, logout, etc 34 | ], 35 | 36 | # The default function will grab *anything* else, so it should know how to 37 | # distinguish between errors and "generous" catch-all routing. 38 | default_function='index', 39 | ), 40 | ) 41 | 42 | # see router.example.py for (many) more options! 43 | -------------------------------------------------------------------------------- /argus-json-notes.txt: -------------------------------------------------------------------------------- 1 | Argus renders JSON (from taxomachine and treemachine). 2 | 3 | It expects two objects: 4 | 1. a tree 5 | 2. object with a 'domsource' attribute (e.g. {"domsource":"ottol"}) 6 | 7 | The tree is nested set of node description. Each node has the attributes: 8 | "children" -> list of child nodes. 9 | 10 | "nleaves" -> 0 for a leaf, # of descendant "leaves" for the node. Note that 11 | the # of leaves refers to the # of leaves in the tree that has been 12 | pruned to "maxnodedepth" (see below), not the # of nodes in the source 13 | graph that are descendants of the node. 14 | 15 | "nTipDescendants" -> 0 for a leaf, # of tips within the node's clade, 16 | *excluding* the node itself. (In other words, this reflects the full 17 | source graph, irrespective of "maxonodedepth".) 18 | 19 | "name" -> string with the node's name. 20 | 21 | "nodeid" -> string that is a node ID in the webservice that generated the JSON 22 | this ID is not guaranteed to be stable (at least, I don't think it is) 23 | across multiple instances of the service. Perhaps not even stable if the 24 | neo4j db is recreated. Argus uses this to enable navigation by attaching a 25 | callback that requests more of the tree starting at node that corresponds to 26 | this nodeid. 27 | 28 | In addition the root is expected to have: 29 | "maxnodedepth" -> number of node levels that include their children. 30 | 31 | When this JSON is retrieved on the client, it is deserialized by a "reviver" 32 | function that converts some elements (those with the 'nodeid' attribute) from 33 | simple objects to instances of the ArgusNode pseudo-class. 34 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blueimp-file-upload", 3 | "version": "9.5.2", 4 | "title": "jQuery File Upload", 5 | "description": "File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.", 6 | "keywords": [ 7 | "jquery", 8 | "file", 9 | "upload", 10 | "widget", 11 | "multiple", 12 | "selection", 13 | "drag", 14 | "drop", 15 | "progress", 16 | "preview", 17 | "cross-domain", 18 | "cross-site", 19 | "chunk", 20 | "resume", 21 | "gae", 22 | "go", 23 | "python", 24 | "php", 25 | "bootstrap" 26 | ], 27 | "homepage": "https://github.com/blueimp/jQuery-File-Upload", 28 | "author": { 29 | "name": "Sebastian Tschan", 30 | "url": "https://blueimp.net" 31 | }, 32 | "maintainers": [ 33 | { 34 | "name": "Sebastian Tschan", 35 | "url": "https://blueimp.net" 36 | } 37 | ], 38 | "repository": { 39 | "type": "git", 40 | "url": "git://github.com/blueimp/jQuery-File-Upload.git" 41 | }, 42 | "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues", 43 | "licenses": [ 44 | { 45 | "type": "MIT", 46 | "url": "http://www.opensource.org/licenses/MIT" 47 | } 48 | ], 49 | "devDependencies": { 50 | "grunt": "1.5.3", 51 | "grunt-bump-build-git": "1.1.3", 52 | "grunt-contrib-jshint": "3.2.0", 53 | "semver": "4.3.2", 54 | "shelljs": "0.8.5" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /curator/static/js/tnrs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bulk-name-resolution-webapp", 3 | "version": "0.0.1", 4 | "description": "Bundle all TNRS-tool JS with browserify", 5 | "author": "Jim Allman ", 6 | "contributors": [], 7 | "scripts": { 8 | "watch": "watchify ./tnrs-main.js --verbose --debug --standalone=tnrs --outfile=../tnrs-bundle.js", 9 | "build": "browserify ./tnrs-main.js --verbose --standalone=tnrs --outfile=../tnrs-bundle.js", 10 | "uglify": "browserify ./tnrs-main.js --verbose --standalone=tnrs | uglifyjs -mc warnings=false > ../tnrs-bundle.js" 11 | }, 12 | "main": "./tnrs-main.js", 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/opentreeoflife/opentree" 16 | }, 17 | "bugs": { 18 | "url": "https://github.com/opentreeoflife/feedback/issues" 19 | }, 20 | "keywords": [ 21 | "tnrs", 22 | "tree", 23 | "taxonomy", 24 | "phylogeny" 25 | ], 26 | "dependencies": { 27 | "acorn": "^6.4.1", 28 | "blob-polyfill": "1.x", 29 | "file-saver": "1.3.x", 30 | "jszip": "^3.7.1", 31 | "papaparse": "^5.3.2" 32 | }, 33 | "devDependencies": { 34 | "browserify": "^16.5.1", 35 | "browserify-versionify": "^1.0.4", 36 | "watchify": "^4.0.0" 37 | }, 38 | "engineStrict": false, 39 | "engines": { 40 | "node": ">= 0.12.7", 41 | "npm": ">= 2.11.3" 42 | }, 43 | "preferGlobal": false, 44 | "private": true, 45 | "publishConfig": {}, 46 | "license": "BSD-2-Clause", 47 | "browser": { 48 | "jquery": "./src/jquery-1.8.3.js" 49 | }, 50 | "browserify-shim": { 51 | "jquery": "$" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /less/bootstrap/less/alerts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: 8px 35px 8px 14px; 11 | margin-bottom: @baseLineHeight; 12 | text-shadow: 0 1px 0 rgba(255,255,255,.5); 13 | background-color: @warningBackground; 14 | border: 1px solid @warningBorder; 15 | .border-radius(@baseBorderRadius); 16 | } 17 | .alert, 18 | .alert h4 { 19 | // Specified for the h4 to prevent conflicts of changing @headingsColor 20 | color: @warningText; 21 | } 22 | .alert h4 { 23 | margin: 0; 24 | } 25 | 26 | // Adjust close link position 27 | .alert .close { 28 | position: relative; 29 | top: -2px; 30 | right: -21px; 31 | line-height: @baseLineHeight; 32 | } 33 | 34 | 35 | // Alternate styles 36 | // ------------------------- 37 | 38 | .alert-success { 39 | background-color: @successBackground; 40 | border-color: @successBorder; 41 | color: @successText; 42 | } 43 | .alert-success h4 { 44 | color: @successText; 45 | } 46 | .alert-danger, 47 | .alert-error { 48 | background-color: @errorBackground; 49 | border-color: @errorBorder; 50 | color: @errorText; 51 | } 52 | .alert-danger h4, 53 | .alert-error h4 { 54 | color: @errorText; 55 | } 56 | .alert-info { 57 | background-color: @infoBackground; 58 | border-color: @infoBorder; 59 | color: @infoText; 60 | } 61 | .alert-info h4 { 62 | color: @infoText; 63 | } 64 | 65 | 66 | // Block alerts 67 | // ------------------------- 68 | 69 | .alert-block { 70 | padding-top: 14px; 71 | padding-bottom: 14px; 72 | } 73 | .alert-block > p, 74 | .alert-block > ul { 75 | margin-bottom: 0; 76 | } 77 | .alert-block p + p { 78 | margin-top: 5px; 79 | } 80 | -------------------------------------------------------------------------------- /less/bootstrap/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v2.3.2 3 | * 4 | * Copyright 2012 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 9 | */ 10 | 11 | // Core variables and mixins 12 | @import "variables.less"; // Modify this for custom colors, font-sizes, etc 13 | @import "mixins.less"; 14 | 15 | // CSS Reset 16 | @import "reset.less"; 17 | 18 | // Grid system and page structure 19 | @import "scaffolding.less"; 20 | @import "grid.less"; 21 | @import "layouts.less"; 22 | 23 | // Base CSS 24 | @import "type.less"; 25 | @import "code.less"; 26 | @import "forms.less"; 27 | @import "tables.less"; 28 | 29 | // Components: common 30 | @import "sprites.less"; 31 | @import "dropdowns.less"; 32 | @import "wells.less"; 33 | @import "component-animations.less"; 34 | @import "close.less"; 35 | 36 | // Components: Buttons & Alerts 37 | @import "buttons.less"; 38 | @import "button-groups.less"; 39 | @import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less 40 | 41 | // Components: Nav 42 | @import "navs.less"; 43 | @import "navbar.less"; 44 | @import "breadcrumbs.less"; 45 | @import "pagination.less"; 46 | @import "pager.less"; 47 | 48 | // Components: Popovers 49 | @import "modals.less"; 50 | @import "tooltip.less"; 51 | @import "popovers.less"; 52 | 53 | // Components: Misc 54 | @import "thumbnails.less"; 55 | @import "media.less"; 56 | @import "labels-badges.less"; 57 | @import "progress-bars.less"; 58 | @import "accordion.less"; 59 | @import "carousel.less"; 60 | @import "hero-unit.less"; 61 | 62 | // Utility classes 63 | @import "utilities.less"; // Has to be last to override when necessary 64 | -------------------------------------------------------------------------------- /curator/static/js/tnrs/README.md: -------------------------------------------------------------------------------- 1 | The bulk-TNRS tool is included in the curation app for convenience and re-use 2 | of its main page template, Bootstrap, etc. To manage complexity, the TNRS tool 3 | uses npm and Node modules. 4 | 5 | This directory holds the JS source and dependencies used for bulk TNRS, which 6 | can be managed from the local package.json file. Note that all scripts used 7 | here will be bundled into a single file `tnrs-bundle.js` in the parent 8 | directory. 9 | 10 | NB - Simply merging changes to master will *not* correctly update the active JS 11 | bundle file. Instead, we should rebuild the latest bundle in a feature branch, 12 | then completely replace all related files in master. For example, if changes 13 | were made and tested in `development` branch, commit them there, then... 14 | ```sh 15 | $ git checkout master 16 | $ cd curator/statis/js/tnrs 17 | $ git checkout development package.json 18 | $ git checkout development package-lock.json 19 | $ git checkout development ../tnrs-bundle.js 20 | $ git commit -a 21 | ``` 22 | Further explanation of the git steps here: 23 | https://riptutorial.com/git/example/2895/overwrite-single-file-in-current-working-directory-with-the-same-from-another-branch 24 | 25 | To install all dependencies using npm: 26 | ```sh 27 | $ cd curator/statis/js/tnrs 28 | $ npm install 29 | ``` 30 | 31 | To check for vulnerabilities in the current package specs: 32 | ```sh 33 | $ cd curator/statis/js/tnrs 34 | $ npm audit 35 | ``` 36 | 37 | To update the JS bundle automatically after edits: 38 | ```sh 39 | $ cd curator/statis/js/tnrs 40 | $ npm run watch 41 | ``` 42 | 43 | See other commands in package.json for building leaner production bundle: 44 | ```sh 45 | $ cd curator/statis/js/tnrs 46 | $ npm run build 47 | $ npm run uglify 48 | ``` 49 | -------------------------------------------------------------------------------- /less/bootstrap/less/responsive-utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Responsive: Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // IE10 Metro responsive 7 | // Required for Windows 8 Metro split-screen snapping with IE10 8 | // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ 9 | @-ms-viewport{ 10 | width: device-width; 11 | } 12 | 13 | // Hide from screenreaders and browsers 14 | // Credit: HTML5 Boilerplate 15 | .hidden { 16 | display: none; 17 | visibility: hidden; 18 | } 19 | 20 | // Visibility utilities 21 | 22 | // For desktops 23 | .visible-phone { display: none !important; } 24 | .visible-tablet { display: none !important; } 25 | .hidden-phone { } 26 | .hidden-tablet { } 27 | .hidden-desktop { display: none !important; } 28 | .visible-desktop { display: inherit !important; } 29 | 30 | // Tablets & small desktops only 31 | @media (min-width: 768px) and (max-width: 979px) { 32 | // Hide everything else 33 | .hidden-desktop { display: inherit !important; } 34 | .visible-desktop { display: none !important ; } 35 | // Show 36 | .visible-tablet { display: inherit !important; } 37 | // Hide 38 | .hidden-tablet { display: none !important; } 39 | } 40 | 41 | // Phones only 42 | @media (max-width: 767px) { 43 | // Hide everything else 44 | .hidden-desktop { display: inherit !important; } 45 | .visible-desktop { display: none !important; } 46 | // Show 47 | .visible-phone { display: inherit !important; } // Use inherit to restore previous behavior 48 | // Hide 49 | .hidden-phone { display: none !important; } 50 | } 51 | 52 | // Print utilities 53 | .visible-print { display: none !important; } 54 | .hidden-print { } 55 | 56 | @media print { 57 | .visible-print { display: inherit !important; } 58 | .hidden-print { display: none !important; } 59 | } 60 | -------------------------------------------------------------------------------- /webapp/views/about/materials_and_methods.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | {{import urllib}} 3 | 5 | 6 |
7 |

Materials and methods

8 | 9 |
10 |
11 | 12 |

13 | TODO: What else goes here? Lorem ipsum dolor sit amet, 14 | consectetur adipiscing elit. In bibendum, magna et viverra 15 | tincidunt, nisi leo dapibus massa, sit amet fermentum dui magna a 16 | nunc. Maecenas a ligula libero. Cras id tempus dui. 17 |

18 |

19 | Nam at vehicula augue. Vestibulum varius ligula ante, sit amet 20 | gravida mi semper non. Nunc ornare bibendum ultrices. Ut nec 21 | porttitor enim. Vivamus luctus semper risus, ac imperdiet ante 22 | pulvinar in. 23 |

24 |

25 | Vivamus urna lectus, rutrum nec odio ac, ullamcorper sagittis 26 | dolor. Sed lacinia dolor a mauris mollis cursus. Fusce tristique 27 | dictum luctus. Vestibulum ante ipsum primis in faucibus orci 28 | luctus et ultrices posuere cubilia Curae; Nam arcu nisi, pharetra 29 | at felis et, condimentum bibendum tellus. In vitae ante ut elit 30 | mollis auctor sed a tortor. 31 |

32 |
33 | 34 |
35 | 36 |

Comments

37 | {{=plugin_localcomments(filter='url',url=request.url)}} 38 | 39 |
40 | 41 | 44 | -------------------------------------------------------------------------------- /less/bootstrap/less/tooltip.less: -------------------------------------------------------------------------------- 1 | // 2 | // Tooltips 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .tooltip { 8 | position: absolute; 9 | z-index: @zindexTooltip; 10 | display: block; 11 | visibility: visible; 12 | font-size: 11px; 13 | line-height: 1.4; 14 | .opacity(0); 15 | &.in { .opacity(80); } 16 | &.top { margin-top: -3px; padding: 5px 0; } 17 | &.right { margin-left: 3px; padding: 0 5px; } 18 | &.bottom { margin-top: 3px; padding: 5px 0; } 19 | &.left { margin-left: -3px; padding: 0 5px; } 20 | } 21 | 22 | // Wrapper for the tooltip content 23 | .tooltip-inner { 24 | max-width: 200px; 25 | padding: 8px; 26 | color: @tooltipColor; 27 | text-align: center; 28 | text-decoration: none; 29 | background-color: @tooltipBackground; 30 | .border-radius(@baseBorderRadius); 31 | } 32 | 33 | // Arrows 34 | .tooltip-arrow { 35 | position: absolute; 36 | width: 0; 37 | height: 0; 38 | border-color: transparent; 39 | border-style: solid; 40 | } 41 | .tooltip { 42 | &.top .tooltip-arrow { 43 | bottom: 0; 44 | left: 50%; 45 | margin-left: -@tooltipArrowWidth; 46 | border-width: @tooltipArrowWidth @tooltipArrowWidth 0; 47 | border-top-color: @tooltipArrowColor; 48 | } 49 | &.right .tooltip-arrow { 50 | top: 50%; 51 | left: 0; 52 | margin-top: -@tooltipArrowWidth; 53 | border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0; 54 | border-right-color: @tooltipArrowColor; 55 | } 56 | &.left .tooltip-arrow { 57 | top: 50%; 58 | right: 0; 59 | margin-top: -@tooltipArrowWidth; 60 | border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth; 61 | border-left-color: @tooltipArrowColor; 62 | } 63 | &.bottom .tooltip-arrow { 64 | top: 0; 65 | left: 50%; 66 | margin-left: -@tooltipArrowWidth; 67 | border-width: 0 @tooltipArrowWidth @tooltipArrowWidth; 68 | border-bottom-color: @tooltipArrowColor; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /curator/static/js/bootstrap-transition.js: -------------------------------------------------------------------------------- 1 | /* =================================================== 2 | * bootstrap-transition.js v2.3.2 3 | * http://twitter.github.com/bootstrap/javascript.html#transitions 4 | * =================================================== 5 | * Copyright 2012 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ========================================================== */ 19 | 20 | 21 | !function ($) { 22 | 23 | "use strict"; // jshint ;_; 24 | 25 | 26 | /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) 27 | * ======================================================= */ 28 | 29 | $(function () { 30 | 31 | $.support.transition = (function () { 32 | 33 | var transitionEnd = (function () { 34 | 35 | var el = document.createElement('bootstrap') 36 | , transEndEventNames = { 37 | 'WebkitTransition' : 'webkitTransitionEnd' 38 | , 'MozTransition' : 'transitionend' 39 | , 'OTransition' : 'oTransitionEnd otransitionend' 40 | , 'transition' : 'transitionend' 41 | } 42 | , name 43 | 44 | for (name in transEndEventNames){ 45 | if (el.style[name] !== undefined) { 46 | return transEndEventNames[name] 47 | } 48 | } 49 | 50 | }()) 51 | 52 | return transitionEnd && { 53 | end: transitionEnd 54 | } 55 | 56 | })() 57 | 58 | }) 59 | 60 | }(window.jQuery); -------------------------------------------------------------------------------- /less/bootstrap/js/bootstrap-transition.js: -------------------------------------------------------------------------------- 1 | /* =================================================== 2 | * bootstrap-transition.js v2.3.2 3 | * http://twitter.github.com/bootstrap/javascript.html#transitions 4 | * =================================================== 5 | * Copyright 2012 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ========================================================== */ 19 | 20 | 21 | !function ($) { 22 | 23 | "use strict"; // jshint ;_; 24 | 25 | 26 | /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) 27 | * ======================================================= */ 28 | 29 | $(function () { 30 | 31 | $.support.transition = (function () { 32 | 33 | var transitionEnd = (function () { 34 | 35 | var el = document.createElement('bootstrap') 36 | , transEndEventNames = { 37 | 'WebkitTransition' : 'webkitTransitionEnd' 38 | , 'MozTransition' : 'transitionend' 39 | , 'OTransition' : 'oTransitionEnd otransitionend' 40 | , 'transition' : 'transitionend' 41 | } 42 | , name 43 | 44 | for (name in transEndEventNames){ 45 | if (el.style[name] !== undefined) { 46 | return transEndEventNames[name] 47 | } 48 | } 49 | 50 | }()) 51 | 52 | return transitionEnd && { 53 | end: transitionEnd 54 | } 55 | 56 | })() 57 | 58 | }) 59 | 60 | }(window.jQuery); -------------------------------------------------------------------------------- /webapp/static/js/bootstrap-transition.js: -------------------------------------------------------------------------------- 1 | /* =================================================== 2 | * bootstrap-transition.js v2.3.2 3 | * http://twitter.github.com/bootstrap/javascript.html#transitions 4 | * =================================================== 5 | * Copyright 2012 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ========================================================== */ 19 | 20 | 21 | !function ($) { 22 | 23 | "use strict"; // jshint ;_; 24 | 25 | 26 | /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) 27 | * ======================================================= */ 28 | 29 | $(function () { 30 | 31 | $.support.transition = (function () { 32 | 33 | var transitionEnd = (function () { 34 | 35 | var el = document.createElement('bootstrap') 36 | , transEndEventNames = { 37 | 'WebkitTransition' : 'webkitTransitionEnd' 38 | , 'MozTransition' : 'transitionend' 39 | , 'OTransition' : 'oTransitionEnd otransitionend' 40 | , 'transition' : 'transitionend' 41 | } 42 | , name 43 | 44 | for (name in transEndEventNames){ 45 | if (el.style[name] !== undefined) { 46 | return transEndEventNames[name] 47 | } 48 | } 49 | 50 | }()) 51 | 52 | return transitionEnd && { 53 | end: transitionEnd 54 | } 55 | 56 | })() 57 | 58 | }) 59 | 60 | }(window.jQuery); -------------------------------------------------------------------------------- /webapp/controllers/plugin_tagging.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | db_tag = db.plugin_tagging_tag 4 | db_link = db.plugin_tagging_link 5 | 6 | def index(): 7 | table_name=request.args(0) 8 | record_id=request.args(1) 9 | if not auth.user_id: 10 | return '' 11 | if table_name!='0' and not (table_name in db.tables and record_id): 12 | raise HTTP(404) 13 | form = SQLFORM.factory(Field('tag_name')) 14 | if request.vars.tag_name: 15 | for item in request.vars.tag_name.split(','): 16 | tag_name = re.compile('\s+').sub(' ',item).strip() 17 | if not tag_name[-1:]=='/': tag_name+='/' 18 | tag_exists = tag = db(db_tag.name==tag_name).select().first() 19 | if not tag_exists: 20 | tag = db_tag.insert(name=tag_name, links=1) 21 | link = db(db_link.tag==tag.id)\ 22 | (db_link.table_name==table_name)\ 23 | (db_link.record_id==record_id).select().first() 24 | if not link: 25 | db_link.insert(tag=tag.id, 26 | table_name=table_name,record_id=record_id) 27 | if tag_exists: 28 | tag.update_record(links=tag.links+1) 29 | for key in request.vars: 30 | if key[:6]=='delete': 31 | link_id=key[6:] 32 | link=db_link[link_id] 33 | del db_link[link_id] 34 | db_tag[link.tag] = dict(links=db_tag[link.tag].links-1) 35 | links = db(db_link.table_name==table_name)\ 36 | (db_link.record_id==record_id).select()\ 37 | .sort(lambda row: row.tag.name.upper()) 38 | return dict(links=links, form=form) 39 | 40 | def tag_cloud(): 41 | tags = db(db_tag.links>0).select() 42 | if tags: 43 | mc = max([tag.links for tag in tags]) 44 | return DIV(_class='plugin_tagging_tag_cloud', 45 | *[SPAN(tag.name[:-1]+' ',_style='font-size:%sem' \ 46 | % (0.8+1.0*tag.links/mc)) for tag in tags]) 47 | 48 | -------------------------------------------------------------------------------- /curator/controllers/supporting_files.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ## a simple controller to handle AJAX uploads of study supporting files 4 | ## adapted from http://in10min.blogspot.com/2013/04/web2py-implement-multiple-files-upload.html 5 | 6 | def upload_file(): 7 | """ 8 | File upload handler for the AJAX form of the plugin jquery-file-upload 9 | Return the response in JSON required by the plugin 10 | """ 11 | import os 12 | import json 13 | response.view = 'generic.json' 14 | try: 15 | # Get the file from the form 16 | f = request.vars['files[]'] 17 | 18 | # Store file 19 | id = db.supporting_files.insert(doc = db.supporting_files.doc.store(f.file, f.filename)) 20 | 21 | # Compute size of the file and update the record 22 | record = db.supporting_files[id] 23 | 24 | path_list = [] 25 | path_list.append(request.folder) 26 | path_list.append('uploads') 27 | path_list.append(record['doc']) 28 | size = os.path.getsize(os.path.join(*path_list)) 29 | 30 | File = db(db.supporting_files.id==id).select()[0] 31 | db.supporting_files[id] = dict(file_size=size) 32 | db.supporting_files[id] = dict(study_id=response.study_id) 33 | 34 | res = dict(files=[{"name": str(f.filename), "size": size, "url": URL(f='download', args=[File['doc']]), "delete_url": URL(f='delete_file', args=[File['doc']])}]) 35 | 36 | return json.dumps(res, separators=(',',':')) 37 | 38 | except: 39 | return dict(message=T('Upload error')) 40 | 41 | 42 | def download(): 43 | return response.download(request, db) 44 | # this in turn calls response.stream() for large files 45 | 46 | 47 | def delete_file(): 48 | """ 49 | Delete an uploaded file 50 | """ 51 | response.view = 'generic.json' 52 | try: 53 | name = request.args[0] 54 | db(db.supporting_files.doc==name).delete() 55 | return dict(message=T('File deleted')) 56 | except: 57 | return dict(message=T('Deletion error')) 58 | 59 | -------------------------------------------------------------------------------- /SITE.routes.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # adapted from router.example.py 4 | 5 | # NOTE that a bare-bones parametric router is required here, since we've switched 6 | # to parametric routing for opentree and the two can't be mixed. The change 7 | # was required to support hyphens in proper URLs! 8 | # 9 | # All the important stuff is in the app's router (opentree/webapp/routes.py). 10 | # This is just enough to trigger parametric (vs. pattern-based) routing 11 | # throughout the site. 12 | 13 | routers = dict( 14 | # base router 15 | BASE=dict( 16 | default_application='opentree', 17 | 18 | root_static=[ 19 | # look for these files in the default app's static/ directory 20 | 'favicon.ico', 21 | 'robots.txt', 22 | ], 23 | ), 24 | 25 | # for more routing rules, see routes.py (if any) inside each app's directory 26 | ) 27 | 28 | # error pages (for ALL APPS) 29 | routes_onerror=[ 30 | # ('init/400', '/opentree/default/login'), 31 | # ('curator/*', '/opentree/static/fail.html'), 32 | # ('*/404', '/opentree/static/cantfind.html'), 33 | # ('opentree/*', '/opentree/static/fail.html'), 34 | ('curator/404', '/curator/default/error'), # let other codes "flow through" as ugly-but-accurate responses 35 | # this catch-all captures errors in 'curator', so we need to spell out all apps below :-/ 36 | # ('*/*', '/opentree/default/error'), 37 | ('opentree/*', '/opentree/default/error'), 38 | # this obfuscates error messages from the API 39 | # ('api/*', '/opentree/default/error'), 40 | ('admin/*', '/opentree/default/error'), 41 | ] 42 | 43 | # Specify log level for rewrite's debug logging 44 | # Possible values: debug, info, warning, error, critical (loglevels), 45 | # off, print (print uses print statement rather than logging) 46 | # GAE users may want to use 'off' to suppress routine logging. 47 | # 48 | logging = 'off' 49 | 50 | def __routes_doctest(): 51 | ''' 52 | see router.example.py for example doctests 53 | ''' 54 | pass 55 | 56 | if __name__ == '__main__': 57 | import doctest 58 | doctest.testmod() 59 | -------------------------------------------------------------------------------- /webapp/views/about/developer_resources.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 |
4 |

Developer resources

5 | 6 |
7 |
8 | 9 |

Search all open tree of life sites 10 | 21 | 22 |

23 | 24 |

Links to various resources

25 | 34 | 35 |
36 |
37 | 38 |

Comments

39 | {{=plugin_localcomments(filter='url',url=request.url)}} 40 | 41 |
42 | 43 | 46 | -------------------------------------------------------------------------------- /less/bootstrap/less/labels-badges.less: -------------------------------------------------------------------------------- 1 | // 2 | // Labels and badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base classes 7 | .label, 8 | .badge { 9 | display: inline-block; 10 | padding: 2px 4px; 11 | font-size: @baseFontSize * .846; 12 | font-weight: bold; 13 | line-height: 14px; // ensure proper line-height if floated 14 | color: @white; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | text-shadow: 0 -1px 0 rgba(0,0,0,.25); 18 | background-color: @grayLight; 19 | } 20 | // Set unique padding and border-radii 21 | .label { 22 | .border-radius(3px); 23 | } 24 | .badge { 25 | padding-left: 9px; 26 | padding-right: 9px; 27 | .border-radius(9px); 28 | } 29 | 30 | // Empty labels/badges collapse 31 | .label, 32 | .badge { 33 | &:empty { 34 | display: none; 35 | } 36 | } 37 | 38 | // Hover/focus state, but only for links 39 | a { 40 | &.label:hover, 41 | &.label:focus, 42 | &.badge:hover, 43 | &.badge:focus { 44 | color: @white; 45 | text-decoration: none; 46 | cursor: pointer; 47 | } 48 | } 49 | 50 | // Colors 51 | // Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute) 52 | .label, 53 | .badge { 54 | // Important (red) 55 | &-important { background-color: @errorText; } 56 | &-important[href] { background-color: darken(@errorText, 10%); } 57 | // Warnings (orange) 58 | &-warning { background-color: @orange; } 59 | &-warning[href] { background-color: darken(@orange, 10%); } 60 | // Success (green) 61 | &-success { background-color: @successText; } 62 | &-success[href] { background-color: darken(@successText, 10%); } 63 | // Info (turquoise) 64 | &-info { background-color: @infoText; } 65 | &-info[href] { background-color: darken(@infoText, 10%); } 66 | // Inverse (black) 67 | &-inverse { background-color: @grayDark; } 68 | &-inverse[href] { background-color: darken(@grayDark, 10%); } 69 | } 70 | 71 | // Quick fix for labels/badges in buttons 72 | .btn { 73 | .label, 74 | .badge { 75 | position: relative; 76 | top: -1px; 77 | } 78 | } 79 | .btn-mini { 80 | .label, 81 | .badge { 82 | top: 0; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /curator/static/js/html5shiv.js: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Shiv v3.6.2pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); 5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",version:"3.6.2pre",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); 8 | for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;darticle,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",version:"3.6.2pre",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); 8 | for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d 2 | 3 | 4 | Bootstrap Plugin Test Suite 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
49 |

Bootstrap Plugin Test Suite

50 |

51 |

52 |
    53 |
    54 |
    55 | 56 | -------------------------------------------------------------------------------- /less/bootstrap/js/tests/unit/bootstrap-alert.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("bootstrap-alerts") 4 | 5 | test("should provide no conflict", function () { 6 | var alert = $.fn.alert.noConflict() 7 | ok(!$.fn.alert, 'alert was set back to undefined (org value)') 8 | $.fn.alert = alert 9 | }) 10 | 11 | test("should be defined on jquery object", function () { 12 | ok($(document.body).alert, 'alert method is defined') 13 | }) 14 | 15 | test("should return element", function () { 16 | ok($(document.body).alert()[0] == document.body, 'document.body returned') 17 | }) 18 | 19 | test("should fade element out on clicking .close", function () { 20 | var alertHTML = '
    ' 21 | + '×' 22 | + '

    Holy guacamole! Best check yo self, you\'re not looking too good.

    ' 23 | + '
    ' 24 | , alert = $(alertHTML).alert() 25 | 26 | alert.find('.close').click() 27 | 28 | ok(!alert.hasClass('in'), 'remove .in class on .close click') 29 | }) 30 | 31 | test("should remove element when clicking .close", function () { 32 | $.support.transition = false 33 | 34 | var alertHTML = '
    ' 35 | + '×' 36 | + '

    Holy guacamole! Best check yo self, you\'re not looking too good.

    ' 37 | + '
    ' 38 | , alert = $(alertHTML).appendTo('#qunit-fixture').alert() 39 | 40 | ok($('#qunit-fixture').find('.alert-message').length, 'element added to dom') 41 | 42 | alert.find('.close').click() 43 | 44 | ok(!$('#qunit-fixture').find('.alert-message').length, 'element removed from dom') 45 | }) 46 | 47 | test("should not fire closed when close is prevented", function () { 48 | $.support.transition = false 49 | stop(); 50 | $('
    ') 51 | .bind('close', function (e) { 52 | e.preventDefault(); 53 | ok(true); 54 | start(); 55 | }) 56 | .bind('closed', function () { 57 | ok(false); 58 | }) 59 | .alert('close') 60 | }) 61 | 62 | }) -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/cors/postmessage.html: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | 17 | jQuery File Upload Plugin postMessage API 18 | 19 | 20 | 21 | 74 | 75 | -------------------------------------------------------------------------------- /less/bootstrap/less/modals.less: -------------------------------------------------------------------------------- 1 | // 2 | // Modals 3 | // -------------------------------------------------- 4 | 5 | // Background 6 | .modal-backdrop { 7 | position: fixed; 8 | top: 0; 9 | right: 0; 10 | bottom: 0; 11 | left: 0; 12 | z-index: @zindexModalBackdrop; 13 | background-color: @black; 14 | // Fade for backdrop 15 | &.fade { opacity: 0; } 16 | } 17 | 18 | .modal-backdrop, 19 | .modal-backdrop.fade.in { 20 | .opacity(80); 21 | } 22 | 23 | // Base modal 24 | .modal { 25 | position: fixed; 26 | top: 10%; 27 | left: 50%; 28 | z-index: @zindexModal; 29 | width: 560px; 30 | margin-left: -280px; 31 | background-color: @white; 32 | border: 1px solid #999; 33 | border: 1px solid rgba(0,0,0,.3); 34 | *border: 1px solid #999; /* IE6-7 */ 35 | .border-radius(6px); 36 | .box-shadow(0 3px 7px rgba(0,0,0,0.3)); 37 | .background-clip(padding-box); 38 | // Remove focus outline from opened modal 39 | outline: none; 40 | 41 | &.fade { 42 | .transition(e('opacity .3s linear, top .3s ease-out')); 43 | top: -25%; 44 | } 45 | &.fade.in { top: 10%; } 46 | } 47 | .modal-header { 48 | padding: 9px 15px; 49 | border-bottom: 1px solid #eee; 50 | // Close icon 51 | .close { margin-top: 2px; } 52 | // Heading 53 | h3 { 54 | margin: 0; 55 | line-height: 30px; 56 | } 57 | } 58 | 59 | // Body (where all modal content resides) 60 | .modal-body { 61 | position: relative; 62 | overflow-y: auto; 63 | max-height: 400px; 64 | padding: 15px; 65 | } 66 | // Remove bottom margin if need be 67 | .modal-form { 68 | margin-bottom: 0; 69 | } 70 | 71 | // Footer (for actions) 72 | .modal-footer { 73 | padding: 14px 15px 15px; 74 | margin-bottom: 0; 75 | text-align: right; // right align buttons 76 | background-color: #f5f5f5; 77 | border-top: 1px solid #ddd; 78 | .border-radius(0 0 6px 6px); 79 | .box-shadow(inset 0 1px 0 @white); 80 | .clearfix(); // clear it in case folks use .pull-* classes on buttons 81 | 82 | // Properly space out buttons 83 | .btn + .btn { 84 | margin-left: 5px; 85 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs 86 | } 87 | // but override that for button groups 88 | .btn-group .btn + .btn { 89 | margin-left: -1px; 90 | } 91 | // and override it for block buttons as well 92 | .btn-block + .btn-block { 93 | margin-left: 0; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /less/bootstrap/js/tests/phantom.js: -------------------------------------------------------------------------------- 1 | // Simple phantom.js integration script 2 | // Adapted from Modernizr 3 | 4 | function waitFor(testFx, onReady, timeOutMillis) { 5 | var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 5001 //< Default Max Timout is 5s 6 | , start = new Date().getTime() 7 | , condition = false 8 | , interval = setInterval(function () { 9 | if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) { 10 | // If not time-out yet and condition not yet fulfilled 11 | condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()) //< defensive code 12 | } else { 13 | if (!condition) { 14 | // If condition still not fulfilled (timeout but condition is 'false') 15 | console.log("'waitFor()' timeout") 16 | phantom.exit(1) 17 | } else { 18 | // Condition fulfilled (timeout and/or condition is 'true') 19 | typeof(onReady) === "string" ? eval(onReady) : onReady() //< Do what it's supposed to do once the condition is fulfilled 20 | clearInterval(interval) //< Stop this interval 21 | } 22 | } 23 | }, 100) //< repeat check every 100ms 24 | } 25 | 26 | 27 | if (phantom.args.length === 0 || phantom.args.length > 2) { 28 | console.log('Usage: phantom.js URL') 29 | phantom.exit() 30 | } 31 | 32 | var page = new WebPage() 33 | 34 | // Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this") 35 | page.onConsoleMessage = function(msg) { 36 | console.log(msg) 37 | }; 38 | 39 | page.open(phantom.args[0], function(status){ 40 | if (status !== "success") { 41 | console.log("Unable to access network") 42 | phantom.exit() 43 | } else { 44 | waitFor(function(){ 45 | return page.evaluate(function(){ 46 | var el = document.getElementById('qunit-testresult') 47 | if (el && el.innerText.match('completed')) { 48 | return true 49 | } 50 | return false 51 | }) 52 | }, function(){ 53 | var failedNum = page.evaluate(function(){ 54 | var el = document.getElementById('qunit-testresult') 55 | try { 56 | return el.getElementsByClassName('failed')[0].innerHTML 57 | } catch (e) { } 58 | return 10000 59 | }); 60 | phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0) 61 | }) 62 | } 63 | }) -------------------------------------------------------------------------------- /webapp/views/about/the_synthetic_tree.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 |
    4 |

    About the synthetic tree

    5 | 6 |
    7 |
    8 |

    9 | TODO: What else goes here? Lorem ipsum dolor sit amet, 10 | consectetur adipiscing elit. In bibendum, magna et viverra 11 | tincidunt, nisi leo dapibus massa, sit amet fermentum dui magna a 12 | nunc. Maecenas a ligula libero. Cras id tempus dui. 13 |

    14 |

    15 | Vivamus urna lectus, rutrum nec odio ac, ullamcorper sagittis 16 | dolor. Sed lacinia dolor a mauris mollis cursus. Fusce tristique 17 | dictum luctus. Vestibulum ante ipsum primis in faucibus orci 18 | luctus et ultrices posuere cubilia Curae; Nam arcu nisi, pharetra 19 | at felis et, condimentum bibendum tellus. In vitae ante ut elit 20 | mollis auctor sed a tortor. 21 |

    22 |

    23 | Ut magna dolor, ultricies nec leo sed, tempor iaculis orci. 24 | Integer dignissim odio nec odio imperdiet, ac ultrices sapien 25 | tristique. In a urna ut eros hendrerit fringilla nec ut ligula. 26 | Sed pulvinar sem vel turpis dapibus mattis. Etiam pretium nibh 27 | quis turpis vulputate suscipit. Suspendisse consequat, dolor 28 | vitae aliquet rhoncus, ipsum nisi tincidunt odio, non pretium 29 | felis erat nec elit. Nullam quis mi lobortis orci volutpat 30 | commodo in iaculis nulla. Mauris sit amet ante quis lectus 31 | vestibulum varius sed vel nisi. 32 |

    33 |

    34 | Nam at vehicula augue. Vestibulum varius ligula ante, sit amet 35 | gravida mi semper non. Nunc ornare bibendum ultrices. Ut nec 36 | porttitor enim. Vivamus luctus semper risus, ac imperdiet ante 37 | pulvinar in. 38 |

    39 |
    40 |
    41 | 42 |

    Comments

    43 | {{=plugin_localcomments(filter='url',url=request.url)}} 44 | 45 |
    46 | 47 | 50 | -------------------------------------------------------------------------------- /webapp/views/about/the_source_tree_manager.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 |
    4 |

    About Phylografter, the source tree manager

    5 | 6 |
    7 |
    8 |

    9 | TODO: What else goes here? Lorem ipsum dolor sit amet, 10 | consectetur adipiscing elit. In bibendum, magna et viverra 11 | tincidunt, nisi leo dapibus massa, sit amet fermentum dui magna a 12 | nunc. Maecenas a ligula libero. Cras id tempus dui. 13 |

    14 |

    15 | Vivamus urna lectus, rutrum nec odio ac, ullamcorper sagittis 16 | dolor. Sed lacinia dolor a mauris mollis cursus. Fusce tristique 17 | dictum luctus. Vestibulum ante ipsum primis in faucibus orci 18 | luctus et ultrices posuere cubilia Curae; Nam arcu nisi, pharetra 19 | at felis et, condimentum bibendum tellus. In vitae ante ut elit 20 | mollis auctor sed a tortor. 21 |

    22 |

    23 | Ut magna dolor, ultricies nec leo sed, tempor iaculis orci. 24 | Integer dignissim odio nec odio imperdiet, ac ultrices sapien 25 | tristique. In a urna ut eros hendrerit fringilla nec ut ligula. 26 | Sed pulvinar sem vel turpis dapibus mattis. Etiam pretium nibh 27 | quis turpis vulputate suscipit. Suspendisse consequat, dolor 28 | vitae aliquet rhoncus, ipsum nisi tincidunt odio, non pretium 29 | felis erat nec elit. Nullam quis mi lobortis orci volutpat 30 | commodo in iaculis nulla. Mauris sit amet ante quis lectus 31 | vestibulum varius sed vel nisi. 32 |

    33 |

    34 | Nam at vehicula augue. Vestibulum varius ligula ante, sit amet 35 | gravida mi semper non. Nunc ornare bibendum ultrices. Ut nec 36 | porttitor enim. Vivamus luctus semper risus, ac imperdiet ante 37 | pulvinar in. 38 |

    39 |
    40 |
    41 | 42 |

    Comments

    43 | {{=plugin_localcomments(filter='url',url=request.url)}} 44 | 45 |
    46 | 47 | 50 | -------------------------------------------------------------------------------- /webapp/views/synthview/index.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 |

    Pre DB p element

    4 |
    5 |

    Post DB p element

    6 | 7 |
    8 | 57 |
    58 |
    59 |
    60 |
    61 |
    62 | 63 | 64 | 89 | -------------------------------------------------------------------------------- /webapp/views/treeview/index.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 |

    Pre vars dump

    3 |

    {{=default_apis}}

    4 |

    Post vars dump

    5 | 6 |

    Pre DB p element

    7 |
    8 |

    Post DB p element

    9 | 10 |
    11 | 60 |
    61 |
    62 |
    63 |
    64 |
    65 | 66 | 67 | 91 | -------------------------------------------------------------------------------- /curator/static/jQuery-File-Upload-9.5.2/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blueimp-file-upload", 3 | "version": "9.5.2", 4 | "title": "jQuery File Upload", 5 | "description": "File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.", 6 | "keywords": [ 7 | "jquery", 8 | "file", 9 | "upload", 10 | "widget", 11 | "multiple", 12 | "selection", 13 | "drag", 14 | "drop", 15 | "progress", 16 | "preview", 17 | "cross-domain", 18 | "cross-site", 19 | "chunk", 20 | "resume", 21 | "gae", 22 | "go", 23 | "python", 24 | "php", 25 | "bootstrap" 26 | ], 27 | "homepage": "https://github.com/blueimp/jQuery-File-Upload", 28 | "author": { 29 | "name": "Sebastian Tschan", 30 | "url": "https://blueimp.net" 31 | }, 32 | "maintainers": [ 33 | { 34 | "name": "Sebastian Tschan", 35 | "url": "https://blueimp.net" 36 | } 37 | ], 38 | "repository": { 39 | "type": "git", 40 | "url": "git://github.com/blueimp/jQuery-File-Upload.git" 41 | }, 42 | "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues", 43 | "licenses": [ 44 | { 45 | "type": "MIT", 46 | "url": "http://www.opensource.org/licenses/MIT" 47 | } 48 | ], 49 | "dependencies": { 50 | "jquery": ">=1.6", 51 | "blueimp-tmpl": ">=2.5.3", 52 | "blueimp-load-image": ">=1.11.0", 53 | "blueimp-canvas-to-blob": ">=2.1.0" 54 | }, 55 | "main": [ 56 | "css/jquery.fileupload.css", 57 | "css/jquery.fileupload-ui.css", 58 | "css/jquery.fileupload-noscript.css", 59 | "css/jquery.fileupload-ui-noscript.css", 60 | "js/cors/jquery.postmessage-transport.js", 61 | "js/cors/jquery.xdr-transport.js", 62 | "js/vendor/jquery.ui.widget.js", 63 | "js/jquery.fileupload.js", 64 | "js/jquery.fileupload-process.js", 65 | "js/jquery.fileupload-validate.js", 66 | "js/jquery.fileupload-image.js", 67 | "js/jquery.fileupload-audio.js", 68 | "js/jquery.fileupload-video.js", 69 | "js/jquery.fileupload-ui.js", 70 | "js/jquery.fileupload-jquery-ui.js", 71 | "js/jquery.fileupload-angular.js", 72 | "js/jquery.iframe-transport.js" 73 | ], 74 | "ignore": [ 75 | "/*.*", 76 | "/cors", 77 | "css/demo-ie8.css", 78 | "css/demo.css", 79 | "css/style.css", 80 | "js/app.js", 81 | "js/main.js", 82 | "server", 83 | "test" 84 | ] 85 | } 86 | -------------------------------------------------------------------------------- /less/bootstrap/less/tests/forms-responsive.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Bootstrap, from Twitter 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 19 | 20 | 21 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
    36 | 37 | 40 | 41 |

    Vertical alignment

    42 | 43 | 44 | span1 45 | 46 |

    Width across elements

    47 |
    48 | 49 |
    50 |
    51 | 52 |
    53 |
    54 | span2 55 |
    56 | 57 | 58 | 61 | 62 |
    63 | 64 | 65 | span1 66 |
    67 | 68 |
    69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /curator/static/js/knockout-bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! knockout-bootstrap version: 0.2.1 2 | * 2013-07-13 3 | * Author: Bill Pullen 4 | * Website: http://billpull.github.com/knockout-bootstrap 5 | * MIT License http://www.opensource.org/licenses/mit-license.php 6 | */ 7 | function s4(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}function guid(){return s4()+s4()+"-"+s4()+"-"+s4()+"-"+s4()+"-"+s4()+s4()+s4()}(function(t){t.fn.outerHtml=function(){if(0==this.length)return!1;var e=this[0],o=e.tagName.toLowerCase();if(e.outerHTML)return e.outerHTML;var n=t.map(e.attributes,function(t){return t.name+'="'+t.value+'"'});return"<"+o+(n.length>0?" "+n.join(" "):"")+">"+e.innerHTML+""}})(jQuery),ko.bindingHandlers.typeahead={init:function(t,e,o){var n=$(t),i=o(),r=ko.utils.unwrapObservable(e());n.attr("autocomplete","off").typeahead({source:r,minLength:i.minLength,items:i.items,updater:i.updater})}},ko.bindingHandlers.progress={init:function(t,e,o,n){var i=$(t),r=$("
    ",{"class":"bar","data-bind":"style: { width:"+e()+" }"});i.attr("id",guid()).addClass("progress progress-info").append(r),ko.applyBindingsToDescendants(n,i[0])}},ko.bindingHandlers.alert={init:function(t,e){var o=$(t),n=ko.utils.unwrapObservable(e()),i=$("