diff --git a/LICENSE.txt b/LICENSE.txt
index 69978e57efb..23e45c00eae 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -17,4 +17,9 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Some icons found in Galaxy are from the Silk Icons set, available under
+the Creative Commons Attribution 2.5 License, from:
+
+http://www.famfamfam.com/lab/icons/silk/
diff --git a/datatypes_conf.xml.sample b/datatypes_conf.xml.sample
index 7db33f2e7d7..23974aab8b6 100644
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -140,6 +140,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
both are always True (is sqlite actually storing a string here, which is always true when not empty?)
+ except sqlalchemy.exceptions.OperationalError, e:
+ print_warning( "adding column 'deleted' failed: %s" % ( e ) )
+ try:
+ app.model.session.execute( "ALTER TABLE 'galaxy_user' ADD COLUMN 'purged' BOOLEAN default 0" )
+ except sqlalchemy.exceptions.OperationalError, e:
+ print_warning( "adding column 'purged' failed: %s" % ( e ) )
+ else:
+ try:
+ app.model.session.execute( "ALTER TABLE galaxy_user ADD COLUMN deleted BOOLEAN default false" )
+ except ( sqlalchemy.exceptions.ProgrammingError, sqlalchemy.exceptions.OperationalError ), e: #Postgres and MySQL raise different Exceptions for this same failure.
+ print_warning( "adding column 'deleted' failed: %s" % ( e ) )
+ try:
+ app.model.session.execute( "ALTER TABLE galaxy_user ADD COLUMN purged BOOLEAN default false" )
+ except ( sqlalchemy.exceptions.ProgrammingError, sqlalchemy.exceptions.OperationalError ), e:
+ print_warning( "adding column 'purged' failed: %s" % ( e ) )
+
+ #these alters are the same, regardless if we are using sqlite
+ #hda table
+ try:
+ app.model.session.execute( "ALTER TABLE history_dataset_association ADD COLUMN copied_from_library_folder_dataset_association_id INTEGER" )
+ except ( sqlalchemy.exceptions.ProgrammingError, sqlalchemy.exceptions.OperationalError ), e:
+ print_warning( "adding column 'copied_from_library_folder_dataset_association_id' failed: %s" % ( e ) )
+
+ #MetadataFile table
+ try:
+ app.model.session.execute( "ALTER TABLE metadata_file ADD COLUMN lda_id INTEGER" )
+ except ( sqlalchemy.exceptions.ProgrammingError, sqlalchemy.exceptions.OperationalError ), e:
+ print_warning( "adding column 'lda_id' failed: %s" % ( e ) )
+
+
+ #now create indexes for new columns in user and metadata file tables
+ try:
+ i = sqlalchemy.Index( 'ix_galaxy_user_deleted', app.model.User.table.c.deleted )
+ i.create()
+ except Exception, e:
+ print_warning( "Adding index failed: %s" % ( e ) )
+ try:
+ i = sqlalchemy.Index( 'ix_galaxy_user_purged', app.model.User.table.c.purged )
+ i.create()
+ except Exception, e:
+ print_warning( "Adding index failed: %s" % ( e ) )
+ try:
+ i = sqlalchemy.Index( 'ix_metadata_file_lda_id', app.model.MetadataFile.table.c.lda_id )
+ i.create()
+ except Exception, e:
+ print_warning( "Adding index failed: %s" % ( e ) )
+
+
+ #Now we shutdown the app
+ app.shutdown()
+ del app
+ print
+ print "Columns added to tables, restarting app, with database_create_tables=True"
+
+ #We restart the app, this time with create_tables == True
+ configuration['database_create_tables'] = True
+ app = galaxy.app.UniverseApplication( global_conf = ini_file, **configuration )
+
+ ##Now we add foreign key constraints as necessary for columns added above
+ print "Adding foreign key constraints"
+ if dialect != "sqlite":
+ try:
+ app.model.session.execute( "ALTER TABLE history_dataset_association ADD FOREIGN KEY (copied_from_library_folder_dataset_association_id) REFERENCES library_folder_dataset_association(id)" )
+ except Exception, e:
+ print_warning( "Adding foreign key constraint to table has failed for an unknown reason: %s" % ( e ) )
+ try:
+ app.model.session.execute( "ALTER TABLE metadata_file ADD FOREIGN KEY (lda_id) REFERENCES library_folder_dataset_association(id)" )
+ except Exception, e:
+ print_warning( "Adding foreign key constraint to table has failed for an unknown reason: %s" % ( e ) )
+
+ else:
+ #Can't do this in SQLite
+ #SQLite ignores (but parses on initial table creation) foreign key constraints anyway, see: http://www.sqlite.org/omitted.html (there is someway to set up behavior using triggers)
+ print_warning( "Adding foreign key constraints to table is not supported in SQLite." )
+
+ #create default permisions for users, histories, etc
+ print "creating private roles and setting defaults for existing users and their histories and datasets"
+
+ #Setup each user with a private role and then set their default permisions and set permisions on existing histories and datasets
+ for user in app.model.User.query().all():
+ print "Setting up user: %s." % user.email
+ if not app.model.security_agent.get_private_user_role( user ):
+ app.model.security_agent.create_private_user_role( user )
+ else:
+ print_warning( "user (%s) already has a private role, (re)setting defaults anyway" % ( user.email ) )
+ #set default permissions and permissions on existing items
+ #we will do this even if a role for the user already exists (slower, but safer)
+ app.model.security_agent.user_set_default_permissions( user, history=True, dataset=True, bypass_manage_permission=True )
+
+ app.model.flush()
+
+ app.shutdown()
+ print
+ print "Update finished, please review output for warnings and errors."
+ empty_xml.close() #close tempfile, it will automatically be deleted off system
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/update_database/update_database_with_security_libraries.sh b/scripts/update_database/update_database_with_security_libraries.sh
new file mode 100644
index 00000000000..65013437651
--- /dev/null
+++ b/scripts/update_database/update_database_with_security_libraries.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+# This script must be executed from the $UNIVERSE_HOME directory
+# e.g., sh ./scripts/update_database/update_database_with_security_libraries.sh
+
+. ./scripts/get_python.sh
+. ./setup_paths.sh
+
+$GALAXY_PYTHON ./scripts/update_database/update_database_with_security_libraries.py ./universe_wsgi.ini $@
diff --git a/static/images/silk/book.png b/static/images/silk/book.png
new file mode 100644
index 00000000000..b0f4dd7928c
Binary files /dev/null and b/static/images/silk/book.png differ
diff --git a/static/images/silk/book_open.png b/static/images/silk/book_open.png
new file mode 100644
index 00000000000..7d863f94974
Binary files /dev/null and b/static/images/silk/book_open.png differ
diff --git a/static/images/silk/folder.png b/static/images/silk/folder.png
new file mode 100644
index 00000000000..784e8fa4823
Binary files /dev/null and b/static/images/silk/folder.png differ
diff --git a/static/images/silk/folder_page.png b/static/images/silk/folder_page.png
new file mode 100644
index 00000000000..1ef6e11438f
Binary files /dev/null and b/static/images/silk/folder_page.png differ
diff --git a/static/images/silk/resultset_bottom.png b/static/images/silk/resultset_bottom.png
new file mode 100644
index 00000000000..22848b0061c
Binary files /dev/null and b/static/images/silk/resultset_bottom.png differ
diff --git a/static/images/silk/resultset_next.png b/static/images/silk/resultset_next.png
new file mode 100644
index 00000000000..e252606d3e6
Binary files /dev/null and b/static/images/silk/resultset_next.png differ
diff --git a/static/images/welcomePhoto.jpg b/static/images/welcomePhoto.jpg
index 91abdf31496..33fc6a470df 100644
Binary files a/static/images/welcomePhoto.jpg and b/static/images/welcomePhoto.jpg differ
diff --git a/static/june_2007_style/base.css.tmpl b/static/june_2007_style/base.css.tmpl
index a8fba0e69c0..28a0f87f546 100644
--- a/static/june_2007_style/base.css.tmpl
+++ b/static/june_2007_style/base.css.tmpl
@@ -283,6 +283,11 @@ table.colored tr
background: $table_row_bg;
}
+table.colored tr.odd_row
+{
+ background: $odd_row_bg;
+}
+
div.debug
{
margin: 10px;
@@ -350,6 +355,16 @@ ul.toolParameterExpandableCollapsable
list-style: none;
}
+ul.manage-table-actions {
+ float: right;
+ margin-top: -2.5em;
+}
+ul.manage-table-actions li {
+ display: block;
+ float: left;
+ margin-left: 0.5em;
+}
+
.action-button {
background: #eeeeee;
color: #333;
@@ -416,4 +431,8 @@ div.popupmenu-item:hover {
.popup-arrow:hover {
color: black;
-}
\ No newline at end of file
+}
+
+div.permissionContainer {
+ padding-left: 20px;
+}
diff --git a/static/june_2007_style/blue/base.css b/static/june_2007_style/blue/base.css
index 4de4530b076..74a7b7c68ec 100644
--- a/static/june_2007_style/blue/base.css
+++ b/static/june_2007_style/blue/base.css
@@ -16,6 +16,7 @@ img
border: 0;
}
+
a:link, a:visited, a:active
{
color: #303030;
@@ -282,6 +283,11 @@ table.colored tr
background: white;
}
+table.colored tr.odd_row
+{
+ background: #DADFEF;
+}
+
div.debug
{
margin: 10px;
@@ -293,7 +299,7 @@ div.debug
div.odd_row
{
- background: #FFFF99;
+ background: #DADFEF;
}
#footer {
@@ -348,6 +354,16 @@ ul.toolParameterExpandableCollapsable
list-style: none;
}
+ul.manage-table-actions {
+ float: right;
+ margin-top: -2.5em;
+}
+ul.manage-table-actions li {
+ display: block;
+ float: left;
+ margin-left: 0.5em;
+}
+
.action-button {
background: #eeeeee;
color: #333;
@@ -414,4 +430,8 @@ div.popupmenu-item:hover {
.popup-arrow:hover {
color: black;
-}
\ No newline at end of file
+}
+
+div.permissionContainer {
+ padding-left: 20px;
+}
diff --git a/static/june_2007_style/blue/history.css b/static/june_2007_style/blue/history.css
index 3a2243bf20d..1dd55a464cd 100644
--- a/static/june_2007_style/blue/history.css
+++ b/static/june_2007_style/blue/history.css
@@ -80,6 +80,13 @@ div.historyItem-running
*/
}
+div.historyItem-noPermission
+{
+ filter: alpha(opacity=60);
+ -moz-opacity: .60;
+ opacity: .60;
+}
+
div.historyItem-queued
{
}
@@ -101,4 +108,4 @@ pre.peek th
{
color: white;
background: #023858;
-}
\ No newline at end of file
+}
diff --git a/static/june_2007_style/blue/library.css b/static/june_2007_style/blue/library.css
new file mode 100644
index 00000000000..76f589af067
--- /dev/null
+++ b/static/june_2007_style/blue/library.css
@@ -0,0 +1,65 @@
+.libraryRow {
+ background-color: #d2c099;
+}
+
+.datasetHighlighted {
+ background-color: #C1C9E5;
+}
+
+div.historyItemBody {
+ padding: 4px 4px 2px 4px;
+}
+
+li.folderRow,
+li.datasetRow
+{
+ border-top: solid 1px #ddd;
+}
+
+li.folderRow:hover,
+li.datasetRow:hover
+{
+ background-color: #C1C9E5;
+}
+
+img.expanderIcon {
+ padding-right: 4px;
+}
+
+input.datasetCheckbox,
+li, ul
+{
+ padding: 0;
+ margin: 0;
+}
+
+.rowTitle
+{
+ padding: 2px;
+}
+
+ul {
+ list-style: none;
+}
+
+.libraryTitle th {
+ text-align: left;
+}
+
+pre.peek
+{
+ background: white;
+ color: black;
+ width: 100%;
+ overflow: auto;
+}
+
+pre.peek th
+{
+ color: white;
+ background: #023858;
+}
+
+a.expandLink {
+ text-decoration: none;
+}
diff --git a/static/june_2007_style/blue/masthead.css b/static/june_2007_style/blue/masthead.css
index f206e7f1b44..b89faddb0a8 100644
--- a/static/june_2007_style/blue/masthead.css
+++ b/static/june_2007_style/blue/masthead.css
@@ -7,6 +7,7 @@ body
margin: 3px;
margin-right: 5px;
margin-left: 5px;
+ overflow: hidden;
}
div.pageTitle
@@ -24,3 +25,38 @@ a:link, a:visited, a:active
{
color: #eeeeee;
}
+
+#tab-bar-bottom
+{
+ z-index: -1;
+ position:absolute;
+ top:27px; left: 0;
+ width: 100%;
+ height: 100%;
+ background: #222532;
+}
+
+span.link-group
+{
+ margin: 0;
+ padding: 0;
+ display: inline;
+ padding-bottom: 10px;
+ margin-bottom: -10px;
+}
+
+span.link-group span
+{
+ margin: 0;
+ padding: 0;
+ display: inline;
+}
+
+span.link-group span.active-link
+{
+ background: #222532;
+ padding-left: 3px; padding-right: 3px;
+ margin-left: -3px; margin-right: -3px;
+ padding-bottom: 10px;
+ margin-bottom: -10px;
+}
\ No newline at end of file
diff --git a/static/june_2007_style/blue/panel_layout.css b/static/june_2007_style/blue/panel_layout.css
index b7ec445bc43..7dda79706a8 100644
--- a/static/june_2007_style/blue/panel_layout.css
+++ b/static/june_2007_style/blue/panel_layout.css
@@ -45,6 +45,19 @@ body
font-weight: bold;
}
+#messagebox
+{
+ position:absolute;
+ top:33px;
+ left:0;
+ width:100%;
+ height:24px !important;
+ overflow: hidden;
+ border-bottom: solid #999 1px;
+ font-size: 90%;
+}
+
+
#left, #left-border, #center, #right-border, #right
{
position: absolute;
@@ -146,7 +159,6 @@ table.column-layout
.unified-panel-header {
height: 2em;
- overflow: hidden;
z-index: 1000;
background: #cccccc;
background-image: url(panel_header_bg.png);
@@ -160,18 +172,17 @@ table.column-layout
color: #333;
font-weight: bold;
}
-
+
.unified-panel-header-inner {
padding-top: 0.45em;
}
-
+
.menu-bg {
background: #C1C9E5 url(menu_bg.png) top repeat-x;
}
div.unified-panel-body {
position: absolute;
- z-index: 1;
top: 2em;
bottom: 0;
width: 100%;
@@ -197,6 +208,7 @@ div.unified-panel-body {
color: black;
background: #aaaaaa;
}
+
.panel-header-button:active {
color: white;
background: #aaaaaa;
@@ -240,7 +252,7 @@ div.popupmenu-item:hover {
}
#overlay {
- position: absolute;
+ position: fixed;
top: 0; left: 0; width: 100%; height: 100%;
z-index: 20000;
}
@@ -271,6 +283,34 @@ div.popupmenu-item:hover {
padding: 5px;
}
-.dialog-box body {
- overflow: scroll;
+
+.panel-error-message, .panel-warning-message, .panel-done-message, .panel-info-message
+{
+ height: 24px;
+ line-height: 24px;
+ color: #303030;
+ padding: 0px;
+ padding-left: 26px;
+ background-color: #FFCCCC;
+ background-image: url(error_small.png);
+ background-repeat: no-repeat;
+ background-position: 6px 50%;
+}
+
+.panel-warning-message
+{
+ background-image: url(warn_small.png);
+ background-color: #FFFFCC;
+}
+
+.panel-done-message
+{
+ background-image: url(done_small.png);
+ background-color: #CCFFCC;
+}
+
+.panel-info-message
+{
+ background-image: url(info_small.png);
+ background-color: #CCCCFF;
}
\ No newline at end of file
diff --git a/static/june_2007_style/blue_colors.ini b/static/june_2007_style/blue_colors.ini
index 447ca3f98bc..5b9f320b296 100644
--- a/static/june_2007_style/blue_colors.ini
+++ b/static/june_2007_style/blue_colors.ini
@@ -15,7 +15,7 @@ form_border=#d8b365
#form_body_bg=#FFFFFF
form_body_bg_top=#FFFFFF
form_body_bg_bottom=#FFFFFF
-odd_row_bg=#FFFF99
+odd_row_bg=#DADFEF
# Messages
error_message_border=#AA6666
error_message_bg=#FFCCCC
@@ -48,6 +48,7 @@ masthead_bg=#2C3143
masthead_text=#eeeeee
masthead_bg_hatch=-
masthead_link=#eeeeee
+masthead_active_tab_bg=#222532
# ---- Layout -----------------------------------------------------------------
# Overall background color (including space between panels)
layout_bg=#eee
diff --git a/static/june_2007_style/history.css.tmpl b/static/june_2007_style/history.css.tmpl
index 30c285b20fb..362cc3a3b23 100644
--- a/static/june_2007_style/history.css.tmpl
+++ b/static/june_2007_style/history.css.tmpl
@@ -80,6 +80,13 @@ div.historyItem-running
*/
}
+div.historyItem-noPermission
+{
+ filter: alpha(opacity=60);
+ -moz-opacity: .60;
+ opacity: .60;
+}
+
div.historyItem-queued
{
}
@@ -101,4 +108,4 @@ pre.peek th
{
color: white;
background: $peek_table_header;
-}
\ No newline at end of file
+}
diff --git a/static/june_2007_style/library.css.tmpl b/static/june_2007_style/library.css.tmpl
new file mode 100644
index 00000000000..5b4a736a70d
--- /dev/null
+++ b/static/june_2007_style/library.css.tmpl
@@ -0,0 +1,65 @@
+.libraryRow {
+ background-color: $form_title_bg_bottom;
+}
+
+.datasetHighlighted {
+ background-color: $menu_bg_over;
+}
+
+div.historyItemBody {
+ padding: 4px 4px 2px 4px;
+}
+
+li.folderRow,
+li.datasetRow
+{
+ border-top: solid 1px #ddd;
+}
+
+li.folderRow:hover,
+li.datasetRow:hover
+{
+ background-color: $menu_bg_over;
+}
+
+img.expanderIcon {
+ padding-right: 4px;
+}
+
+input.datasetCheckbox,
+li, ul
+{
+ padding: 0;
+ margin: 0;
+}
+
+.rowTitle
+{
+ padding: 2px;
+}
+
+ul {
+ list-style: none;
+}
+
+.libraryTitle th {
+ text-align: left;
+}
+
+pre.peek
+{
+ background: white;
+ color: black;
+ width: 100%;
+ overflow: auto;
+}
+
+pre.peek th
+{
+ color: white;
+ background: $peek_table_header;
+}
+
+a.expandLink {
+ text-decoration: none;
+}
diff --git a/static/june_2007_style/make_style.py b/static/june_2007_style/make_style.py
index 4ba96651c52..1bc2adf9212 100755
--- a/static/june_2007_style/make_style.py
+++ b/static/june_2007_style/make_style.py
@@ -1,5 +1,9 @@
#!/usr/bin/env python
+from galaxy import eggs
+import pkg_resources
+pkg_resources.require("Cheetah")
+
import sys
from Cheetah.Template import Template
import string
@@ -13,8 +17,8 @@ def run( cmd ):
templates = [ ( "base.css.tmpl", "base.css" ),
( "panel_layout.css.tmpl", "panel_layout.css" ),
- ( "panel_layout_ie.css.tmpl", "panel_layout_ie.css" ),
( "masthead.css.tmpl", "masthead.css"),
+ ( "library.css.tmpl", "library.css"),
( "history.css.tmpl", "history.css" ),
( "tool_menu.css.tmpl", "tool_menu.css" ),
( "reset.css.tmpl", "reset.css" ) ]
@@ -64,7 +68,8 @@ for line in open( vars ):
for input, output in templates:
print input ,"->", output
open( os.path.join( out_dir, output ), "w" ).write( str( Template( file=input, searchList=[context] ) ) )
-
+
+"""
for rule, output in images:
t = string.Template( rule ).substitute( context )
print t, "->", output
@@ -74,3 +79,4 @@ for src, bg, out in shared_images:
t = "./png_over_color.py shared_images/%s %s %s" % ( src, context[bg], os.path.join( out_dir, out ) )
print t
run( t.split() )
+"""
diff --git a/static/june_2007_style/masthead.css.tmpl b/static/june_2007_style/masthead.css.tmpl
index 0c759f2aba6..a6d3b7ea5c7 100644
--- a/static/june_2007_style/masthead.css.tmpl
+++ b/static/june_2007_style/masthead.css.tmpl
@@ -7,6 +7,7 @@ body
margin: 3px;
margin-right: 5px;
margin-left: 5px;
+ overflow: hidden;
}
div.pageTitle
@@ -24,3 +25,38 @@ a:link, a:visited, a:active
{
color: $masthead_link;
}
+
+#tab-bar-bottom
+{
+ z-index: -1;
+ position:absolute;
+ top:27px; left: 0;
+ width: 100%;
+ height: 100%;
+ background: $masthead_active_tab_bg;
+}
+
+span.link-group
+{
+ margin: 0;
+ padding: 0;
+ display: inline;
+ padding-bottom: 10px;
+ margin-bottom: -10px;
+}
+
+span.link-group span
+{
+ margin: 0;
+ padding: 0;
+ display: inline;
+}
+
+span.link-group span.active-link
+{
+ background: $masthead_active_tab_bg;
+ padding-left: 3px; padding-right: 3px;
+ margin-left: -3px; margin-right: -3px;
+ padding-bottom: 10px;
+ margin-bottom: -10px;
+}
\ No newline at end of file
diff --git a/static/june_2007_style/panel_layout.css.tmpl b/static/june_2007_style/panel_layout.css.tmpl
index 0479767977b..4df44dba18a 100644
--- a/static/june_2007_style/panel_layout.css.tmpl
+++ b/static/june_2007_style/panel_layout.css.tmpl
@@ -45,6 +45,19 @@ body
font-weight: bold;
}
+#messagebox
+{
+ position:absolute;
+ top:33px;
+ left:0;
+ width:100%;
+ height:24px !important;
+ overflow: hidden;
+ border-bottom: solid #999 1px;
+ font-size: 90%;
+}
+
+
#left, #left-border, #center, #right-border, #right
{
position: absolute;
@@ -268,4 +281,37 @@ div.popupmenu-item:hover {
.dialog-box .body, .dialog-box .buttons {
padding: 5px;
+}
+
+## Messages for message box, slightly different style
+
+.panel-error-message, .panel-warning-message, .panel-done-message, .panel-info-message
+{
+ height: 24px;
+ line-height: 24px;
+ color: $base_text;
+ padding: 0px;
+ padding-left: 26px;
+ background-color: $error_message_bg;
+ background-image: url(error_small.png);
+ background-repeat: no-repeat;
+ background-position: 6px 50%;
+}
+
+.panel-warning-message
+{
+ background-image: url(warn_small.png);
+ background-color: $warn_message_bg;
+}
+
+.panel-done-message
+{
+ background-image: url(done_small.png);
+ background-color: $done_message_bg;
+}
+
+.panel-info-message
+{
+ background-image: url(info_small.png);
+ background-color: $info_message_bg;
}
\ No newline at end of file
diff --git a/static/scripts/galaxy.panels.js b/static/scripts/galaxy.panels.js
index 7463991fbf9..efe2ccb0a2a 100644
--- a/static/scripts/galaxy.panels.js
+++ b/static/scripts/galaxy.panels.js
@@ -79,7 +79,12 @@ function make_left_panel( panel_el, center_el, border_el ) {
}
}
).find( "div" ).show();;
-
+ var force_panel = function( op ) {
+ if ( ( hidden && op == 'show' ) || ( ! hidden && op == 'hide' ) ) {
+ toggle();
+ }
+ }
+ return { force_panel: force_panel };
};
function make_right_panel( panel_el, center_el, border_el ) {
@@ -173,7 +178,12 @@ function make_right_panel( panel_el, center_el, border_el ) {
}
}
).find( "div" ).show();
- return { handle_minwidth_hint: handle_minwidth_hint };
+ var force_panel = function( op ) {
+ if ( ( hidden && op == 'show' ) || ( ! hidden && op == 'hide' ) ) {
+ toggle();
+ }
+ }
+ return { handle_minwidth_hint: handle_minwidth_hint, force_panel: force_panel };
};
// Modal dialog boxes
@@ -234,4 +244,4 @@ function make_popupmenu( button_element, options ) {
} );
};
$( button_element ).click( click );
-};
\ No newline at end of file
+};
diff --git a/static/scripts/packed/galaxy.panels.js b/static/scripts/packed/galaxy.panels.js
index 241d997a112..fd71a3f43d6 100644
--- a/static/scripts/packed/galaxy.panels.js
+++ b/static/scripts/packed/galaxy.panels.js
@@ -1 +1 @@
-var hidden_width=7;var border_tweak=9;var jq=jQuery;function ensure_dd_helper(){if(jq("#DD-helper").length==0){$("").css({background:"white",opacity:0,zIndex:9000,position:"absolute",top:0,left:0,width:"100%",height:"100%"}).appendTo("body").hide()}}function make_left_panel(E,A,B){var D=false;var C=null;resize=function(F){var G=F;if(F<0){F=0}jq(E).css("width",F);jq(B).css("left",G);jq(A).css("left",F+7);if(document.recalc){document.recalc()}};toggle=function(){if(D){jq(B).removeClass("hover");jq(B).animate({left:C},"fast");jq(E).css("left",-C).show().animate({left:0},"fast",function(){resize(C);jq(B).removeClass("hidden")});D=false}else{C=jq(B).position().left;jq(A).css("left",hidden_width);if(document.recalc){document.recalc()}jq(B).removeClass("hover");jq(E).animate({left:-C},"fast");jq(B).animate({left:-1},"fast",function(){jq(this).addClass("hidden")});D=true}};jq(B).hover(function(){jq(this).addClass("hover")},function(){jq(this).removeClass("hover")}).draggable({start:function(F,G){jq("#DD-helper").show()},stop:function(F,G){jq("#DD-helper").hide();return false},drag:function(F,G){x=G.position.left;x=Math.min(400,Math.max(100,x));if(D){jq(E).css("left",0);jq(B).removeClass("hidden");D=false}resize(x);G.position.left=x;G.position.top=$(this).data("draggable").originalPosition.top},click:function(){toggle()}}).find("div").show()}function make_right_panel(A,E,G){var I=false;var F=false;var C=null;var D=function(J){jq(A).css("width",J);jq(E).css("right",J+9);jq(G).css("right",J).css("left","");if(document.recalc){document.recalc()}};var H=function(){if(I){jq(G).removeClass("hover");jq(G).animate({right:C},"fast");jq(A).css("right",-C).show().animate({right:0},"fast",function(){D(C);jq(G).removeClass("hidden")});I=false}else{C=jq(document).width()-jq(G).position().left-border_tweak;jq(E).css("right",hidden_width+1);if(document.recalc){document.recalc()}jq(G).removeClass("hover");jq(A).animate({right:-C},"fast");jq(G).animate({right:-1},"fast",function(){jq(this).addClass("hidden")});I=true}F=false};var B=function(J){var K=jq(E).width()-(I?C:0);if(K").text(F).click(G));A.append(" ")});A.show()}else{A.hide()}var A=$(".dialog-box").find(".extra_buttons").html("");if(C){$.each(C,function(F,G){A.append($("").text(F).click(G));A.append(" ")});A.show()}else{A.hide()}if(B=="progress"){B=$("")}$(".dialog-box").find(".body").html(B);if(!$(".dialog-box-container").is(":visible")){$("#overlay").show();$(".dialog-box-container").fadeIn()}}function make_popupmenu(D,B){var A=$("
").appendTo("body");$.each(B,function(G,F){$("").html(G).click(F).appendTo(A)});var C=function(){$(A).unbind().hide();$("#popup-helper").unbind().hide()};var E=function(){var F=$(D).offset();$("#popup-helper").mousedown(C).show();$(A).click(C).css({top:-1000}).show().css({top:F.top+$(D).height()+9,left:F.left+$(D).width()-$(A).width()})};$(D).click(E)};
\ No newline at end of file
+var hidden_width=7;var border_tweak=9;var jq=jQuery;function ensure_dd_helper(){if(jq("#DD-helper").length==0){$("").css({background:"white",opacity:0,zIndex:9000,position:"absolute",top:0,left:0,width:"100%",height:"100%"}).appendTo("body").hide()}}function make_left_panel(F,B,C){var E=false;var D=null;resize=function(G){var H=G;if(G<0){G=0}jq(F).css("width",G);jq(C).css("left",H);jq(B).css("left",G+7);if(document.recalc){document.recalc()}};toggle=function(){if(E){jq(C).removeClass("hover");jq(C).animate({left:D},"fast");jq(F).css("left",-D).show().animate({left:0},"fast",function(){resize(D);jq(C).removeClass("hidden")});E=false}else{D=jq(C).position().left;jq(B).css("left",hidden_width);if(document.recalc){document.recalc()}jq(C).removeClass("hover");jq(F).animate({left:-D},"fast");jq(C).animate({left:-1},"fast",function(){jq(this).addClass("hidden")});E=true}};jq(C).hover(function(){jq(this).addClass("hover")},function(){jq(this).removeClass("hover")}).draggable({start:function(G,H){jq("#DD-helper").show()},stop:function(G,H){jq("#DD-helper").hide();return false},drag:function(G,H){x=H.position.left;x=Math.min(400,Math.max(100,x));if(E){jq(F).css("left",0);jq(C).removeClass("hidden");E=false}resize(x);H.position.left=x;H.position.top=$(this).data("draggable").originalPosition.top},click:function(){toggle()}}).find("div").show();var A=function(G){if((E&&G=="show")||(!E&&G=="hide")){toggle()}};return{force_panel:A}}function make_right_panel(A,E,H){var J=false;var G=false;var C=null;var D=function(K){jq(A).css("width",K);jq(E).css("right",K+9);jq(H).css("right",K).css("left","");if(document.recalc){document.recalc()}};var I=function(){if(J){jq(H).removeClass("hover");jq(H).animate({right:C},"fast");jq(A).css("right",-C).show().animate({right:0},"fast",function(){D(C);jq(H).removeClass("hidden")});J=false}else{C=jq(document).width()-jq(H).position().left-border_tweak;jq(E).css("right",hidden_width+1);if(document.recalc){document.recalc()}jq(H).removeClass("hover");jq(A).animate({right:-C},"fast");jq(H).animate({right:-1},"fast",function(){jq(this).addClass("hidden")});J=true}G=false};var B=function(K){var L=jq(E).width()-(J?C:0);if(L").text(F).click(G));A.append(" ")});A.show()}else{A.hide()}var A=$(".dialog-box").find(".extra_buttons").html("");if(C){$.each(C,function(F,G){A.append($("").text(F).click(G));A.append(" ")});A.show()}else{A.hide()}if(B=="progress"){B=$("")}$(".dialog-box").find(".body").html(B);if(!$(".dialog-box-container").is(":visible")){$("#overlay").show();$(".dialog-box-container").fadeIn()}}function make_popupmenu(D,B){var A=$("
").appendTo("body");$.each(B,function(G,F){$("").html(G).click(F).appendTo(A)});var C=function(){$(A).unbind().hide();$("#popup-helper").unbind().hide()};var E=function(){var F=$(D).offset();$("#popup-helper").mousedown(C).show();$(A).click(C).css({top:-1000}).show().css({top:F.top+$(D).height()+9,left:F.left+$(D).width()-$(A).width()})};$(D).click(E)};
\ No newline at end of file
diff --git a/static/scripts/packed/galaxy.ui.scrollPanel.js b/static/scripts/packed/galaxy.ui.scrollPanel.js
index b16bbeeca48..fd0e8056d1d 100644
--- a/static/scripts/packed/galaxy.ui.scrollPanel.js
+++ b/static/scripts/packed/galaxy.ui.scrollPanel.js
@@ -1 +1 @@
-$.ui.plugin.add("draggable","scrollPanel",{drag:function(G,H){var J=$(this).data("draggable");clearTimeout(J.timeout);var B=H.options,D=J.element,A=B.panel,C=A.position(),I=A.width(),E=A.height();viewport=A.parent();viewport_w=viewport.width(),viewport_h=viewport.height(),element_w=D.width(),element_h=D.height(),moved=false,close=5,nudge=23,p_min_x=-(I-viewport_w),p_min_y=-(E-viewport_h),p_max_x=0,p_max_y=0,min_vis_x=-C.left,max_vis_x=min_vis_x+viewport_w,min_vis_y=-C.top,max_vis_y=min_vis_y+viewport_h,mouse_x=H.position.left+J.offset.click.left;mouse_y=H.position.top+J.offset.click.top;if((C.leftp_min_x)&&(mouse_x+close>max_vis_x)){var K=Math.min(nudge,C.left-p_min_x);A.css("left",C.left-K);moved=true;J.offset.parent.left-=K;H.position.left+=K}if((!moved)&&(C.topp_min_y)&&(mouse_y+close>max_vis_y)){var K=Math.min(nudge,C.top-p_min_x);A.css("top",(C.top-K)+"px");var F=C.top-A.position().top;J.offset.parent.top-=F;H.position.top+=F;moved=true}H.position.left=Math.max(H.position.left,0);H.position.top=Math.max(H.position.top,0);H.position.left=Math.min(H.position.left,I-element_w);H.position.top=Math.min(H.position.top,E-element_h);if(moved){$.ui.ddmanager.prepareOffsets(J,G)}if(moved){J.old_e=G;J.timeout=setTimeout(function(){J.mouseMove(G)},50)}},stop:function(C,B){var A=$(this).data("draggable");clearTimeout(A.timeout)}});
\ No newline at end of file
+$.ui.plugin.add("draggable","scrollPanel",{drag:function(G,H){var J=$(this).data("draggable");clearTimeout(J.timeout);var B=H.options,D=J.element,A=B.panel,C=A.position(),I=A.width(),E=A.height();viewport=A.parent();viewport_w=viewport.width(),viewport_h=viewport.height(),element_w=D.width(),element_h=D.height(),moved=false,close_dist=5,nudge=23,p_min_x=-(I-viewport_w),p_min_y=-(E-viewport_h),p_max_x=0,p_max_y=0,min_vis_x=-C.left,max_vis_x=min_vis_x+viewport_w,min_vis_y=-C.top,max_vis_y=min_vis_y+viewport_h,mouse_x=H.position.left+J.offset.click.left;mouse_y=H.position.top+J.offset.click.top;if((C.leftp_min_x)&&(mouse_x+close_dist>max_vis_x)){var K=Math.min(nudge,C.left-p_min_x);A.css("left",C.left-K);moved=true;J.offset.parent.left-=K;H.position.left+=K}if((!moved)&&(C.topp_min_y)&&(mouse_y+close_dist>max_vis_y)){var K=Math.min(nudge,C.top-p_min_x);A.css("top",(C.top-K)+"px");var F=C.top-A.position().top;J.offset.parent.top-=F;H.position.top+=F;moved=true}H.position.left=Math.max(H.position.left,0);H.position.top=Math.max(H.position.top,0);H.position.left=Math.min(H.position.left,I-element_w);H.position.top=Math.min(H.position.top,E-element_h);if(moved){$.ui.ddmanager.prepareOffsets(J,G)}if(moved){J.old_e=G;J.timeout=setTimeout(function(){J.mouseMove(G)},50)}},stop:function(C,B){var A=$(this).data("draggable");clearTimeout(A.timeout)}});
\ No newline at end of file
diff --git a/static/welcome.html b/static/welcome.html
index 7a5064c6af7..5bd2ab245cd 100644
--- a/static/welcome.html
+++ b/static/welcome.html
@@ -10,28 +10,27 @@
-
- Galaxy and 2008 Meeting Season
+
+ Workflows are finally here!
+ Watch how you can (Click link to play)...
+ Security - Data security in Galaxy is a new feature, so familiarize yourself with the details, which can be found
+ here or in our data security page. The data security
+ process incorporates users, groups and roles, and enables the application of certain restrictions on datasets. The default process
+ is to not apply any security restrictions to datasets, and data becomes more restricted with each new "permission restriction" applied
+ to it. With no restrictions, users should not see any difference in the way Galaxy has always worked. The general definitions of
+ these entities are:
+
+
+ Users - registered Galaxy users that have created a Galaxy account. Users can be members of a group and can
+ be associated with 1 or more roles. If a user is not authenticated during a Galaxy session, they will not have access to any
+ of the security features, and datasets they create during that session will have no security restrictions applied to them
+ (i.e., they will be considered "public").
+
+
+
+ Groups - a set of 0 or more users which are considered members of the group. Groups can be associated with 0
+ or more roles, simplifying the process of applying "permission restrictions" to the data between a select group of users.
+
+
+
+ Roles - associate users and groups with specific permissions on datasets. For example, users in groups A and B
+ can be associated with role C which gives them the "access" permission on datasets D, E and F. Roles have a type which is currently
+ one of the following:
+
+
+ private - every user is associated automatically with their own private role, and administrators cannot
+ manage them.
+
+
+ user - this is currently not used, but eventually any registered user will be able to create a new role
+ and this will be it's type.
+
+
+ sharing - a role created automatically during a Galaxy session that enables a user to share data with
+ another user. This can generally be considered a temporary role, but this role type is evolving.
+
+
admin - a role created by a Galaxy administrator.
+
+
+
+
+ Permissions - for any dataset, applying one of the following role "permission restrictions" will restrict the
+ use of the dataset.
+
+
+ access - users associated with the role can import this dataset into their history for analysis.
+
+ If no roles with the 'access' permission restriction are associated with a dataset, the dataset is "public" and may
+ be shared with anyone. Public library datasets will be accessible to all users (as well as anyone not logged in
+ during a Galaxy session) from the list of libraries displayed when the "Access Libraries stored locally" tool is used.
+
+
+ Associating a dataset with a role that includes the "access" permission restriction narrows the set of users that can
+ access it. For example, if 'Role A' includes the "access" permission restriction and 'Role A' is associated with the dataset,
+ only those users and groups who are associated with 'Role A' may access the dataset.
+
+
+ If multiple roles that include the "access" permission restriction are associated with a dataset, access to the
+ dataset is derived from the intersection of the users associated with the roles. For example, if 'Role A' and 'Role B' are
+ associated with a dataset, only those users and groups who are associated with both 'Role A' AND 'Role B' may access the dataset.
+
+
+ In order for a user to make a dataset private to just themselves, they should associate the dataset with their private role
+ (the role identical to their Galaxy user name / email address). Associating additional roles that include the 'access'
+ permission restriction is not advised since the behavior will probably not be as expected. Role permission restrictions
+ are always logically "ANDed" together, so only the user will be able to access the dataset since they are the only member of
+ their "private role". To make a dataset private to themselves and one or more other users, the user should create a new role
+ (note: this functionality is still under development for non administrator users) and associate the dataset with that role,
+ not their "private role".
+
+
+ Private data (data associated with roles that include the "access" permission restriction) must be made public in order
+ to be used with external sources, such as the "view at UCSC" link, or the "Perform genome analysis and prediction with EpiGRAPH"
+ tool. Being "made public" means removing the association of all roles that include the "access" permission restriction from
+ the dataset.
+
+
+
edit metadata - users associated with the role can edit this dataset's metadata in the dataset library.
+
+ manage permissions - users associated with the role can manage the roles associated with this dataset. If no
+ roles that include the 'manage permissions' are associated with the dataset, only administrators can modify it's permission
+ restrictions.
+
+
+
+
+
+
The menu on the left provides the following features
+
+
+ Manage users - provides a view of the registered users and all groups and non-private roles associated
+ with each user.
+
+
+
+ Manage groups - provides a view of all groups along with the members of the group and the roles associated with
+ each group (both private and non-private roles). Non-private roles include a link to a page that allows you to manage the users
+ and groups that are associated with the role. The page also includes a view of the library datasets that are associated with the
+ role and the various "permission restrictions" applied to each dataset.
+
+
+
+ Manage non-private roles - provides a view of all non-private roles along with the role type, and the users and groups that
+ are associated with the role.
+
+
+
+ Manage libraries - Dataset libraries enable a Galaxy administrator to upload datasets into a library. Only
+ administrators can create dataset libraries and maintain their contents ( datasets ) and the security applied to them. From
+ the Galaxy analysis view, the "Access Libraries stored locally" tool in the "Get Data" tool
+ section allows users to access the datasets in a library ( if the user is not restricted from accessing the datasets by the
+ security rules applied to them ) by "uploading" them into their histories. This "uploading" process will not make a copy of
+ the dataset, however, but will be a sort of pointer to the dataset on disk. This approach allows for multiple users to have
+ access to a single ( possibly very large ) dataset on disk.
+
+
+%if msg:
+ ${render_msg( msg, messagetype )}
+%endif
+
+%if not libraries:
+ %if deleted:
+ There are no deleted libraries
+ %else:
+ There are no libraries.
+ %endif
+%else:
+
+ %endif
## Allow other body level elements
- ${next.body()}
+ ${next.body()}
## Scripts can be loaded later since they progressively add features to
## the panels, but do not change layout
diff --git a/templates/dataset/copy_view.mako b/templates/dataset/copy_view.mako
index 97c932bac32..ba4f265ce43 100644
--- a/templates/dataset/copy_view.mako
+++ b/templates/dataset/copy_view.mako
@@ -25,7 +25,7 @@
if data.id in source_dataset_ids:
checked = " checked"
%>
-
This dataset is accessible by everyone (it is public).
+ %endif
-
-
- This will change the datatype of the existing dataset
- but not modify its contents. Use this if Galaxy
- has incorrectly guessed the type of your dataset.
-
-
-
-
-
-
-
-
-
-
-
-
-
Copy History Item
-
- Click here to make a copy of this history item.
-
-
-
+
+
+%endif
diff --git a/templates/dataset/security_common.mako b/templates/dataset/security_common.mako
new file mode 100644
index 00000000000..517836f18d4
--- /dev/null
+++ b/templates/dataset/security_common.mako
@@ -0,0 +1,87 @@
+<%def name="render_select( current_actions, action_key, action, all_roles )">
+ <%
+ in_roles = []
+ for a in current_actions:
+ if a.action == action.action:
+ in_roles.append( a.role )
+ out_roles = filter( lambda x: x not in in_roles, all_roles )
+ %>
+
diff --git a/templates/history/permissions.mako b/templates/history/permissions.mako
new file mode 100644
index 00000000000..a189523440d
--- /dev/null
+++ b/templates/history/permissions.mako
@@ -0,0 +1,7 @@
+<%inherit file="/base.mako"/>
+<%def name="title()">Change Default Permissions on New Datasets in This History%def>
+<%namespace file="/dataset/security_common.mako" import="render_permission_form" />
+
+%if trans.user:
+ ${render_permission_form( trans.history, trans.history.name, h.url_for(), 'id', None, trans.user.all_roles() )}
+%endif
diff --git a/templates/history/share.mako b/templates/history/share.mako
index 5e64e66756a..8728587cb45 100644
--- a/templates/history/share.mako
+++ b/templates/history/share.mako
@@ -1,6 +1,7 @@
<%inherit file="/base.mako"/>
<%def name="title()">Share histories%def>
+%if not can_change and not cannot_change:
Share Histories
@@ -27,4 +28,90 @@
-
\ No newline at end of file
+
+%else:
+
+
+ %for history in histories:
+
+ %endfor
+
+
+ The history or histories you've chosen to share contain datasets that the user you're sharing with does not have permission to access. These datasets are shown below. Datasets which the user already has permission to access are not shown.
+
+
+ %if can_change:
+
+ The following datasets can be shared with ${email} by updating their permissions:
+
+
+
Histories
Datasets
+ %for history, datasets in can_change.items():
+
+
${history.name}
+
+ %for dataset in datasets:
+ ${dataset.name}
+ %endfor
+
+
+ %endfor
+
+
+
+ %endif
+ %if cannot_change:
+
+ The following datasets cannot be shared with ${email} because you do not have permission to change the permissions on them.
+
+
+
Histories
Datasets
+ %for history, datasets in cannot_change.items():
+
+
${history.name}
+
+ %for dataset in datasets:
+ ${dataset.name}
+ %endfor
+
+
+ %endfor
+
+
+
+ %endif
+
+ How would you like to proceed?
+
+ %if can_change:
+ Set datasets above to public access
+ %if cannot_change:
+ (where possible)
+ %endif
+
+ Set datasets above to private access for me and the user(s) with whom I am sharing
+ %if cannot_change:
+ (where possible)
+ %endif
+
+ %endif
+ Share anyway
+ %if can_change:
+ (don't change any permissions)
+ %endif
+
+ Don't share
+
+
+
%def>
@@ -13,8 +28,12 @@
## If a specific tool id was specified, load it in the middle frame
<%
- if tool_id is not None:
+ if trans.app.config.require_login and not trans.user:
+ center_url = h.url_for( controller='user', action='login' )
+ elif tool_id is not None:
center_url = h.url_for( 'tool_runner', tool_id=tool_id, from_noframe=True )
+ elif workflow_id is not None:
+ center_url = h.url_for( controller='workflow', action='run', id=workflow_id )
elif m_c is not None:
center_url = h.url_for( controller=m_c, action=m_a )
else:
@@ -29,12 +48,12 @@
%if t.user:
%for m in t.user.stored_workflow_menu_entries:
@@ -110,4 +110,4 @@
-
\ No newline at end of file
+
diff --git a/templates/user/index.mako b/templates/user/index.mako
index 2b11262cece..04303c9b0a4 100644
--- a/templates/user/index.mako
+++ b/templates/user/index.mako
@@ -8,6 +8,7 @@
-%endif
\ No newline at end of file
+%endif
diff --git a/templates/user/permissions.mako b/templates/user/permissions.mako
new file mode 100644
index 00000000000..45b44795f38
--- /dev/null
+++ b/templates/user/permissions.mako
@@ -0,0 +1,7 @@
+<%inherit file="/base.mako"/>
+<%def name="title()">Change Default Permissions on New Histories%def>
+<%namespace file="/dataset/security_common.mako" import="render_permission_form" />
+
+%if trans.user:
+ ${render_permission_form( trans.user, trans.user.email, h.url_for(), 'id', None, trans.user.all_roles() )}
+%endif
diff --git a/templates/workflow/editor.mako b/templates/workflow/editor.mako
index 18d7b862fed..3b3cf7ee055 100644
--- a/templates/workflow/editor.mako
+++ b/templates/workflow/editor.mako
@@ -1,6 +1,18 @@
<%inherit file="/base_panels.mako"/>
-<%def name="title()">Galaxy Workflow Editor%def>
+<%def name="init()">
+<%
+ self.active_view="workflow"
+ self.message_box_visible=True
+ self.message_box_class="warning"
+%>
+%def>
+
+<%def name="message_box_content()">
+ Workflow support is currently in beta testing.
+ Workflows may not work with all tools, may fail unexpectedly, and may
+ not be compatible with future updates to Galaxy.
+%def>
<%def name="late_javascripts()">
@@ -229,7 +241,7 @@
}
var close_editor = function() {
- <% next_url = h.url_for( controller='root', m_c='workflow' ) %>
+ <% next_url = h.url_for( controller='workflow', action='index' ) %>
if ( workflow && workflow.has_changes ) {
do_close = function() {
window.onbeforeunload = undefined;
@@ -301,11 +313,12 @@
<%def name="stylesheets()">
- ${parent.stylesheets()}
-
- ## Also include "base.css" for styling tool menu and forms (details)
+ ## Include "base.css" for styling tool menu and forms (details)
+ ## But make sure styles for the layout take precedence
+ ${parent.stylesheets()}
+