galaxy-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions

commit/galaxy-central: greg: Fix for rendering workflows icontained in repositories n the tool shed.
by Bitbucket 05 Jul '12
by Bitbucket 05 Jul '12
05 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/c04a80322875/
changeset: c04a80322875
user: greg
date: 2012-07-06 03:31:52
summary: Fix for rendering workflows icontained in repositories n the tool shed.
affected #: 1 file
diff -r b9804f980783c4a014a66f7cf45979ae290e71f0 -r c04a803228753159987fbed332398aff5df17c15 templates/webapps/community/repository/common.mako
--- a/templates/webapps/community/repository/common.mako
+++ b/templates/webapps/community/repository/common.mako
@@ -84,7 +84,7 @@
</%def><%def name="render_repository_items( repository_metadata_id, metadata, can_set_metadata=False, webapp='community' )">
- <% from galaxy.tool_shed.encoding_util import tool_shed_decode %>
+ <% from galaxy.tool_shed.encoding_util import tool_shed_encode %>
%if metadata or can_set_metadata:
<p/><div class="toolForm">
@@ -236,7 +236,7 @@
%><tr><td>
- <a href="${h.url_for( controller='workflow', action='view_workflow', repository_metadata_id=repository_metadata_id, workflow_name=tool_shed_decode( workflow_name ), webapp=webapp )}">${workflow_name}</a>
+ <a href="${h.url_for( controller='workflow', action='view_workflow', repository_metadata_id=repository_metadata_id, workflow_name=tool_shed_encode( workflow_name ), webapp=webapp )}">${workflow_name}</a></td><td>
%if steps:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Fixes for simultaneously installing multiple tool shed repositories into a local Galaxy instance, and fixes for installing repositories retrieved from searches in the tool shed.
by Bitbucket 05 Jul '12
by Bitbucket 05 Jul '12
05 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/b9804f980783/
changeset: b9804f980783
user: greg
date: 2012-07-05 23:44:01
summary: Fixes for simultaneously installing multiple tool shed repositories into a local Galaxy instance, and fixes for installing repositories retrieved from searches in the tool shed.
affected #: 13 files
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 lib/galaxy/web/controllers/admin_toolshed.py
--- a/lib/galaxy/web/controllers/admin_toolshed.py
+++ b/lib/galaxy/web/controllers/admin_toolshed.py
@@ -558,21 +558,15 @@
message = kwd.get( 'message', '' )
status = kwd.get( 'status', 'done' )
tool_shed_url = kwd[ 'tool_shed_url' ]
+ # The value of repo_info_dicts is a list of one or more dictionaries, each associated with a tool shed repository that will be installed.
+ encoded_repo_info_dicts = util.listify( kwd[ 'repo_info_dicts' ] )
+ repo_info_dicts = [ tool_shed_decode( repo_info_dict ) for repo_info_dict in encoded_repo_info_dicts ]
+ # Every repository will be installed into the same tool panel section or all will be installed outside of any sections.
new_tool_panel_section = kwd.get( 'new_tool_panel_section', '' )
tool_panel_section = kwd.get( 'tool_panel_section', '' )
+ # One or more repositories may include tools, but not necessarily all of them.
includes_tools = util.string_as_bool( kwd.get( 'includes_tools', False ) )
includes_tool_dependencies = util.string_as_bool( kwd.get( 'includes_tool_dependencies', False ) )
- if includes_tool_dependencies:
- dict_with_tool_dependencies = tool_shed_decode( kwd[ 'repo_info_dict' ] )
- # The repo_info_dict includes tool dependencies which we need to display so the user knows what will be installed.
- repo_info_dict = {}
- for name, repo_info_tuple in dict_with_tool_dependencies.items():
- description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
- # Create a new repo_info_dict by eliminating tool_dependencies from the repo_info_tuple.
- repo_info_dict[ name ] = ( description, repository_clone_url, changeset_revision, ctx_rev )
- else:
- dict_with_tool_dependencies = {}
- repo_info_dict = tool_shed_decode( kwd[ 'repo_info_dict' ] )
install_tool_dependencies = kwd.get( 'install_tool_dependencies', '' )
tool_section = None
if not includes_tools or ( includes_tools and kwd.get( 'select_tool_panel_section_button', False ) ):
@@ -597,50 +591,51 @@
break
# Make sure all tool_shed_repository records exist.
created_or_updated_tool_shed_repositories = []
- for name, repo_info_tuple in repo_info_dict.items():
- description, repository_clone_url, changeset_revision, ctx_rev = repo_info_tuple
- clone_dir = os.path.join( tool_path, self.generate_tool_path( repository_clone_url, changeset_revision ) )
- relative_install_dir = os.path.join( clone_dir, name )
- owner = get_repository_owner( clean_repository_clone_url( repository_clone_url ) )
- # Make sure the repository was not already installed.
- installed_tool_shed_repository, installed_changeset_revision = self.repository_was_previously_installed( trans,
- tool_shed_url,
- name,
- repo_info_tuple,
- clone_dir )
- if installed_tool_shed_repository:
- message = "The tool shed repository <b>%s</b> with owner <b>%s</b> and changeset revision <b>%s</b> " % ( name, owner, changeset_revision )
- if installed_changeset_revision != changeset_revision:
- message += "was previously installed using changeset revision <b>%s</b>. " % installed_changeset_revision
+ for repo_info_dict in repo_info_dicts:
+ for name, repo_info_tuple in repo_info_dict.items():
+ description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
+ clone_dir = os.path.join( tool_path, self.generate_tool_path( repository_clone_url, changeset_revision ) )
+ relative_install_dir = os.path.join( clone_dir, name )
+ owner = get_repository_owner( clean_repository_clone_url( repository_clone_url ) )
+ # Make sure the repository was not already installed.
+ installed_tool_shed_repository, installed_changeset_revision = self.repository_was_previously_installed( trans,
+ tool_shed_url,
+ name,
+ repo_info_tuple,
+ clone_dir )
+ if installed_tool_shed_repository:
+ message += "The tool shed repository <b>%s</b> with owner <b>%s</b> and changeset revision <b>%s</b> " % ( name, owner, changeset_revision )
+ if installed_changeset_revision != changeset_revision:
+ message += "was previously installed using changeset revision <b>%s</b>. " % installed_changeset_revision
+ else:
+ message += "was previously installed. "
+ if installed_tool_shed_repository.uninstalled:
+ message += "The repository has been uninstalled, however, so reinstall the original repository instead of installing it again. "
+ elif installed_tool_shed_repository.deleted:
+ message += "The repository has been deactivated, however, so activate the original repository instead of installing it again. "
+ if installed_changeset_revision != changeset_revision:
+ message += "You can get the latest updates for the repository using the <b>Get updates</b> option from the repository's "
+ message += "<b>Repository Actions</b> pop-up menu. "
+ status = 'error'
+ if len( repo_info_dicts ) == 1:
+ new_kwd = dict( message=message, status=status )
+ return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
+ action='browse_repositories',
+ **new_kwd ) )
else:
- message += "was previously installed. "
- if installed_tool_shed_repository.uninstalled:
- message += "The repository has been uninstalled, however, so reinstall the original repository instead of installing it again. "
- elif installed_tool_shed_repository.deleted:
- message += "The repository has been deactivated, however, so activate the original repository instead of installing it again. "
- if installed_changeset_revision != changeset_revision:
- message += "You can get the latest updates for the repository using the <b>Get updates</b> option from the repository's "
- message += "<b>Repository Actions</b> pop-up menu. "
- status = 'error'
- if len( repo_info_dict ) == 1:
- new_kwd = dict( message=message, status=status )
- return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
- action='browse_repositories',
- **new_kwd ) )
- else:
- print "Adding new row (or updating an existing row) for repository '%s' in the tool_shed_repository table." % name
- tool_shed_repository = create_or_update_tool_shed_repository( app=trans.app,
- name=name,
- description=description,
- installed_changeset_revision=changeset_revision,
- ctx_rev=ctx_rev,
- repository_clone_url=repository_clone_url,
- metadata_dict={},
- status=trans.model.ToolShedRepository.installation_status.NEW,
- current_changeset_revision=changeset_revision,
- owner=owner,
- dist_to_shed=False )
- created_or_updated_tool_shed_repositories.append( tool_shed_repository )
+ print "Adding new row (or updating an existing row) for repository '%s' in the tool_shed_repository table." % name
+ tool_shed_repository = create_or_update_tool_shed_repository( app=trans.app,
+ name=name,
+ description=description,
+ installed_changeset_revision=changeset_revision,
+ ctx_rev=ctx_rev,
+ repository_clone_url=repository_clone_url,
+ metadata_dict={},
+ status=trans.model.ToolShedRepository.installation_status.NEW,
+ current_changeset_revision=changeset_revision,
+ owner=owner,
+ dist_to_shed=False )
+ created_or_updated_tool_shed_repositories.append( tool_shed_repository )
if created_or_updated_tool_shed_repositories:
if includes_tools and ( new_tool_panel_section or tool_panel_section ):
if new_tool_panel_section:
@@ -669,7 +664,7 @@
new_kwd = dict( includes_tool_dependencies=kwd.get( 'includes_tool_dependencies', False ),
includes_tools=kwd.get( 'includes_tools', False ),
install_tool_dependencies=install_tool_dependencies,
- repo_info_dict=kwd[ 'repo_info_dict' ],
+ repo_info_dicts=kwd[ 'repo_info_dicts' ],
message=message,
new_tool_panel_section=kwd.get( 'new_tool_panel_section', '' ),
shed_tool_conf=kwd[ 'shed_tool_conf' ],
@@ -701,12 +696,12 @@
shed_tool_conf = shed_tool_conf.replace( './', '', 1 )
shed_tool_conf_select_field = None
tool_panel_section_select_field = build_tool_panel_section_select_field( trans )
- if includes_tools and len( repo_info_dict ) == 1:
+ if includes_tools and len( repo_info_dicts ) == 1:
# If we're installing a single repository that contains a readme file, get it's contents to display.
+ repo_info_dict = repo_info_dicts[ 0 ]
name = repo_info_dict.keys()[ 0 ]
repo_info_tuple = repo_info_dict[ name ]
- description, repository_clone_url, changeset_revision, ctx_rev = repo_info_tuple
- repository_owner = get_repository_owner( clean_repository_clone_url( repository_clone_url ) )
+ description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
url = '%srepository/get_readme?name=%s&owner=%s&changeset_revision=%s&webapp=galaxy&no_reset=true' % \
( tool_shed_url, name, repository_owner, changeset_revision )
response = urllib2.urlopen( url )
@@ -724,8 +719,8 @@
install_tool_dependencies_check_box = CheckboxField( 'install_tool_dependencies', checked=True )
return trans.fill_template( '/admin/tool_shed_repository/select_tool_panel_section.mako',
tool_shed_url=tool_shed_url,
- repo_info_dict=kwd[ 'repo_info_dict' ],
- dict_with_tool_dependencies=dict_with_tool_dependencies,
+ encoded_repo_info_dicts=kwd[ 'repo_info_dicts' ],
+ repo_info_dicts=repo_info_dicts,
shed_tool_conf=shed_tool_conf,
includes_tools=includes_tools,
includes_tool_dependencies=includes_tool_dependencies,
@@ -781,7 +776,8 @@
@web.require_admin
def install_tool_shed_repositories( self, trans, tool_shed_repositories, reinstalling=False, **kwd ):
"""Install specified tool shed repositories."""
- repo_info_dict = tool_shed_decode( kwd[ 'repo_info_dict' ] )
+ encoded_repo_info_dicts = util.listify( kwd[ 'repo_info_dicts' ] )
+ repo_info_dicts = [ tool_shed_decode( repo_info_dict ) for repo_info_dict in encoded_repo_info_dicts ]
tool_path = kwd[ 'tool_path' ]
includes_tool_dependencies = util.string_as_bool( kwd[ 'includes_tool_dependencies' ] )
install_tool_dependencies = CheckboxField.is_checked( kwd.get( 'install_tool_dependencies', '' ) )
@@ -790,14 +786,11 @@
tool_section = trans.app.toolbox.tool_panel[ tool_panel_section_key ]
else:
tool_section = None
- for tool_shed_repository in tool_shed_repositories:
+ for tool_shed_repository, repo_info_dict in zip( tool_shed_repositories, repo_info_dicts ):
# Clone each repository to the configured location.
update_tool_shed_repository_status( trans.app, tool_shed_repository, trans.model.ToolShedRepository.installation_status.CLONING )
repo_info_tuple = repo_info_dict[ tool_shed_repository.name ]
- if includes_tool_dependencies and not reinstalling:
- description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
- else:
- description, repository_clone_url, changeset_revision, ctx_rev = repo_info_tuple
+ description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
clone_dir = os.path.join( tool_path, self.generate_tool_path( repository_clone_url, tool_shed_repository.installed_changeset_revision ) )
relative_install_dir = os.path.join( clone_dir, tool_shed_repository.name )
clone_repository( repository_clone_url, os.path.abspath( relative_install_dir ), ctx_rev )
@@ -858,38 +851,38 @@
shutil.rmtree( work_dir )
except:
pass
- if 'datatypes' in metadata:
- update_tool_shed_repository_status( trans.app,
- tool_shed_repository,
- trans.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES )
- work_dir = make_tmp_directory()
- datatypes_config = get_config_from_repository( trans.app,
- 'datatypes_conf.xml',
- tool_shed_repository,
- tool_shed_repository.installed_changeset_revision,
- work_dir )
- # Load proprietary data types required by tools.
- converter_path, display_path = alter_config_and_load_prorietary_datatypes( trans.app, datatypes_config, relative_install_dir, override=False )
- if converter_path or display_path:
- # Create a dictionary of tool shed repository related information.
- repository_dict = create_repository_dict_for_proprietary_datatypes( tool_shed=self.tool_shed,
- name=tool_shed_repository.name,
- owner=tool_shed_repository.owner,
- installed_changeset_revision=tool_shed_repository.installed_changeset_revision,
- tool_dicts=metadata.get( 'tools', [] ),
- converter_path=converter_path,
- display_path=display_path )
- if converter_path:
- # Load proprietary datatype converters
- trans.app.datatypes_registry.load_datatype_converters( trans.app.toolbox, installed_repository_dict=repository_dict )
- if display_path:
- # Load proprietary datatype display applications
- trans.app.datatypes_registry.load_display_applications( installed_repository_dict=repository_dict )
- try:
- shutil.rmtree( work_dir )
- except:
- pass
- update_tool_shed_repository_status( trans.app, tool_shed_repository, trans.model.ToolShedRepository.installation_status.INSTALLED )
+ if 'datatypes' in metadata:
+ update_tool_shed_repository_status( trans.app,
+ tool_shed_repository,
+ trans.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES )
+ work_dir = make_tmp_directory()
+ datatypes_config = get_config_from_repository( trans.app,
+ 'datatypes_conf.xml',
+ tool_shed_repository,
+ tool_shed_repository.installed_changeset_revision,
+ work_dir )
+ # Load proprietary data types required by tools.
+ converter_path, display_path = alter_config_and_load_prorietary_datatypes( trans.app, datatypes_config, relative_install_dir, override=False )
+ if converter_path or display_path:
+ # Create a dictionary of tool shed repository related information.
+ repository_dict = create_repository_dict_for_proprietary_datatypes( tool_shed=self.tool_shed,
+ name=tool_shed_repository.name,
+ owner=tool_shed_repository.owner,
+ installed_changeset_revision=tool_shed_repository.installed_changeset_revision,
+ tool_dicts=metadata.get( 'tools', [] ),
+ converter_path=converter_path,
+ display_path=display_path )
+ if converter_path:
+ # Load proprietary datatype converters
+ trans.app.datatypes_registry.load_datatype_converters( trans.app.toolbox, installed_repository_dict=repository_dict )
+ if display_path:
+ # Load proprietary datatype display applications
+ trans.app.datatypes_registry.load_display_applications( installed_repository_dict=repository_dict )
+ try:
+ shutil.rmtree( work_dir )
+ except:
+ pass
+ update_tool_shed_repository_status( trans.app, tool_shed_repository, trans.model.ToolShedRepository.installation_status.INSTALLED )
tsr_ids_for_monitoring = [ trans.security.encode_id( tsr.id ) for tsr in tool_shed_repositories ]
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
action='monitor_repository_installation',
@@ -1241,7 +1234,7 @@
new_kwd = dict( includes_tool_dependencies=tool_shed_repository.includes_tool_dependencies,
includes_tools=tool_shed_repository.includes_tools,
install_tool_dependencies=install_tool_dependencies,
- repo_info_dict=kwd[ 'repo_info_dict' ],
+ repo_info_dicts=kwd[ 'repo_info_dict' ],
message=message,
new_tool_panel_section=new_tool_panel_section,
shed_tool_conf=shed_tool_conf,
@@ -1282,8 +1275,7 @@
# Handle case where the repository was previously installed using an older changeset_revsion, but later the repository was updated
# in the tool shed and now we're trying to install the latest changeset revision of the same repository instead of updating the one
# that was previously installed. We'll look in the database instead of on disk since the repository may be uninstalled.
- description, repository_clone_url, changeset_revision, ctx_rev = repo_info_tuple
- repository_owner = get_repository_owner( clean_repository_clone_url( repository_clone_url ) )
+ description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
tool_shed = get_tool_shed_from_clone_url( repository_clone_url )
# Get all previous change set revisions from the tool shed for the repository back to, but excluding, the previous valid changeset
# revision to see if it was previously installed using one of them.
@@ -1309,22 +1301,16 @@
def reselect_tool_panel_section( self, trans, **kwd ):
repository = get_repository( trans, kwd[ 'id' ] )
metadata = repository.metadata
- # Populate repo_info_dict.
tool_shed_url = get_url_from_repository_tool_shed( trans.app, repository )
ctx_rev = get_ctx_rev( tool_shed_url, repository.name, repository.owner, repository.installed_changeset_revision )
repository_clone_url = generate_clone_url( trans, repository )
repo_info_dict = {}
- repo_info_dict[ repository.name ] = ( repository.description, repository_clone_url, repository.installed_changeset_revision, ctx_rev )
- dict_with_tool_dependencies = {}
- includes_tool_dependencies = repository.includes_tool_dependencies
- if includes_tool_dependencies:
- # Populate dict_with_tool_dependencies.
- dict_with_tool_dependencies[ repository.name ] = ( repository.description,
- repository_clone_url,
- repository.installed_changeset_revision,
- ctx_rev,
- repository.owner,
- metadata[ 'tool_dependencies' ] )
+ repo_info_dict[ repository.name ] = ( repository.description,
+ repository_clone_url,
+ repository.installed_changeset_revision,
+ ctx_rev,
+ repository.owner,
+ metadata.get( 'tool_dependencies', None ) )
# Get the location in the tool panel in which the tool was originally loaded.
if 'tool_panel_section' in metadata:
tool_panel_dict = metadata[ 'tool_panel_section' ]
@@ -1360,7 +1346,6 @@
install_tool_dependencies_check_box=install_tool_dependencies_check_box,
tool_panel_section_select_field=tool_panel_section_select_field,
repo_info_dict=tool_shed_encode( repo_info_dict ),
- dict_with_tool_dependencies=dict_with_tool_dependencies,
includes_tool_dependencies=includes_tool_dependencies,
message=message,
status=status )
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 lib/galaxy/webapps/community/controllers/common.py
--- a/lib/galaxy/webapps/community/controllers/common.py
+++ b/lib/galaxy/webapps/community/controllers/common.py
@@ -381,27 +381,6 @@
repository_metadata.downloadable = changeset_is_downloadable( metadata_dict )
trans.sa_session.add( repository_metadata )
trans.sa_session.flush()
-def decode( value ):
- # Extract and verify hash
- a, b = value.split( ":" )
- value = binascii.unhexlify( b )
- test = hmac_new( 'ToolShedAndGalaxyMustHaveThisSameKey', value )
- assert a == test
- # Restore from string
- try:
- values = json_fix( simplejson.loads( value ) )
- except Exception, e:
- # We do not have a json string
- values = value
- return values
-def encode( val ):
- if isinstance( val, dict ):
- value = simplejson.dumps( val )
- else:
- value = val
- a = hmac_new( 'ToolShedAndGalaxyMustHaveThisSameKey', value )
- b = binascii.hexlify( value )
- return "%s:%s" % ( a, b )
def generate_clone_url( trans, repository_id ):
"""Generate the URL for cloning a repository."""
repository = get_repository( trans, repository_id )
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -819,13 +819,16 @@
trans.sa_session.flush()
download_url = '/repos/%s/%s/archive/%s' % ( repository.user.username, repository.name, file_type_str )
return trans.response.send_redirect( download_url )
- def __encode_repo_info_dict( self, trans, webapp, repository_metadata_ids ):
+ def __encode_repo_info_dict( self, trans, repository_metadata_ids ):
repo_info_dict = {}
includes_tools = False
- for repository_metadata_id in repository_metadata_ids:
+ includes_tool_dependencies = False
+ for repository_metadata_id in util.listify( repository_metadata_ids ):
repository_metadata = get_repository_metadata_by_id( trans, repository_metadata_id )
if not includes_tools and 'tools' in repository_metadata.metadata:
includes_tools = True
+ if not includes_tool_dependencies and 'tool_dependencies' in repository_metadata.metadata:
+ includes_tool_dependencies = True
repository = get_repository( trans, trans.security.encode_id( repository_metadata.repository_id ) )
# Get the changelog rev for this changeset_revision.
repo_dir = repository.repo_path
@@ -834,8 +837,11 @@
ctx = get_changectx_for_changeset( repo, changeset_revision )
repository_id = trans.security.encode_id( repository.id )
repository_clone_url = generate_clone_url( trans, repository_id )
- repo_info_dict[ repository.name ] = ( repository.description, repository_clone_url, changeset_revision, str( ctx.rev() ) )
- return encode( repo_info_dict ), includes_tools
+ if includes_tool_dependencies:
+ repo_info_dict[ repository.name ] = ( repository.description, repository_clone_url, changeset_revision, str( ctx.rev() ) )
+ else:
+ repo_info_dict[ repository.name ] = ( repository.description, repository_clone_url, changeset_revision, str( ctx.rev() ) )
+ return tool_shed_encode( repo_info_dict ), includes_tools, includes_tool_dependencies
@web.expose
def find_tools( self, trans, **kwd ):
params = util.Params( kwd )
@@ -865,11 +871,17 @@
action=a,
**kwd ) )
if operation == "install":
- galaxy_url = trans.get_cookie( name='toolshedgalaxyurl' )
- encoded_repo_info_dict, includes_tools = self.__encode_repo_info_dict( trans, webapp, util.listify( item_id ) )
- url = '%sadmin_toolshed/install_repository?tool_shed_url=%s&webapp=%s&repo_info_dict=%s&includes_tools=%s' % \
- ( galaxy_url, url_for( '/', qualified=True ), webapp, encoded_repo_info_dict, str( includes_tools ) )
- return trans.response.send_redirect( url )
+ # We've received a list of RepositoryMetadata ids, so we need to build a list of associated Repository ids.
+ encoded_repository_ids = []
+ changeset_revisions = []
+ for repository_metadata_id in util.listify( item_id ):
+ repository_metadata = get_repository_metadata_by_id( trans, repository_metadata_id )
+ encoded_repository_ids.append( trans.security.encode_id( repository_metadata.repository.id ) )
+ changeset_revisions.append( repository_metadata.changeset_revision )
+ return trans.response.send_redirect( web.url_for( controller='repository',
+ action='install_repositories_by_revision',
+ repository_ids=encoded_repository_ids,
+ changeset_revisions=changeset_revisions ) )
else:
# This can only occur when there is a multi-select grid with check boxes and an operation,
# and the user clicked the operation button without checking any of the check boxes.
@@ -945,11 +957,17 @@
action=a,
**kwd ) )
if operation == "install":
- galaxy_url = trans.get_cookie( name='toolshedgalaxyurl' )
- encoded_repo_info_dict, includes_tools = self.__encode_repo_info_dict( trans, webapp, util.listify( item_id ) )
- url = '%sadmin_toolshed/install_repository?tool_shed_url=%s&webapp=%s&repo_info_dict=%s&includes_tools=%s' % \
- ( galaxy_url, url_for( '/', qualified=True ), webapp, encoded_repo_info_dict, str( includes_tools ) )
- return trans.response.send_redirect( url )
+ # We've received a list of RepositoryMetadata ids, so we need to build a list of associated Repository ids.
+ encoded_repository_ids = []
+ changeset_revisions = []
+ for repository_metadata_id in util.listify( item_id ):
+ repository_metadata = get_repository_metadata_by_id( trans, item_id )
+ encoded_repository_ids.append( trans.security.encode_id( repository_metadata.repository.id ) )
+ changeset_revisions.append( repository_metadata.changeset_revision )
+ return trans.response.send_redirect( web.url_for( controller='repository',
+ action='install_repositories_by_revision',
+ repository_ids=encoded_repository_ids,
+ changeset_revisions=changeset_revisions ) )
else:
# This can only occur when there is a multi-select grid with check boxes and an operation,
# and the user clicked the operation button without checking any of the check boxes.
@@ -1199,41 +1217,46 @@
message=message,
status=status )
@web.expose
- def install_repository_revision( self, trans, repository_id, **kwd ):
+ def install_repositories_by_revision( self, trans, repository_ids, changeset_revisions, **kwd ):
+ """Install a list of repositories into a local Galaxy instance by a specified changeset revision for each."""
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
webapp = get_webapp( trans, **kwd )
galaxy_url = trans.get_cookie( name='toolshedgalaxyurl' )
- repository_clone_url = generate_clone_url( trans, repository_id )
- repository = get_repository( trans, repository_id )
- changeset_revision = util.restore_text( params.get( 'changeset_revision', repository.tip ) )
- repository_metadata = get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision )
- metadata = repository_metadata.metadata
- # Tell the caller if the repository includes Galaxy tools so the page enabling selection of the tool panel section can be displayed.
- includes_tools = 'tools' in metadata
- includes_tool_dependencies = 'tool_dependencies' in metadata
- # Get the changelog rev for this changeset_revision.
- repo_dir = repository.repo_path
- repo = hg.repository( get_configured_ui(), repo_dir )
- ctx = get_changectx_for_changeset( repo, changeset_revision )
- repo_info_dict = {}
- if includes_tool_dependencies:
+ repo_info_dicts = []
+ includes_tools = False
+ includes_tool_dependencies = False
+ for repository_id, changeset_revision in zip( util.listify( repository_ids ), util.listify( changeset_revisions ) ):
+ repository_clone_url = generate_clone_url( trans, repository_id )
+ repository = get_repository( trans, repository_id )
+ #changeset_revision = util.restore_text( params.get( 'changeset_revision', repository.tip ) )
+ repository_metadata = get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision )
+ metadata = repository_metadata.metadata
+ # Tell the caller if the repository includes Galaxy tools so the page enabling selection of the tool panel section can be displayed.
+ if not includes_tools and 'tools' in metadata:
+ includes_tools = True
+ if not includes_tool_dependencies and 'tool_dependencies' in metadata:
+ includes_tool_dependencies = True
+ # Get the changelog rev for this changeset_revision.
+ repo_dir = repository.repo_path
+ repo = hg.repository( get_configured_ui(), repo_dir )
+ ctx = get_changectx_for_changeset( repo, changeset_revision )
+ repo_info_dict = {}
repo_info_dict[ repository.name ] = ( repository.description,
repository_clone_url,
changeset_revision,
str( ctx.rev() ),
repository.user.username,
- metadata[ 'tool_dependencies' ] )
- else:
- repo_info_dict[ repository.name ] = ( repository.description,
- repository_clone_url,
- changeset_revision,
- str( ctx.rev() ) )
- encoded_repo_info_dict = encode( repo_info_dict )
+ metadata.get( 'tool_dependencies', None ) )
+ repo_info_dicts.append( tool_shed_encode( repo_info_dict ) )
+ encoded_repo_info_dicts = ','.join( repo_info_dicts )
# Redirect back to local Galaxy to perform install.
- url = '%sadmin_toolshed/install_repository?tool_shed_url=%s&repo_info_dict=%s&includes_tools=%s&includes_tool_dependencies=%s' % \
- ( galaxy_url, url_for( '/', qualified=True ), encoded_repo_info_dict, str( includes_tools ), str( includes_tool_dependencies ) )
+ url = '%sadmin_toolshed/install_repository' % galaxy_url
+ url += '?tool_shed_url=%s' % url_for( '/', qualified=True )
+ url += '&repo_info_dicts=%s' % encoded_repo_info_dicts
+ url += '&includes_tools=%s' % includes_tools
+ url += '&includes_tool_dependencies=%s' % includes_tool_dependencies
return trans.response.send_redirect( url )
@web.expose
def load_invalid_tool( self, trans, repository_id, tool_config, changeset_revision, **kwd ):
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 lib/galaxy/webapps/community/controllers/workflow.py
--- a/lib/galaxy/webapps/community/controllers/workflow.py
+++ b/lib/galaxy/webapps/community/controllers/workflow.py
@@ -10,6 +10,7 @@
from galaxy.web.controllers.workflow import attach_ordered_steps
from galaxy.model.orm import *
from common import *
+from galaxy.tool_shed.encoding_util import *
class RepoInputDataModule( InputDataModule ):
@@ -139,7 +140,7 @@
repository_metadata_id = kwd.get( 'repository_metadata_id', '' )
workflow_name = kwd.get( 'workflow_name', '' )
if workflow_name:
- workflow_name = decode( workflow_name )
+ workflow_name = tool_shed_decode( workflow_name )
webapp = kwd.get( 'webapp', 'community' )
message = kwd.get( 'message', '' )
status = kwd.get( 'status', 'done' )
@@ -159,7 +160,7 @@
repository_id = trans.security.encode_id( repository_metadata.repository_id )
changeset_revision = repository_metadata.changeset_revision
metadata = repository_metadata.metadata
- workflow_name = decode( workflow_name )
+ workflow_name = tool_shed_decode( workflow_name )
# metadata[ 'workflows' ] is a list of tuples where each contained tuple is
# [ <relative path to the .ga file in the repository>, <exported workflow dict> ]
for workflow_tup in metadata[ 'workflows' ]:
@@ -385,7 +386,7 @@
repository_metadata_id = kwd.get( 'repository_metadata_id', '' )
workflow_name = kwd.get( 'workflow_name', '' )
if workflow_name:
- workflow_name = decode( workflow_name )
+ workflow_name = tool_shed_decode( workflow_name )
webapp = kwd.get( 'webapp', 'community' )
message = kwd.get( 'message', '' )
status = kwd.get( 'status', 'done' )
@@ -403,7 +404,7 @@
return open( tmp_fname )
galaxy_url = trans.get_cookie( name='toolshedgalaxyurl' )
url = '%sworkflow/import_workflow?tool_shed_url=%s&repository_metadata_id=%s&workflow_name=%s&webapp=%s' % \
- ( galaxy_url, url_for( '/', qualified=True ), repository_metadata_id, encode( workflow_name ), webapp )
+ ( galaxy_url, url_for( '/', qualified=True ), repository_metadata_id, tool_shed_encode( workflow_name ), webapp )
return trans.response.send_redirect( url )
return trans.response.send_redirect( web.url_for( controller='workflow',
action='view_workflow',
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 templates/admin/tool_shed_repository/common.mako
--- a/templates/admin/tool_shed_repository/common.mako
+++ b/templates/admin/tool_shed_repository/common.mako
@@ -67,7 +67,7 @@
</script></%def>
-<%def name="render_tool_dependency_section( install_tool_dependencies_check_box, dict_with_tool_dependencies )">
+<%def name="render_tool_dependency_section( install_tool_dependencies_check_box, repo_info_dicts )"><% import os %><div class="form-row"><div class="toolParamHelp" style="clear: both;">
@@ -100,32 +100,36 @@
<th>Type</th><th>Install directory</th></tr>
- %for repository_name, repo_info_tuple in dict_with_tool_dependencies.items():
- <% description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple %>
- %for dependency_key, requirements_dict in tool_dependencies.items():
- <%
- name = requirements_dict[ 'name' ]
- version = requirements_dict[ 'version' ]
- type = requirements_dict[ 'type' ]
- install_dir = os.path.join( trans.app.config.tool_dependency_dir,
- name,
- version,
- repository_owner,
- repository_name,
- changeset_revision )
- tool_dependency_readme_text = requirements_dict.get( 'readme', None )
- %>
- %if not os.path.exists( install_dir ):
- <tr>
- <td>${name}</td>
- <td>${version}</td>
- <td>${type}</td>
- <td>${install_dir}</td>
- </tr>
- %if tool_dependency_readme_text:
- <tr><td colspan="4" bgcolor="#FFFFCC">${name} ${version} requirements and installation information</td></tr>
- <tr><td colspan="4"><pre>${tool_dependency_readme_text}</pre></td></tr>
- %endif
+ %for repo_info_dict in repo_info_dicts:
+ %for repository_name, repo_info_tuple in repo_info_dict.items():
+ <% description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple %>
+ %if tool_dependencies:
+ %for dependency_key, requirements_dict in tool_dependencies.items():
+ <%
+ name = requirements_dict[ 'name' ]
+ version = requirements_dict[ 'version' ]
+ type = requirements_dict[ 'type' ]
+ install_dir = os.path.join( trans.app.config.tool_dependency_dir,
+ name,
+ version,
+ repository_owner,
+ repository_name,
+ changeset_revision )
+ tool_dependency_readme_text = requirements_dict.get( 'readme', None )
+ %>
+ %if not os.path.exists( install_dir ):
+ <tr>
+ <td>${name}</td>
+ <td>${version}</td>
+ <td>${type}</td>
+ <td>${install_dir}</td>
+ </tr>
+ %if tool_dependency_readme_text:
+ <tr><td colspan="4" bgcolor="#FFFFCC">${name} ${version} requirements and installation information</td></tr>
+ <tr><td colspan="4"><pre>${tool_dependency_readme_text}</pre></td></tr>
+ %endif
+ %endif
+ %endfor
%endif
%endfor
%endfor
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
--- a/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
+++ b/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
@@ -12,7 +12,7 @@
<form name="reselect_tool_panel_section" id="reselect_tool_panel_section" action="${h.url_for( controller='admin_toolshed', action='reinstall_repository', id=trans.security.encode_id( repository.id ), repo_info_dict=repo_info_dict )}" method="post" ><div style="clear: both"></div>
%if includes_tool_dependencies:
- ${render_tool_dependency_section( install_tool_dependencies_check_box, dict_with_tool_dependencies )}
+ ${render_tool_dependency_section( install_tool_dependencies_check_box, [ repo_info_dict ] )}
%endif
<div style="clear: both"></div><div class="form-row">
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 templates/admin/tool_shed_repository/select_tool_panel_section.mako
--- a/templates/admin/tool_shed_repository/select_tool_panel_section.mako
+++ b/templates/admin/tool_shed_repository/select_tool_panel_section.mako
@@ -23,19 +23,23 @@
<br/><div class="toolForm">
- <div class="toolFormTitle">Confirm tool dependency installation</div>
+ %if includes_tool_dependencies:
+ <div class="toolFormTitle">Confirm tool dependency installation</div>
+ %else:
+ <div class="toolFormTitle">Choose the tool panel section to contain the installed tools (optional)</div>
+ %endif
<div class="toolFormBody">
- <form name="select_tool_panel_section" id="select_tool_panel_section" action="${h.url_for( controller='admin_toolshed', action='install_repository', tool_shed_url=tool_shed_url, repo_info_dict=repo_info_dict, includes_tools=includes_tools, includes_tool_dependencies=includes_tool_dependencies )}" method="post" >
+ <form name="select_tool_panel_section" id="select_tool_panel_section" action="${h.url_for( controller='admin_toolshed', action='install_repository', tool_shed_url=tool_shed_url, repo_info_dicts=encoded_repo_info_dicts, includes_tools=includes_tools, includes_tool_dependencies=includes_tool_dependencies )}" method="post" ><div style="clear: both"></div>
%if includes_tool_dependencies:
- ${render_tool_dependency_section( install_tool_dependencies_check_box, dict_with_tool_dependencies )}
+ ${render_tool_dependency_section( install_tool_dependencies_check_box, repo_info_dicts )}
+ <div style="clear: both"></div>
+ <div class="form-row">
+ <table class="colored" width="100%">
+ <th bgcolor="#EBD9B2">Choose the tool panel section to contain the installed tools (optional)</th>
+ </table>
+ </div>
%endif
- <div style="clear: both"></div>
- <div class="form-row">
- <table class="colored" width="100%">
- <th bgcolor="#EBD9B2">Choose the tool panel section to contain the installed tools (optional)</th>
- </table>
- </div>
%if shed_tool_conf_select_field:
<div class="form-row"><label>Shed tool configuration file:</label>
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 templates/webapps/community/repository/common.mako
--- a/templates/webapps/community/repository/common.mako
+++ b/templates/webapps/community/repository/common.mako
@@ -84,7 +84,7 @@
</%def><%def name="render_repository_items( repository_metadata_id, metadata, can_set_metadata=False, webapp='community' )">
- <% from galaxy.webapps.community.controllers.common import encode, decode %>
+ <% from galaxy.tool_shed.encoding_util import tool_shed_decode %>
%if metadata or can_set_metadata:
<p/><div class="toolForm">
@@ -236,7 +236,7 @@
%><tr><td>
- <a href="${h.url_for( controller='workflow', action='view_workflow', repository_metadata_id=repository_metadata_id, workflow_name=encode( workflow_name ), webapp=webapp )}">${workflow_name}</a>
+ <a href="${h.url_for( controller='workflow', action='view_workflow', repository_metadata_id=repository_metadata_id, workflow_name=tool_shed_decode( workflow_name ), webapp=webapp )}">${workflow_name}</a></td><td>
%if steps:
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 templates/webapps/community/repository/preview_tools_in_changeset.mako
--- a/templates/webapps/community/repository/preview_tools_in_changeset.mako
+++ b/templates/webapps/community/repository/preview_tools_in_changeset.mako
@@ -64,7 +64,7 @@
<br/><br/><ul class="manage-table-actions">
- <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repository_revision', repository_id=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revision=changeset_revision )}">Install to local Galaxy</a></li>
+ <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repositories_by_revision', repository_ids=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revisions=changeset_revision )}">Install to local Galaxy</a></li><li><a class="action-button" id="repository-${repository.id}-popup" class="menubutton">Tool Shed Actions</a></li><div popupmenu="repository-${repository.id}-popup"><a class="action-button" href="${h.url_for( controller='repository', action='browse_valid_repositories', webapp=webapp )}">Browse valid repositories</a>
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 templates/webapps/community/repository/tool_form.mako
--- a/templates/webapps/community/repository/tool_form.mako
+++ b/templates/webapps/community/repository/tool_form.mako
@@ -123,7 +123,7 @@
%if webapp == 'galaxy':
<li><a class="action-button" id="repository-${repository.id}-popup" class="menubutton">Repository Actions</a></li><div popupmenu="repository-${repository.id}-popup">
- <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repository_revision', repository_id=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revision=changeset_revision )}">Install to local Galaxy</a></li>
+ <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repositories_by_revision', repository_ids=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revisions=changeset_revision )}">Install to local Galaxy</a></li><li><a class="action-button" href="${h.url_for( controller='repository', action='preview_tools_in_changeset', repository_id=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revision=changeset_revision )}">Browse repository</a></li></div><li><a class="action-button" id="tool_shed-${repository.id}-popup" class="menubutton">Tool Shed Actions</a></li>
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 templates/webapps/community/repository/view_repository.mako
--- a/templates/webapps/community/repository/view_repository.mako
+++ b/templates/webapps/community/repository/view_repository.mako
@@ -94,7 +94,7 @@
</div>
%endif
%else:
- <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repository_revision', repository_id=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revision=changeset_revision )}">Install to local Galaxy</a></li>
+ <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repositories_by_revision', repository_ids=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revisions=changeset_revision )}">Install to local Galaxy</a></li><li><a class="action-button" id="repository-${repository.id}-popup" class="menubutton">Tool Shed Actions</a></li><div popupmenu="repository-${repository.id}-popup"><a class="action-button" href="${h.url_for( controller='repository', action='browse_valid_repositories', webapp=webapp )}">Browse valid repositories</a>
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 templates/webapps/community/repository/view_tool_metadata.mako
--- a/templates/webapps/community/repository/view_tool_metadata.mako
+++ b/templates/webapps/community/repository/view_tool_metadata.mako
@@ -36,7 +36,7 @@
%if webapp == 'galaxy':
<li><a class="action-button" id="repository-${repository.id}-popup" class="menubutton">Repository Actions</a></li><div popupmenu="repository-${repository.id}-popup">
- <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repository_revision', repository_id=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revision=changeset_revision )}">Install to local Galaxy</a></li>
+ <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repositories_by_revision', repository_ids=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revisions=changeset_revision )}">Install to local Galaxy</a></li><li><a class="action-button" href="${h.url_for( controller='repository', action='preview_tools_in_changeset', repository_id=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revision=changeset_revision )}">Browse repository</a></li></div><li><a class="action-button" id="tool_shed-${repository.id}-popup" class="menubutton">Tool Shed Actions</a></li>
diff -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 -r b9804f980783c4a014a66f7cf45979ae290e71f0 templates/webapps/community/repository/view_workflow.mako
--- a/templates/webapps/community/repository/view_workflow.mako
+++ b/templates/webapps/community/repository/view_workflow.mako
@@ -5,7 +5,7 @@
<%
from galaxy.web.framework.helpers import time_ago
- from galaxy.webapps.community.controllers.common import encode
+ from galaxy.tool_shed.encoding_util import tool_shed_encode
in_tool_shed = webapp == 'community'
is_admin = trans.user_is_admin()
@@ -34,7 +34,7 @@
<%inherit file="${inherit(context)}"/><%def name="render_workflow( repository_metadata_id, workflow_name, webapp )">
- <% center_url = h.url_for( controller='workflow', action='generate_workflow_image', repository_metadata_id=repository_metadata_id, workflow_name=encode( workflow_name ), webapp=webapp ) %>
+ <% center_url = h.url_for( controller='workflow', action='generate_workflow_image', repository_metadata_id=repository_metadata_id, workflow_name=tool_shed_encode( workflow_name ), webapp=webapp ) %><iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="${center_url}"></iframe></%def>
@@ -76,8 +76,8 @@
%else:
<li><a class="action-button" id="repository-${repository.id}-popup" class="menubutton">Repository Actions</a></li><div popupmenu="repository-${repository.id}-popup">
- <li><a class="action-button" href="${h.url_for( controller='workflow', action='import_workflow', repository_metadata_id=repository_metadata_id, workflow_name=encode( workflow_name ), webapp=webapp )}">Import workflow to local Galaxy</a></li>
- <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repository_revision', repository_id=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revision=changeset_revision )}">Install repository to local Galaxy</a></li>
+ <li><a class="action-button" href="${h.url_for( controller='workflow', action='import_workflow', repository_metadata_id=repository_metadata_id, workflow_name=tool_shed_encode( workflow_name ), webapp=webapp )}">Import workflow to local Galaxy</a></li>
+ <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repositories_by_revision', repository_ids=trans.security.encode_id( repository.id ), webapp=webapp, changeset_revisions=changeset_revision )}">Install repository to local Galaxy</a></li></div><li><a class="action-button" id="toolshed-${repository.id}-popup" class="menubutton">Tool Shed Actions</a></li><div popupmenu="toolshed-${repository.id}-popup">
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Look for the webapp setting in the request's environ if it is not included in the request's parameters.
by Bitbucket 05 Jul '12
by Bitbucket 05 Jul '12
05 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/98204b9f4f80/
changeset: 98204b9f4f80
user: greg
date: 2012-07-05 19:54:31
summary: Look for the webapp setting in the request's environ if it is not included in the request's parameters.
affected #: 11 files
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -1552,7 +1552,7 @@
@web.expose
@web.require_admin
def index( self, trans, **kwd ):
- webapp = kwd.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = kwd.get( 'message', '' )
status = kwd.get( 'status', 'done' )
if webapp == 'galaxy':
@@ -1572,7 +1572,7 @@
@web.expose
@web.require_admin
def center( self, trans, **kwd ):
- webapp = kwd.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = kwd.get( 'message', '' )
status = kwd.get( 'status', 'done' )
if webapp == 'galaxy':
@@ -1629,7 +1629,7 @@
@web.require_admin
def create_role( self, trans, **kwd ):
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
name = util.restore_text( params.get( 'name', '' ) )
@@ -1706,7 +1706,7 @@
@web.require_admin
def rename_role( self, trans, **kwd ):
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
id = params.get( 'id', None )
@@ -1751,7 +1751,7 @@
@web.require_admin
def manage_users_and_groups_for_role( self, trans, **kwd ):
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
id = params.get( 'id', None )
@@ -1846,7 +1846,7 @@
@web.require_admin
def mark_role_deleted( self, trans, **kwd ):
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
id = kwd.get( 'id', None )
if not id:
message = "No role ids received for deleting"
@@ -1872,7 +1872,7 @@
@web.require_admin
def undelete_role( self, trans, **kwd ):
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
id = kwd.get( 'id', None )
if not id:
message = "No role ids received for undeleting"
@@ -1915,7 +1915,7 @@
# - GroupRoleAssociations where role_id == Role.id
# - DatasetPermissionss where role_id == Role.id
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
id = kwd.get( 'id', None )
if not id:
message = "No role ids received for purging"
@@ -1988,7 +1988,7 @@
@web.require_admin
def rename_group( self, trans, **kwd ):
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
id = params.get( 'id', None )
@@ -2031,7 +2031,7 @@
@web.require_admin
def manage_users_and_roles_for_group( self, trans, **kwd ):
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
group = get_group( trans, params.id )
@@ -2078,7 +2078,7 @@
@web.require_admin
def create_group( self, trans, **kwd ):
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
name = util.restore_text( params.get( 'name', '' ) )
@@ -2156,7 +2156,7 @@
@web.require_admin
def mark_group_deleted( self, trans, **kwd ):
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
id = params.get( 'id', None )
if not id:
message = "No group ids received for marking deleted"
@@ -2182,7 +2182,7 @@
@web.require_admin
def undelete_group( self, trans, **kwd ):
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
id = kwd.get( 'id', None )
if not id:
message = "No group ids received for undeleting"
@@ -2220,7 +2220,7 @@
# This method should only be called for a Group that has previously been deleted.
# Purging a deleted Group simply deletes all UserGroupAssociations and GroupRoleAssociations.
params = util.Params( kwd )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
id = kwd.get( 'id', None )
if not id:
message = "No group ids received for purging"
@@ -2259,7 +2259,7 @@
@web.expose
@web.require_admin
def create_new_user( self, trans, **kwd ):
- webapp = kwd.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
return trans.response.send_redirect( web.url_for( controller='user',
action='create',
cntrller='admin',
@@ -2267,7 +2267,7 @@
@web.expose
@web.require_admin
def reset_user_password( self, trans, **kwd ):
- webapp = kwd.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
user_id = kwd.get( 'id', None )
if not user_id:
message = "No users received for resetting passwords."
@@ -2316,7 +2316,7 @@
@web.expose
@web.require_admin
def mark_user_deleted( self, trans, **kwd ):
- webapp = kwd.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
id = kwd.get( 'id', None )
if not id:
message = "No user ids received for deleting"
@@ -2341,7 +2341,7 @@
@web.expose
@web.require_admin
def undelete_user( self, trans, **kwd ):
- webapp = kwd.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
id = kwd.get( 'id', None )
if not id:
message = "No user ids received for undeleting"
@@ -2388,7 +2388,7 @@
# - UserRoleAssociation where user_id == User.id EXCEPT FOR THE PRIVATE ROLE
# - UserAddress where user_id == User.id
# Purging Histories and Datasets must be handled via the cleanup_datasets.py script
- webapp = kwd.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
id = kwd.get( 'id', None )
if not id:
message = "No user ids received for purging"
@@ -2493,7 +2493,7 @@
@web.expose
@web.require_admin
def manage_roles_and_groups_for_user( self, trans, **kwd ):
- webapp = kwd.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
user_id = kwd.get( 'id', None )
message = ''
status = ''
@@ -2714,3 +2714,11 @@
id = trans.security.decode_id( id )
quota = trans.sa_session.query( trans.model.Quota ).get( id )
return quota
+def get_webapp( trans, **kwd ):
+ """Get the value of the webapp, can be one of 'community', 'galaxy', 'reports', 'demo_sequencer'."""
+ if 'webapp' in kwd:
+ return kwd[ 'webapp' ]
+ if 'webapp' in trans.environ:
+ return trans.environ[ 'webapp' ]
+ # The default is galaxy.
+ return 'galaxy'
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/web/controllers/admin.py
--- a/lib/galaxy/web/controllers/admin.py
+++ b/lib/galaxy/web/controllers/admin.py
@@ -51,7 +51,6 @@
return 'never'
# Grid definition
- webapp = "galaxy"
title = "Users"
model_class = model.User
template='/admin/user/grid.mako'
@@ -136,7 +135,6 @@
return 0
# Grid definition
- webapp = "galaxy"
title = "Roles"
model_class = model.Role
template='/admin/dataset_security/role/grid.mako'
@@ -220,7 +218,6 @@
return 0
# Grid definition
- webapp = "galaxy"
title = "Groups"
model_class = model.Group
template='/admin/dataset_security/group/grid.mako'
@@ -302,7 +299,6 @@
return 0
# Grid definition
- webapp = "galaxy"
title = "Quotas"
model_class = model.Quota
template='/admin/quota/grid.mako'
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/web/controllers/admin_toolshed.py
--- a/lib/galaxy/web/controllers/admin_toolshed.py
+++ b/lib/galaxy/web/controllers/admin_toolshed.py
@@ -147,7 +147,6 @@
( bgcolor, trans.security.encode_id( tool_shed_repository.id ), status_label )
return rval
- webapp = "galaxy"
title = "Monitor installing tool shed repositories"
template = "admin/tool_shed_repository/repository_installation_grid.mako"
model_class = model.ToolShedRepository
@@ -230,7 +229,6 @@
( bgcolor, trans.security.encode_id( tool_dependency.id ), tool_dependency.status )
return rval
- webapp = "galaxy"
title = "Tool Dependencies"
template = "admin/tool_shed_repository/tool_dependencies_grid.mako"
model_class = model.ToolDependency
@@ -1516,7 +1514,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
repository = get_repository( trans, repository_id )
metadata = {}
tool = None
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/web/controllers/external_service.py
--- a/lib/galaxy/web/controllers/external_service.py
+++ b/lib/galaxy/web/controllers/external_service.py
@@ -21,7 +21,6 @@
return 'Error in loading external_service type: %s' % external_service.external_service_type_id
# Grid definition
- webapp = "galaxy"
title = "External Services"
template = "admin/external_service/grid.mako"
model_class = model.ExternalService
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/web/controllers/request_type.py
--- a/lib/galaxy/web/controllers/request_type.py
+++ b/lib/galaxy/web/controllers/request_type.py
@@ -28,7 +28,6 @@
return len( request_type.external_services )
return 'No external service assigned'
# Grid definition
- webapp = "galaxy"
title = "Request Types"
template = "admin/request_type/grid.mako"
model_class = model.RequestType
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/web/controllers/requests_admin.py
--- a/lib/galaxy/web/controllers/requests_admin.py
+++ b/lib/galaxy/web/controllers/requests_admin.py
@@ -47,7 +47,6 @@
except:
return 'None'
# Grid definition
- webapp = "galaxy"
title = "Sample Datasets"
template = "admin/requests/sample_datasets_grid.mako"
model_class = model.SampleDataset
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/web/controllers/user.py
--- a/lib/galaxy/web/controllers/user.py
+++ b/lib/galaxy/web/controllers/user.py
@@ -514,7 +514,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
use_panels = util.string_as_bool( kwd.get( 'use_panels', True ) )
email = util.restore_text( params.get( 'email', '' ) )
# Do not sanitize passwords, so take from kwd
@@ -597,7 +597,7 @@
email = util.restore_text( kwd.get( 'email', '' ) )
password = kwd.get( 'password', '' )
username = util.restore_text( kwd.get( 'username', '' ) )
- webapp = kwd.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
status = kwd.get( 'status', 'done' )
is_admin = cntrller == 'admin' and trans.user_is_admin()
user = trans.app.model.User( email=email )
@@ -694,7 +694,7 @@
user = trans.user
if not user:
raise AssertionError, "The user id (%s) is not valid" % str( user_id )
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
email = util.restore_text( params.get( 'email', user.email ) )
# Do not sanitize passwords, so take from kwd
# instead of params ( which were sanitized )
@@ -759,7 +759,7 @@
def edit_username( self, trans, cntrller, **kwd ):
params = util.Params( kwd )
is_admin = cntrller == 'admin' and trans.user_is_admin()
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
user_id = params.get( 'user_id', None )
@@ -789,7 +789,7 @@
def edit_info( self, trans, cntrller, **kwd ):
params = util.Params( kwd )
is_admin = cntrller == 'admin' and trans.user_is_admin()
- webapp = params.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
user_id = params.get( 'user_id', None )
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/web/controllers/workflow.py
--- a/lib/galaxy/web/controllers/workflow.py
+++ b/lib/galaxy/web/controllers/workflow.py
@@ -1033,7 +1033,7 @@
"""
url = kwd.get( 'url', '' )
workflow_text = kwd.get( 'workflow_text', '' )
- webapp = kwd.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwd )
message = kwd.get( 'message', '' )
status = kwd.get( 'status', 'done' )
import_button = kwd.get( 'import_button', False )
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/web/framework/helpers/grids.py
--- a/lib/galaxy/web/framework/helpers/grids.py
+++ b/lib/galaxy/web/framework/helpers/grids.py
@@ -53,7 +53,7 @@
def __call__( self, trans, **kwargs ):
# Get basics.
- webapp = kwargs.get( 'webapp', 'galaxy' )
+ webapp = get_webapp( trans, **kwargs )
status = kwargs.get( 'status', None )
message = kwargs.get( 'message', None )
# Build a base filter and sort key that is the combination of the saved state and defaults.
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/webapps/community/controllers/admin.py
--- a/lib/galaxy/webapps/community/controllers/admin.py
+++ b/lib/galaxy/webapps/community/controllers/admin.py
@@ -60,7 +60,6 @@
return query.filter( and_( model.Tool.table.c.user_id == model.User.table.c.id,
model.User.table.c.email == column_filter ) )
# Grid definition
- webapp = "community"
title = "Users"
model_class = model.User
template='/admin/user/grid.mako'
@@ -148,7 +147,6 @@
return 0
# Grid definition
- webapp = "community"
title = "Roles"
model_class = model.Role
template='/admin/dataset_security/role/grid.mako'
@@ -235,7 +233,6 @@
return 0
# Grid definition
- webapp = "community"
title = "Groups"
model_class = model.Group
template='/admin/dataset_security/group/grid.mako'
diff -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 -r 98204b9f4f806c15fa52fd728b5dacbc64f5eeb1 lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -40,7 +40,6 @@
return 0
# Grid definition
- webapp = "community"
title = "Categories"
model_class = model.Category
template='/webapps/community/category/grid.mako'
@@ -377,7 +376,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
cntrller = params.get( 'cntrller', 'repository' )
is_admin = trans.user_is_admin()
invalid_tools_dict = odict()
@@ -495,7 +494,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
commit_message = util.restore_text( params.get( 'commit_message', 'Deleted selected files' ) )
repository = get_repository( trans, id )
repo = hg.repository( get_configured_ui(), repository.repo_path )
@@ -511,7 +510,7 @@
status=status )
@web.expose
def browse_valid_repositories( self, trans, **kwd ):
- webapp = kwd.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
galaxy_url = kwd.get( 'galaxy_url', None )
if galaxy_url:
trans.set_cookie( galaxy_url, name='toolshedgalaxyurl' )
@@ -596,7 +595,7 @@
name = params.get( 'name', None )
owner = params.get( 'owner', None )
changeset_revision = params.get( 'changeset_revision', None )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
repository = get_repository_by_name_and_owner( trans, name, owner )
repo_dir = repository.repo_path
repo = hg.repository( get_configured_ui(), repo_dir )
@@ -769,7 +768,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
repository = get_repository( trans, repository_id )
tool, message = load_tool_from_changeset_revision( trans, repository_id, changeset_revision, tool_config )
tool_state = self.__new_state( trans )
@@ -842,7 +841,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
galaxy_url = kwd.get( 'galaxy_url', None )
if galaxy_url:
trans.set_cookie( galaxy_url, name='toolshedgalaxyurl' )
@@ -922,7 +921,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
galaxy_url = kwd.get( 'galaxy_url', None )
if galaxy_url:
trans.set_cookie( galaxy_url, name='toolshedgalaxyurl' )
@@ -1050,7 +1049,7 @@
name = params.get( 'name', None )
owner = params.get( 'owner', None )
changeset_revision = params.get( 'changeset_revision', None )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
repository = get_repository_by_name_and_owner( trans, name, owner )
for downloadable_revision in repository.downloadable_revisions:
if downloadable_revision.changeset_revision == changeset_revision:
@@ -1204,7 +1203,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
galaxy_url = trans.get_cookie( name='toolshedgalaxyurl' )
repository_clone_url = generate_clone_url( trans, repository_id )
repository = get_repository( trans, repository_id )
@@ -1241,7 +1240,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'error' )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
repository = get_repository( trans, repository_id )
repo_dir = repository.repo_path
repo = hg.repository( get_configured_ui(), repo_dir )
@@ -1537,7 +1536,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
repository = get_repository( trans, repository_id )
changeset_revision = util.restore_text( params.get( 'changeset_revision', repository.tip ) )
repository_metadata = get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision )
@@ -1999,7 +1998,7 @@
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
repository = get_repository( trans, id )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
repo = hg.repository( get_configured_ui(), repository.repo_path )
avg_rating, num_ratings = self.get_ave_item_rating_data( trans.sa_session, repository, webapp_model=trans.model )
changeset_revision = util.restore_text( params.get( 'changeset_revision', repository.tip ) )
@@ -2068,7 +2067,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- webapp = params.get( 'webapp', 'community' )
+ webapp = get_webapp( trans, **kwd )
repository = get_repository( trans, repository_id )
metadata = {}
tool = None
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: jgoecks: Hacks to get trackster navigation controls to display in embedded visualizations.
by Bitbucket 05 Jul '12
by Bitbucket 05 Jul '12
05 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/e7e59c068d70/
changeset: e7e59c068d70
user: jgoecks
date: 2012-07-05 18:03:32
summary: Hacks to get trackster navigation controls to display in embedded visualizations.
affected #: 1 file
diff -r 0ffcc91708233cc087d9996235f0917b377cfe8a -r e7e59c068d7002e48eebb9dc6f34721fb7456fb5 templates/page/display.mako
--- a/templates/page/display.mako
+++ b/templates/page/display.mako
@@ -112,6 +112,13 @@
width: 25%;
padding: 0.2em 0.8em;
}
+ ## HACKs to get Trackster navigation controls to display.
+ .embedded-item .trackster-nav-container {
+ height: inherit;
+ }
+ .embedded-item .trackster-nav {
+ position: inherit;
+ }
</style></%def>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Refine the definition of changeset revisions that can be automatically installed into a local Galaxy instance.
by Bitbucket 05 Jul '12
by Bitbucket 05 Jul '12
05 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/0ffcc9170823/
changeset: 0ffcc9170823
user: greg
date: 2012-07-05 17:55:10
summary: Refine the definition of changeset revisions that can be automatically installed into a local Galaxy instance.
affected #: 7 files
diff -r eff8b196858c1ff5a6227bd750a06ea924f8530c -r 0ffcc91708233cc087d9996235f0917b377cfe8a lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -76,8 +76,9 @@
processed_invalid_tool_configs = []
processed_relative_workflow_paths = []
processed_datatypes = []
- for downloadable_revision in repository.downloadable_revisions:
- metadata = downloadable_revision.metadata
+ # A repository's metadata_revisions are those that ignore the value of the repository_metadata.downloadable column.
+ for metadata_revision in repository.metadata_revisions:
+ metadata = metadata_revision.metadata
if 'tools' in metadata:
tool_dicts = metadata[ 'tools' ]
for tool_dict in tool_dicts:
@@ -1461,7 +1462,7 @@
"""
# To set excluded_lower_bounds_changeset_revision, calling methods should do the following, where the value of changeset_revision
# is a downloadable changeset_revision.
- # excluded_lower_bounds_changeset_revision = get_previous_valid_changset_revision( repository, repo, changeset_revision )
+ # excluded_lower_bounds_changeset_revision = get_previous_downloadable_changset_revision( repository, repo, changeset_revision )
if excluded_lower_bounds_changeset_revision == INITIAL_CHANGELOG_HASH:
appending_started = True
else:
diff -r eff8b196858c1ff5a6227bd750a06ea924f8530c -r 0ffcc91708233cc087d9996235f0917b377cfe8a lib/galaxy/webapps/community/controllers/common.py
--- a/lib/galaxy/webapps/community/controllers/common.py
+++ b/lib/galaxy/webapps/community/controllers/common.py
@@ -134,10 +134,7 @@
trans.sa_session.add( repository_metadata )
trans.sa_session.flush()
def build_changeset_revision_select_field( trans, repository, selected_value=None, add_id_to_name=True ):
- """
- Build a SelectField whose options are the changeset_revision
- strings of all downloadable_revisions of the received repository.
- """
+ """Build a SelectField whose options are the changeset_rev strings of all downloadable revisions of the received repository."""
repo = hg.repository( get_configured_ui(), repository.repo_path )
options = []
changeset_tups = []
@@ -169,6 +166,10 @@
selected = selected_value and option_tup[1] == selected_value
select_field.add_option( option_tup[0], option_tup[1], selected=selected )
return select_field
+def changeset_is_downloadable( metadata_dict ):
+ # A RepositoryMetadata record will be created if metadata_dict includes only invalid stuff like 'invalid_tools', but in this case
+ # it won't be downloadable.
+ return 'datatypes' in metadata_dict or 'tools' in metadata_dict or 'workflows' in metadata_dict
def changeset_is_malicious( trans, id, changeset_revision, **kwd ):
"""Check the malicious flag in repository metadata for a specified change set"""
repository_metadata = get_repository_metadata_by_changeset_revision( trans, id, changeset_revision )
@@ -374,15 +375,12 @@
def create_or_update_repository_metadata( trans, id, repository, changeset_revision, metadata_dict ):
repository_metadata = get_repository_metadata_by_changeset_revision( trans, id, changeset_revision )
if repository_metadata:
- # Update RepositoryMetadata.metadata.
repository_metadata.metadata = metadata_dict
- trans.sa_session.add( repository_metadata )
- trans.sa_session.flush()
else:
- # Create a new repository_metadata table row.
repository_metadata = trans.model.RepositoryMetadata( repository.id, changeset_revision, metadata_dict )
- trans.sa_session.add( repository_metadata )
- trans.sa_session.flush()
+ repository_metadata.downloadable = changeset_is_downloadable( metadata_dict )
+ trans.sa_session.add( repository_metadata )
+ trans.sa_session.flush()
def decode( value ):
# Extract and verify hash
a, b = value.split( ":" )
@@ -605,7 +603,7 @@
if parent_id is None:
# The tool did not change through all of the changeset revisions.
return old_id
-def get_previous_valid_changset_revision( repository, repo, before_changeset_revision ):
+def get_previous_downloadable_changset_revision( repository, repo, before_changeset_revision ):
"""
Return the downloadable changeset_revision in the repository changelog just prior to the changeset to which before_changeset_revision
refers. If there isn't one, return the hash value of an empty repository changlog, INITIAL_CHANGELOG_HASH.
@@ -1087,12 +1085,9 @@
# Update the last saved repository_metadata table row.
repository_metadata.changeset_revision = changeset_revision
repository_metadata.metadata = metadata_dict
+ repository_metadata.downloadable = changeset_is_downloadable( metadata_dict )
trans.sa_session.add( repository_metadata )
- try:
- trans.sa_session.flush()
- except TypeError, e:
- message = "Unable to save metadata for this repository probably due to a tool config file that doesn't conform to the Cheetah template syntax."
- status = 'error'
+ trans.sa_session.flush()
else:
# There are no tools in the repository, and we're setting metadata on the repository tip.
repository_metadata = trans.model.RepositoryMetadata( repository.id, changeset_revision, metadata_dict )
@@ -1102,6 +1097,7 @@
# We're re-generating metadata for an old repository revision.
repository_metadata = get_repository_metadata_by_changeset_revision( trans, id, changeset_revision )
repository_metadata.metadata = metadata_dict
+ repository_metadata.downloadable = changeset_is_downloadable( metadata_dict )
trans.sa_session.add( repository_metadata )
trans.sa_session.flush()
elif updating_tip and len( repo ) == 1 and not invalid_files:
diff -r eff8b196858c1ff5a6227bd750a06ea924f8530c -r 0ffcc91708233cc087d9996235f0917b377cfe8a lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -75,10 +75,7 @@
def __init__( self, col_name ):
grids.GridColumn.__init__( self, col_name )
def get_value( self, trans, grid, repository ):
- """
- Display a SelectField whose options are the changeset_revision
- strings of all downloadable_revisions of this repository.
- """
+ """Display a SelectField whose options are the changeset_revision strings of all downloadable_revisions of this repository."""
select_field = build_changeset_revision_select_field( trans, repository )
if len( select_field.options ) > 1:
return select_field.get_html()
@@ -245,22 +242,10 @@
filterable="standard" ) )
operations = []
def build_initial_query( self, trans, **kwd ):
- # The clause_list approach is to filter out those repositories that include metadata, but only because they contain 'invalid_tools' in
- # the metadata (i.e., they don't have valid tools, datatypes or workflows). Is there a better approach?
- clause_list = []
- for repository_metadata in trans.sa_session.query( trans.model.RepositoryMetadata ) \
- .filter( trans.model.RepositoryMetadata.table.c.malicious == False ):
- metadata = repository_metadata.metadata
- if 'datatypes' in metadata or'tools' in metadata or 'workflows' in metadata:
- clause_list.append( trans.model.RepositoryMetadata.table.c.id == repository_metadata.id )
- if clause_list:
- return trans.sa_session.query( self.model_class ) \
- .join( model.RepositoryMetadata.table ) \
- .join( model.User.table ) \
- .filter( or_( *clause_list ) )
return trans.sa_session.query( self.model_class ) \
.join( model.RepositoryMetadata.table ) \
- .join( model.User.table )
+ .join( model.User.table ) \
+ .filter( model.RepositoryMetadata.table.c.downloadable == True )
class MatchedRepositoryListGrid( grids.Grid ):
class NameColumn( grids.TextColumn ):
@@ -400,7 +385,8 @@
for repository in trans.sa_session.query( trans.model.Repository ) \
.filter( trans.model.Repository.table.c.deleted == False ) \
.order_by( trans.model.Repository.table.c.name ):
- for downloadable_revision in repository.downloadable_revisions:
+ # A repository's metadata_revisions are those that ignore the value of the repository_metadata.downloadable column.
+ for downloadable_revision in repository.metadata_revisions:
metadata = downloadable_revision.metadata
invalid_tools = metadata.get( 'invalid_tools', [] )
for invalid_tool_config in invalid_tools:
@@ -410,7 +396,7 @@
.filter( and_( trans.model.Repository.table.c.deleted == False,
trans.model.Repository.table.c.user_id == trans.user.id ) ) \
.order_by( trans.model.Repository.table.c.name ):
- for downloadable_revision in repository.downloadable_revisions:
+ for downloadable_revision in repository.metadata_revisions:
metadata = downloadable_revision.metadata
invalid_tools = metadata.get( 'invalid_tools', [] )
for invalid_tool_config in invalid_tools:
@@ -1595,7 +1581,7 @@
repo_dir = repository.repo_path
repo = hg.repository( get_configured_ui(), repo_dir )
# Get the lower bound changeset revision
- lower_bound_changeset_revision = get_previous_valid_changset_revision( repository, repo, changeset_revision )
+ lower_bound_changeset_revision = get_previous_downloadable_changset_revision( repository, repo, changeset_revision )
# Build the list of changeset revision hashes.
changeset_hashes = []
for changeset in reversed_lower_upper_bounded_changelog( repo, lower_bound_changeset_revision, changeset_revision ):
diff -r eff8b196858c1ff5a6227bd750a06ea924f8530c -r 0ffcc91708233cc087d9996235f0917b377cfe8a lib/galaxy/webapps/community/controllers/upload.py
--- a/lib/galaxy/webapps/community/controllers/upload.py
+++ b/lib/galaxy/webapps/community/controllers/upload.py
@@ -130,9 +130,6 @@
error, error_message = handle_sample_tool_data_table_conf_file( trans.app, full_path )
if error:
message = '%s<br/>%s' % ( message, error_message )
- #if full_path.endswith( '.loc.sample' ):
- # # Handle the special case where a xxx.loc.sample file is being uploaded by copying it to ~/tool-data/xxx.loc.
- # copy_sample_file( trans.app, full_path )
# See if the content of the change set was valid.
admin_only = len( repository.downloadable_revisions ) != 1
handle_email_alerts( trans, repository, content_alert_str=content_alert_str, new_repo_alert=new_repo_alert, admin_only=admin_only )
@@ -272,7 +269,6 @@
if error:
return False, message, files_to_remove, content_alert_str, undesirable_dirs_removed, undesirable_files_removed
commands.commit( repo.ui, repo, full_path, user=trans.user.username, message=commit_message )
- # See if the content of the change set was valid.
admin_only = len( repository.downloadable_revisions ) != 1
handle_email_alerts( trans, repository, content_alert_str=content_alert_str, new_repo_alert=new_repo_alert, admin_only=admin_only )
return True, '', files_to_remove, content_alert_str, undesirable_dirs_removed, undesirable_files_removed
diff -r eff8b196858c1ff5a6227bd750a06ea924f8530c -r 0ffcc91708233cc087d9996235f0917b377cfe8a lib/galaxy/webapps/community/model/mapping.py
--- a/lib/galaxy/webapps/community/model/mapping.py
+++ b/lib/galaxy/webapps/community/model/mapping.py
@@ -121,7 +121,8 @@
Column( "changeset_revision", TrimmedString( 255 ), index=True ),
Column( "metadata", JSONType, nullable=True ),
Column( "tool_versions", JSONType, nullable=True ),
- Column( "malicious", Boolean, default=False ) )
+ Column( "malicious", Boolean, default=False ),
+ Column( "downloadable", Boolean, default=True ) )
RepositoryRatingAssociation.table = Table( "repository_rating_association", metadata,
Column( "id", Integer, primary_key=True ),
@@ -196,7 +197,11 @@
categories=relation( RepositoryCategoryAssociation ),
ratings=relation( RepositoryRatingAssociation, order_by=desc( RepositoryRatingAssociation.table.c.update_time ), backref="repositories" ),
user=relation( User.mapper ),
- downloadable_revisions=relation( RepositoryMetadata, order_by=desc( RepositoryMetadata.table.c.update_time ) ) ) )
+ downloadable_revisions=relation( RepositoryMetadata,
+ primaryjoin=( ( Repository.table.c.id == RepositoryMetadata.table.c.repository_id ) & ( RepositoryMetadata.table.c.downloadable == True ) ),
+ order_by=desc( RepositoryMetadata.table.c.update_time ) ),
+ metadata_revisions=relation( RepositoryMetadata,
+ order_by=desc( RepositoryMetadata.table.c.update_time ) ) ) )
assign_mapper( context, RepositoryMetadata, RepositoryMetadata.table,
properties=dict( repository=relation( Repository ) ) )
diff -r eff8b196858c1ff5a6227bd750a06ea924f8530c -r 0ffcc91708233cc087d9996235f0917b377cfe8a lib/galaxy/webapps/community/model/migrate/check.py
--- a/lib/galaxy/webapps/community/model/migrate/check.py
+++ b/lib/galaxy/webapps/community/model/migrate/check.py
@@ -77,8 +77,10 @@
# Verify that the code and the DB are in sync
db_schema = schema.ControlledSchema( engine, migrate_repository )
if migrate_repository.versions.latest != db_schema.version:
- raise Exception( "Your database has version '%d' but this code expects version '%d'. Please backup your database and then migrate the schema by running 'sh manage_db.sh upgrade'."
- % ( db_schema.version, migrate_repository.versions.latest ) )
+ exception_msg = "Your database has version '%d' but this code expects version '%d'. " % ( db_schema.version, migrate_repository.versions.latest )
+ exception_msg += "Back up your database and then migrate the schema by running the following from your Galaxy installation directory:"
+ exception_msg += "\n\nsh manage_db.sh upgrade community\n"
+ raise Exception( exception_msg )
else:
log.info( "At database version %d" % db_schema.version )
diff -r eff8b196858c1ff5a6227bd750a06ea924f8530c -r 0ffcc91708233cc087d9996235f0917b377cfe8a lib/galaxy/webapps/community/model/migrate/versions/0012_add_downloadable_column.py
--- /dev/null
+++ b/lib/galaxy/webapps/community/model/migrate/versions/0012_add_downloadable_column.py
@@ -0,0 +1,48 @@
+"""
+Migration script to add the downloadable column to the repository_metadata table.
+"""
+
+from sqlalchemy import *
+from sqlalchemy.orm import *
+from migrate import *
+from migrate.changeset import *
+
+import sys, logging
+log = logging.getLogger( __name__ )
+log.setLevel(logging.DEBUG)
+handler = logging.StreamHandler( sys.stdout )
+format = "%(name)s %(levelname)s %(asctime)s %(message)s"
+formatter = logging.Formatter( format )
+handler.setFormatter( formatter )
+log.addHandler( handler )
+
+metadata = MetaData( migrate_engine )
+db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) )
+
+def upgrade():
+ print __doc__
+ metadata.reflect()
+ # Create and initialize imported column in job table.
+ RepositoryMetadata_table = Table( "repository_metadata", metadata, autoload=True )
+ c = Column( "downloadable", Boolean, default=True )
+ try:
+ # Create
+ c.create( RepositoryMetadata_table )
+ assert c is RepositoryMetadata_table.c.downloadable
+ # Initialize.
+ if migrate_engine.name == 'mysql' or migrate_engine.name == 'sqlite':
+ default_true = "1"
+ elif migrate_engine.name == 'postgres':
+ default_true = "true"
+ db_session.execute( "UPDATE repository_metadata SET downloadable=%s" % default_true )
+ except Exception, e:
+ print "Adding downloadable column to the repository_metadata table failed: %s" % str( e )
+
+def downgrade():
+ metadata.reflect()
+ # Drop downloadable column from repository_metadata table.
+ RepositoryMetadata_table = Table( "repository_metadata", metadata, autoload=True )
+ try:
+ RepositoryMetadata_table.c.downloadable.drop()
+ except Exception, e:
+ print "Dropping column downloadable from the repository_metadata table failed: %s" % str( e )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: jgoecks: Add introductory help text for paramamonster.
by Bitbucket 05 Jul '12
by Bitbucket 05 Jul '12
05 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/eff8b196858c/
changeset: eff8b196858c
user: jgoecks
date: 2012-07-05 17:26:24
summary: Add introductory help text for paramamonster.
affected #: 3 files
diff -r 202c6a7dae95450eb9781c8df6fdc0c2795b6968 -r eff8b196858c1ff5a6227bd750a06ea924f8530c static/scripts/packed/viz/paramamonster.js
--- a/static/scripts/packed/viz/paramamonster.js
+++ b/static/scripts/packed/viz/paramamonster.js
@@ -1,1 +1,1 @@
-var ToolInputsSettings=Backbone.Model.extend({defaults:{inputs:null,values:null}});var ToolParameterTree=Backbone.RelationalModel.extend({defaults:{tool:null,tree_data:null},initialize:function(b){var a=this;this.get("tool").get("inputs").each(function(c){if(!c.get_samples()){return}c.on("change:min change:max change:num_samples",function(d){if(d.get("in_ptree")){a.set_tree_data()}},a);c.on("change:in_ptree",function(d){if(d.get("in_ptree")){a.add_param(d)}else{a.remove_param(d)}a.set_tree_data()},a)});if(b.config){_.each(b.config,function(d){var c=a.get("tool").get("inputs").find(function(e){return e.get("name")===d.name});a.add_param(c);c.set(d)})}},add_param:function(a){if(a.get("ptree_index")){return}a.set("in_ptree",true);a.set("ptree_index",this.get_tree_params().length)},remove_param:function(a){a.set("in_ptree",false);a.set("ptree_index",null);_(this.get_tree_params()).each(function(b,c){b.set("ptree_index",c+1)})},set_tree_data:function(){var b=_.map(this.get_tree_params(),function(d){return{param:d,samples:d.get_samples()}});var a=0,c=function(g,d){var i=g[d],h=i.param,f=h.get("label"),e=i.samples;if(g.length-1===d){return _.map(e,function(j){return{id:a++,name:j,param:h,value:j}})}return _.map(e,function(j){return{id:a++,name:j,param:h,value:j,children:c(g,d+1)}})};this.set("tree_data",{name:"Root",id:a++,children:(b.length!==0?c(b,0):null)})},get_tree_params:function(){return _(this.get("tool").get("inputs").where({in_ptree:true})).sortBy(function(a){return a.get("ptree_index")})},get_num_leaves:function(){return this.get_tree_params().reduce(function(a,b){return a*b.get_samples().length},1)},get_node_settings:function(e){var c=this.get("tool").get_inputs_dict();var f=e.parent;if(f){while(f.depth!==0){c[f.param.get("name")]=f.value;f=f.parent}}var a=this,b=function(h,g){if(h.param){g[h.param.get("name")]=h.value}if(!h.children){return new ToolInputsSettings({inputs:a.get("tool").get("inputs"),values:g})}else{return _.flatten(_.map(h.children,function(i){return b(i,_.clone(g))}))}},d=b(e,c);if(!_.isArray(d)){d=[d]}return d},get_connected_nodes:function(c){var d=function(e){if(!e.children){return e}else{return _.flatten([e,_.map(e.children,function(f){return d(f)})])}};var b=[],a=c.parent;while(a){b.push(a);a=a.parent}return _.flatten([b,d(c)])},get_leaf:function(b){var c=this.get("tree_data"),a=function(d){return _.find(d,function(e){return b[e.param.get("name")]===e.value})};while(c.children){c=a(c.children)}return c},toJSON:function(){return this.get_tree_params().map(function(a){return{name:a.get("name"),min:a.get("min"),max:a.get("max"),num_samples:a.get("num_samples")}})}});var ParamaMonsterTrack=Backbone.RelationalModel.extend({defaults:{track:null,settings:null,regions:null},relations:[{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"}],initialize:function(a){if(a.track){var b=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},a.track);delete b.mode;this.set("track",object_from_template(b,{},null))}},same_settings:function(a){var b=this.get("settings"),c=a.get("settings");for(var d in b){if(!c[d]||b[d]!==c[d]){return false}}return true},toJSON:function(){return{track:this.get("track").to_dict(),settings:this.get("settings"),regions:this.get("regions")}}});var TrackCollection=Backbone.Collection.extend({model:ParamaMonsterTrack});var ParamaMonsterVisualization=Visualization.extend({defaults:_.extend({},Visualization.prototype.defaults,{dataset:null,tool:null,parameter_tree:null,regions:null,tracks:null}),relations:[{type:Backbone.HasOne,key:"dataset",relatedModel:"Dataset"},{type:Backbone.HasOne,key:"tool",relatedModel:"Tool"},{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"},{type:Backbone.HasMany,key:"tracks",relatedModel:"ParamaMonsterTrack"}],initialize:function(a){var b=this.get("tool").copy(true);this.set("tool_with_samplable_inputs",b);this.set("parameter_tree",new ToolParameterTree({tool:b,config:a.tree_config}))},add_placeholder:function(a){this.get("tracks").add(new PlaceholderTrack(a))},add_track:function(a){this.get("tracks").add(a)},toJSON:function(){return{id:this.get("id"),title:"Parameter exploration for dataset '"+this.get("dataset").get("name")+"'",type:"paramamonster",dataset_id:this.get("dataset").id,tool_id:this.get("tool").id,regions:this.get("regions").toJSON(),tree_config:this.get("parameter_tree").toJSON(),tracks:this.get("tracks").toJSON()}}});var ParamaMonsterTrackView=Backbone.View.extend({tagName:"tr",TILE_LEN:250,initialize:function(a){this.canvas_manager=a.canvas_manager;this.render();this.model.on("change:track",this.draw_tiles,this)},render:function(){var f=this.model.get("settings"),b=f.get("values"),d=$("<td/>").addClass("settings").appendTo(this.$el),c=$("<div/>").addClass("track-info").hide().appendTo(d);c.append($("<div/>").css("font-weight","bold").text("Track Settings"));f.get("inputs").each(function(h){c.append(h.get("label")+": "+b[h.get("name")]+"<br/>")});var a=this,g=$("<button/>").appendTo(c).text("Run on complete dataset").click(function(){c.toggle();a.trigger("run_on_dataset",f)});var e=create_icon_buttons_menu([{title:"Settings",icon_class:"gear track-settings",on_click:function(){c.toggle()},tipsy_config:{gravity:"s"}},{title:"Remove",icon_class:"cross-circle",on_click:function(){a.$el.remove();$(".tipsy").remove()}}]);d.prepend(e.$el);this.model.get("regions").each(function(){a.$el.append($("<td/>").addClass("tile").html($("<img/>").attr("src",galaxy_paths.get("image_path")+"/loading_large_white_bg.gif")))});if(this.model.get("track")){this.draw_tiles()}},draw_tiles:function(){var b=this,a=this.model.get("track"),d=this.model.get("regions"),c=this.$el.find("td.tile");$.when(a.data_manager.data_is_ready()).then(function(e){d.each(function(h,g){var f=h.length()/b.TILE_LEN,j=1/f,i="Pack";$.when(a.data_manager.get_data(h,i,f,{})).then(function(l){var k=b.canvas_manager.new_canvas();k.width=b.TILE_LEN;k.height=a.get_canvas_height(l,i,j,k.width);a.draw_tile(l,k.getContext("2d"),i,f,h,j);$(c[g]).empty().append(k)})})})}});var ToolInputValOrSweepView=Backbone.View.extend({number_input_template:'<div class="form-row-input sweep"><input class="min" type="text" size="6" value="<%= min %>"> - <input class="max" type="text" size="6" value="<%= max %>"> samples: <input class="num_samples" type="text" size="1" value="<%= num_samples %>"></div>',select_input_template:'<div class="form-row-input sweep"><%= options %></div>',initialize:function(a){this.$el=a.tool_row;this.render()},render:function(){var b=this.model,f=b.get("type"),h=this.$el.find(".form-row-input"),d=null;h.find(":input").change(function(){b.set("value",$(this).val())});if(f==="number"){d=$(_.template(this.number_input_template,this.model.toJSON()))}else{if(f==="select"){var c=_.map(this.$el.find("select option"),function(i){return $(i).val()}),e=c.join(", ");d=$(_.template(this.select_input_template,{options:e}))}}d.insertAfter(h);var a=this,g=create_icon_buttons_menu([{title:"Add parameter to tree",icon_class:"plus-button",on_click:function(){b.set("in_ptree",true);h.hide();d.show();$(this).hide();a.$el.find(".icon-button.toggle").show()}},{title:"Remove parameter from tree",icon_class:"toggle",on_click:function(){b.set("in_ptree",false);d.hide();h.show();$(this).hide();a.$el.find(".icon-button.plus-button").show()}}],{tipsy_config:{gravity:"s"}});this.$el.prepend(g.$el);if(b.get("in_ptree")){h.hide();a.$el.find(".icon-button.plus-button").hide()}else{a.$el.find(".icon-button.toggle").hide();d.hide()}_.each(["min","max","num_samples"],function(i){d.find("."+i).change(function(){b.set(i,parseFloat($(this).val()))})})}});var ToolParameterTreeDesignView=Backbone.View.extend({className:"tree-design",initialize:function(a){this.render()},render:function(){var c=new ToolFormView({model:this.model.get("tool")});c.render();this.$el.append(c.$el);var b=this,a=b.model.get("tool").get("inputs");this.$el.find(".form-row").not(".form-actions").each(function(d){var e=new ToolInputValOrSweepView({model:a.at(d),tool_row:$(this)})})}});var ToolParameterTreeView=Backbone.View.extend({className:"tool-parameter-tree",initialize:function(a){this.model.on("change:tree_data",this.render,this)},render:function(){this.$el.children().remove();var i=this.model.get_tree_params();if(!i.length){return}this.width=100*(2+i.length);this.height=15*this.model.get_num_leaves();var h=this;var g=d3.layout.cluster().size([this.height,this.width-160]);var c=d3.svg.diagonal().projection(function(j){return[j.y,j.x]});var a=g.nodes(this.model.get("tree_data"));var d=_.uniq(_.pluck(a,"y"));_.each(i,function(l,k){var j=d[k+1];h.$el.append($("<div>").addClass("label").text(l.get("label")).css("left",j+250))});var b=d3.select(this.$el[0]).append("svg").attr("width",this.width).attr("height",this.height+20).append("g").attr("transform","translate(40, 10)");var f=b.selectAll("path.link").data(g.links(a)).enter().append("path").attr("class","link").attr("d",c);var e=b.selectAll("g.node").data(a).enter().append("g").attr("class","node").attr("transform",function(j){return"translate("+j.y+","+j.x+")"}).on("mouseover",function(k){var j=_.pluck(h.model.get_connected_nodes(k),"id");e.filter(function(l){return _.find(j,function(m){return m===l.id})!==undefined}).style("fill","#f00")}).on("mouseout",function(){e.style("fill","#000")});e.append("circle").attr("r",9);e.append("text").attr("dx",function(j){return j.children?-12:12}).attr("dy",3).attr("text-anchor",function(j){return j.children?"end":"start"}).text(function(j){return j.name})}});var ParamaMonsterVisualizationView=Backbone.View.extend({className:"paramamonster",initialize:function(b){this.canvas_manager=new CanvasManager(this.$el.parents("body"));this.tool_param_tree_view=new ToolParameterTreeView({model:this.model.get("parameter_tree")});this.track_collection_container=$("<table/>").addClass("tracks");this.model.get("parameter_tree").on("change:tree_data",this.handle_node_clicks,this);var a=this;this.model.get("tracks").each(function(c){c.get("track").view=a})},render:function(){var d=new ToolParameterTreeDesignView({model:this.model.get("parameter_tree")});$("#left").append(d.$el);var a=this,e=a.model.get("regions"),b=$("<tr/>").appendTo(this.track_collection_container);e.each(function(f){b.append($("<th>").text(f.toString()))});b.children().first().attr("colspan",2);var c=$("<div>").addClass("tiles");$("#right").append(c.append(this.track_collection_container));a.model.get("tracks").each(function(f){a.add_track(f)});this.tool_param_tree_view.render();$("#center").append(this.tool_param_tree_view.$el);this.handle_node_clicks()},run_tool_on_dataset:function(b){var a=this.model.get("tool"),d=a.get("name"),c=this.model.get("dataset");a.set_input_values(b.get("values"));$.when(a.rerun(c)).then(function(e){});show_modal("Running "+d+" on complete dataset",d+" is running on dataset '"+c.get("name")+"'. Outputs are in the dataset's history.",{Ok:function(){hide_modal()}})},add_track:function(d){var b=this,c=this.model.get("parameter_tree");b.model.add_track(d);var a=new ParamaMonsterTrackView({model:d,canvas_manager:b.canvas_manager});a.on("run_on_dataset",b.run_tool_on_dataset,b);b.track_collection_container.append(a.$el);a.$el.hover(function(){var f=c.get_leaf(d.get("settings").get("values"));var e=_.pluck(c.get_connected_nodes(f),"id");d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").filter(function(g){return _.find(e,function(h){return h===g.id})!==undefined}).style("fill","#f00")},function(){d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").style("fill","#000")});return d},handle_node_clicks:function(){var a=this,b=this.model.get("parameter_tree"),d=this.model.get("regions"),c=d3.select(this.tool_param_tree_view.$el[0]).selectAll("g.node");c.on("click",function(k,g){var f=a.model.get("tool"),j=a.model.get("dataset"),h=b.get_node_settings(k),e=$.Deferred();if(h.length>=10){show_modal("Whoa there cowboy!","You clicked on a node to try "+a.model.get("tool").get("name")+" with "+h.length+" different combinations of settings. You can only run 10 jobs at a time.",{Ok:function(){hide_modal();e.resolve(false)}})}else{e.resolve(true)}$.when(e).then(function(i){if(!i){return}var l=_.map(h,function(m){var n=new ParamaMonsterTrack({settings:m,regions:d});a.add_track(n);return n});_.each(l,function(n,m){setTimeout(function(){f.set_input_values(n.get("settings").get("values"));$.when(f.rerun(j,d)).then(function(p){var q=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},p.first().get("track_config")),o=object_from_template(q,a,null);n.set("track",o)})},m*10000)})})})}});
\ No newline at end of file
+var ToolInputsSettings=Backbone.Model.extend({defaults:{inputs:null,values:null}});var ToolParameterTree=Backbone.RelationalModel.extend({defaults:{tool:null,tree_data:null},initialize:function(b){var a=this;this.get("tool").get("inputs").each(function(c){if(!c.get_samples()){return}c.on("change:min change:max change:num_samples",function(d){if(d.get("in_ptree")){a.set_tree_data()}},a);c.on("change:in_ptree",function(d){if(d.get("in_ptree")){a.add_param(d)}else{a.remove_param(d)}a.set_tree_data()},a)});if(b.config){_.each(b.config,function(d){var c=a.get("tool").get("inputs").find(function(e){return e.get("name")===d.name});a.add_param(c);c.set(d)})}},add_param:function(a){if(a.get("ptree_index")){return}a.set("in_ptree",true);a.set("ptree_index",this.get_tree_params().length)},remove_param:function(a){a.set("in_ptree",false);a.set("ptree_index",null);_(this.get_tree_params()).each(function(b,c){b.set("ptree_index",c+1)})},set_tree_data:function(){var b=_.map(this.get_tree_params(),function(d){return{param:d,samples:d.get_samples()}});var a=0,c=function(g,d){var i=g[d],h=i.param,f=h.get("label"),e=i.samples;if(g.length-1===d){return _.map(e,function(j){return{id:a++,name:j,param:h,value:j}})}return _.map(e,function(j){return{id:a++,name:j,param:h,value:j,children:c(g,d+1)}})};this.set("tree_data",{name:"Root",id:a++,children:(b.length!==0?c(b,0):null)})},get_tree_params:function(){return _(this.get("tool").get("inputs").where({in_ptree:true})).sortBy(function(a){return a.get("ptree_index")})},get_num_leaves:function(){return this.get_tree_params().reduce(function(a,b){return a*b.get_samples().length},1)},get_node_settings:function(e){var c=this.get("tool").get_inputs_dict();var f=e.parent;if(f){while(f.depth!==0){c[f.param.get("name")]=f.value;f=f.parent}}var a=this,b=function(h,g){if(h.param){g[h.param.get("name")]=h.value}if(!h.children){return new ToolInputsSettings({inputs:a.get("tool").get("inputs"),values:g})}else{return _.flatten(_.map(h.children,function(i){return b(i,_.clone(g))}))}},d=b(e,c);if(!_.isArray(d)){d=[d]}return d},get_connected_nodes:function(c){var d=function(e){if(!e.children){return e}else{return _.flatten([e,_.map(e.children,function(f){return d(f)})])}};var b=[],a=c.parent;while(a){b.push(a);a=a.parent}return _.flatten([b,d(c)])},get_leaf:function(b){var c=this.get("tree_data"),a=function(d){return _.find(d,function(e){return b[e.param.get("name")]===e.value})};while(c.children){c=a(c.children)}return c},toJSON:function(){return this.get_tree_params().map(function(a){return{name:a.get("name"),min:a.get("min"),max:a.get("max"),num_samples:a.get("num_samples")}})}});var ParamaMonsterTrack=Backbone.RelationalModel.extend({defaults:{track:null,settings:null,regions:null},relations:[{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"}],initialize:function(a){if(a.track){var b=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},a.track);delete b.mode;this.set("track",object_from_template(b,{},null))}},same_settings:function(a){var b=this.get("settings"),c=a.get("settings");for(var d in b){if(!c[d]||b[d]!==c[d]){return false}}return true},toJSON:function(){return{track:this.get("track").to_dict(),settings:this.get("settings"),regions:this.get("regions")}}});var TrackCollection=Backbone.Collection.extend({model:ParamaMonsterTrack});var ParamaMonsterVisualization=Visualization.extend({defaults:_.extend({},Visualization.prototype.defaults,{dataset:null,tool:null,parameter_tree:null,regions:null,tracks:null}),relations:[{type:Backbone.HasOne,key:"dataset",relatedModel:"Dataset"},{type:Backbone.HasOne,key:"tool",relatedModel:"Tool"},{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"},{type:Backbone.HasMany,key:"tracks",relatedModel:"ParamaMonsterTrack"}],initialize:function(a){var b=this.get("tool").copy(true);this.set("tool_with_samplable_inputs",b);this.set("parameter_tree",new ToolParameterTree({tool:b,config:a.tree_config}))},add_placeholder:function(a){this.get("tracks").add(new PlaceholderTrack(a))},add_track:function(a){this.get("tracks").add(a)},toJSON:function(){return{id:this.get("id"),title:"Parameter exploration for dataset '"+this.get("dataset").get("name")+"'",type:"paramamonster",dataset_id:this.get("dataset").id,tool_id:this.get("tool").id,regions:this.get("regions").toJSON(),tree_config:this.get("parameter_tree").toJSON(),tracks:this.get("tracks").toJSON()}}});var ParamaMonsterTrackView=Backbone.View.extend({tagName:"tr",TILE_LEN:250,initialize:function(a){this.canvas_manager=a.canvas_manager;this.render();this.model.on("change:track",this.draw_tiles,this)},render:function(){var f=this.model.get("settings"),b=f.get("values"),d=$("<td/>").addClass("settings").appendTo(this.$el),c=$("<div/>").addClass("track-info").hide().appendTo(d);c.append($("<div/>").css("font-weight","bold").text("Track Settings"));f.get("inputs").each(function(h){c.append(h.get("label")+": "+b[h.get("name")]+"<br/>")});var a=this,g=$("<button/>").appendTo(c).text("Run on complete dataset").click(function(){c.toggle();a.trigger("run_on_dataset",f)});var e=create_icon_buttons_menu([{title:"Settings",icon_class:"gear track-settings",on_click:function(){c.toggle()},tipsy_config:{gravity:"s"}},{title:"Remove",icon_class:"cross-circle",on_click:function(){a.$el.remove();$(".tipsy").remove()}}]);d.prepend(e.$el);this.model.get("regions").each(function(){a.$el.append($("<td/>").addClass("tile").html($("<img/>").attr("src",galaxy_paths.get("image_path")+"/loading_large_white_bg.gif")))});if(this.model.get("track")){this.draw_tiles()}},draw_tiles:function(){var b=this,a=this.model.get("track"),d=this.model.get("regions"),c=this.$el.find("td.tile");$.when(a.data_manager.data_is_ready()).then(function(e){d.each(function(h,g){var f=h.length()/b.TILE_LEN,j=1/f,i="Pack";$.when(a.data_manager.get_data(h,i,f,{})).then(function(l){var k=b.canvas_manager.new_canvas();k.width=b.TILE_LEN;k.height=a.get_canvas_height(l,i,j,k.width);a.draw_tile(l,k.getContext("2d"),i,f,h,j);$(c[g]).empty().append(k)})})})}});var ToolInputValOrSweepView=Backbone.View.extend({number_input_template:'<div class="form-row-input sweep"><input class="min" type="text" size="6" value="<%= min %>"> - <input class="max" type="text" size="6" value="<%= max %>"> samples: <input class="num_samples" type="text" size="1" value="<%= num_samples %>"></div>',select_input_template:'<div class="form-row-input sweep"><%= options %></div>',initialize:function(a){this.$el=a.tool_row;this.render()},render:function(){var b=this.model,f=b.get("type"),h=this.$el.find(".form-row-input"),d=null;h.find(":input").change(function(){b.set("value",$(this).val())});if(f==="number"){d=$(_.template(this.number_input_template,this.model.toJSON()))}else{if(f==="select"){var c=_.map(this.$el.find("select option"),function(i){return $(i).val()}),e=c.join(", ");d=$(_.template(this.select_input_template,{options:e}))}}d.insertAfter(h);var a=this,g=create_icon_buttons_menu([{title:"Add parameter to tree",icon_class:"plus-button",on_click:function(){b.set("in_ptree",true);h.hide();d.show();$(this).hide();a.$el.find(".icon-button.toggle").show()}},{title:"Remove parameter from tree",icon_class:"toggle",on_click:function(){b.set("in_ptree",false);d.hide();h.show();$(this).hide();a.$el.find(".icon-button.plus-button").show()}}],{tipsy_config:{gravity:"s"}});this.$el.prepend(g.$el);if(b.get("in_ptree")){h.hide();a.$el.find(".icon-button.plus-button").hide()}else{a.$el.find(".icon-button.toggle").hide();d.hide()}_.each(["min","max","num_samples"],function(i){d.find("."+i).change(function(){b.set(i,parseFloat($(this).val()))})})}});var ToolParameterTreeDesignView=Backbone.View.extend({className:"tree-design",initialize:function(a){this.render()},render:function(){var c=new ToolFormView({model:this.model.get("tool")});c.render();this.$el.append(c.$el);var b=this,a=b.model.get("tool").get("inputs");this.$el.find(".form-row").not(".form-actions").each(function(d){var e=new ToolInputValOrSweepView({model:a.at(d),tool_row:$(this)})})}});var ToolParameterTreeView=Backbone.View.extend({className:"tool-parameter-tree",initialize:function(a){this.model.on("change:tree_data",this.render,this)},render:function(){this.$el.children().remove();var i=this.model.get_tree_params();if(!i.length){return}this.width=100*(2+i.length);this.height=15*this.model.get_num_leaves();var h=this;var g=d3.layout.cluster().size([this.height,this.width-160]);var c=d3.svg.diagonal().projection(function(j){return[j.y,j.x]});var a=g.nodes(this.model.get("tree_data"));var d=_.uniq(_.pluck(a,"y"));_.each(i,function(l,k){var j=d[k+1],m=$("#center").position().left;h.$el.append($("<div>").addClass("label").text(l.get("label")).css("left",j+m))});var b=d3.select(this.$el[0]).append("svg").attr("width",this.width).attr("height",this.height+20).append("g").attr("transform","translate(40, 10)");var f=b.selectAll("path.link").data(g.links(a)).enter().append("path").attr("class","link").attr("d",c);var e=b.selectAll("g.node").data(a).enter().append("g").attr("class","node").attr("transform",function(j){return"translate("+j.y+","+j.x+")"}).on("mouseover",function(k){var j=_.pluck(h.model.get_connected_nodes(k),"id");e.filter(function(l){return _.find(j,function(m){return m===l.id})!==undefined}).style("fill","#f00")}).on("mouseout",function(){e.style("fill","#000")});e.append("circle").attr("r",9);e.append("text").attr("dx",function(j){return j.children?-12:12}).attr("dy",3).attr("text-anchor",function(j){return j.children?"end":"start"}).text(function(j){return j.name})}});var ParamaMonsterVisualizationView=Backbone.View.extend({className:"paramamonster",helpText:"<div><h4>Getting Started</h4><ol><li>Create a parameter tree by using the icons next to the tool's parameter names to add or remove parameters.<li>Adjust the tree by using parameter inputs to select min, max, and number of samples<li>Run the tool with different settings by clicking on tree nodes</ol></div>",initialize:function(b){this.canvas_manager=new CanvasManager(this.$el.parents("body"));this.tool_param_tree_view=new ToolParameterTreeView({model:this.model.get("parameter_tree")});this.track_collection_container=$("<table/>").addClass("tracks");this.model.get("parameter_tree").on("change:tree_data",this.handle_node_clicks,this);var a=this;this.model.get("tracks").each(function(c){c.get("track").view=a})},render:function(){var f=new ToolParameterTreeDesignView({model:this.model.get("parameter_tree")});$("#left").append(f.$el);var b=this,g=b.model.get("regions"),c=$("<tr/>").appendTo(this.track_collection_container);g.each(function(h){c.append($("<th>").text(h.toString()))});c.children().first().attr("colspan",2);var e=$("<div>").addClass("tiles");$("#right").append(e.append(this.track_collection_container));b.model.get("tracks").each(function(h){b.add_track(h)});var d=$(this.helpText).addClass("help"),a=create_icon_buttons_menu([{title:"Close",icon_class:"cross-circle",on_click:function(){$(".tipsy").remove();d.remove()},tipsy_config:{gravity:"s"}}]);d.prepend(a.$el.css("float","right"));$("#center").append(d);this.tool_param_tree_view.render();$("#center").append(this.tool_param_tree_view.$el);this.handle_node_clicks()},run_tool_on_dataset:function(b){var a=this.model.get("tool"),d=a.get("name"),c=this.model.get("dataset");a.set_input_values(b.get("values"));$.when(a.rerun(c)).then(function(e){});show_modal("Running "+d+" on complete dataset",d+" is running on dataset '"+c.get("name")+"'. Outputs are in the dataset's history.",{Ok:function(){hide_modal()}})},add_track:function(d){var b=this,c=this.model.get("parameter_tree");b.model.add_track(d);var a=new ParamaMonsterTrackView({model:d,canvas_manager:b.canvas_manager});a.on("run_on_dataset",b.run_tool_on_dataset,b);b.track_collection_container.append(a.$el);a.$el.hover(function(){var f=c.get_leaf(d.get("settings").get("values"));var e=_.pluck(c.get_connected_nodes(f),"id");d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").filter(function(g){return _.find(e,function(h){return h===g.id})!==undefined}).style("fill","#f00")},function(){d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").style("fill","#000")});return d},handle_node_clicks:function(){var a=this,b=this.model.get("parameter_tree"),d=this.model.get("regions"),c=d3.select(this.tool_param_tree_view.$el[0]).selectAll("g.node");c.on("click",function(k,g){var f=a.model.get("tool"),j=a.model.get("dataset"),h=b.get_node_settings(k),e=$.Deferred();if(h.length>=10){show_modal("Whoa there cowboy!","You clicked on a node to try "+a.model.get("tool").get("name")+" with "+h.length+" different combinations of settings. You can only run 10 jobs at a time.",{Ok:function(){hide_modal();e.resolve(false)}})}else{e.resolve(true)}$.when(e).then(function(i){if(!i){return}var l=_.map(h,function(m){var n=new ParamaMonsterTrack({settings:m,regions:d});a.add_track(n);return n});_.each(l,function(n,m){setTimeout(function(){f.set_input_values(n.get("settings").get("values"));$.when(f.rerun(j,d)).then(function(p){var q=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},p.first().get("track_config")),o=object_from_template(q,a,null);n.set("track",o)})},m*10000)})})})}});
\ No newline at end of file
diff -r 202c6a7dae95450eb9781c8df6fdc0c2795b6968 -r eff8b196858c1ff5a6227bd750a06ea924f8530c static/scripts/viz/paramamonster.js
--- a/static/scripts/viz/paramamonster.js
+++ b/static/scripts/viz/paramamonster.js
@@ -626,11 +626,11 @@
// Setup and add labels for tree levels.
var param_depths = _.uniq(_.pluck(nodes, "y"));
_.each(tree_params, function(param, index) {
- var x = param_depths[index+1];
+ var x = param_depths[index+1],
+ center_left = $('#center').position().left;
self.$el.append( $('<div>').addClass('label')
.text(param.get('label'))
- // HACK: add 250 b/c in center panel.
- .css('left', x + 250) );
+ .css('left', x + center_left) );
});
// Set up vis element.
@@ -681,6 +681,13 @@
*/
var ParamaMonsterVisualizationView = Backbone.View.extend({
className: 'paramamonster',
+
+ helpText:
+ '<div><h4>Getting Started</h4>' +
+ '<ol><li>Create a parameter tree by using the icons next to the tool\'s parameter names to add or remove parameters.' +
+ '<li>Adjust the tree by using parameter inputs to select min, max, and number of samples' +
+ '<li>Run the tool with different settings by clicking on tree nodes' +
+ '</ol></div>',
initialize: function(options) {
this.canvas_manager = new CanvasManager(this.$el.parents('body'));
@@ -722,7 +729,26 @@
self.add_track(track);
});
- // Render tool parameter tree in center panel.
+ // -- Render help and tool parameter tree in center panel. --
+
+ // Help includes text and a close button.
+ var help_div = $(this.helpText).addClass('help'),
+ close_button = create_icon_buttons_menu([
+ {
+ title: 'Close',
+ icon_class: 'cross-circle',
+ on_click: function() {
+ $('.tipsy').remove();
+ help_div.remove();
+ },
+ tipsy_config: { gravity: 's' }
+ }
+ ]);
+
+ help_div.prepend(close_button.$el.css('float', 'right'));
+ $('#center').append(help_div);
+
+ // Parameter tree:
this.tool_param_tree_view.render();
$('#center').append(this.tool_param_tree_view.$el);
diff -r 202c6a7dae95450eb9781c8df6fdc0c2795b6968 -r eff8b196858c1ff5a6227bd750a06ea924f8530c templates/visualization/paramamonster.mako
--- a/templates/visualization/paramamonster.mako
+++ b/templates/visualization/paramamonster.mako
@@ -12,9 +12,6 @@
<%def name="stylesheets()">
${parent.stylesheets()}
<style>
- div#center {
- overflow: auto;
- }
.link {
fill: none;
stroke: #ccc;
@@ -84,6 +81,7 @@
#center {
left: 300px;
right: 600px;
+ overflow: auto;
}
#right {
width: 600px;
@@ -96,6 +94,12 @@
left: 0;
right: 0;
}
+ .help {
+ border-radius: 15px;
+ border: solid 1px #CCC;
+ padding: 0px 2px;
+ margin: 10px;
+ }
</style></%def>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: inithello: Cleaned up code, added searchable list of NCBI builds.
by Bitbucket 05 Jul '12
by Bitbucket 05 Jul '12
05 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/202c6a7dae95/
changeset: 202c6a7dae95
user: inithello
date: 2012-07-05 15:56:54
summary: Cleaned up code, added searchable list of NCBI builds.
affected #: 12 files
Diff too large to display.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

05 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/d9c384f7a754/
changeset: d9c384f7a754
user: greg
date: 2012-07-05 15:42:11
summary: Make sure there is an entry for the main public Galaxy tool shed in the tool_sheds_conf.xml file when attempting to determine if tools migrated from the distribution to the tool shed are missing and need to be installed.
affected #: 1 file
diff -r 456f11df0b53897086257b952457d615b3942539 -r d9c384f7a75435173817754300f8e7bef12d8840 lib/galaxy/tool_shed/migrate/common.py
--- a/lib/galaxy/tool_shed/migrate/common.py
+++ b/lib/galaxy/tool_shed/migrate/common.py
@@ -21,39 +21,44 @@
root = tree.getroot()
tool_shed = root.get( 'name' )
tool_shed_url = get_tool_shed_url_from_tools_xml_file_path( app, tool_shed )
- for elem in root:
- if elem.tag == 'repository':
- tool_dependencies = []
- tool_dependencies_dict = {}
- repository_name = elem.get( 'name' )
- changeset_revision = elem.get( 'changeset_revision' )
- url = '%s/repository/get_tool_dependencies?name=%s&owner=%s&changeset_revision=%s&webapp=install_manager&no_reset=true' % \
- ( tool_shed_url, repository_name, REPOSITORY_OWNER, changeset_revision )
- response = urllib2.urlopen( url )
- text = response.read()
- response.close()
- if text:
- tool_dependencies_dict = tool_shed_decode( text )
- for dependency_key, requirements_dict in tool_dependencies_dict.items():
- tool_dependency_name = requirements_dict[ 'name' ]
- tool_dependency_version = requirements_dict[ 'version' ]
- tool_dependency_type = requirements_dict[ 'type' ]
- tool_dependency_readme = requirements_dict.get( 'readme', '' )
- tool_dependencies.append( ( tool_dependency_name, tool_dependency_version, tool_dependency_type, tool_dependency_readme ) )
- for tool_elem in elem.findall( 'tool' ):
- migrated_tool_configs_dict[ tool_elem.get( 'file' ) ] = tool_dependencies
- # Parse the proprietary tool_panel_configs (the default is tool_conf.xml) and generate the list of missing tool config file names.
- missing_tool_configs_dict = odict()
- for tool_panel_config in tool_panel_configs:
- tree = util.parse_xml( tool_panel_config )
- root = tree.getroot()
+ if tool_shed_url:
for elem in root:
- if elem.tag == 'tool':
- missing_tool_configs_dict = check_tool_tag_set( elem, migrated_tool_configs_dict, missing_tool_configs_dict )
- elif elem.tag == 'section':
- for section_elem in elem:
- if section_elem.tag == 'tool':
- missing_tool_configs_dict = check_tool_tag_set( section_elem, migrated_tool_configs_dict, missing_tool_configs_dict )
+ if elem.tag == 'repository':
+ tool_dependencies = []
+ tool_dependencies_dict = {}
+ repository_name = elem.get( 'name' )
+ changeset_revision = elem.get( 'changeset_revision' )
+ url = '%s/repository/get_tool_dependencies?name=%s&owner=%s&changeset_revision=%s&webapp=install_manager&no_reset=true' % \
+ ( tool_shed_url, repository_name, REPOSITORY_OWNER, changeset_revision )
+ response = urllib2.urlopen( url )
+ text = response.read()
+ response.close()
+ if text:
+ tool_dependencies_dict = tool_shed_decode( text )
+ for dependency_key, requirements_dict in tool_dependencies_dict.items():
+ tool_dependency_name = requirements_dict[ 'name' ]
+ tool_dependency_version = requirements_dict[ 'version' ]
+ tool_dependency_type = requirements_dict[ 'type' ]
+ tool_dependency_readme = requirements_dict.get( 'readme', '' )
+ tool_dependencies.append( ( tool_dependency_name, tool_dependency_version, tool_dependency_type, tool_dependency_readme ) )
+ for tool_elem in elem.findall( 'tool' ):
+ migrated_tool_configs_dict[ tool_elem.get( 'file' ) ] = tool_dependencies
+ # Parse the proprietary tool_panel_configs (the default is tool_conf.xml) and generate the list of missing tool config file names.
+ missing_tool_configs_dict = odict()
+ for tool_panel_config in tool_panel_configs:
+ tree = util.parse_xml( tool_panel_config )
+ root = tree.getroot()
+ for elem in root:
+ if elem.tag == 'tool':
+ missing_tool_configs_dict = check_tool_tag_set( elem, migrated_tool_configs_dict, missing_tool_configs_dict )
+ elif elem.tag == 'section':
+ for section_elem in elem:
+ if section_elem.tag == 'tool':
+ missing_tool_configs_dict = check_tool_tag_set( section_elem, migrated_tool_configs_dict, missing_tool_configs_dict )
+ else:
+ exception_msg = '\n\nThe entry for the main Galaxy tool shed at %s is missing from the %s file. ' % ( tool_shed, app.config.tool_sheds_config )
+ exception_msg += 'The entry for this tool shed must always be available in this file, so re-add it before attempting to start your Galaxy server.\n'
+ raise Exception( exception_msg )
return missing_tool_configs_dict
def check_tool_tag_set( elem, migrated_tool_configs_dict, missing_tool_configs_dict ):
file_path = elem.get( 'file', None )
@@ -76,8 +81,9 @@
config_filenames.append( config_filename )
return config_filenames
def get_tool_shed_url_from_tools_xml_file_path( app, tool_shed ):
+ search_str = '://%s' % tool_shed
for shed_name, shed_url in app.tool_shed_registry.tool_sheds.items():
- if shed_url.find( tool_shed ) >= 0:
+ if shed_url.find( search_str ) >= 0:
if shed_url.endswith( '/' ):
shed_url = shed_url.rstrip( '/' )
return shed_url
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: jgoecks: Make bookmarks available in shared Trackster visualizations.
by Bitbucket 05 Jul '12
by Bitbucket 05 Jul '12
05 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/456f11df0b53/
changeset: 456f11df0b53
user: jgoecks
date: 2012-07-05 15:31:19
summary: Make bookmarks available in shared Trackster visualizations.
affected #: 6 files
diff -r 6face40d68836de96bf92d46c0d6e6bf32cdb616 -r 456f11df0b53897086257b952457d615b3942539 static/scripts/packed/viz/trackster_ui.js
--- a/static/scripts/packed/viz/trackster_ui.js
+++ b/static/scripts/packed/viz/trackster_ui.js
@@ -1,1 +1,1 @@
-var add_bookmark=function(d,b){var f=$("#bookmarks-container"),h=$("<div/>").addClass("bookmark").appendTo(f),g=$("<div/>").addClass("delete-icon-container").appendTo(h).click(function(){h.slideUp("fast");h.remove();view.has_changes=true;return false}),a=$("<a href=''/>").addClass("icon-button delete").appendTo(g),i=$("<div/>").addClass("position").appendTo(h),e=$("<a href=''/>").text(d).appendTo(i).click(function(){view.go_to(d);return false}),c=$("<div/>").text(b).make_text_editable({num_rows:3,use_textarea:true,help_text:"Set bookmark note"}).addClass("annotation").appendTo(h);view.has_changes=true;return h};var object_from_template=function(c,b,a){if("copy" in c){return c.copy(a)}else{var d=c.obj_type;if(!d){d=c.track_type}return new addable_objects[d](b,a,c)}};var addable_objects={LineTrack:LineTrack,FeatureTrack:FeatureTrack,VcfTrack:VcfTrack,ReadTrack:ReadTrack,CompositeTrack:CompositeTrack,DrawableGroup:DrawableGroup};var create_visualization=function(c,a,b,d){view=new View(c);view.editor=true;$.when(view.load_chroms_deferred).then(function(){if(a){var n=a.chrom,e=a.start,k=a.end,g=a.overview;if(n&&(e!==undefined)&&k){view.change_chrom(n,e,k)}}if(b){var h,f,j;for(var l=0;l<b.length;l++){view.add_drawable(object_from_template(b[l],view,view))}}view.update_intro_div();var o;for(var l=0;l<view.drawables.length;l++){if(view.drawables[l].name===g){view.set_overview(view.drawables[l]);break}}if(d){var m;for(var l=0;l<d.length;l++){m=d[l];add_bookmark(m.position,m.annotation)}}view.has_changes=false});return view};var init_keyboard_nav=function(a){$(document).keydown(function(b){if($(b.srcElement).is(":input")){return}switch(b.which){case 37:a.move_fraction(0.25);break;case 38:var c=Math.round(a.viewport_container.height()/15);a.viewport_container.scrollTop(a.viewport_container.scrollTop()-20);break;case 39:a.move_fraction(-0.25);break;case 40:var c=Math.round(a.viewport_container.height()/15);a.viewport_container.scrollTop(a.viewport_container.scrollTop()+20);break}})};
\ No newline at end of file
+var add_bookmark=function(e,c,a){var g=$("#bookmarks-container"),i=$("<div/>").addClass("bookmark").appendTo(g);var j=$("<div/>").addClass("position").appendTo(i),f=$("<a href=''/>").text(e).appendTo(j).click(function(){view.go_to(e);return false}),d=$("<div/>").text(c).appendTo(i);if(a){var h=$("<div/>").addClass("delete-icon-container").prependTo(i).click(function(){i.slideUp("fast");i.remove();view.has_changes=true;return false}),b=$("<a href=''/>").addClass("icon-button delete").appendTo(h);d.make_text_editable({num_rows:3,use_textarea:true,help_text:"Edit bookmark note"}).addClass("annotation")}view.has_changes=true;return i};var object_from_template=function(c,b,a){if("copy" in c){return c.copy(a)}else{var d=c.obj_type;if(!d){d=c.track_type}return new addable_objects[d](b,a,c)}};var addable_objects={LineTrack:LineTrack,FeatureTrack:FeatureTrack,VcfTrack:VcfTrack,ReadTrack:ReadTrack,CompositeTrack:CompositeTrack,DrawableGroup:DrawableGroup};var create_visualization=function(d,a,c,e,b){view=new View(d);view.editor=true;$.when(view.load_chroms_deferred).then(function(){if(a){var o=a.chrom,f=a.start,l=a.end,h=a.overview;if(o&&(f!==undefined)&&l){view.change_chrom(o,f,l)}}if(c){var j,g,k;for(var m=0;m<c.length;m++){view.add_drawable(object_from_template(c[m],view,view))}}view.update_intro_div();var p;for(var m=0;m<view.drawables.length;m++){if(view.drawables[m].name===h){view.set_overview(view.drawables[m]);break}}if(e){var n;for(var m=0;m<e.length;m++){n=e[m];add_bookmark(n.position,n.annotation,b)}}view.has_changes=false});return view};var init_keyboard_nav=function(a){$(document).keydown(function(b){if($(b.srcElement).is(":input")){return}switch(b.which){case 37:a.move_fraction(0.25);break;case 38:var c=Math.round(a.viewport_container.height()/15);a.viewport_container.scrollTop(a.viewport_container.scrollTop()-20);break;case 39:a.move_fraction(-0.25);break;case 40:var c=Math.round(a.viewport_container.height()/15);a.viewport_container.scrollTop(a.viewport_container.scrollTop()+20);break}})};
\ No newline at end of file
diff -r 6face40d68836de96bf92d46c0d6e6bf32cdb616 -r 456f11df0b53897086257b952457d615b3942539 static/scripts/packed/viz/visualization.js
--- a/static/scripts/packed/viz/visualization.js
+++ b/static/scripts/packed/viz/visualization.js
@@ -1,1 +1,1 @@
-var ServerStateDeferred=Backbone.Model.extend({defaults:{ajax_settings:{},interval:1000,success_fn:function(a){return true}},go:function(){var d=$.Deferred(),c=this,f=c.get("ajax_settings"),e=c.get("success_fn"),b=c.get("interval"),a=function(){$.ajax(f).success(function(g){if(e(g)){d.resolve(g)}else{setTimeout(a,b)}})};a();return d}});var CanvasManager=function(a){this.default_font=a!==undefined?a:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};_.extend(CanvasManager.prototype,{load_pattern:function(a,e){var b=this.patterns,c=this.dummy_context,d=new Image();d.src=galaxy_paths.attributes.image_path+e;d.onload=function(){b[a]=c.createPattern(d,"repeat")}},get_pattern:function(a){return this.patterns[a]},new_canvas:function(){var a=$("<canvas/>")[0];if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(a)}a.manager=this;return a}});var Cache=Backbone.Model.extend({defaults:{num_elements:20,obj_cache:null,key_ary:null},initialize:function(a){this.clear()},get_elt:function(b){var c=this.attributes.obj_cache,d=this.attributes.key_ary,a=d.indexOf(b);if(a!==-1){if(c[b].stale){d.splice(a,1);delete c[b]}else{this.move_key_to_end(b,a)}}return c[b]},set_elt:function(b,d){var e=this.attributes.obj_cache,f=this.attributes.key_ary,c=this.attributes.num_elements;if(!e[b]){if(f.length>=c){var a=f.shift();delete e[a]}f.push(b)}e[b]=d;return d},move_key_to_end:function(b,a){this.attributes.key_ary.splice(a,1);this.attributes.key_ary.push(b)},clear:function(){this.attributes.obj_cache={};this.attributes.key_ary=[]},size:function(){return this.attributes.key_ary.length}});var GenomeDataManager=Cache.extend({defaults:_.extend({},Cache.prototype.defaults,{dataset:null,filters_manager:null,data_url:null,dataset_state_url:null,data_mode_compatible:function(a,b){return true},can_subset:function(a){return false}}),data_is_ready:function(){var c=this.get("dataset"),b=$.Deferred(),a=new ServerStateDeferred({ajax_settings:{url:this.get("dataset_state_url"),data:{dataset_id:c.id,hda_ldda:c.get("hda_ldda")},dataType:"json"},interval:5000,success_fn:function(d){return d!=="pending"}});$.when(a.go()).then(function(d){b.resolve(d==="ok"||d==="data")});return b},load_data:function(h,g,b,f){var d={chrom:h.get("chrom"),low:h.get("start"),high:h.get("end"),mode:g,resolution:b};dataset=this.get("dataset");if(dataset){d.dataset_id=dataset.id;d.hda_ldda=dataset.get("hda_ldda")}$.extend(d,f);var j=this.get("filters_manager");if(j){var k=[];var a=j.filters;for(var e=0;e<a.length;e++){k.push(a[e].name)}d.filter_cols=JSON.stringify(k)}var c=this;return $.getJSON(this.get("data_url"),d,function(i){c.set_data(h,i)})},get_data:function(g,f,c,e){var h=this.get_elt(g);if(h&&(is_deferred(h)||this.get("data_mode_compatible")(h,f))){return h}var j=this.get("key_ary"),b=this.get("obj_cache"),k,a;for(var d=0;d<j.length;d++){k=j[d];a=new GenomeRegion({from_str:k});if(a.contains(g)){h=b[k];if(is_deferred(h)||(this.get("data_mode_compatible")(h,f)&&this.get("can_subset")(h))){this.move_key_to_end(k,d);return h}}}h=this.load_data(g,f,c,e);this.set_data(g,h);return h},set_data:function(b,a){this.set_elt(b,a)},DEEP_DATA_REQ:"deep",BROAD_DATA_REQ:"breadth",get_more_data:function(i,h,d,g,e){var k=this.get_elt(i);if(!(k&&this.get("data_mode_compatible")(k,h))){console.log("ERROR: no current data for: ",dataset,i.toString(),h,d,g);return}k.stale=true;var c=i.get("start");if(e===this.DEEP_DATA_REQ){$.extend(g,{start_val:k.data.length+1})}else{if(e===this.BROAD_DATA_REQ){c=(k.max_high?k.max_high:k.data[k.data.length-1][2])+1}}var j=i.copy().set("start",c);var b=this,f=this.load_data(j,h,d,g),a=$.Deferred();this.set_data(i,a);$.when(f).then(function(l){if(l.data){l.data=k.data.concat(l.data);if(l.max_low){l.max_low=k.max_low}if(l.message){l.message=l.message.replace(/[0-9]+/,l.data.length)}}b.set_data(i,l);a.resolve(l)});return a},get_elt:function(a){return Cache.prototype.get_elt.call(this,a.toString())},set_elt:function(b,a){return Cache.prototype.set_elt.call(this,b.toString(),a)}});var ReferenceTrackDataManager=GenomeDataManager.extend({load_data:function(a,d,e,b,c){if(b>1){return{data:null}}return GenomeDataManager.prototype.load_data.call(this,a,d,e,b,c)}});var Genome=Backbone.Model.extend({defaults:{name:null,key:null,chroms_info:null},get_chroms_info:function(){return this.attributes.chroms_info.chrom_info}});var GenomeRegion=Backbone.RelationalModel.extend({defaults:{chrom:null,start:0,end:0,DIF_CHROMS:1000,BEFORE:1001,CONTAINS:1002,OVERLAP_START:1003,OVERLAP_END:1004,CONTAINED_BY:1005,AFTER:1006},initialize:function(b){if(b.from_str){var d=b.from_str.split(":"),c=d[0],a=d[1].split("-");this.set({chrom:c,start:parseInt(a[0],10),end:parseInt(a[1],10)})}},copy:function(){return new GenomeRegion({chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")})},length:function(){return this.get("end")-this.get("start")},toString:function(){return this.get("chrom")+":"+this.get("start")+"-"+this.get("end")},toJSON:function(){return{chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")}},compute_overlap:function(h){var b=this.get("chrom"),g=h.get("chrom"),f=this.get("start"),d=h.get("start"),e=this.get("end"),c=h.get("end"),a;if(b&&g&&b!==g){return this.get("DIF_CHROMS")}if(f<d){if(e<d){a=this.get("BEFORE")}else{if(e<=c){a=this.get("OVERLAP_START")}else{a=this.get("CONTAINS")}}}else{if(f>c){a=this.get("AFTER")}else{if(e<=c){a=this.get("CONTAINED_BY")}else{a=this.get("OVERLAP_END")}}}return a},contains:function(a){return this.compute_overlap(a)===this.get("CONTAINS")},overlaps:function(a){return _.intersection([this.compute_overlap(a)],[this.get("DIF_CHROMS"),this.get("BEFORE"),this.get("AFTER")]).length===0}});var GenomeRegionCollection=Backbone.Collection.extend({model:GenomeRegion});var BrowserBookmark=Backbone.Model.extend({defaults:{region:null,note:""}});var BrowserBookmarks=Backbone.Collection.extend({model:BrowserBookmark});var Visualization=Backbone.RelationalModel.extend({defaults:{id:"",title:"",type:"",dbkey:"",datasets:[]},url:function(){return galaxy_paths.get("visualization_url")},save:function(){return $.ajax({url:this.url(),type:"POST",dataType:"json",data:{vis_json:JSON.stringify(this)}})}});var TracksterVisualization=Visualization.extend({defaults:{bookmarks:[],viewport:{}}});var CircsterVisualization=Visualization.extend({});var HistogramDataset=Backbone.Model.extend({initialize:function(a){this.attributes.data=a;this.attributes.max=_.max(a,function(b){if(!b||typeof b==="string"){return 0}return b[1]})[1]}});var TrackConfig=Backbone.Model.extend({});var CircsterHistogramDatasetLayout=Backbone.Model.extend({chroms_layout:function(){var b=this.attributes.genome.get_chroms_info(),d=d3.layout.pie().value(function(f){return f.len}).sort(null),e=d(b),a=this.attributes.total_gap/b.length,c=_.map(e,function(h,g){var f=h.endAngle-a;h.endAngle=(f>h.startAngle?f:h.startAngle);return h});return c},chrom_data_layout:function(j,b,g,f,h){if(!b||typeof b==="string"){return null}var d=b[0],i=b[3],c=d3.scale.linear().domain([0,h]).range([g,f]),e=d3.layout.pie().value(function(k){return i}).startAngle(j.startAngle).endAngle(j.endAngle),a=e(d);_.each(d,function(k,l){a[l].outerRadius=c(k[1])});return a}});var CircsterView=Backbone.View.extend({className:"circster",initialize:function(a){this.width=a.width;this.height=a.height;this.total_gap=a.total_gap;this.genome=a.genome;this.dataset=a.dataset;this.radius_start=a.radius_start;this.dataset_arc_height=a.dataset_arc_height},render:function(){var d=this.radius_start,e=this.dataset_arc_height,j=new CircsterHistogramDatasetLayout({genome:this.genome,total_gap:this.total_gap}),i=j.chroms_layout(),g=_.zip(i,this.dataset.attributes.data),h=this.dataset.attributes.max,b=_.map(g,function(m){var n=m[0],l=m[1];return j.chrom_data_layout(n,l,d,d+e,h)});var c=d3.select(this.$el[0]).append("svg").attr("width",this.width).attr("height",this.height).append("g").attr("transform","translate("+this.width/2+","+this.height/2+")");var k=c.append("g").attr("id","inner-arc"),f=d3.svg.arc().innerRadius(d).outerRadius(d+e),a=k.selectAll("#inner-arc>path").data(i).enter().append("path").attr("d",f).style("stroke","#ccc").style("fill","#ccc").append("title").text(function(l){return l.data.chrom});_.each(b,function(l){if(!l){return}var o=c.append("g"),n=d3.svg.arc().innerRadius(d),m=o.selectAll("path").data(l).enter().append("path").attr("d",n).style("stroke","red").style("fill","red")})}});var TrackBrowserRouter=Backbone.Router.extend({initialize:function(b){this.view=b.view;this.route(/([\w]+)$/,"change_location");this.route(/([\w]+\:[\d,]+-[\d,]+)$/,"change_location");var a=this;a.view.on("navigate",function(c){a.navigate(c)})},change_location:function(a){this.view.go_to(a)}});var add_datasets=function(a,c,b){$.ajax({url:a,data:{"f-dbkey":view.dbkey},error:function(){alert("Grid failed")},success:function(d){show_modal("Select datasets for new tracks",d,{Cancel:function(){hide_modal()},Add:function(){var e=[];$("input[name=id]:checked,input[name=ldda_ids]:checked").each(function(){var f,g=$(this).val();if($(this).attr("name")==="id"){f={hda_id:g}}else{f={ldda_id:g}}e[e.length]=$.ajax({url:c,data:f,dataType:"json"})});$.when.apply($,e).then(function(){var f=(arguments[0] instanceof Array?$.map(arguments,function(g){return g[0]}):[arguments[0]]);b(f)});hide_modal()}})}})};
\ No newline at end of file
+var ServerStateDeferred=Backbone.Model.extend({defaults:{ajax_settings:{},interval:1000,success_fn:function(a){return true}},go:function(){var d=$.Deferred(),c=this,f=c.get("ajax_settings"),e=c.get("success_fn"),b=c.get("interval"),a=function(){$.ajax(f).success(function(g){if(e(g)){d.resolve(g)}else{setTimeout(a,b)}})};a();return d}});var CanvasManager=function(a){this.default_font=a!==undefined?a:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};_.extend(CanvasManager.prototype,{load_pattern:function(a,e){var b=this.patterns,c=this.dummy_context,d=new Image();d.src=galaxy_paths.attributes.image_path+e;d.onload=function(){b[a]=c.createPattern(d,"repeat")}},get_pattern:function(a){return this.patterns[a]},new_canvas:function(){var a=$("<canvas/>")[0];if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(a)}a.manager=this;return a}});var Cache=Backbone.Model.extend({defaults:{num_elements:20,obj_cache:null,key_ary:null},initialize:function(a){this.clear()},get_elt:function(b){var c=this.attributes.obj_cache,d=this.attributes.key_ary,a=d.indexOf(b);if(a!==-1){if(c[b].stale){d.splice(a,1);delete c[b]}else{this.move_key_to_end(b,a)}}return c[b]},set_elt:function(b,d){var e=this.attributes.obj_cache,f=this.attributes.key_ary,c=this.attributes.num_elements;if(!e[b]){if(f.length>=c){var a=f.shift();delete e[a]}f.push(b)}e[b]=d;return d},move_key_to_end:function(b,a){this.attributes.key_ary.splice(a,1);this.attributes.key_ary.push(b)},clear:function(){this.attributes.obj_cache={};this.attributes.key_ary=[]},size:function(){return this.attributes.key_ary.length}});var GenomeDataManager=Cache.extend({defaults:_.extend({},Cache.prototype.defaults,{dataset:null,filters_manager:null,data_url:null,dataset_state_url:null,data_mode_compatible:function(a,b){return true},can_subset:function(a){return false}}),data_is_ready:function(){var c=this.get("dataset"),b=$.Deferred(),a=new ServerStateDeferred({ajax_settings:{url:this.get("dataset_state_url"),data:{dataset_id:c.id,hda_ldda:c.get("hda_ldda")},dataType:"json"},interval:5000,success_fn:function(d){return d!=="pending"}});$.when(a.go()).then(function(d){b.resolve(d==="ok"||d==="data")});return b},load_data:function(h,g,b,f){var d={chrom:h.get("chrom"),low:h.get("start"),high:h.get("end"),mode:g,resolution:b};dataset=this.get("dataset");if(dataset){d.dataset_id=dataset.id;d.hda_ldda=dataset.get("hda_ldda")}$.extend(d,f);var j=this.get("filters_manager");if(j){var k=[];var a=j.filters;for(var e=0;e<a.length;e++){k.push(a[e].name)}d.filter_cols=JSON.stringify(k)}var c=this;return $.getJSON(this.get("data_url"),d,function(i){c.set_data(h,i)})},get_data:function(g,f,c,e){var h=this.get_elt(g);if(h&&(is_deferred(h)||this.get("data_mode_compatible")(h,f))){return h}var j=this.get("key_ary"),b=this.get("obj_cache"),k,a;for(var d=0;d<j.length;d++){k=j[d];a=new GenomeRegion({from_str:k});if(a.contains(g)){h=b[k];if(is_deferred(h)||(this.get("data_mode_compatible")(h,f)&&this.get("can_subset")(h))){this.move_key_to_end(k,d);return h}}}h=this.load_data(g,f,c,e);this.set_data(g,h);return h},set_data:function(b,a){this.set_elt(b,a)},DEEP_DATA_REQ:"deep",BROAD_DATA_REQ:"breadth",get_more_data:function(i,h,d,g,e){var k=this.get_elt(i);if(!(k&&this.get("data_mode_compatible")(k,h))){console.log("ERROR: no current data for: ",dataset,i.toString(),h,d,g);return}k.stale=true;var c=i.get("start");if(e===this.DEEP_DATA_REQ){$.extend(g,{start_val:k.data.length+1})}else{if(e===this.BROAD_DATA_REQ){c=(k.max_high?k.max_high:k.data[k.data.length-1][2])+1}}var j=i.copy().set("start",c);var b=this,f=this.load_data(j,h,d,g),a=$.Deferred();this.set_data(i,a);$.when(f).then(function(l){if(l.data){l.data=k.data.concat(l.data);if(l.max_low){l.max_low=k.max_low}if(l.message){l.message=l.message.replace(/[0-9]+/,l.data.length)}}b.set_data(i,l);a.resolve(l)});return a},get_elt:function(a){return Cache.prototype.get_elt.call(this,a.toString())},set_elt:function(b,a){return Cache.prototype.set_elt.call(this,b.toString(),a)}});var ReferenceTrackDataManager=GenomeDataManager.extend({load_data:function(a,d,e,b,c){if(b>1){return{data:null}}return GenomeDataManager.prototype.load_data.call(this,a,d,e,b,c)}});var Genome=Backbone.Model.extend({defaults:{name:null,key:null,chroms_info:null},get_chroms_info:function(){return this.attributes.chroms_info.chrom_info}});var GenomeRegion=Backbone.RelationalModel.extend({defaults:{chrom:null,start:0,end:0,DIF_CHROMS:1000,BEFORE:1001,CONTAINS:1002,OVERLAP_START:1003,OVERLAP_END:1004,CONTAINED_BY:1005,AFTER:1006},initialize:function(b){if(b.from_str){var d=b.from_str.split(":"),c=d[0],a=d[1].split("-");this.set({chrom:c,start:parseInt(a[0],10),end:parseInt(a[1],10)})}},copy:function(){return new GenomeRegion({chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")})},length:function(){return this.get("end")-this.get("start")},toString:function(){return this.get("chrom")+":"+this.get("start")+"-"+this.get("end")},toJSON:function(){return{chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")}},compute_overlap:function(h){var b=this.get("chrom"),g=h.get("chrom"),f=this.get("start"),d=h.get("start"),e=this.get("end"),c=h.get("end"),a;if(b&&g&&b!==g){return this.get("DIF_CHROMS")}if(f<d){if(e<d){a=this.get("BEFORE")}else{if(e<=c){a=this.get("OVERLAP_START")}else{a=this.get("CONTAINS")}}}else{if(f>c){a=this.get("AFTER")}else{if(e<=c){a=this.get("CONTAINED_BY")}else{a=this.get("OVERLAP_END")}}}return a},contains:function(a){return this.compute_overlap(a)===this.get("CONTAINS")},overlaps:function(a){return _.intersection([this.compute_overlap(a)],[this.get("DIF_CHROMS"),this.get("BEFORE"),this.get("AFTER")]).length===0}});var GenomeRegionCollection=Backbone.Collection.extend({model:GenomeRegion});var BrowserBookmark=Backbone.RelationalModel.extend({defaults:{region:null,note:""},relations:[{type:Backbone.HasOne,key:"region",relatedModel:"GenomeRegion"}]});var BrowserBookmarkCollection=Backbone.Collection.extend({model:BrowserBookmark});var Visualization=Backbone.RelationalModel.extend({defaults:{id:"",title:"",type:"",dbkey:"",datasets:[]},url:function(){return galaxy_paths.get("visualization_url")},save:function(){return $.ajax({url:this.url(),type:"POST",dataType:"json",data:{vis_json:JSON.stringify(this)}})}});var TracksterVisualization=Visualization.extend({defaults:{bookmarks:[],viewport:{}}});var CircsterVisualization=Visualization.extend({});var HistogramDataset=Backbone.Model.extend({initialize:function(a){this.attributes.data=a;this.attributes.max=_.max(a,function(b){if(!b||typeof b==="string"){return 0}return b[1]})[1]}});var TrackConfig=Backbone.Model.extend({});var CircsterHistogramDatasetLayout=Backbone.Model.extend({chroms_layout:function(){var b=this.attributes.genome.get_chroms_info(),d=d3.layout.pie().value(function(f){return f.len}).sort(null),e=d(b),a=this.attributes.total_gap/b.length,c=_.map(e,function(h,g){var f=h.endAngle-a;h.endAngle=(f>h.startAngle?f:h.startAngle);return h});return c},chrom_data_layout:function(j,b,g,f,h){if(!b||typeof b==="string"){return null}var d=b[0],i=b[3],c=d3.scale.linear().domain([0,h]).range([g,f]),e=d3.layout.pie().value(function(k){return i}).startAngle(j.startAngle).endAngle(j.endAngle),a=e(d);_.each(d,function(k,l){a[l].outerRadius=c(k[1])});return a}});var CircsterView=Backbone.View.extend({className:"circster",initialize:function(a){this.width=a.width;this.height=a.height;this.total_gap=a.total_gap;this.genome=a.genome;this.dataset=a.dataset;this.radius_start=a.radius_start;this.dataset_arc_height=a.dataset_arc_height},render:function(){var d=this.radius_start,e=this.dataset_arc_height,j=new CircsterHistogramDatasetLayout({genome:this.genome,total_gap:this.total_gap}),i=j.chroms_layout(),g=_.zip(i,this.dataset.attributes.data),h=this.dataset.attributes.max,b=_.map(g,function(m){var n=m[0],l=m[1];return j.chrom_data_layout(n,l,d,d+e,h)});var c=d3.select(this.$el[0]).append("svg").attr("width",this.width).attr("height",this.height).append("g").attr("transform","translate("+this.width/2+","+this.height/2+")");var k=c.append("g").attr("id","inner-arc"),f=d3.svg.arc().innerRadius(d).outerRadius(d+e),a=k.selectAll("#inner-arc>path").data(i).enter().append("path").attr("d",f).style("stroke","#ccc").style("fill","#ccc").append("title").text(function(l){return l.data.chrom});_.each(b,function(l){if(!l){return}var o=c.append("g"),n=d3.svg.arc().innerRadius(d),m=o.selectAll("path").data(l).enter().append("path").attr("d",n).style("stroke","red").style("fill","red")})}});var TrackBrowserRouter=Backbone.Router.extend({initialize:function(b){this.view=b.view;this.route(/([\w]+)$/,"change_location");this.route(/([\w]+\:[\d,]+-[\d,]+)$/,"change_location");var a=this;a.view.on("navigate",function(c){a.navigate(c)})},change_location:function(a){this.view.go_to(a)}});var add_datasets=function(a,c,b){$.ajax({url:a,data:{"f-dbkey":view.dbkey},error:function(){alert("Grid failed")},success:function(d){show_modal("Select datasets for new tracks",d,{Cancel:function(){hide_modal()},Add:function(){var e=[];$("input[name=id]:checked,input[name=ldda_ids]:checked").each(function(){var f,g=$(this).val();if($(this).attr("name")==="id"){f={hda_id:g}}else{f={ldda_id:g}}e[e.length]=$.ajax({url:c,data:f,dataType:"json"})});$.when.apply($,e).then(function(){var f=(arguments[0] instanceof Array?$.map(arguments,function(g){return g[0]}):[arguments[0]]);b(f)});hide_modal()}})}})};
\ No newline at end of file
diff -r 6face40d68836de96bf92d46c0d6e6bf32cdb616 -r 456f11df0b53897086257b952457d615b3942539 static/scripts/viz/trackster_ui.js
--- a/static/scripts/viz/trackster_ui.js
+++ b/static/scripts/viz/trackster_ui.js
@@ -5,29 +5,35 @@
/**
* Add bookmark.
*/
-var add_bookmark = function(position, annotation) {
- var
- bookmarks_container = $("#bookmarks-container"),
- new_bookmark = $("<div/>").addClass("bookmark").appendTo(bookmarks_container),
- delete_icon_container = $("<div/>").addClass("delete-icon-container").appendTo(new_bookmark).click(function (){
- // Remove bookmark.
- new_bookmark.slideUp("fast");
- new_bookmark.remove();
- view.has_changes = true;
- return false;
- }),
- delete_icon = $("<a href=''/>").addClass("icon-button delete").appendTo(delete_icon_container),
- position_div = $("<div/>").addClass("position").appendTo(new_bookmark),
+var add_bookmark = function(position, annotation, editable) {
+ // Create HTML.
+ var bookmarks_container = $("#bookmarks-container"),
+ new_bookmark = $("<div/>").addClass("bookmark").appendTo(bookmarks_container);
+
+ var position_div = $("<div/>").addClass("position").appendTo(new_bookmark),
position_link = $("<a href=''/>").text(position).appendTo(position_div).click(function() {
view.go_to(position);
return false;
}),
- annotation_div = $("<div/>").text(annotation).make_text_editable({
+ annotation_div = $("<div/>").text(annotation).appendTo(new_bookmark);
+
+ // If editable, enable bookmark deletion and annotation editing.
+ if (editable) {
+ var delete_icon_container = $("<div/>").addClass("delete-icon-container").prependTo(new_bookmark).click(function (){
+ // Remove bookmark.
+ new_bookmark.slideUp("fast");
+ new_bookmark.remove();
+ view.has_changes = true;
+ return false;
+ }),
+ delete_icon = $("<a href=''/>").addClass("icon-button delete").appendTo(delete_icon_container);
+ annotation_div.make_text_editable({
num_rows: 3,
use_textarea: true,
- help_text: "Set bookmark note"
- }).addClass("annotation").appendTo(new_bookmark);
-
+ help_text: "Edit bookmark note"
+ }).addClass("annotation");
+ }
+
view.has_changes = true;
return new_bookmark;
};
@@ -67,7 +73,7 @@
/**
* Create a complete Trackster visualization. Returns view.
*/
-var create_visualization = function(view_config, viewport_config, drawables_config, bookmarks_config) {
+var create_visualization = function(view_config, viewport_config, drawables_config, bookmarks_config, editable) {
// Create view.
view = new View(view_config);
@@ -114,7 +120,7 @@
var bookmark;
for (var i = 0; i < bookmarks_config.length; i++) {
bookmark = bookmarks_config[i];
- add_bookmark(bookmark['position'], bookmark['annotation']);
+ add_bookmark(bookmark['position'], bookmark['annotation'], editable);
}
}
diff -r 6face40d68836de96bf92d46c0d6e6bf32cdb616 -r 456f11df0b53897086257b952457d615b3942539 static/scripts/viz/visualization.js
--- a/static/scripts/viz/visualization.js
+++ b/static/scripts/viz/visualization.js
@@ -526,17 +526,25 @@
/**
* A genome browser bookmark.
*/
-var BrowserBookmark = Backbone.Model.extend({
+var BrowserBookmark = Backbone.RelationalModel.extend({
defaults: {
region: null,
- note: ""
- }
+ note: ''
+ },
+
+ relations: [
+ {
+ type: Backbone.HasOne,
+ key: 'region',
+ relatedModel: 'GenomeRegion'
+ }
+ ]
});
/**
* Bookmarks collection.
*/
-var BrowserBookmarks = Backbone.Collection.extend({
+var BrowserBookmarkCollection = Backbone.Collection.extend({
model: BrowserBookmark
});
diff -r 6face40d68836de96bf92d46c0d6e6bf32cdb616 -r 456f11df0b53897086257b952457d615b3942539 templates/tracks/browser.mako
--- a/templates/tracks/browser.mako
+++ b/templates/tracks/browser.mako
@@ -178,7 +178,8 @@
},
JSON.parse('${ h.to_json_string( config.get( 'viewport', dict() ) ) }'),
JSON.parse('${ h.to_json_string( config['tracks'] ).replace("'", "\\'") }'),
- JSON.parse('${ h.to_json_string( config['bookmarks'] ) }')
+ JSON.parse('${ h.to_json_string( config['bookmarks'] ) }'),
+ true
);
init_editor();
set_up_router({view: view});
@@ -239,7 +240,7 @@
// Add new bookmark.
var position = view.chrom + ":" + view.low + "-" + view.high,
annotation = "Bookmark description";
- return add_bookmark(position, annotation);
+ return add_bookmark(position, annotation, true);
});
// make_popupmenu( $("#bookmarks-more-button"), {
diff -r 6face40d68836de96bf92d46c0d6e6bf32cdb616 -r 456f11df0b53897086257b952457d615b3942539 templates/visualization/display.mako
--- a/templates/visualization/display.mako
+++ b/templates/visualization/display.mako
@@ -3,6 +3,16 @@
<%def name="javascripts()"><% config = item_data %>
${parent.javascripts()}
+
+ <script type='text/javascript'>
+ $(function() {
+ // HACK: add bookmarks container and header.
+ $('#right > .unified-panel-body > div').append(
+ $('<div/>').attr('id', 'bookmarks-container')
+ .append( $('<h4/>').text('Bookmarks') )
+ );
+ });
+ </script><!--[if lt IE 9]><script type='text/javascript' src="${h.url_for('/static/scripts/excanvas.js')}"></script>
@@ -12,30 +22,16 @@
<%def name="stylesheets()">
${parent.stylesheets()}
- ## For page:
+ ## Style changes needed for display.
<style type="text/css">
.page-body {
padding: 0px;
}
- </style>
-
- <style type="text/css">
- #browser-container {
- overflow: none;
+ #bookmarks-container {
+ padding-left: 10px;
}
- .nav-container {
- width: 100%;
- ## Overriding styles from trackster.css to push nav up into title bar
- height: 0;
- text-align: center;
- }
- .nav {
- ## Overriding styles from trackster.css to push nav up into title bar
- position: relative;
- display: inline-block;
- top: -2em;
- background: transparent;
- border: none;
+ .bookmark {
+ margin: 0em;
}
</style></%def>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Filter out unwanted tool shed repositores from the list of valid repositories in the tool shed.
by Bitbucket 03 Jul '12
by Bitbucket 03 Jul '12
03 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/6face40d6883/
changeset: 6face40d6883
user: greg
date: 2012-07-03 22:06:11
summary: Filter out unwanted tool shed repositores from the list of valid repositories in the tool shed.
affected #: 1 file
diff -r ab1e5f08593151b35979b7371d001b50d0d3b39f -r 6face40d68836de96bf92d46c0d6e6bf32cdb616 lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -245,6 +245,19 @@
filterable="standard" ) )
operations = []
def build_initial_query( self, trans, **kwd ):
+ # The clause_list approach is to filter out those repositories that include metadata, but only because they contain 'invalid_tools' in
+ # the metadata (i.e., they don't have valid tools, datatypes or workflows). Is there a better approach?
+ clause_list = []
+ for repository_metadata in trans.sa_session.query( trans.model.RepositoryMetadata ) \
+ .filter( trans.model.RepositoryMetadata.table.c.malicious == False ):
+ metadata = repository_metadata.metadata
+ if 'datatypes' in metadata or'tools' in metadata or 'workflows' in metadata:
+ clause_list.append( trans.model.RepositoryMetadata.table.c.id == repository_metadata.id )
+ if clause_list:
+ return trans.sa_session.query( self.model_class ) \
+ .join( model.RepositoryMetadata.table ) \
+ .join( model.User.table ) \
+ .filter( or_( *clause_list ) )
return trans.sa_session.query( self.model_class ) \
.join( model.RepositoryMetadata.table ) \
.join( model.User.table )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Add search for repository name, description when browsing valid repositories in the tool shed.
by Bitbucket 03 Jul '12
by Bitbucket 03 Jul '12
03 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/ab1e5f085931/
changeset: ab1e5f085931
user: greg
date: 2012-07-03 21:27:28
summary: Add search for repository name, description when browsing valid repositories in the tool shed.
affected #: 1 file
diff -r 4bea5ec54ec4022da1fd49bb616304e4e4b1ec6c -r ab1e5f08593151b35979b7371d001b50d0d3b39f lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -238,6 +238,11 @@
attach_popup=False,
key="User.username" )
]
+ columns.append( grids.MulticolFilterColumn( "Search repository name, description, owner",
+ cols_to_filter=[ columns[0], columns[1] ],
+ key="free-text-search",
+ visible=False,
+ filterable="standard" ) )
operations = []
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( self.model_class ) \
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

03 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/4bea5ec54ec4/
changeset: 4bea5ec54ec4
user: greg
date: 2012-07-03 20:42:52
summary: Fix definition of missing tool dependencies.
affected #: 1 file
diff -r c4bdfbf9b3270809754fc075bf0af9b9a3d49f3c -r 4bea5ec54ec4022da1fd49bb616304e4e4b1ec6c lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -2720,9 +2720,7 @@
"""Return the repository's tool dependencies that are not currently installed, and may not ever have been installed."""
missing_dependencies = []
for tool_dependency in self.tool_dependencies:
- if tool_dependency.status in [ ToolDependency.installation_status.NEVER_INSTALLED,
- ToolDependency.installation_status.ERROR,
- ToolDependency.installation_status.UNINSTALLED ]:
+ if tool_dependency.status not in [ ToolDependency.installation_status.INSTALLED ]:
missing_dependencies.append( tool_dependency )
return missing_dependencies
@property
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

03 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/c4bdfbf9b327/
changeset: c4bdfbf9b327
user: greg
date: 2012-07-03 20:03:46
summary: Fix column layout for tool dependencies.
affected #: 1 file
diff -r 31564ea924e7911a04eecc9157d1817d68febd97 -r c4bdfbf9b3270809754fc075bf0af9b9a3d49f3c templates/webapps/community/repository/common.mako
--- a/templates/webapps/community/repository/common.mako
+++ b/templates/webapps/community/repository/common.mako
@@ -105,8 +105,8 @@
<table class="grid"><tr><td><b>name</b></td>
+ <td><b>version</b></td><td><b>type</b></td>
- <td><b>version</b></td></tr>
%for dependency_key, requirements_dict in tool_dependencies.items():
<%
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Clarify up status column display in the tool shed repository grids, and fix a method signature bug.
by Bitbucket 03 Jul '12
by Bitbucket 03 Jul '12
03 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/31564ea924e7/
changeset: 31564ea924e7
user: greg
date: 2012-07-03 19:53:09
summary: Clarify up status column display in the tool shed repository grids, and fix a method signature bug.
affected #: 4 files
diff -r f6b32f963f6114e8ee86853a6311836b8dd5cdd3 -r 31564ea924e7911a04eecc9157d1817d68febd97 lib/galaxy/tool_shed/__init__.py
--- a/lib/galaxy/tool_shed/__init__.py
+++ b/lib/galaxy/tool_shed/__init__.py
@@ -52,5 +52,5 @@
if installed_repository_dict[ 'converter_path' ]:
galaxy.util.shed_util.load_installed_datatype_converters( self.app, installed_repository_dict, deactivate=deactivate )
if installed_repository_dict[ 'display_path' ]:
- galaxy.util.shed_util.load_installed_display_applications( installed_repository_dict, deactivate=deactivate )
+ galaxy.util.shed_util.load_installed_display_applications( self.app, installed_repository_dict, deactivate=deactivate )
\ No newline at end of file
diff -r f6b32f963f6114e8ee86853a6311836b8dd5cdd3 -r 31564ea924e7911a04eecc9157d1817d68febd97 lib/galaxy/tool_shed/migrate/check.py
--- a/lib/galaxy/tool_shed/migrate/check.py
+++ b/lib/galaxy/tool_shed/migrate/check.py
@@ -127,7 +127,7 @@
msg += "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n"
msg += "sh ./scripts/migrate_tools/%04d_tools.sh install_dependencies\n" % latest_tool_migration_script_number
msg += "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n"
- msg += "Tool dependencies can be installed after the repositories have been installed, but installing them now is better.\n\n"
+ msg += "Tool dependencies can be installed after the repositories have been installed as well.\n\n"
msg += "After the installation process finishes, you can start your Galaxy server. As part of this installation process,\n"
msg += "entries for each of the following tool config files will be added to the file named ./migrated_tool_conf.xml, so these\n"
msg += "tools will continue to be loaded into your tool panel. Because of this, existing entries for these files should be\n"
diff -r f6b32f963f6114e8ee86853a6311836b8dd5cdd3 -r 31564ea924e7911a04eecc9157d1817d68febd97 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -1279,7 +1279,7 @@
except:
pass
return repository_dict
-def load_installed_display_applications( installed_repository_dict, deactivate=False ):
+def load_installed_display_applications( app, installed_repository_dict, deactivate=False ):
# Load or deactivate proprietary datatype display applications
app.datatypes_registry.load_display_applications( installed_repository_dict=installed_repository_dict, deactivate=deactivate )
def make_tmp_directory():
diff -r f6b32f963f6114e8ee86853a6311836b8dd5cdd3 -r 31564ea924e7911a04eecc9157d1817d68febd97 lib/galaxy/web/controllers/admin_toolshed.py
--- a/lib/galaxy/web/controllers/admin_toolshed.py
+++ b/lib/galaxy/web/controllers/admin_toolshed.py
@@ -30,6 +30,7 @@
return tool_shed_repository.changeset_revision
class StatusColumn( grids.TextColumn ):
def get_value( self, trans, grid, tool_shed_repository ):
+ status_label = tool_shed_repository.status
if tool_shed_repository.status in [ trans.model.ToolShedRepository.installation_status.CLONING,
trans.model.ToolShedRepository.installation_status.SETTING_TOOL_VERSIONS,
trans.model.ToolShedRepository.installation_status.INSTALLING_TOOL_DEPENDENCIES,
@@ -45,12 +46,12 @@
elif tool_shed_repository.status in [ trans.model.ToolShedRepository.installation_status.INSTALLED ]:
if tool_shed_repository.missing_tool_dependencies:
bgcolor = trans.model.ToolShedRepository.states.WARNING
+ status_label = '%s, missing dependencies' % status_label
else:
bgcolor = trans.model.ToolShedRepository.states.OK
else:
bgcolor = trans.model.ToolShedRepository.states.ERROR
- rval = '<div class="count-box state-color-%s">' % bgcolor
- rval += '%s</div>' % tool_shed_repository.status
+ rval = '<div class="count-box state-color-%s">%s</div>' % ( bgcolor, status_label )
return rval
class ToolShedColumn( grids.TextColumn ):
def get_value( self, trans, grid, tool_shed_repository ):
@@ -121,6 +122,7 @@
return tool_shed_repository.changeset_revision
class StatusColumn( grids.TextColumn ):
def get_value( self, trans, grid, tool_shed_repository ):
+ status_label = tool_shed_repository.status
if tool_shed_repository.status in [ trans.model.ToolShedRepository.installation_status.CLONING,
trans.model.ToolShedRepository.installation_status.SETTING_TOOL_VERSIONS,
trans.model.ToolShedRepository.installation_status.INSTALLING_TOOL_DEPENDENCIES,
@@ -136,12 +138,13 @@
elif tool_shed_repository.status in [ trans.model.ToolShedRepository.installation_status.INSTALLED ]:
if tool_shed_repository.missing_tool_dependencies:
bgcolor = trans.model.ToolShedRepository.states.WARNING
+ status_label = '%s, missing dependencies' % status_label
else:
bgcolor = trans.model.ToolShedRepository.states.OK
else:
bgcolor = trans.model.ToolShedRepository.states.ERROR
rval = '<div class="count-box state-color-%s" id="RepositoryStatus-%s">%s</div>' % \
- ( bgcolor, trans.security.encode_id( tool_shed_repository.id ), tool_shed_repository.status )
+ ( bgcolor, trans.security.encode_id( tool_shed_repository.id ), status_label )
return rval
webapp = "galaxy"
@@ -223,8 +226,8 @@
bgcolor = trans.model.ToolDependency.states.ERROR
elif tool_dependency.status in [ trans.model.ToolDependency.installation_status.INSTALLED ]:
bgcolor = trans.model.ToolDependency.states.OK
- rval = '<div class="count-box state-color-%s" id="ToolDependencyStatus-%s">' % ( bgcolor, trans.security.encode_id( tool_dependency.id ) )
- rval += '%s</div>' % tool_dependency.status
+ rval = '<div class="count-box state-color-%s" id="ToolDependencyStatus-%s">%s</div>' % \
+ ( bgcolor, trans.security.encode_id( tool_dependency.id ), tool_dependency.status )
return rval
webapp = "galaxy"
@@ -408,7 +411,7 @@
if installed_repository_dict[ 'converter_path' ]:
load_installed_datatype_converters( trans.app, installed_repository_dict, deactivate=True )
if installed_repository_dict[ 'display_path' ]:
- load_installed_display_applications( installed_repository_dict, deactivate=True )
+ load_installed_display_applications( trans.app, installed_repository_dict, deactivate=True )
if remove_from_disk_checked:
try:
# Remove the repository from disk.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/f6b32f963f61/
changeset: f6b32f963f61
user: jgoecks
date: 2012-07-03 17:49:10
summary: Small fixes for 8fd408407f7e.
affected #: 2 files
diff -r 3965354dda0b11768ae0c8c1ff5c33313bf98ee4 -r f6b32f963f6114e8ee86853a6311836b8dd5cdd3 static/scripts/packed/viz/paramamonster.js
--- a/static/scripts/packed/viz/paramamonster.js
+++ b/static/scripts/packed/viz/paramamonster.js
@@ -1,1 +1,1 @@
-var ToolInputsSettings=Backbone.Model.extend({defaults:{inputs:null,values:null}});var ToolParameterTree=Backbone.RelationalModel.extend({defaults:{tool:null,tree_data:null},initialize:function(b){var a=this;this.get("tool").get("inputs").each(function(c){if(!c.get_samples()){return}c.on("change:min change:max change:num_samples",function(d){if(d.get("in_ptree")){a.set_tree_data()}},a);c.on("change:in_ptree",function(d){if(d.get("in_ptree")){a.add_param(d)}else{a.remove_param(d)}a.set_tree_data()},a)});if(b.config){_.each(b.config,function(d){var c=a.get("tool").get("inputs").find(function(e){return e.get("name")===d.name});a.add_param(c);c.set(d)})}},add_param:function(a){if(a.get("ptree_index")){return}a.set("in_ptree",true);a.set("ptree_index",this.get_tree_params().length)},remove_param:function(a){a.set("in_ptree",false);a.set("ptree_index",null);_(this.get_tree_params()).each(function(b,c){b.set("ptree_index",c+1)})},set_tree_data:function(){var b=_.map(this.get_tree_params(),function(d){return{param:d,samples:d.get_samples()}});var a=0,c=function(g,d){var i=g[d],h=i.param,f=h.get("label"),e=i.samples;if(g.length-1===d){return _.map(e,function(j){return{id:a++,name:j,param:h,value:j}})}return _.map(e,function(j){return{id:a++,name:j,param:h,value:j,children:c(g,d+1)}})};this.set("tree_data",{name:"Root",id:a++,children:(b.length!==0?c(b,0):null)})},get_tree_params:function(){return _(this.get("tool").get("inputs").where({in_ptree:true})).sortBy(function(a){return a.get("ptree_index")})},get_num_leaves:function(){return this.get_tree_params().reduce(function(a,b){return a*b.get_samples().length},1)},get_node_settings:function(e){var c=this.get("tool").get_inputs_dict();var f=e.parent;if(f){while(f.depth!==0){c[f.param.get("name")]=f.value;f=f.parent}}var a=this,b=function(h,g){if(h.param){g[h.param.get("name")]=h.value}if(!h.children){return new ToolInputsSettings({inputs:a.get("tool").get("inputs"),values:g})}else{return _.flatten(_.map(h.children,function(i){return b(i,_.clone(g))}))}},d=b(e,c);if(!_.isArray(d)){d=[d]}return d},get_connected_nodes:function(c){var d=function(e){if(!e.children){return e}else{return _.flatten([e,_.map(e.children,function(f){return d(f)})])}};var b=[],a=c.parent;while(a){b.push(a);a=a.parent}return _.flatten([b,d(c)])},get_leaf:function(b){var c=this.get("tree_data"),a=function(d){return _.find(d,function(e){return b[e.param.get("name")]===e.value})};while(c.children){c=a(c.children)}return c},toJSON:function(){return this.get_tree_params().map(function(a){return{name:a.get("name"),min:a.get("min"),max:a.get("max"),num_samples:a.get("num_samples")}})}});var ParamaMonsterTrack=Backbone.RelationalModel.extend({defaults:{track:null,settings:null,regions:null},relations:[{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"}],initialize:function(a){if(a.track){var b=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},a.track);delete b.mode;this.set("track",object_from_template(b,{},null))}},same_settings:function(a){var b=this.get("settings"),c=a.get("settings");for(var d in b){if(!c[d]||b[d]!==c[d]){return false}}return true},toJSON:function(){return{track:this.get("track").to_dict(),settings:this.get("settings"),regions:this.get("regions")}}});var TrackCollection=Backbone.Collection.extend({model:ParamaMonsterTrack});var ParamaMonsterVisualization=Visualization.extend({defaults:_.extend({},Visualization.prototype.defaults,{dataset:null,tool:null,parameter_tree:null,regions:null,tracks:null}),relations:[{type:Backbone.HasOne,key:"dataset",relatedModel:"Dataset"},{type:Backbone.HasOne,key:"tool",relatedModel:"Tool"},{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"},{type:Backbone.HasMany,key:"tracks",relatedModel:"ParamaMonsterTrack"}],initialize:function(a){var b=this.get("tool").copy(true);this.set("tool_with_samplable_inputs",b);this.set("parameter_tree",new ToolParameterTree({tool:b,config:a.tree_config}))},add_placeholder:function(a){this.get("tracks").add(new PlaceholderTrack(a))},add_track:function(a){this.get("tracks").add(a)},toJSON:function(){return{id:this.get("id"),title:"Parameter exploration for dataset '"+this.get("dataset").get("name")+"'",type:"paramamonster",dataset_id:this.get("dataset").id,tool_id:this.get("tool").id,regions:this.get("regions").toJSON(),tree_config:this.get("parameter_tree").toJSON(),tracks:this.get("tracks").toJSON()}}});var ParamaMonsterTrackView=Backbone.View.extend({tagName:"tr",TILE_LEN:250,initialize:function(a){this.canvas_manager=a.canvas_manager;this.render();this.model.on("change:track",this.draw_tiles,this)},render:function(){var f=this.model.get("settings"),b=f.get("values"),d=$("<td/>").addClass("settings").appendTo(this.$el),c=$("<div/>").addClass("track-info").hide().appendTo(d);c.append($("<div/>").css("font-weight","bold").text("Track Settings"));f.get("inputs").each(function(h){c.append(h.get("label")+": "+b[h.get("name")]+"<br/>")});var a=this,g=$("<button/>").appendTo(c).text("Run on complete dataset").click(function(){a.trigger("run_on_dataset",f)});var e=create_icon_buttons_menu([{title:"Settings",icon_class:"gear track-settings",on_click:function(){c.toggle()},tipsy_config:{gravity:"s"}},{title:"Remove",icon_class:"cross-circle",on_click:function(){a.$el.remove();$(".tipsy").remove()}}]);d.prepend(e.$el);this.model.get("regions").each(function(){a.$el.append($("<td/>").addClass("tile").html($("<img/>").attr("src",galaxy_paths.get("image_path")+"/loading_large_white_bg.gif")))});if(this.model.get("track")){this.draw_tiles()}},draw_tiles:function(){var b=this,a=this.model.get("track"),d=this.model.get("regions"),c=this.$el.find("td.tile");$.when(a.data_manager.data_is_ready()).then(function(e){d.each(function(h,g){var f=h.length()/b.TILE_LEN,j=1/f,i="Pack";$.when(a.data_manager.get_data(h,i,f,{})).then(function(l){var k=b.canvas_manager.new_canvas();k.width=b.TILE_LEN;k.height=a.get_canvas_height(l,i,j,k.width);a.draw_tile(l,k.getContext("2d"),i,f,h,j);$(c[g]).empty().append(k)})})})}});var ToolInputValOrSweepView=Backbone.View.extend({number_input_template:'<div class="form-row-input sweep"><input class="min" type="text" size="6" value="<%= min %>"> - <input class="max" type="text" size="6" value="<%= max %>"> samples: <input class="num_samples" type="text" size="1" value="<%= num_samples %>"></div>',select_input_template:'<div class="form-row-input sweep"><%= options %></div>',initialize:function(a){this.$el=a.tool_row;this.render()},render:function(){var b=this.model,f=b.get("type"),h=this.$el.find(".form-row-input"),d=null;h.find(":input").change(function(){b.set("value",$(this).val())});if(f==="number"){d=$(_.template(this.number_input_template,this.model.toJSON()))}else{if(f==="select"){var c=_.map(this.$el.find("select option"),function(i){return $(i).val()}),e=c.join(", ");d=$(_.template(this.select_input_template,{options:e}))}}d.insertAfter(h);var a=this,g=create_icon_buttons_menu([{title:"Add parameter to tree",icon_class:"plus-button",on_click:function(){b.set("in_ptree",true);h.hide();d.show();$(this).hide();a.$el.find(".icon-button.toggle").show()}},{title:"Remove parameter from tree",icon_class:"toggle",on_click:function(){b.set("in_ptree",false);d.hide();h.show();$(this).hide();a.$el.find(".icon-button.plus-button").show()}}],{tipsy_config:{gravity:"s"}});this.$el.prepend(g.$el);if(b.get("in_ptree")){h.hide();a.$el.find(".icon-button.plus-button").hide()}else{a.$el.find(".icon-button.toggle").hide();d.hide()}_.each(["min","max","num_samples"],function(i){d.find("."+i).change(function(){b.set(i,parseFloat($(this).val()))})})}});var ToolParameterTreeDesignView=Backbone.View.extend({className:"tree-design",initialize:function(a){this.render()},render:function(){var c=new ToolFormView({model:this.model.get("tool")});c.render();this.$el.append(c.$el);var b=this,a=b.model.get("tool").get("inputs");this.$el.find(".form-row").not(".form-actions").each(function(d){var e=new ToolInputValOrSweepView({model:a.at(d),tool_row:$(this)})})}});var ToolParameterTreeView=Backbone.View.extend({className:"tool-parameter-tree",initialize:function(a){this.model.on("change:tree_data",this.render,this)},render:function(){this.$el.children().remove();var i=this.model.get_tree_params();if(!i.length){return}this.width=100*(2+i.length);this.height=15*this.model.get_num_leaves();var h=this;var g=d3.layout.cluster().size([this.height,this.width-160]);var c=d3.svg.diagonal().projection(function(j){return[j.y,j.x]});var a=g.nodes(this.model.get("tree_data"));var d=_.uniq(_.pluck(a,"y"));_.each(i,function(l,k){var j=d[k+1];h.$el.append($("<div>").addClass("label").text(l.get("label")).css("left",j+250))});var b=d3.select(this.$el[0]).append("svg").attr("width",this.width).attr("height",this.height+20).append("g").attr("transform","translate(40, 10)");var f=b.selectAll("path.link").data(g.links(a)).enter().append("path").attr("class","link").attr("d",c);var e=b.selectAll("g.node").data(a).enter().append("g").attr("class","node").attr("transform",function(j){return"translate("+j.y+","+j.x+")"}).on("mouseover",function(k){var j=_.pluck(h.model.get_connected_nodes(k),"id");e.filter(function(l){return _.find(j,function(m){return m===l.id})!==undefined}).style("fill","#f00")}).on("mouseout",function(){e.style("fill","#000")});e.append("circle").attr("r",9);e.append("text").attr("dx",function(j){return j.children?-12:12}).attr("dy",3).attr("text-anchor",function(j){return j.children?"end":"start"}).text(function(j){return j.name})}});var ParamaMonsterVisualizationView=Backbone.View.extend({className:"paramamonster",initialize:function(b){this.canvas_manager=new CanvasManager(this.$el.parents("body"));this.tool_param_tree_view=new ToolParameterTreeView({model:this.model.get("parameter_tree")});this.track_collection_container=$("<table/>").addClass("tracks");this.model.get("parameter_tree").on("change:tree_data",this.handle_node_clicks,this);var a=this;this.model.get("tracks").each(function(c){c.get("track").view=a})},render:function(){var d=new ToolParameterTreeDesignView({model:this.model.get("parameter_tree")});$("#left").append(d.$el);var a=this,e=a.model.get("regions"),b=$("<tr/>").appendTo(this.track_collection_container);e.each(function(f){b.append($("<th>").text(f.toString()))});b.children().first().attr("colspan",2);var c=$("<div>").addClass("tiles");$("#right").append(c.append(this.track_collection_container));a.model.get("tracks").each(function(f){a.add_track(f)});this.tool_param_tree_view.render();$("#center").append(this.tool_param_tree_view.$el);this.handle_node_clicks()},run_tool_on_dataset:function(b){var a=this.model.get("tool"),d=a.get("name"),c=this.model.get("dataset");a.set_input_values(b);$.when(a.rerun(c)).then(function(e){console.log(e);show_modal("Running "+d+" on complete dataset",d+"is running on dataset '"+c.get("name")+"' and is available in the dataset's history.",{Ok:function(){hide_modal()}})})},add_track:function(d){var b=this,c=this.model.get("parameter_tree");b.model.add_track(d);var a=new ParamaMonsterTrackView({model:d,canvas_manager:b.canvas_manager});a.on("run_on_dataset",b.run_tool_on_dataset,b);b.track_collection_container.append(a.$el);a.$el.hover(function(){var f=c.get_leaf(d.get("settings").get("values"));var e=_.pluck(c.get_connected_nodes(f),"id");d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").filter(function(g){return _.find(e,function(h){return h===g.id})!==undefined}).style("fill","#f00")},function(){d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").style("fill","#000")});return d},handle_node_clicks:function(){var a=this,b=this.model.get("parameter_tree"),d=this.model.get("regions"),c=d3.select(this.tool_param_tree_view.$el[0]).selectAll("g.node");c.on("click",function(k,g){var f=a.model.get("tool"),j=a.model.get("dataset"),h=b.get_node_settings(k),e=$.Deferred();if(h.length>=10){show_modal("Whoa there cowboy!","You clicked on a node to try "+a.model.get("tool").get("name")+" with "+h.length+" different combinations of settings. You can only run 10 jobs at a time.",{Ok:function(){hide_modal();e.resolve(false)}})}else{e.resolve(true)}$.when(e).then(function(i){if(!i){return}var l=_.map(h,function(m){var n=new ParamaMonsterTrack({settings:m,regions:d});a.add_track(n);return n});_.each(l,function(n,m){setTimeout(function(){f.set_input_values(n.get("settings").get("values"));$.when(f.rerun(j,d)).then(function(p){var q=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},p.first().get("track_config")),o=object_from_template(q,a,null);n.set("track",o)})},m*10000)})})})}});
\ No newline at end of file
+var ToolInputsSettings=Backbone.Model.extend({defaults:{inputs:null,values:null}});var ToolParameterTree=Backbone.RelationalModel.extend({defaults:{tool:null,tree_data:null},initialize:function(b){var a=this;this.get("tool").get("inputs").each(function(c){if(!c.get_samples()){return}c.on("change:min change:max change:num_samples",function(d){if(d.get("in_ptree")){a.set_tree_data()}},a);c.on("change:in_ptree",function(d){if(d.get("in_ptree")){a.add_param(d)}else{a.remove_param(d)}a.set_tree_data()},a)});if(b.config){_.each(b.config,function(d){var c=a.get("tool").get("inputs").find(function(e){return e.get("name")===d.name});a.add_param(c);c.set(d)})}},add_param:function(a){if(a.get("ptree_index")){return}a.set("in_ptree",true);a.set("ptree_index",this.get_tree_params().length)},remove_param:function(a){a.set("in_ptree",false);a.set("ptree_index",null);_(this.get_tree_params()).each(function(b,c){b.set("ptree_index",c+1)})},set_tree_data:function(){var b=_.map(this.get_tree_params(),function(d){return{param:d,samples:d.get_samples()}});var a=0,c=function(g,d){var i=g[d],h=i.param,f=h.get("label"),e=i.samples;if(g.length-1===d){return _.map(e,function(j){return{id:a++,name:j,param:h,value:j}})}return _.map(e,function(j){return{id:a++,name:j,param:h,value:j,children:c(g,d+1)}})};this.set("tree_data",{name:"Root",id:a++,children:(b.length!==0?c(b,0):null)})},get_tree_params:function(){return _(this.get("tool").get("inputs").where({in_ptree:true})).sortBy(function(a){return a.get("ptree_index")})},get_num_leaves:function(){return this.get_tree_params().reduce(function(a,b){return a*b.get_samples().length},1)},get_node_settings:function(e){var c=this.get("tool").get_inputs_dict();var f=e.parent;if(f){while(f.depth!==0){c[f.param.get("name")]=f.value;f=f.parent}}var a=this,b=function(h,g){if(h.param){g[h.param.get("name")]=h.value}if(!h.children){return new ToolInputsSettings({inputs:a.get("tool").get("inputs"),values:g})}else{return _.flatten(_.map(h.children,function(i){return b(i,_.clone(g))}))}},d=b(e,c);if(!_.isArray(d)){d=[d]}return d},get_connected_nodes:function(c){var d=function(e){if(!e.children){return e}else{return _.flatten([e,_.map(e.children,function(f){return d(f)})])}};var b=[],a=c.parent;while(a){b.push(a);a=a.parent}return _.flatten([b,d(c)])},get_leaf:function(b){var c=this.get("tree_data"),a=function(d){return _.find(d,function(e){return b[e.param.get("name")]===e.value})};while(c.children){c=a(c.children)}return c},toJSON:function(){return this.get_tree_params().map(function(a){return{name:a.get("name"),min:a.get("min"),max:a.get("max"),num_samples:a.get("num_samples")}})}});var ParamaMonsterTrack=Backbone.RelationalModel.extend({defaults:{track:null,settings:null,regions:null},relations:[{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"}],initialize:function(a){if(a.track){var b=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},a.track);delete b.mode;this.set("track",object_from_template(b,{},null))}},same_settings:function(a){var b=this.get("settings"),c=a.get("settings");for(var d in b){if(!c[d]||b[d]!==c[d]){return false}}return true},toJSON:function(){return{track:this.get("track").to_dict(),settings:this.get("settings"),regions:this.get("regions")}}});var TrackCollection=Backbone.Collection.extend({model:ParamaMonsterTrack});var ParamaMonsterVisualization=Visualization.extend({defaults:_.extend({},Visualization.prototype.defaults,{dataset:null,tool:null,parameter_tree:null,regions:null,tracks:null}),relations:[{type:Backbone.HasOne,key:"dataset",relatedModel:"Dataset"},{type:Backbone.HasOne,key:"tool",relatedModel:"Tool"},{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"},{type:Backbone.HasMany,key:"tracks",relatedModel:"ParamaMonsterTrack"}],initialize:function(a){var b=this.get("tool").copy(true);this.set("tool_with_samplable_inputs",b);this.set("parameter_tree",new ToolParameterTree({tool:b,config:a.tree_config}))},add_placeholder:function(a){this.get("tracks").add(new PlaceholderTrack(a))},add_track:function(a){this.get("tracks").add(a)},toJSON:function(){return{id:this.get("id"),title:"Parameter exploration for dataset '"+this.get("dataset").get("name")+"'",type:"paramamonster",dataset_id:this.get("dataset").id,tool_id:this.get("tool").id,regions:this.get("regions").toJSON(),tree_config:this.get("parameter_tree").toJSON(),tracks:this.get("tracks").toJSON()}}});var ParamaMonsterTrackView=Backbone.View.extend({tagName:"tr",TILE_LEN:250,initialize:function(a){this.canvas_manager=a.canvas_manager;this.render();this.model.on("change:track",this.draw_tiles,this)},render:function(){var f=this.model.get("settings"),b=f.get("values"),d=$("<td/>").addClass("settings").appendTo(this.$el),c=$("<div/>").addClass("track-info").hide().appendTo(d);c.append($("<div/>").css("font-weight","bold").text("Track Settings"));f.get("inputs").each(function(h){c.append(h.get("label")+": "+b[h.get("name")]+"<br/>")});var a=this,g=$("<button/>").appendTo(c).text("Run on complete dataset").click(function(){c.toggle();a.trigger("run_on_dataset",f)});var e=create_icon_buttons_menu([{title:"Settings",icon_class:"gear track-settings",on_click:function(){c.toggle()},tipsy_config:{gravity:"s"}},{title:"Remove",icon_class:"cross-circle",on_click:function(){a.$el.remove();$(".tipsy").remove()}}]);d.prepend(e.$el);this.model.get("regions").each(function(){a.$el.append($("<td/>").addClass("tile").html($("<img/>").attr("src",galaxy_paths.get("image_path")+"/loading_large_white_bg.gif")))});if(this.model.get("track")){this.draw_tiles()}},draw_tiles:function(){var b=this,a=this.model.get("track"),d=this.model.get("regions"),c=this.$el.find("td.tile");$.when(a.data_manager.data_is_ready()).then(function(e){d.each(function(h,g){var f=h.length()/b.TILE_LEN,j=1/f,i="Pack";$.when(a.data_manager.get_data(h,i,f,{})).then(function(l){var k=b.canvas_manager.new_canvas();k.width=b.TILE_LEN;k.height=a.get_canvas_height(l,i,j,k.width);a.draw_tile(l,k.getContext("2d"),i,f,h,j);$(c[g]).empty().append(k)})})})}});var ToolInputValOrSweepView=Backbone.View.extend({number_input_template:'<div class="form-row-input sweep"><input class="min" type="text" size="6" value="<%= min %>"> - <input class="max" type="text" size="6" value="<%= max %>"> samples: <input class="num_samples" type="text" size="1" value="<%= num_samples %>"></div>',select_input_template:'<div class="form-row-input sweep"><%= options %></div>',initialize:function(a){this.$el=a.tool_row;this.render()},render:function(){var b=this.model,f=b.get("type"),h=this.$el.find(".form-row-input"),d=null;h.find(":input").change(function(){b.set("value",$(this).val())});if(f==="number"){d=$(_.template(this.number_input_template,this.model.toJSON()))}else{if(f==="select"){var c=_.map(this.$el.find("select option"),function(i){return $(i).val()}),e=c.join(", ");d=$(_.template(this.select_input_template,{options:e}))}}d.insertAfter(h);var a=this,g=create_icon_buttons_menu([{title:"Add parameter to tree",icon_class:"plus-button",on_click:function(){b.set("in_ptree",true);h.hide();d.show();$(this).hide();a.$el.find(".icon-button.toggle").show()}},{title:"Remove parameter from tree",icon_class:"toggle",on_click:function(){b.set("in_ptree",false);d.hide();h.show();$(this).hide();a.$el.find(".icon-button.plus-button").show()}}],{tipsy_config:{gravity:"s"}});this.$el.prepend(g.$el);if(b.get("in_ptree")){h.hide();a.$el.find(".icon-button.plus-button").hide()}else{a.$el.find(".icon-button.toggle").hide();d.hide()}_.each(["min","max","num_samples"],function(i){d.find("."+i).change(function(){b.set(i,parseFloat($(this).val()))})})}});var ToolParameterTreeDesignView=Backbone.View.extend({className:"tree-design",initialize:function(a){this.render()},render:function(){var c=new ToolFormView({model:this.model.get("tool")});c.render();this.$el.append(c.$el);var b=this,a=b.model.get("tool").get("inputs");this.$el.find(".form-row").not(".form-actions").each(function(d){var e=new ToolInputValOrSweepView({model:a.at(d),tool_row:$(this)})})}});var ToolParameterTreeView=Backbone.View.extend({className:"tool-parameter-tree",initialize:function(a){this.model.on("change:tree_data",this.render,this)},render:function(){this.$el.children().remove();var i=this.model.get_tree_params();if(!i.length){return}this.width=100*(2+i.length);this.height=15*this.model.get_num_leaves();var h=this;var g=d3.layout.cluster().size([this.height,this.width-160]);var c=d3.svg.diagonal().projection(function(j){return[j.y,j.x]});var a=g.nodes(this.model.get("tree_data"));var d=_.uniq(_.pluck(a,"y"));_.each(i,function(l,k){var j=d[k+1];h.$el.append($("<div>").addClass("label").text(l.get("label")).css("left",j+250))});var b=d3.select(this.$el[0]).append("svg").attr("width",this.width).attr("height",this.height+20).append("g").attr("transform","translate(40, 10)");var f=b.selectAll("path.link").data(g.links(a)).enter().append("path").attr("class","link").attr("d",c);var e=b.selectAll("g.node").data(a).enter().append("g").attr("class","node").attr("transform",function(j){return"translate("+j.y+","+j.x+")"}).on("mouseover",function(k){var j=_.pluck(h.model.get_connected_nodes(k),"id");e.filter(function(l){return _.find(j,function(m){return m===l.id})!==undefined}).style("fill","#f00")}).on("mouseout",function(){e.style("fill","#000")});e.append("circle").attr("r",9);e.append("text").attr("dx",function(j){return j.children?-12:12}).attr("dy",3).attr("text-anchor",function(j){return j.children?"end":"start"}).text(function(j){return j.name})}});var ParamaMonsterVisualizationView=Backbone.View.extend({className:"paramamonster",initialize:function(b){this.canvas_manager=new CanvasManager(this.$el.parents("body"));this.tool_param_tree_view=new ToolParameterTreeView({model:this.model.get("parameter_tree")});this.track_collection_container=$("<table/>").addClass("tracks");this.model.get("parameter_tree").on("change:tree_data",this.handle_node_clicks,this);var a=this;this.model.get("tracks").each(function(c){c.get("track").view=a})},render:function(){var d=new ToolParameterTreeDesignView({model:this.model.get("parameter_tree")});$("#left").append(d.$el);var a=this,e=a.model.get("regions"),b=$("<tr/>").appendTo(this.track_collection_container);e.each(function(f){b.append($("<th>").text(f.toString()))});b.children().first().attr("colspan",2);var c=$("<div>").addClass("tiles");$("#right").append(c.append(this.track_collection_container));a.model.get("tracks").each(function(f){a.add_track(f)});this.tool_param_tree_view.render();$("#center").append(this.tool_param_tree_view.$el);this.handle_node_clicks()},run_tool_on_dataset:function(b){var a=this.model.get("tool"),d=a.get("name"),c=this.model.get("dataset");a.set_input_values(b.get("values"));$.when(a.rerun(c)).then(function(e){});show_modal("Running "+d+" on complete dataset",d+" is running on dataset '"+c.get("name")+"'. Outputs are in the dataset's history.",{Ok:function(){hide_modal()}})},add_track:function(d){var b=this,c=this.model.get("parameter_tree");b.model.add_track(d);var a=new ParamaMonsterTrackView({model:d,canvas_manager:b.canvas_manager});a.on("run_on_dataset",b.run_tool_on_dataset,b);b.track_collection_container.append(a.$el);a.$el.hover(function(){var f=c.get_leaf(d.get("settings").get("values"));var e=_.pluck(c.get_connected_nodes(f),"id");d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").filter(function(g){return _.find(e,function(h){return h===g.id})!==undefined}).style("fill","#f00")},function(){d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").style("fill","#000")});return d},handle_node_clicks:function(){var a=this,b=this.model.get("parameter_tree"),d=this.model.get("regions"),c=d3.select(this.tool_param_tree_view.$el[0]).selectAll("g.node");c.on("click",function(k,g){var f=a.model.get("tool"),j=a.model.get("dataset"),h=b.get_node_settings(k),e=$.Deferred();if(h.length>=10){show_modal("Whoa there cowboy!","You clicked on a node to try "+a.model.get("tool").get("name")+" with "+h.length+" different combinations of settings. You can only run 10 jobs at a time.",{Ok:function(){hide_modal();e.resolve(false)}})}else{e.resolve(true)}$.when(e).then(function(i){if(!i){return}var l=_.map(h,function(m){var n=new ParamaMonsterTrack({settings:m,regions:d});a.add_track(n);return n});_.each(l,function(n,m){setTimeout(function(){f.set_input_values(n.get("settings").get("values"));$.when(f.rerun(j,d)).then(function(p){var q=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},p.first().get("track_config")),o=object_from_template(q,a,null);n.set("track",o)})},m*10000)})})})}});
\ No newline at end of file
diff -r 3965354dda0b11768ae0c8c1ff5c33313bf98ee4 -r f6b32f963f6114e8ee86853a6311836b8dd5cdd3 static/scripts/viz/paramamonster.js
--- a/static/scripts/viz/paramamonster.js
+++ b/static/scripts/viz/paramamonster.js
@@ -400,6 +400,7 @@
});
var self = this,
run_on_dataset_button = $('<button/>').appendTo(settings_div).text('Run on complete dataset').click(function() {
+ settings_div.toggle();
self.trigger('run_on_dataset', settings);
});
var icon_menu = create_icon_buttons_menu([
@@ -732,16 +733,17 @@
var tool = this.model.get('tool'),
tool_name = tool.get('name'),
dataset = this.model.get('dataset');
- tool.set_input_values(settings);
+ tool.set_input_values(settings.get('values'));
$.when(tool.rerun(dataset)).then(function(outputs) {
- console.log(outputs);
- show_modal('Running ' + tool_name + ' on complete dataset',
- tool_name + 'is running on dataset \'' +
- dataset.get('name') + '\' and is available in the dataset\'s history.',
+ // TODO.
+ });
+
+ show_modal('Running ' + tool_name + ' on complete dataset',
+ tool_name + ' is running on dataset \'' +
+ dataset.get('name') + '\'. Outputs are in the dataset\'s history.',
{
'Ok': function() { hide_modal(); }
});
- });
},
/**
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Fixes for inspecting tool dependencies associated with a specified installed tool shed repository.
by Bitbucket 03 Jul '12
by Bitbucket 03 Jul '12
03 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/3965354dda0b/
changeset: 3965354dda0b
user: greg
date: 2012-07-03 17:38:48
summary: Fixes for inspecting tool dependencies associated with a specified installed tool shed repository.
affected #: 2 files
diff -r 8fd408407f7e48b917d14803c8ef61eaf10ca62c -r 3965354dda0b11768ae0c8c1ff5c33313bf98ee4 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -975,6 +975,16 @@
def get_tool_dependency( trans, id ):
"""Get a tool_dependency from the database via id"""
return trans.sa_session.query( trans.model.ToolDependency ).get( trans.security.decode_id( id ) )
+def get_tool_dependency_ids( as_string=False, **kwd ):
+ tool_dependency_id = kwd.get( 'tool_dependency_id', None )
+ tool_dependency_ids = util.listify( kwd.get( 'tool_dependency_ids', None ) )
+ if not tool_dependency_ids:
+ tool_dependency_ids = util.listify( kwd.get( 'id', None ) )
+ if tool_dependency_id and tool_dependency_id not in tool_dependency_ids:
+ tool_dependency_ids.append( tool_dependency_id )
+ if as_string:
+ return ','.join( tool_dependency_ids )
+ return tool_dependency_ids
def get_tool_panel_config_tool_path_install_dir( app, repository ):
# Return shed-related tool panel config, the tool_path configured in it, and the relative path to the directory where the
# repository is installed. This method assumes all repository tools are defined in a single shed-related tool panel config.
diff -r 8fd408407f7e48b917d14803c8ef61eaf10ca62c -r 3965354dda0b11768ae0c8c1ff5c33313bf98ee4 lib/galaxy/web/controllers/admin_toolshed.py
--- a/lib/galaxy/web/controllers/admin_toolshed.py
+++ b/lib/galaxy/web/controllers/admin_toolshed.py
@@ -262,7 +262,7 @@
model.ToolDependency.installation_status.ERROR ] ) )
]
def build_initial_query( self, trans, **kwd ):
- tool_dependency_ids = util.listify( kwd.get( 'tool_dependency_ids', None ) )
+ tool_dependency_ids = get_tool_dependency_ids( as_string=False, **kwd )
if tool_dependency_ids:
clause_list = []
for tool_dependency_id in tool_dependency_ids:
@@ -1067,12 +1067,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- tool_dependency_id = params.get( 'tool_dependency_id', None )
- tool_dependency_ids = util.listify( params.get( 'tool_dependency_ids', None ) )
- if not tool_dependency_ids:
- tool_dependency_ids = util.listify( params.get( 'id', None ) )
- if tool_dependency_id and tool_dependency_id not in tool_dependency_ids:
- tool_dependency_ids.append( tool_dependency_id )
+ tool_dependency_ids = get_tool_dependency_ids( as_string=False, **kwd )
# We need a tool_shed_repository, so get it from one of the tool_dependencies.
tool_dependency = get_tool_dependency( trans, tool_dependency_ids[ 0 ] )
tool_shed_repository = tool_dependency.tool_shed_repository
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: jgoecks: Bug fixes and enhancements for paramamonster.
by Bitbucket 03 Jul '12
by Bitbucket 03 Jul '12
03 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/8fd408407f7e/
changeset: 8fd408407f7e
user: jgoecks
date: 2012-07-03 17:20:10
summary: Bug fixes and enhancements for paramamonster.
affected #: 4 files
diff -r cf4b47cde5e5505a4f7fd1e9557ef4187ecea491 -r 8fd408407f7e48b917d14803c8ef61eaf10ca62c lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -2643,9 +2643,19 @@
if isinstance( input, DataToolParameter ):
param_dict.update( { 'type' : 'data', 'html' : urllib.quote( input.get_html( trans ) ) } )
elif isinstance( input, SelectToolParameter ):
+ # Get options, value.
+ options = input.get_options( trans, [] )
+ value = options[0][1]
+ for option in options:
+ if option[2]:
+ # Found selected option.
+ value = option[1]
+
+ # Pack input.
param_dict.update( { 'type' : 'select',
'html' : urllib.quote( input.get_html( trans ) ),
- 'options': input.static_options
+ 'options': options,
+ 'value': value
} )
elif isinstance( input, Conditional ):
# TODO.
diff -r cf4b47cde5e5505a4f7fd1e9557ef4187ecea491 -r 8fd408407f7e48b917d14803c8ef61eaf10ca62c static/scripts/packed/viz/paramamonster.js
--- a/static/scripts/packed/viz/paramamonster.js
+++ b/static/scripts/packed/viz/paramamonster.js
@@ -1,1 +1,1 @@
-var ToolParameterTree=Backbone.RelationalModel.extend({defaults:{tool:null,tree_data:null},initialize:function(b){var a=this;this.get("tool").get("inputs").each(function(c){if(!c.get_samples()){return}c.on("change:min change:max change:num_samples",function(d){if(d.get("in_ptree")){a.set_tree_data()}},a);c.on("change:in_ptree",function(d){if(d.get("in_ptree")){a.add_param(d)}else{a.remove_param(d)}a.set_tree_data()},a)});if(b.config){_.each(b.config,function(d){var c=a.get("tool").get("inputs").find(function(e){return e.get("name")===d.name});a.add_param(c);c.set(d)})}},add_param:function(a){if(a.get("ptree_index")){return}a.set("in_ptree",true);a.set("ptree_index",this.get_tree_params().length)},remove_param:function(a){a.set("in_ptree",false);a.set("ptree_index",null);_(this.get_tree_params()).each(function(b,c){b.set("ptree_index",c+1)})},set_tree_data:function(){var b=_.map(this.get_tree_params(),function(d){return{param:d,samples:d.get_samples()}});var a=0,c=function(g,d){var i=g[d],h=i.param,f=h.get("label"),e=i.samples;if(g.length-1===d){return _.map(e,function(j){return{id:a++,name:j,param:h,value:j}})}return _.map(e,function(j){return{id:a++,name:j,param:h,value:j,children:c(g,d+1)}})};this.set("tree_data",{name:"Root",id:a++,children:(b.length!==0?c(b,0):null)})},get_tree_params:function(){return _(this.get("tool").get("inputs").where({in_ptree:true})).sortBy(function(a){return a.get("ptree_index")})},get_num_leaves:function(){return this.get_tree_params().reduce(function(a,b){return a*b.get_samples().length},1)},get_node_settings:function(d){var b=this.get("tool").get_inputs_dict();var e=d.parent;if(e){while(e.depth!==0){b[e.param.get("name")]=e.value;e=e.parent}}var a=function(g,f){if(g.param){f[g.param.get("name")]=g.value}if(!g.children){return f}else{return _.flatten(_.map(g.children,function(h){return a(h,_.clone(f))}))}},c=a(d,b);if(!_.isArray(c)){c=[c]}return c},get_connected_nodes:function(c){var d=function(e){if(!e.children){return e}else{return _.flatten([e,_.map(e.children,function(f){return d(f)})])}};var b=[],a=c.parent;while(a){b.push(a);a=a.parent}return _.flatten([b,d(c)])},get_leaf:function(b){var c=this.get("tree_data"),a=function(d){return _.find(d,function(e){return b[e.param.get("name")]===e.value})};while(c.children){c=a(c.children)}return c},toJSON:function(){return this.get_tree_params().map(function(a){return{name:a.get("name"),min:a.get("min"),max:a.get("max"),num_samples:a.get("num_samples")}})}});var ParamaMonsterTrack=Backbone.RelationalModel.extend({defaults:{track:null,settings:null,regions:null},relations:[{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"}],initialize:function(a){if(a.track){var b=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},a.track);delete b.mode;this.set("track",object_from_template(b,{},null))}},same_settings:function(a){var b=this.get("settings"),c=a.get("settings");for(var d in b){if(!c[d]||b[d]!==c[d]){return false}}return true},toJSON:function(){return{track:this.get("track").to_dict(),settings:this.get("settings"),regions:this.get("regions")}}});var TrackCollection=Backbone.Collection.extend({model:ParamaMonsterTrack});var ParamaMonsterVisualization=Visualization.extend({defaults:_.extend({},Visualization.prototype.defaults,{dataset:null,tool:null,parameter_tree:null,regions:null,tracks:null}),relations:[{type:Backbone.HasOne,key:"dataset",relatedModel:"Dataset"},{type:Backbone.HasOne,key:"tool",relatedModel:"Tool"},{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"},{type:Backbone.HasMany,key:"tracks",relatedModel:"ParamaMonsterTrack"}],initialize:function(a){var b=this.get("tool").copy(true);this.set("tool_with_samplable_inputs",b);this.set("parameter_tree",new ToolParameterTree({tool:b,config:a.tree_config}))},add_placeholder:function(a){this.get("tracks").add(new PlaceholderTrack(a))},add_track:function(a){this.get("tracks").add(a)},toJSON:function(){return{id:this.get("id"),title:"Parameter exploration for dataset '"+this.get("dataset").get("name")+"'",type:"paramamonster",dataset_id:this.get("dataset").id,tool_id:this.get("tool").id,regions:this.get("regions").toJSON(),tree_config:this.get("parameter_tree").toJSON(),tracks:this.get("tracks").toJSON()}}});var ParamaMonsterTrackView=Backbone.View.extend({tagName:"tr",TILE_LEN:250,initialize:function(a){this.canvas_manager=a.canvas_manager;this.render();this.model.on("change:track",this.draw_tiles,this)},render:function(){var e=this.model.get("settings"),c=$("<td/>").addClass("settings").appendTo(this.$el),b=$("<div/>").addClass("track-info").hide().appendTo(c);b.append($("<div/>").css("font-weight","bold").text("Track Settings"));_.each(_.keys(e),function(g){b.append(g+": "+e[g]+"<br/>")});var a=this,f=$("<button/>").appendTo(b).text("Run on complete dataset").click(function(){a.trigger("run_on_dataset",e)});var d=create_icon_buttons_menu([{title:"Settings",icon_class:"gear track-settings",on_click:function(){b.toggle()},tipsy_config:{gravity:"s"}},{title:"Remove",icon_class:"cross-circle",on_click:function(){a.$el.remove();$(".tipsy").remove()}}]);c.prepend(d.$el);this.model.get("regions").each(function(){a.$el.append($("<td/>").addClass("tile").html($("<img/>").attr("src",galaxy_paths.get("image_path")+"/loading_large_white_bg.gif")))});if(this.model.get("track")){this.draw_tiles()}},draw_tiles:function(){var b=this,a=this.model.get("track"),d=this.model.get("regions"),c=this.$el.find("td.tile");$.when(a.data_manager.data_is_ready()).then(function(e){d.each(function(h,g){var f=h.length()/b.TILE_LEN,j=1/f,i="Pack";$.when(a.data_manager.get_data(h,i,f,{})).then(function(l){var k=b.canvas_manager.new_canvas();k.width=b.TILE_LEN;k.height=a.get_canvas_height(l,i,j,k.width);a.draw_tile(l,k.getContext("2d"),i,f,h,j);$(c[g]).empty().append(k)})})})}});var ToolInputValOrSweepView=Backbone.View.extend({number_input_template:'<div class="form-row-input sweep"><input class="min" type="text" size="6" value="<%= min %>"> - <input class="max" type="text" size="6" value="<%= max %>"> samples: <input class="num_samples" type="text" size="1" value="<%= num_samples %>"></div>',select_input_template:'<div class="form-row-input sweep"><%= options %></div>',initialize:function(a){this.$el=a.tool_row;this.render()},render:function(){var b=this.model,f=b.get("type"),h=this.$el.find(".form-row-input"),d=null;h.find("input").change(function(){b.set("value",$(this).val())});if(f==="number"){d=$(_.template(this.number_input_template,this.model.toJSON()))}else{if(f==="select"){var c=_.map(this.$el.find("select option"),function(i){return $(i).val()}),e=c.join(", ");d=$(_.template(this.select_input_template,{options:e}))}}d.insertAfter(h);if(b.get("in_ptree")){h.hide()}else{d.hide()}var a=this,g=create_icon_buttons_menu([{title:"Add parameter to tree",icon_class:"plus-button",on_click:function(){b.set("in_ptree",true);h.hide();d.show()}},{title:"Remove parameter from tree",icon_class:"toggle",on_click:function(){b.set("in_ptree",false);d.hide();h.show()}}],{tipsy_config:{gravity:"s"}});this.$el.prepend(g.$el);_.each(["min","max","num_samples"],function(i){d.find("."+i).change(function(){b.set(i,parseFloat($(this).val()))})})}});var ToolParameterTreeDesignView=Backbone.View.extend({className:"tree-design",initialize:function(a){this.render()},render:function(){var c=new ToolFormView({model:this.model.get("tool")});c.render();this.$el.append(c.$el);var b=this,a=b.model.get("tool").get("inputs");this.$el.find(".form-row").not(".form-actions").each(function(d){var e=new ToolInputValOrSweepView({model:a.at(d),tool_row:$(this)})})}});var ToolParameterTreeView=Backbone.View.extend({className:"tool-parameter-tree",initialize:function(a){this.model.on("change:tree_data",this.render,this)},render:function(){this.$el.children().remove();var i=this.model.get_tree_params();if(!i.length){return}this.width=100*(2+i.length);this.height=15*this.model.get_num_leaves();var h=this;var g=d3.layout.cluster().size([this.height,this.width-160]);var c=d3.svg.diagonal().projection(function(j){return[j.y,j.x]});var a=g.nodes(this.model.get("tree_data"));var d=_.uniq(_.pluck(a,"y"));_.each(i,function(l,k){var j=d[k+1];h.$el.append($("<div>").addClass("label").text(l.get("label")).css("left",j+250))});var b=d3.select(this.$el[0]).append("svg").attr("width",this.width).attr("height",this.height+20).append("g").attr("transform","translate(40, 10)");var f=b.selectAll("path.link").data(g.links(a)).enter().append("path").attr("class","link").attr("d",c);var e=b.selectAll("g.node").data(a).enter().append("g").attr("class","node").attr("transform",function(j){return"translate("+j.y+","+j.x+")"}).on("mouseover",function(k){var j=_.pluck(h.model.get_connected_nodes(k),"id");e.filter(function(l){return _.find(j,function(m){return m===l.id})!==undefined}).style("fill","#f00")}).on("mouseout",function(){e.style("fill","#000")});e.append("circle").attr("r",9);e.append("text").attr("dx",function(j){return j.children?-12:12}).attr("dy",3).attr("text-anchor",function(j){return j.children?"end":"start"}).text(function(j){return j.name})}});var ParamaMonsterVisualizationView=Backbone.View.extend({className:"paramamonster",initialize:function(b){this.canvas_manager=new CanvasManager(this.$el.parents("body"));this.tool_param_tree_view=new ToolParameterTreeView({model:this.model.get("parameter_tree")});this.track_collection_container=$("<table/>").addClass("tracks");this.model.get("parameter_tree").on("change:tree_data",this.handle_node_clicks,this);var a=this;this.model.get("tracks").each(function(c){c.get("track").view=a})},render:function(){var d=new ToolParameterTreeDesignView({model:this.model.get("parameter_tree")});$("#left").append(d.$el);var a=this,e=a.model.get("regions"),b=$("<tr/>").appendTo(this.track_collection_container);e.each(function(f){b.append($("<th>").text(f.toString()))});b.children().first().attr("colspan",2);var c=$("<div>").addClass("tiles");$("#right").append(c.append(this.track_collection_container));a.model.get("tracks").each(function(f){a.add_track(f)});this.tool_param_tree_view.render();$("#center").append(this.tool_param_tree_view.$el);this.handle_node_clicks()},run_tool_on_dataset:function(b){var a=this.model.get("tool"),c=this.model.get("dataset");a.set_input_values(b);$.when(a.rerun(c)).then(function(d){})},add_track:function(d){var b=this,c=this.model.get("parameter_tree");b.model.add_track(d);var a=new ParamaMonsterTrackView({model:d,canvas_manager:b.canvas_manager});a.on("run_on_dataset",b.run_tool_on_dataset,b);b.track_collection_container.append(a.$el);a.$el.hover(function(){var f=c.get_leaf(d.get("settings"));var e=_.pluck(c.get_connected_nodes(f),"id");d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").filter(function(g){return _.find(e,function(h){return h===g.id})!==undefined}).style("fill","#f00")},function(){d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").style("fill","#000")});return d},handle_node_clicks:function(){var a=this,b=this.model.get("parameter_tree"),d=this.model.get("regions"),c=d3.select(this.tool_param_tree_view.$el[0]).selectAll("g.node");c.on("click",function(k,g){var f=a.model.get("tool"),j=a.model.get("dataset"),h=b.get_node_settings(k),e=$.Deferred();if(h.length>=10){show_modal("Whoa there cowboy!","You clicked on a node to try "+a.model.get("tool").get("name")+" with "+h.length+" different combinations of settings. You can only run 10 jobs at a time.",{Ok:function(){hide_modal();e.resolve(false)}})}else{e.resolve(true)}$.when(e).then(function(i){if(!i){return}var l=_.map(h,function(m){var n=new ParamaMonsterTrack({settings:m,regions:d});a.add_track(n);return n});_.each(l,function(n,m){setTimeout(function(){f.set_input_values(n.get("settings"));$.when(f.rerun(j,d)).then(function(p){var q=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},p.first().get("track_config")),o=object_from_template(q,a,null);n.set("track",o)})},m*10000)})})})}});
\ No newline at end of file
+var ToolInputsSettings=Backbone.Model.extend({defaults:{inputs:null,values:null}});var ToolParameterTree=Backbone.RelationalModel.extend({defaults:{tool:null,tree_data:null},initialize:function(b){var a=this;this.get("tool").get("inputs").each(function(c){if(!c.get_samples()){return}c.on("change:min change:max change:num_samples",function(d){if(d.get("in_ptree")){a.set_tree_data()}},a);c.on("change:in_ptree",function(d){if(d.get("in_ptree")){a.add_param(d)}else{a.remove_param(d)}a.set_tree_data()},a)});if(b.config){_.each(b.config,function(d){var c=a.get("tool").get("inputs").find(function(e){return e.get("name")===d.name});a.add_param(c);c.set(d)})}},add_param:function(a){if(a.get("ptree_index")){return}a.set("in_ptree",true);a.set("ptree_index",this.get_tree_params().length)},remove_param:function(a){a.set("in_ptree",false);a.set("ptree_index",null);_(this.get_tree_params()).each(function(b,c){b.set("ptree_index",c+1)})},set_tree_data:function(){var b=_.map(this.get_tree_params(),function(d){return{param:d,samples:d.get_samples()}});var a=0,c=function(g,d){var i=g[d],h=i.param,f=h.get("label"),e=i.samples;if(g.length-1===d){return _.map(e,function(j){return{id:a++,name:j,param:h,value:j}})}return _.map(e,function(j){return{id:a++,name:j,param:h,value:j,children:c(g,d+1)}})};this.set("tree_data",{name:"Root",id:a++,children:(b.length!==0?c(b,0):null)})},get_tree_params:function(){return _(this.get("tool").get("inputs").where({in_ptree:true})).sortBy(function(a){return a.get("ptree_index")})},get_num_leaves:function(){return this.get_tree_params().reduce(function(a,b){return a*b.get_samples().length},1)},get_node_settings:function(e){var c=this.get("tool").get_inputs_dict();var f=e.parent;if(f){while(f.depth!==0){c[f.param.get("name")]=f.value;f=f.parent}}var a=this,b=function(h,g){if(h.param){g[h.param.get("name")]=h.value}if(!h.children){return new ToolInputsSettings({inputs:a.get("tool").get("inputs"),values:g})}else{return _.flatten(_.map(h.children,function(i){return b(i,_.clone(g))}))}},d=b(e,c);if(!_.isArray(d)){d=[d]}return d},get_connected_nodes:function(c){var d=function(e){if(!e.children){return e}else{return _.flatten([e,_.map(e.children,function(f){return d(f)})])}};var b=[],a=c.parent;while(a){b.push(a);a=a.parent}return _.flatten([b,d(c)])},get_leaf:function(b){var c=this.get("tree_data"),a=function(d){return _.find(d,function(e){return b[e.param.get("name")]===e.value})};while(c.children){c=a(c.children)}return c},toJSON:function(){return this.get_tree_params().map(function(a){return{name:a.get("name"),min:a.get("min"),max:a.get("max"),num_samples:a.get("num_samples")}})}});var ParamaMonsterTrack=Backbone.RelationalModel.extend({defaults:{track:null,settings:null,regions:null},relations:[{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"}],initialize:function(a){if(a.track){var b=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},a.track);delete b.mode;this.set("track",object_from_template(b,{},null))}},same_settings:function(a){var b=this.get("settings"),c=a.get("settings");for(var d in b){if(!c[d]||b[d]!==c[d]){return false}}return true},toJSON:function(){return{track:this.get("track").to_dict(),settings:this.get("settings"),regions:this.get("regions")}}});var TrackCollection=Backbone.Collection.extend({model:ParamaMonsterTrack});var ParamaMonsterVisualization=Visualization.extend({defaults:_.extend({},Visualization.prototype.defaults,{dataset:null,tool:null,parameter_tree:null,regions:null,tracks:null}),relations:[{type:Backbone.HasOne,key:"dataset",relatedModel:"Dataset"},{type:Backbone.HasOne,key:"tool",relatedModel:"Tool"},{type:Backbone.HasMany,key:"regions",relatedModel:"GenomeRegion"},{type:Backbone.HasMany,key:"tracks",relatedModel:"ParamaMonsterTrack"}],initialize:function(a){var b=this.get("tool").copy(true);this.set("tool_with_samplable_inputs",b);this.set("parameter_tree",new ToolParameterTree({tool:b,config:a.tree_config}))},add_placeholder:function(a){this.get("tracks").add(new PlaceholderTrack(a))},add_track:function(a){this.get("tracks").add(a)},toJSON:function(){return{id:this.get("id"),title:"Parameter exploration for dataset '"+this.get("dataset").get("name")+"'",type:"paramamonster",dataset_id:this.get("dataset").id,tool_id:this.get("tool").id,regions:this.get("regions").toJSON(),tree_config:this.get("parameter_tree").toJSON(),tracks:this.get("tracks").toJSON()}}});var ParamaMonsterTrackView=Backbone.View.extend({tagName:"tr",TILE_LEN:250,initialize:function(a){this.canvas_manager=a.canvas_manager;this.render();this.model.on("change:track",this.draw_tiles,this)},render:function(){var f=this.model.get("settings"),b=f.get("values"),d=$("<td/>").addClass("settings").appendTo(this.$el),c=$("<div/>").addClass("track-info").hide().appendTo(d);c.append($("<div/>").css("font-weight","bold").text("Track Settings"));f.get("inputs").each(function(h){c.append(h.get("label")+": "+b[h.get("name")]+"<br/>")});var a=this,g=$("<button/>").appendTo(c).text("Run on complete dataset").click(function(){a.trigger("run_on_dataset",f)});var e=create_icon_buttons_menu([{title:"Settings",icon_class:"gear track-settings",on_click:function(){c.toggle()},tipsy_config:{gravity:"s"}},{title:"Remove",icon_class:"cross-circle",on_click:function(){a.$el.remove();$(".tipsy").remove()}}]);d.prepend(e.$el);this.model.get("regions").each(function(){a.$el.append($("<td/>").addClass("tile").html($("<img/>").attr("src",galaxy_paths.get("image_path")+"/loading_large_white_bg.gif")))});if(this.model.get("track")){this.draw_tiles()}},draw_tiles:function(){var b=this,a=this.model.get("track"),d=this.model.get("regions"),c=this.$el.find("td.tile");$.when(a.data_manager.data_is_ready()).then(function(e){d.each(function(h,g){var f=h.length()/b.TILE_LEN,j=1/f,i="Pack";$.when(a.data_manager.get_data(h,i,f,{})).then(function(l){var k=b.canvas_manager.new_canvas();k.width=b.TILE_LEN;k.height=a.get_canvas_height(l,i,j,k.width);a.draw_tile(l,k.getContext("2d"),i,f,h,j);$(c[g]).empty().append(k)})})})}});var ToolInputValOrSweepView=Backbone.View.extend({number_input_template:'<div class="form-row-input sweep"><input class="min" type="text" size="6" value="<%= min %>"> - <input class="max" type="text" size="6" value="<%= max %>"> samples: <input class="num_samples" type="text" size="1" value="<%= num_samples %>"></div>',select_input_template:'<div class="form-row-input sweep"><%= options %></div>',initialize:function(a){this.$el=a.tool_row;this.render()},render:function(){var b=this.model,f=b.get("type"),h=this.$el.find(".form-row-input"),d=null;h.find(":input").change(function(){b.set("value",$(this).val())});if(f==="number"){d=$(_.template(this.number_input_template,this.model.toJSON()))}else{if(f==="select"){var c=_.map(this.$el.find("select option"),function(i){return $(i).val()}),e=c.join(", ");d=$(_.template(this.select_input_template,{options:e}))}}d.insertAfter(h);var a=this,g=create_icon_buttons_menu([{title:"Add parameter to tree",icon_class:"plus-button",on_click:function(){b.set("in_ptree",true);h.hide();d.show();$(this).hide();a.$el.find(".icon-button.toggle").show()}},{title:"Remove parameter from tree",icon_class:"toggle",on_click:function(){b.set("in_ptree",false);d.hide();h.show();$(this).hide();a.$el.find(".icon-button.plus-button").show()}}],{tipsy_config:{gravity:"s"}});this.$el.prepend(g.$el);if(b.get("in_ptree")){h.hide();a.$el.find(".icon-button.plus-button").hide()}else{a.$el.find(".icon-button.toggle").hide();d.hide()}_.each(["min","max","num_samples"],function(i){d.find("."+i).change(function(){b.set(i,parseFloat($(this).val()))})})}});var ToolParameterTreeDesignView=Backbone.View.extend({className:"tree-design",initialize:function(a){this.render()},render:function(){var c=new ToolFormView({model:this.model.get("tool")});c.render();this.$el.append(c.$el);var b=this,a=b.model.get("tool").get("inputs");this.$el.find(".form-row").not(".form-actions").each(function(d){var e=new ToolInputValOrSweepView({model:a.at(d),tool_row:$(this)})})}});var ToolParameterTreeView=Backbone.View.extend({className:"tool-parameter-tree",initialize:function(a){this.model.on("change:tree_data",this.render,this)},render:function(){this.$el.children().remove();var i=this.model.get_tree_params();if(!i.length){return}this.width=100*(2+i.length);this.height=15*this.model.get_num_leaves();var h=this;var g=d3.layout.cluster().size([this.height,this.width-160]);var c=d3.svg.diagonal().projection(function(j){return[j.y,j.x]});var a=g.nodes(this.model.get("tree_data"));var d=_.uniq(_.pluck(a,"y"));_.each(i,function(l,k){var j=d[k+1];h.$el.append($("<div>").addClass("label").text(l.get("label")).css("left",j+250))});var b=d3.select(this.$el[0]).append("svg").attr("width",this.width).attr("height",this.height+20).append("g").attr("transform","translate(40, 10)");var f=b.selectAll("path.link").data(g.links(a)).enter().append("path").attr("class","link").attr("d",c);var e=b.selectAll("g.node").data(a).enter().append("g").attr("class","node").attr("transform",function(j){return"translate("+j.y+","+j.x+")"}).on("mouseover",function(k){var j=_.pluck(h.model.get_connected_nodes(k),"id");e.filter(function(l){return _.find(j,function(m){return m===l.id})!==undefined}).style("fill","#f00")}).on("mouseout",function(){e.style("fill","#000")});e.append("circle").attr("r",9);e.append("text").attr("dx",function(j){return j.children?-12:12}).attr("dy",3).attr("text-anchor",function(j){return j.children?"end":"start"}).text(function(j){return j.name})}});var ParamaMonsterVisualizationView=Backbone.View.extend({className:"paramamonster",initialize:function(b){this.canvas_manager=new CanvasManager(this.$el.parents("body"));this.tool_param_tree_view=new ToolParameterTreeView({model:this.model.get("parameter_tree")});this.track_collection_container=$("<table/>").addClass("tracks");this.model.get("parameter_tree").on("change:tree_data",this.handle_node_clicks,this);var a=this;this.model.get("tracks").each(function(c){c.get("track").view=a})},render:function(){var d=new ToolParameterTreeDesignView({model:this.model.get("parameter_tree")});$("#left").append(d.$el);var a=this,e=a.model.get("regions"),b=$("<tr/>").appendTo(this.track_collection_container);e.each(function(f){b.append($("<th>").text(f.toString()))});b.children().first().attr("colspan",2);var c=$("<div>").addClass("tiles");$("#right").append(c.append(this.track_collection_container));a.model.get("tracks").each(function(f){a.add_track(f)});this.tool_param_tree_view.render();$("#center").append(this.tool_param_tree_view.$el);this.handle_node_clicks()},run_tool_on_dataset:function(b){var a=this.model.get("tool"),d=a.get("name"),c=this.model.get("dataset");a.set_input_values(b);$.when(a.rerun(c)).then(function(e){console.log(e);show_modal("Running "+d+" on complete dataset",d+"is running on dataset '"+c.get("name")+"' and is available in the dataset's history.",{Ok:function(){hide_modal()}})})},add_track:function(d){var b=this,c=this.model.get("parameter_tree");b.model.add_track(d);var a=new ParamaMonsterTrackView({model:d,canvas_manager:b.canvas_manager});a.on("run_on_dataset",b.run_tool_on_dataset,b);b.track_collection_container.append(a.$el);a.$el.hover(function(){var f=c.get_leaf(d.get("settings").get("values"));var e=_.pluck(c.get_connected_nodes(f),"id");d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").filter(function(g){return _.find(e,function(h){return h===g.id})!==undefined}).style("fill","#f00")},function(){d3.select(b.tool_param_tree_view.$el[0]).selectAll("g.node").style("fill","#000")});return d},handle_node_clicks:function(){var a=this,b=this.model.get("parameter_tree"),d=this.model.get("regions"),c=d3.select(this.tool_param_tree_view.$el[0]).selectAll("g.node");c.on("click",function(k,g){var f=a.model.get("tool"),j=a.model.get("dataset"),h=b.get_node_settings(k),e=$.Deferred();if(h.length>=10){show_modal("Whoa there cowboy!","You clicked on a node to try "+a.model.get("tool").get("name")+" with "+h.length+" different combinations of settings. You can only run 10 jobs at a time.",{Ok:function(){hide_modal();e.resolve(false)}})}else{e.resolve(true)}$.when(e).then(function(i){if(!i){return}var l=_.map(h,function(m){var n=new ParamaMonsterTrack({settings:m,regions:d});a.add_track(n);return n});_.each(l,function(n,m){setTimeout(function(){f.set_input_values(n.get("settings").get("values"));$.when(f.rerun(j,d)).then(function(p){var q=_.extend({data_url:galaxy_paths.get("raw_data_url"),converted_datasets_state_url:galaxy_paths.get("dataset_state_url")},p.first().get("track_config")),o=object_from_template(q,a,null);n.set("track",o)})},m*10000)})})})}});
\ No newline at end of file
diff -r cf4b47cde5e5505a4f7fd1e9557ef4187ecea491 -r 8fd408407f7e48b917d14803c8ef61eaf10ca62c static/scripts/viz/paramamonster.js
--- a/static/scripts/viz/paramamonster.js
+++ b/static/scripts/viz/paramamonster.js
@@ -2,6 +2,17 @@
* Visualization and components for ParamaMonster, a visualization for exploring a tool's parameter space via
* genomic visualization.
*/
+
+/**
+ * A collection of tool input settings. Object is useful for keeping a list of settings
+ * for future use without changing the input's value and for preserving inputs order.
+ */
+var ToolInputsSettings = Backbone.Model.extend({
+ defaults: {
+ inputs: null,
+ values: null
+ }
+});
/**
* Tree for a tool's parameters.
@@ -131,7 +142,7 @@
},
/**
- * Returns array of settings based on a node and its subtree.
+ * Returns array of ToolInputsSettings objects based on a node and its subtree.
*/
get_node_settings: function(target_node) {
// -- Get fixed settings from tool and parent nodes.
@@ -149,7 +160,8 @@
}
// Walk subtree starting at clicked node to get full list of settings.
- var get_settings = function(node, settings) {
+ var self = this,
+ get_settings = function(node, settings) {
// Add setting for this node. Root node does not have a param,
// however.
if (node.param) {
@@ -157,8 +169,11 @@
}
if (!node.children) {
- // At leaf node: add param setting and return.
- return settings;
+ // At leaf node, so return settings.
+ return new ToolInputsSettings({
+ inputs: self.get('tool').get('inputs'),
+ values: settings
+ });
}
else {
// At interior node: return list of subtree settings.
@@ -376,11 +391,12 @@
// Render settings icon and popup.
// TODO: use template.
var settings = this.model.get('settings'),
+ values = settings.get('values'),
settings_td = $('<td/>').addClass('settings').appendTo(this.$el),
settings_div = $('<div/>').addClass('track-info').hide().appendTo(settings_td);
settings_div.append( $('<div/>').css('font-weight', 'bold').text('Track Settings') );
- _.each(_.keys(settings), function(name) {
- settings_div.append( name + ': ' + settings[name] + '<br/>');
+ settings.get('inputs').each(function(input) {
+ settings_div.append( input.get('label') + ': ' + values[input.get('name')] + '<br/>');
});
var self = this,
run_on_dataset_button = $('<button/>').appendTo(settings_div).text('Run on complete dataset').click(function() {
@@ -472,7 +488,7 @@
sweep_inputs_row = null;
// Update tool inputs as single input changes.
- single_input_row.find('input').change(function() {
+ single_input_row.find(':input').change(function() {
input.set('value', $(this).val());
});
@@ -489,19 +505,8 @@
options: options_text
}));
}
-
sweep_inputs_row.insertAfter(single_input_row);
- if (input.get('in_ptree')) {
- single_input_row.hide();
- }
- else {
- sweep_inputs_row.hide();
- }
-
- // Fow now, assume parameter is included in tree to start.
-
-
// Add buttons for adding/removing parameter.
var self = this,
menu = create_icon_buttons_menu([
@@ -512,6 +517,8 @@
input.set('in_ptree', true);
single_input_row.hide();
sweep_inputs_row.show();
+ $(this).hide();
+ self.$el.find('.icon-button.toggle').show();
}
},
@@ -523,6 +530,8 @@
input.set('in_ptree', false);
sweep_inputs_row.hide();
single_input_row.show();
+ $(this).hide();
+ self.$el.find('.icon-button.plus-button').show();
}
}
],
@@ -531,6 +540,16 @@
});
this.$el.prepend(menu.$el);
+ // Show/hide input rows and icons depending on whether parameter is in the tree.
+ if (input.get('in_ptree')) {
+ single_input_row.hide();
+ self.$el.find('.icon-button.plus-button').hide();
+ }
+ else {
+ self.$el.find('.icon-button.toggle').hide();
+ sweep_inputs_row.hide();
+ }
+
// Update input's min, max, number of samples as values change.
_.each(['min', 'max', 'num_samples'], function(attr) {
sweep_inputs_row.find('.' + attr).change(function() {
@@ -711,10 +730,17 @@
run_tool_on_dataset: function(settings) {
var tool = this.model.get('tool'),
+ tool_name = tool.get('name'),
dataset = this.model.get('dataset');
tool.set_input_values(settings);
$.when(tool.rerun(dataset)).then(function(outputs) {
- // TODO: show modal with information about how to get to datasets.
+ console.log(outputs);
+ show_modal('Running ' + tool_name + ' on complete dataset',
+ tool_name + 'is running on dataset \'' +
+ dataset.get('name') + '\' and is available in the dataset\'s history.',
+ {
+ 'Ok': function() { hide_modal(); }
+ });
});
},
@@ -732,7 +758,7 @@
track_view.on('run_on_dataset', self.run_tool_on_dataset, self);
self.track_collection_container.append(track_view.$el);
track_view.$el.hover(function() {
- var settings_leaf = param_tree.get_leaf(pm_track.get('settings'));
+ var settings_leaf = param_tree.get_leaf(pm_track.get('settings').get('values'));
var connected_node_ids = _.pluck(param_tree.get_connected_nodes(settings_leaf), 'id');
// TODO: can do faster with enter?
@@ -793,7 +819,7 @@
setTimeout(function() {
// Set inputs and run tool.
// console.log('running with settings', pm_track.get('settings'));
- tool.set_input_values(pm_track.get('settings'));
+ tool.set_input_values(pm_track.get('settings').get('values'));
$.when(tool.rerun(dataset, regions)).then(function(output) {
// Create and add track for output dataset.
var track_config = _.extend({
diff -r cf4b47cde5e5505a4f7fd1e9557ef4187ecea491 -r 8fd408407f7e48b917d14803c8ef61eaf10ca62c templates/visualization/paramamonster.mako
--- a/templates/visualization/paramamonster.mako
+++ b/templates/visualization/paramamonster.mako
@@ -103,7 +103,8 @@
${parent.javascripts()}
${h.templates( "tool_link", "panel_section", "tool_search", "tool_form" )}
- ${h.js( "libs/d3", "mvc/data", "mvc/tools", "viz/visualization", "viz/paramamonster", "viz/trackster", "viz/trackster_ui", "jquery.ui.sortable.slider" )}
+ ${h.js( "libs/d3", "mvc/data", "mvc/tools", "viz/visualization", "viz/paramamonster",
+ "viz/trackster", "viz/trackster_ui", "jquery.ui.sortable.slider" )}
<script type="text/javascript">
var viz;
@@ -118,6 +119,7 @@
$('.unified-panel-body').append(viz_view.$el);
// -- Menu set up. --
+ /*
var menu = create_icon_buttons_menu([
{ icon_class: 'disk--arrow', title: 'Save', on_click: function() {
// Show saving dialog box
@@ -145,6 +147,7 @@
menu.$el.attr("style", "float: right");
$("#right .unified-panel-header-inner").append(menu.$el);
+ */
});
</script></%def>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

03 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/cf4b47cde5e5/
changeset: cf4b47cde5e5
user: greg
date: 2012-07-03 16:47:50
summary: Fixes for finding installed tool dependencies.
affected #: 2 files
diff -r bd24fd95ae9726e789d314bac2433ed07d0e1abe -r cf4b47cde5e5505a4f7fd1e9557ef4187ecea491 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -2358,7 +2358,7 @@
"""
commands = []
if self.tool_shed_repository:
- installed_tool_dependencies = self.tool_shed_repository.tool_dependencies
+ installed_tool_dependencies = self.tool_shed_repository.installed_tool_dependencies
else:
installed_tool_dependencies = None
for requirement in self.requirements:
@@ -2371,8 +2371,6 @@
version=requirement.version,
type=requirement.type,
installed_tool_dependencies=installed_tool_dependencies )
- if requirement.type == 'package':
- script_file, base_path, version = self.app.toolbox.dependency_manager.find_dep( requirement.name, requirement.version )
if script_file is None and base_path is None:
log.warn( "Failed to resolve dependency on '%s', ignoring", requirement.name )
elif script_file is None:
diff -r bd24fd95ae9726e789d314bac2433ed07d0e1abe -r cf4b47cde5e5505a4f7fd1e9557ef4187ecea491 lib/galaxy/tools/deps/__init__.py
--- a/lib/galaxy/tools/deps/__init__.py
+++ b/lib/galaxy/tools/deps/__init__.py
@@ -45,10 +45,9 @@
installed_dependency = None
if installed_tool_dependencies:
for installed_tool_dependency in installed_tool_dependencies:
- if not installed_tool_dependency.uninstalled:
- if installed_tool_dependency.name==name and installed_tool_dependency.version==version and installed_tool_dependency.type==type:
- installed_dependency = installed_tool_dependency
- break
+ if installed_tool_dependency.name==name and installed_tool_dependency.version==version and installed_tool_dependency.type==type:
+ installed_dependency = installed_tool_dependency
+ break
for base_path in self.base_paths:
if installed_dependency:
tool_shed_repository = installed_dependency.tool_shed_repository
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Template bug fix introduced in my last change set.
by Bitbucket 03 Jul '12
by Bitbucket 03 Jul '12
03 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/bd24fd95ae97/
changeset: bd24fd95ae97
user: greg
date: 2012-07-03 16:19:00
summary: Template bug fix introduced in my last change set.
affected #: 1 file
diff -r b1cdad4c77fa52d939901b1afb56f910f0753088 -r bd24fd95ae9726e789d314bac2433ed07d0e1abe templates/admin/tool_shed_repository/tool_dependency_installation_status.mako
--- a/templates/admin/tool_shed_repository/tool_dependency_installation_status.mako
+++ b/templates/admin/tool_shed_repository/tool_dependency_installation_status.mako
@@ -10,7 +10,7 @@
elif tool_dependency.status in [ trans.model.ToolDependency.installation_status.INSTALLED ]:
bgcolor = trans.model.ToolDependency.states.OK
rval = '<div class="count-box state-color-%s" id="ToolDependencyStatus-%s">%s</div>' % \
- ( bgcolor, trans.security.encode_id( tool_dependency.id, tool_dependency.status ) )
+ ( bgcolor, trans.security.encode_id( tool_dependency.id ), tool_dependency.status )
return rval
%>
${rval}
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Miscellaneous code cleanup related to monitoring tool shed repository installation.
by Bitbucket 03 Jul '12
by Bitbucket 03 Jul '12
03 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/b1cdad4c77fa/
changeset: b1cdad4c77fa
user: greg
date: 2012-07-03 15:55:51
summary: Miscellaneous code cleanup related to monitoring tool shed repository installation.
affected #: 3 files
diff -r 951ba799c0b020ae9d90f55435a30e19039f51fb -r b1cdad4c77fa52d939901b1afb56f910f0753088 lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -1557,20 +1557,7 @@
status = kwd.get( 'status', 'done' )
if webapp == 'galaxy':
installed_repositories = trans.sa_session.query( trans.model.ToolShedRepository ).first()
- installing_repository_ids = []
- new_status = trans.model.ToolShedRepository.installation_status.NEW
- cloning_status = trans.model.ToolShedRepository.installation_status.CLONING
- setting_tool_versions_status = trans.model.ToolShedRepository.installation_status.SETTING_TOOL_VERSIONS
- installing_dependencies_status = trans.model.ToolShedRepository.installation_status.INSTALLING_TOOL_DEPENDENCIES
- loading_datatypes_status = trans.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES
- for tool_shed_repository in trans.sa_session.query( trans.model.ToolShedRepository ) \
- .filter( or_( trans.model.ToolShedRepository.status == new_status,
- trans.model.ToolShedRepository.status == cloning_status,
- trans.model.ToolShedRepository.status == setting_tool_versions_status,
- trans.model.ToolShedRepository.status == installing_dependencies_status,
- trans.model.ToolShedRepository.status == loading_datatypes_status ) ):
- installing_repository_ids.append( trans.security.encode_id( tool_shed_repository.id ) )
- installing_repository_ids = ','.join( installing_repository_ids )
+ installing_repository_ids = get_ids_of_tool_shed_repositories_being_installed( trans, as_string=True )
return trans.fill_template( '/webapps/galaxy/admin/index.mako',
webapp=webapp,
installed_repositories=installed_repositories,
@@ -2675,6 +2662,24 @@
## ---- Utility methods -------------------------------------------------------
+def get_ids_of_tool_shed_repositories_being_installed( trans, as_string=False ):
+ installing_repository_ids = []
+ new_status = trans.model.ToolShedRepository.installation_status.NEW
+ cloning_status = trans.model.ToolShedRepository.installation_status.CLONING
+ setting_tool_versions_status = trans.model.ToolShedRepository.installation_status.SETTING_TOOL_VERSIONS
+ installing_dependencies_status = trans.model.ToolShedRepository.installation_status.INSTALLING_TOOL_DEPENDENCIES
+ loading_datatypes_status = trans.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES
+ for tool_shed_repository in trans.sa_session.query( trans.model.ToolShedRepository ) \
+ .filter( or_( trans.model.ToolShedRepository.status == new_status,
+ trans.model.ToolShedRepository.status == cloning_status,
+ trans.model.ToolShedRepository.status == setting_tool_versions_status,
+ trans.model.ToolShedRepository.status == installing_dependencies_status,
+ trans.model.ToolShedRepository.status == loading_datatypes_status ) ):
+ installing_repository_ids.append( trans.security.encode_id( tool_shed_repository.id ) )
+ if as_string:
+ return ','.join( installing_repository_ids )
+ return installing_repository_ids
+
def get_user( trans, user_id ):
"""Get a User from the database by id."""
user = trans.sa_session.query( trans.model.User ).get( trans.security.decode_id( user_id ) )
diff -r 951ba799c0b020ae9d90f55435a30e19039f51fb -r b1cdad4c77fa52d939901b1afb56f910f0753088 lib/galaxy/web/controllers/admin_toolshed.py
--- a/lib/galaxy/web/controllers/admin_toolshed.py
+++ b/lib/galaxy/web/controllers/admin_toolshed.py
@@ -140,8 +140,8 @@
bgcolor = trans.model.ToolShedRepository.states.OK
else:
bgcolor = trans.model.ToolShedRepository.states.ERROR
- rval = '<div class="count-box state-color-%s" id="RepositoryStatus-%s">' % ( bgcolor, trans.security.encode_id( tool_shed_repository.id ) )
- rval += '%s</div>' % tool_shed_repository.status
+ rval = '<div class="count-box state-color-%s" id="RepositoryStatus-%s">%s</div>' % \
+ ( bgcolor, trans.security.encode_id( tool_shed_repository.id ), tool_shed_repository.status )
return rval
webapp = "galaxy"
@@ -170,7 +170,8 @@
RevisionColumn( "Revision",
filterable="advanced" ),
StatusColumn( "Installation Status",
- filterable="advanced" ),
+ filterable="advanced",
+ label_id_prefix="RepositoryStatus-" )
]
operations = []
def build_initial_query( self, trans, **kwd ):
@@ -1149,18 +1150,7 @@
if tsrid and tsrid not in tsridslist:
tsridslist.append( tsrid )
if not tsridslist:
- new_status = trans.model.ToolShedRepository.installation_status.NEW
- cloning_status = trans.model.ToolShedRepository.installation_status.CLONING
- setting_tool_versions_status = trans.model.ToolShedRepository.installation_status.SETTING_TOOL_VERSIONS
- installing_dependencies_status = trans.model.ToolShedRepository.installation_status.INSTALLING_TOOL_DEPENDENCIES
- loading_datatypes_status = trans.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES
- for tool_shed_repository in trans.sa_session.query( trans.model.ToolShedRepository ) \
- .filter( or_( trans.model.ToolShedRepository.status == new_status,
- trans.model.ToolShedRepository.status == cloning_status,
- trans.model.ToolShedRepository.status == setting_tool_versions_status,
- trans.model.ToolShedRepository.status == installing_dependencies_status,
- trans.model.ToolShedRepository.status == loading_datatypes_status ) ):
- tsridslist.append( trans.security.encode_id( tool_shed_repository.id ) )
+ tsridslist = get_ids_of_tool_shed_repositories_being_installed( trans, as_string=False )
kwd[ 'tool_shed_repository_ids' ] = tsridslist
return self.repository_installation_grid( trans, **kwd )
@web.json
diff -r 951ba799c0b020ae9d90f55435a30e19039f51fb -r b1cdad4c77fa52d939901b1afb56f910f0753088 templates/admin/tool_shed_repository/tool_dependency_installation_status.mako
--- a/templates/admin/tool_shed_repository/tool_dependency_installation_status.mako
+++ b/templates/admin/tool_shed_repository/tool_dependency_installation_status.mako
@@ -9,8 +9,8 @@
bgcolor = trans.model.ToolDependency.states.ERROR
elif tool_dependency.status in [ trans.model.ToolDependency.installation_status.INSTALLED ]:
bgcolor = trans.model.ToolDependency.states.OK
- rval = '<div class="count-box state-color-%s" id="ToolDependencyStatus-%s">' % ( bgcolor, trans.security.encode_id( tool_dependency.id ) )
- rval += '%s</div>' % tool_dependency.status
+ rval = '<div class="count-box state-color-%s" id="ToolDependencyStatus-%s">%s</div>' % \
+ ( bgcolor, trans.security.encode_id( tool_dependency.id, tool_dependency.status ) )
return rval
%>
${rval}
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Fixes for monitoring tool_shed_repositories being installed.
by Bitbucket 02 Jul '12
by Bitbucket 02 Jul '12
02 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/951ba799c0b0/
changeset: 951ba799c0b0
user: greg
date: 2012-07-02 22:56:55
summary: Fixes for monitoring tool_shed_repositories being installed.
affected #: 5 files
diff -r a8e1ffb2c5f5290105893dea606d3bda97b1f244 -r 951ba799c0b020ae9d90f55435a30e19039f51fb lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -1556,10 +1556,25 @@
message = kwd.get( 'message', '' )
status = kwd.get( 'status', 'done' )
if webapp == 'galaxy':
- cloned_repositories = trans.sa_session.query( trans.model.ToolShedRepository ).first()
+ installed_repositories = trans.sa_session.query( trans.model.ToolShedRepository ).first()
+ installing_repository_ids = []
+ new_status = trans.model.ToolShedRepository.installation_status.NEW
+ cloning_status = trans.model.ToolShedRepository.installation_status.CLONING
+ setting_tool_versions_status = trans.model.ToolShedRepository.installation_status.SETTING_TOOL_VERSIONS
+ installing_dependencies_status = trans.model.ToolShedRepository.installation_status.INSTALLING_TOOL_DEPENDENCIES
+ loading_datatypes_status = trans.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES
+ for tool_shed_repository in trans.sa_session.query( trans.model.ToolShedRepository ) \
+ .filter( or_( trans.model.ToolShedRepository.status == new_status,
+ trans.model.ToolShedRepository.status == cloning_status,
+ trans.model.ToolShedRepository.status == setting_tool_versions_status,
+ trans.model.ToolShedRepository.status == installing_dependencies_status,
+ trans.model.ToolShedRepository.status == loading_datatypes_status ) ):
+ installing_repository_ids.append( trans.security.encode_id( tool_shed_repository.id ) )
+ installing_repository_ids = ','.join( installing_repository_ids )
return trans.fill_template( '/webapps/galaxy/admin/index.mako',
webapp=webapp,
- cloned_repositories=cloned_repositories,
+ installed_repositories=installed_repositories,
+ installing_repository_ids=installing_repository_ids,
message=message,
status=status )
else:
diff -r a8e1ffb2c5f5290105893dea606d3bda97b1f244 -r 951ba799c0b020ae9d90f55435a30e19039f51fb lib/galaxy/web/controllers/admin_toolshed.py
--- a/lib/galaxy/web/controllers/admin_toolshed.py
+++ b/lib/galaxy/web/controllers/admin_toolshed.py
@@ -140,7 +140,7 @@
bgcolor = trans.model.ToolShedRepository.states.OK
else:
bgcolor = trans.model.ToolShedRepository.states.ERROR
- rval = '<div class="count-box state-color-%s" id="ToolShedRepositoryStatus-%s">' % ( bgcolor, trans.security.encode_id( tool_shed_repository.id ) )
+ rval = '<div class="count-box state-color-%s" id="RepositoryStatus-%s">' % ( bgcolor, trans.security.encode_id( tool_shed_repository.id ) )
rval += '%s</div>' % tool_shed_repository.status
return rval
@@ -1148,6 +1148,19 @@
tsridslist = util.listify( params.get( 'id', None ) )
if tsrid and tsrid not in tsridslist:
tsridslist.append( tsrid )
+ if not tsridslist:
+ new_status = trans.model.ToolShedRepository.installation_status.NEW
+ cloning_status = trans.model.ToolShedRepository.installation_status.CLONING
+ setting_tool_versions_status = trans.model.ToolShedRepository.installation_status.SETTING_TOOL_VERSIONS
+ installing_dependencies_status = trans.model.ToolShedRepository.installation_status.INSTALLING_TOOL_DEPENDENCIES
+ loading_datatypes_status = trans.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES
+ for tool_shed_repository in trans.sa_session.query( trans.model.ToolShedRepository ) \
+ .filter( or_( trans.model.ToolShedRepository.status == new_status,
+ trans.model.ToolShedRepository.status == cloning_status,
+ trans.model.ToolShedRepository.status == setting_tool_versions_status,
+ trans.model.ToolShedRepository.status == installing_dependencies_status,
+ trans.model.ToolShedRepository.status == loading_datatypes_status ) ):
+ tsridslist.append( trans.security.encode_id( tool_shed_repository.id ) )
kwd[ 'tool_shed_repository_ids' ] = tsridslist
return self.repository_installation_grid( trans, **kwd )
@web.json
diff -r a8e1ffb2c5f5290105893dea606d3bda97b1f244 -r 951ba799c0b020ae9d90f55435a30e19039f51fb templates/admin/tool_shed_repository/common.mako
--- a/templates/admin/tool_shed_repository/common.mako
+++ b/templates/admin/tool_shed_repository/common.mako
@@ -200,8 +200,8 @@
//alert( "repository_status_list[item] " + repository_status_list[item].toSource() );
//alert( "repository_status_list[item]['status']" + repository_status_list[item]['status'] );
if (repository_status_list[item]['status'] != 'Installed'){
- empty = false;
- break;
+ empty = false;
+ break;
}
}
if ( ! empty ) {
diff -r a8e1ffb2c5f5290105893dea606d3bda97b1f244 -r 951ba799c0b020ae9d90f55435a30e19039f51fb templates/admin/tool_shed_repository/repository_installation_status.mako
--- a/templates/admin/tool_shed_repository/repository_installation_status.mako
+++ b/templates/admin/tool_shed_repository/repository_installation_status.mako
@@ -19,7 +19,7 @@
bgcolor = trans.model.ToolShedRepository.states.OK
else:
bgcolor = trans.model.ToolShedRepository.states.ERROR
- rval = '<div class="count-box state-color-%s" id="ToolShedRepositoryStatus-%s">' % ( bgcolor, trans.security.encode_id( repository.id ) )
+ rval = '<div class="count-box state-color-%s" id="RepositoryStatus-%s">' % ( bgcolor, trans.security.encode_id( repository.id ) )
rval += '%s</div>' % repository.status
return rval
%>
diff -r a8e1ffb2c5f5290105893dea606d3bda97b1f244 -r 951ba799c0b020ae9d90f55435a30e19039f51fb templates/webapps/galaxy/admin/index.mako
--- a/templates/webapps/galaxy/admin/index.mako
+++ b/templates/webapps/galaxy/admin/index.mako
@@ -70,8 +70,10 @@
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='reload_tool' )}" target="galaxy_main">Reload a tool's configuration</a></div><div class="toolTitle"><a href="${h.url_for( controller='admin', action='memdump' )}" target="galaxy_main">Profile memory usage</a></div><div class="toolTitle"><a href="${h.url_for( controller='admin', action='jobs' )}" target="galaxy_main">Manage jobs</a></div>
- <div class="toolTitle"><a href="${h.url_for( controller='admin_toolshed', action='monitor_repository_installation' )}" target="galaxy_main">Monitor installing tool shed repositories</a></div>
- %if cloned_repositories:
+ %if installing_repository_ids:
+ <div class="toolTitle"><a href="${h.url_for( controller='admin_toolshed', action='monitor_repository_installation', tool_shed_repository_ids=installing_repository_ids )}" target="galaxy_main">Monitor installing tool shed repositories</a></div>
+ %endif
+ %if installed_repositories:
<div class="toolTitle"><a href="${h.url_for( controller='admin_toolshed', action='browse_repositories' )}" target="galaxy_main">Manage installed tool shed repositories</a></div>
%endif
</div>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

02 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/a8e1ffb2c5f5/
changeset: a8e1ffb2c5f5
user: jgoecks
date: 2012-07-02 21:40:05
summary: Stylesheet cleanup and fixes for Trackster.
affected #: 3 files
diff -r e54f7684c919f1556bec34521b4ccffac0602792 -r a8e1ffb2c5f5290105893dea606d3bda97b1f244 static/june_2007_style/blue/trackster.css
--- a/static/june_2007_style/blue/trackster.css
+++ b/static/june_2007_style/blue/trackster.css
@@ -1,6 +1,6 @@
.viewport-container{overflow-x:hidden;overflow-y:auto;background:white;}
-.trackster-nav-container{width:100%;}
-.trackster-nav{padding:0 0;color:#333;font-weight:bold;background:#cccccc;background-image:url(panel_header_bg.png);background-position:middle center;background-repeat:repeat-x;border-bottom:solid #333 1px;}
+.trackster-nav-container{width:100%;height:0;text-align:center;}
+.trackster-nav{padding:0 0;color:#333;font-weight:bold;background:#cccccc;position:relative;display:inline-block;top:-2em;background:transparent;border:none;}
.content{font:10px verdana;}
.nav-controls{text-align:center;padding:1px 0;}
.nav-controls input{margin:0 5px;}
diff -r e54f7684c919f1556bec34521b4ccffac0602792 -r a8e1ffb2c5f5290105893dea606d3bda97b1f244 static/june_2007_style/trackster.css.tmpl
--- a/static/june_2007_style/trackster.css.tmpl
+++ b/static/june_2007_style/trackster.css.tmpl
@@ -5,16 +5,21 @@
}
.trackster-nav-container {
width: 100%;
+ /* Used to push nav into title bar: */
+ height: 0;
+ text-align: center;
}
.trackster-nav {
padding: 0 0;
color:#333;
font-weight:bold;
background:#cccccc;
- background-image:url(panel_header_bg.png);
- background-position: middle center;
- background-repeat:repeat-x;
- border-bottom: solid #333 1px;
+ /* Push nav up into title bar */
+ position: relative;
+ display: inline-block;
+ top: -2em;
+ background: transparent;
+ border: none;
}
.content {
font: 10px verdana;
diff -r e54f7684c919f1556bec34521b4ccffac0602792 -r a8e1ffb2c5f5290105893dea606d3bda97b1f244 templates/tracks/browser.mako
--- a/templates/tracks/browser.mako
+++ b/templates/tracks/browser.mako
@@ -11,28 +11,7 @@
<%def name="stylesheets()">
${parent.stylesheets()}
-
${h.css( "history", "autocomplete_tagging", "trackster", "overcast/jquery-ui-1.8.5.custom", "library" )}
-
- <style type="text/css">
- #browser-container {
- overflow: none;
- }
- .trackster-nav-container {
- width: 100%;
- ## Overriding styles from trackster.css to push nav up into title bar
- height: 0;
- text-align: center;
- }
- .trackster-nav {
- ## Overriding styles from trackster.css to push nav up into title bar
- position: relative;
- display: inline-block;
- top: -2em;
- background: transparent;
- border: none;
- }
- </style></%def><%def name="javascripts()">
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Fix for creating or updating a tool_shed_repository db record.
by Bitbucket 02 Jul '12
by Bitbucket 02 Jul '12
02 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/e54f7684c919/
changeset: e54f7684c919
user: greg
date: 2012-07-02 21:28:28
summary: Fix for creating or updating a tool_shed_repository db record.
affected #: 1 file
diff -r 0bf342288c79f417e7fbb6e0e7ac992024936e6e -r e54f7684c919f1556bec34521b4ccffac0602792 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -330,6 +330,15 @@
if not owner:
owner = get_repository_owner_from_clone_url( repository_clone_url )
includes_datatypes = 'datatypes' in metadata_dict
+ if status in [ app.model.ToolShedRepository.installation_status.DEACTIVATED ]:
+ deleted = True
+ uninstalled = False
+ elif status in [ app.model.ToolShedRepository.installation_status.UNINSTALLED ]:
+ deleted = True
+ uninstalled = True
+ else:
+ deleted = False
+ uninstalled = False
tool_shed_repository = get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( app,
tool_shed,
name,
@@ -341,22 +350,9 @@
tool_shed_repository.ctx_rev = ctx_rev
tool_shed_repository.metadata = metadata_dict
tool_shed_repository.includes_datatypes = includes_datatypes
+ tool_shed_repository.deleted = deleted
+ tool_shed_repository.uninstalled = uninstalled
tool_shed_repository.status = status
- if status in [ app.model.ToolShedRepository.installation_status.NEW,
- app.model.ToolShedRepository.installation_status.CLONING,
- app.model.ToolShedRepository.installation_status.SETTING_TOOL_VERSIONS,
- app.model.ToolShedRepository.installation_status.INSTALLING_TOOL_DEPENDENCIES,
- app.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES,
- app.model.ToolShedRepository.installation_status.INSTALLED,
- app.model.ToolShedRepository.installation_status.ERROR ]:
- tool_shed_repository.deleted = False
- tool_shed_repository.uninstalled = False
- elif status in [ app.model.ToolShedRepository.installation_status.DEACTIVATED ]:
- tool_shed_repository.deleted = True
- tool_shed_repository.uninstalled = False
- elif status in [ app.model.ToolShedRepository.installation_status.UNINSTALLED ]:
- tool_shed_repository.deleted = True
- tool_shed_repository.uninstalled = True
else:
tool_shed_repository = app.model.ToolShedRepository( tool_shed=tool_shed,
name=name,
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Apply recent refinements for installing tool shed repositories to the process used for reinstalling them after they've been uninstalled.
by Bitbucket 02 Jul '12
by Bitbucket 02 Jul '12
02 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/0bf342288c79/
changeset: 0bf342288c79
user: greg
date: 2012-07-02 20:44:46
summary: Apply recent refinements for installing tool shed repositories to the process used for reinstalling them after they've been uninstalled.
affected #: 7 files
diff -r e241ff58404830172524fb099fee7b5d7324f026 -r 0bf342288c79f417e7fbb6e0e7ac992024936e6e lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -290,11 +290,15 @@
dest_path = os.path.abspath( app.config.tool_data_path )
sample_file_name = strip_path( filename )
copied_file = sample_file_name.replace( '.sample', '' )
- # It's ok to overwrite the .sample version of the file.
- shutil.copy( os.path.abspath( filename ), os.path.join( dest_path, sample_file_name ) )
+ full_source_path = os.path.abspath( filename )
+ full_destination_path = os.path.join( dest_path, sample_file_name )
+ # Don't copy a file to itself - not sure how this happens, but sometimes it does...
+ if full_source_path != full_destination_path:
+ # It's ok to overwrite the .sample version of the file.
+ shutil.copy( full_source_path, full_destination_path )
# Only create the .loc file if it does not yet exist. We don't overwrite it in case it contains stuff proprietary to the local instance.
if not os.path.exists( os.path.join( dest_path, copied_file ) ):
- shutil.copy( os.path.abspath( filename ), os.path.join( dest_path, copied_file ) )
+ shutil.copy( full_source_path, os.path.join( dest_path, copied_file ) )
def copy_sample_files( app, sample_files, sample_files_copied=None, dest_path=None ):
"""
Copy all files to dest_path in the local Galaxy environment that have not already been copied. Those that have been copied
@@ -346,8 +350,13 @@
app.model.ToolShedRepository.installation_status.INSTALLED,
app.model.ToolShedRepository.installation_status.ERROR ]:
tool_shed_repository.deleted = False
- if status not in [ app.model.ToolShedRepository.installation_status.UNINSTALLED ]:
tool_shed_repository.uninstalled = False
+ elif status in [ app.model.ToolShedRepository.installation_status.DEACTIVATED ]:
+ tool_shed_repository.deleted = True
+ tool_shed_repository.uninstalled = False
+ elif status in [ app.model.ToolShedRepository.installation_status.UNINSTALLED ]:
+ tool_shed_repository.deleted = True
+ tool_shed_repository.uninstalled = True
else:
tool_shed_repository = app.model.ToolShedRepository( tool_shed=tool_shed,
name=name,
@@ -359,6 +368,8 @@
metadata=metadata_dict,
includes_datatypes=includes_datatypes,
dist_to_shed=dist_to_shed,
+ deleted=deleted,
+ uninstalled=uninstalled,
status=status )
sa_session.add( tool_shed_repository )
sa_session.flush()
diff -r e241ff58404830172524fb099fee7b5d7324f026 -r 0bf342288c79f417e7fbb6e0e7ac992024936e6e lib/galaxy/web/controllers/admin_toolshed.py
--- a/lib/galaxy/web/controllers/admin_toolshed.py
+++ b/lib/galaxy/web/controllers/admin_toolshed.py
@@ -488,7 +488,7 @@
return get_repository_file_contents( file_path )
@web.expose
@web.require_admin
- def initiate_repository_installation( self, trans, shed_repository_ids, encoded_kwd ):
+ def initiate_repository_installation( self, trans, shed_repository_ids, encoded_kwd, reinstalling=False ):
tsr_ids = util.listify( shed_repository_ids )
tool_shed_repositories = []
for tsr_id in tsr_ids:
@@ -502,7 +502,8 @@
encoded_kwd=encoded_kwd,
query=query,
tool_shed_repositories=tool_shed_repositories,
- initiate_repository_installation_ids=shed_repository_ids )
+ initiate_repository_installation_ids=shed_repository_ids,
+ reinstalling=reinstalling )
@web.expose
@web.require_admin
def initiate_tool_dependency_installation( self, trans, tool_dependencies ):
@@ -660,6 +661,7 @@
tool_panel_section_key = 'section_%s' % tool_panel_section
tool_section = trans.app.toolbox.tool_panel[ tool_panel_section_key ]
else:
+ tool_panel_section_key = None
tool_section = None
tsrids_list = [ trans.security.encode_id( tsr.id ) for tsr in created_or_updated_tool_shed_repositories ]
new_kwd = dict( includes_tool_dependencies=kwd.get( 'includes_tool_dependencies', False ),
@@ -668,7 +670,7 @@
repo_info_dict=kwd[ 'repo_info_dict' ],
message=message,
new_tool_panel_section=kwd.get( 'new_tool_panel_section', '' ),
- shed_tool_conf = kwd[ 'shed_tool_conf' ],
+ shed_tool_conf=kwd[ 'shed_tool_conf' ],
status=status,
tool_panel_section=kwd.get( 'tool_panel_section', '' ),
tool_path=tool_path,
@@ -680,7 +682,8 @@
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
action='initiate_repository_installation',
shed_repository_ids=tsrids_str,
- encoded_kwd=encoded_kwd ) )
+ encoded_kwd=encoded_kwd,
+ reinstalling=False ) )
else:
kwd[ 'message' ] = message
kwd[ 'status' ] = status
@@ -774,7 +777,7 @@
status=status )
@web.expose
@web.require_admin
- def install_tool_shed_repositories( self, trans, tool_shed_repositories, **kwd ):
+ def install_tool_shed_repositories( self, trans, tool_shed_repositories, reinstalling=False, **kwd ):
"""Install specified tool shed repositories."""
repo_info_dict = tool_shed_decode( kwd[ 'repo_info_dict' ] )
tool_path = kwd[ 'tool_path' ]
@@ -789,13 +792,20 @@
# Clone each repository to the configured location.
update_tool_shed_repository_status( trans.app, tool_shed_repository, trans.model.ToolShedRepository.installation_status.CLONING )
repo_info_tuple = repo_info_dict[ tool_shed_repository.name ]
- if includes_tool_dependencies:
+ if includes_tool_dependencies and not reinstalling:
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
else:
description, repository_clone_url, changeset_revision, ctx_rev = repo_info_tuple
clone_dir = os.path.join( tool_path, self.generate_tool_path( repository_clone_url, tool_shed_repository.installed_changeset_revision ) )
relative_install_dir = os.path.join( clone_dir, tool_shed_repository.name )
clone_repository( repository_clone_url, os.path.abspath( relative_install_dir ), ctx_rev )
+ if reinstalling:
+ # Since we're reinstalling the repository we need to find the latest changeset revision to which is can be updated.
+ current_changeset_revision, current_ctx_rev = get_update_to_changeset_revision_and_ctx_rev( trans, tool_shed_repository )
+ if current_ctx_rev != ctx_rev:
+ repo = hg.repository( get_configured_ui(), path=os.path.abspath( relative_install_dir ) )
+ pull_repository( repo, repository_clone_url, current_changeset_revision )
+ update_repository( repo, ctx_rev=current_ctx_rev )
self.handle_repository_contents( trans,
tool_shed_repository=tool_shed_repository,
tool_path=tool_path,
@@ -803,7 +813,8 @@
relative_install_dir=relative_install_dir,
tool_shed=tool_shed_repository.tool_shed,
tool_section=tool_section,
- shed_tool_conf=kwd.get( 'shed_tool_conf', '' ) )
+ shed_tool_conf=kwd.get( 'shed_tool_conf', '' ),
+ reinstalling=reinstalling )
trans.sa_session.refresh( tool_shed_repository )
metadata = tool_shed_repository.metadata
if 'tools' in metadata:
@@ -882,7 +893,7 @@
action='monitor_repository_installation',
tool_shed_repository_ids=tsr_ids_for_monitoring ) )
def handle_repository_contents( self, trans, tool_shed_repository, tool_path, repository_clone_url, relative_install_dir, tool_shed=None,
- tool_section=None, shed_tool_conf=None ):
+ tool_section=None, shed_tool_conf=None, reinstalling=False ):
"""
Generate the metadata for the installed tool shed repository, among other things. This method is called from Galaxy (never the tool shed)
when an admin is installing a new repository or reinstalling an uninstalled repository.
@@ -891,7 +902,7 @@
tool_shed_repository.metadata = metadata_dict
trans.sa_session.add( tool_shed_repository )
trans.sa_session.flush()
- if 'tool_dependencies' in metadata_dict:
+ if 'tool_dependencies' in metadata_dict and not reinstalling:
tool_dependencies = create_tool_dependency_objects( trans.app, tool_shed_repository, tool_shed_repository.installed_changeset_revision )
if 'tools' in metadata_dict:
tool_panel_dict = generate_tool_panel_dict_for_new_install( metadata_dict[ 'tools' ], tool_section )
@@ -1033,6 +1044,7 @@
kwd[ 'message' ] = 'All selected tool shed repositories are already uninstalled.'
kwd[ 'status' ] = 'error'
elif operation == "install":
+ reinstalling = util.string_as_bool( params.get( 'reinstalling', False ) )
encoded_kwd = kwd[ 'encoded_kwd' ]
decoded_kwd = tool_shed_decode( encoded_kwd )
tsr_ids = decoded_kwd[ 'tool_shed_repository_ids' ]
@@ -1043,7 +1055,7 @@
trans.model.ToolShedRepository.installation_status.UNINSTALLED ]:
repositories_for_installation.append( repository )
if repositories_for_installation:
- self.install_tool_shed_repositories( trans, repositories_for_installation, **decoded_kwd )
+ self.install_tool_shed_repositories( trans, repositories_for_installation, reinstalling=reinstalling, **decoded_kwd )
else:
kwd[ 'message' ] = 'All selected tool shed repositories are already installed.'
kwd[ 'status' ] = 'error'
@@ -1155,25 +1167,15 @@
no_changes = kwd.get( 'no_changes', '' )
no_changes_checked = CheckboxField.is_checked( no_changes )
install_tool_dependencies = CheckboxField.is_checked( kwd.get( 'install_tool_dependencies', '' ) )
+ new_tool_panel_section = kwd.get( 'new_tool_panel_section', '' )
+ tool_panel_section = kwd.get( 'tool_panel_section', '' )
shed_tool_conf, tool_path, relative_install_dir = get_tool_panel_config_tool_path_install_dir( trans.app, tool_shed_repository )
repository_clone_url = generate_clone_url( trans, tool_shed_repository )
clone_dir = os.path.join( tool_path, self.generate_tool_path( repository_clone_url, tool_shed_repository.installed_changeset_revision ) )
relative_install_dir = os.path.join( clone_dir, tool_shed_repository.name )
tool_shed_url = get_url_from_repository_tool_shed( trans.app, tool_shed_repository )
- if not tool_shed_repository.ctx_rev:
- # The ctx_rev column was introduced late, so may be null for some installed ToolShedRepositories.
- ctx_rev = get_ctx_rev( tool_shed_url, tool_shed_repository.name, tool_shed_repository.owner, tool_shed_repository.installed_changeset_revision )
- else:
- ctx_rev = tool_shed_repository.ctx_rev
- update_tool_shed_repository_status( trans.app, tool_shed_repository, trans.model.ToolShedRepository.installation_status.CLONING )
- clone_repository( repository_clone_url, os.path.abspath( relative_install_dir ), ctx_rev )
- # Since we're reinstalling the repository we need to find the latest changeset revision to which is can be updated.
- current_changeset_revision, current_ctx_rev = get_update_to_changeset_revision_and_ctx_rev( trans, tool_shed_repository )
- if current_ctx_rev != ctx_rev:
- repo = hg.repository( get_configured_ui(), path=os.path.abspath( relative_install_dir ) )
- pull_repository( repo, repository_clone_url, current_changeset_revision )
- update_repository( repo, ctx_rev=current_ctx_rev )
tool_section = None
+ tool_panel_section_key = None
metadata = tool_shed_repository.metadata
if tool_shed_repository.includes_tools:
# Get the location in the tool panel in which each tool was originally loaded.
@@ -1190,12 +1192,10 @@
original_section_id = tool_section_dict[ 'id' ]
original_section_name = tool_section_dict[ 'name' ]
if no_changes_checked:
- if original_section_id in [ '' ]:
- tool_section = None
- else:
- section_key = 'section_%s' % str( original_section_id )
- if section_key in trans.app.toolbox.tool_panel:
- tool_section = trans.app.toolbox.tool_panel[ section_key ]
+ if original_section_id:
+ tool_panel_section_key = 'section_%s' % str( original_section_id )
+ if tool_panel_section_key in trans.app.toolbox.tool_panel:
+ tool_section = trans.app.toolbox.tool_panel[ tool_panel_section_key ]
else:
# The section in which the tool was originally loaded used to be in the tool panel, but no longer is.
elem = Element( 'section' )
@@ -1203,18 +1203,16 @@
elem.attrib[ 'id' ] = original_section_id
elem.attrib[ 'version' ] = ''
tool_section = tools.ToolSection( elem )
- trans.app.toolbox.tool_panel[ section_key ] = tool_section
+ trans.app.toolbox.tool_panel[ tool_panel_section_key ] = tool_section
else:
# The user elected to change the tool panel section to contain the tools.
- new_tool_panel_section = kwd.get( 'new_tool_panel_section', '' )
- tool_panel_section = kwd.get( 'tool_panel_section', '' )
if new_tool_panel_section:
section_id = new_tool_panel_section.lower().replace( ' ', '_' )
- new_section_key = 'section_%s' % str( section_id )
- if new_section_key in trans.app.toolbox.tool_panel:
+ tool_panel_section_key = 'section_%s' % str( section_id )
+ if tool_panel_section_key in trans.app.toolbox.tool_panel:
# Appending a tool to an existing section in trans.app.toolbox.tool_panel
log.debug( "Appending to tool panel section: %s" % new_tool_panel_section )
- tool_section = trans.app.toolbox.tool_panel[ new_section_key ]
+ tool_section = trans.app.toolbox.tool_panel[ tool_panel_section_key ]
else:
# Appending a new section to trans.app.toolbox.tool_panel
log.debug( "Loading new tool panel section: %s" % new_tool_panel_section )
@@ -1223,46 +1221,43 @@
elem.attrib[ 'id' ] = section_id
elem.attrib[ 'version' ] = ''
tool_section = tools.ToolSection( elem )
- trans.app.toolbox.tool_panel[ new_section_key ] = tool_section
+ trans.app.toolbox.tool_panel[ tool_panel_section_key ] = tool_section
elif tool_panel_section:
- section_key = 'section_%s' % tool_panel_section
- tool_section = trans.app.toolbox.tool_panel[ section_key ]
+ tool_panel_section_key = 'section_%s' % tool_panel_section
+ tool_section = trans.app.toolbox.tool_panel[ tool_panel_section_key ]
else:
tool_section = None
- self.handle_repository_contents( trans,
- tool_shed_repository=tool_shed_repository,
- tool_path=tool_path,
- repository_clone_url=repository_clone_url,
- relative_install_dir=relative_install_dir,
- tool_shed=tool_shed_repository.tool_shed,
- tool_section=tool_section,
- shed_tool_conf=shed_tool_conf )
-
- if install_tool_dependencies and tool_shed_repository.tool_dependencies and 'tool_dependencies' in metadata:
- # Install tool dependencies.
- update_tool_shed_repository_status( trans.app,
- tool_shed_repository,
- trans.model.ToolShedRepository.installation_status.INSTALLING_TOOL_DEPENDENCIES )
- work_dir = make_tmp_directory()
- # Get the tool_dependencies.xml file from the repository.
- tool_dependencies_config = get_config_from_repository( trans.app,
- 'tool_dependencies.xml',
- tool_shed_repository,
- tool_shed_repository.installed_changeset_revision,
- work_dir )
- installed_tool_dependencies = handle_tool_dependencies( app=trans.app,
- tool_shed_repository=tool_shed_repository,
- tool_dependencies_config=tool_dependencies_config,
- tool_dependencies=tool_dependencies )
- tool_shed_repository.uninstalled = False
- tool_shed_repository.deleted = False
- tool_shed_repository.status = trans.model.ToolShedRepository.installation_status.INSTALLED
- trans.sa_session.add( tool_shed_repository )
- trans.sa_session.flush()
+ # The repository's status must be updated from 'Uninstall' to 'New' when initiating reinstall so the repository_installation_updater will function.
+ tool_shed_repository = create_or_update_tool_shed_repository( trans.app,
+ tool_shed_repository.name,
+ tool_shed_repository.description,
+ tool_shed_repository.installed_changeset_revision,
+ tool_shed_repository.ctx_rev,
+ repository_clone_url,
+ tool_shed_repository.metadata,
+ trans.model.ToolShedRepository.installation_status.NEW,
+ tool_shed_repository.installed_changeset_revision,
+ tool_shed_repository.owner,
+ tool_shed_repository.dist_to_shed )
+ new_kwd = dict( includes_tool_dependencies=tool_shed_repository.includes_tool_dependencies,
+ includes_tools=tool_shed_repository.includes_tools,
+ install_tool_dependencies=install_tool_dependencies,
+ repo_info_dict=kwd[ 'repo_info_dict' ],
+ message=message,
+ new_tool_panel_section=new_tool_panel_section,
+ shed_tool_conf=shed_tool_conf,
+ status=status,
+ tool_panel_section=tool_panel_section,
+ tool_path=tool_path,
+ tool_panel_section_key=tool_panel_section_key,
+ tool_shed_repository_ids=[ repository_id ],
+ tool_shed_url=tool_shed_url )
+ encoded_kwd = tool_shed_encode( new_kwd )
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
- action='browse_repositories',
- message=message,
- status=status ) )
+ action='initiate_repository_installation',
+ shed_repository_ids=repository_id,
+ encoded_kwd=encoded_kwd,
+ reinstalling=True ) )
@web.json
def repository_installation_status_updates( self, trans, ids=None, status_list=None ):
# Avoid caching
@@ -1314,8 +1309,24 @@
@web.require_admin
def reselect_tool_panel_section( self, trans, **kwd ):
repository = get_repository( trans, kwd[ 'id' ] )
+ metadata = repository.metadata
+ # Populate repo_info_dict.
+ tool_shed_url = get_url_from_repository_tool_shed( trans.app, repository )
+ ctx_rev = get_ctx_rev( tool_shed_url, repository.name, repository.owner, repository.installed_changeset_revision )
+ repository_clone_url = generate_clone_url( trans, repository )
+ repo_info_dict = {}
+ repo_info_dict[ repository.name ] = ( repository.description, repository_clone_url, repository.installed_changeset_revision, ctx_rev )
+ dict_with_tool_dependencies = {}
+ includes_tool_dependencies = repository.includes_tool_dependencies
+ if includes_tool_dependencies:
+ # Populate dict_with_tool_dependencies.
+ dict_with_tool_dependencies[ repository.name ] = ( repository.description,
+ repository_clone_url,
+ repository.installed_changeset_revision,
+ ctx_rev,
+ repository.owner,
+ metadata[ 'tool_dependencies' ] )
# Get the location in the tool panel in which the tool was originally loaded.
- metadata = repository.metadata
if 'tool_panel_section' in metadata:
tool_panel_dict = metadata[ 'tool_panel_section' ]
if tool_panel_dict:
@@ -1342,11 +1353,16 @@
message = "The tools contained in your <b>%s</b> repository were last loaded into the tool panel outside of any sections. " % repository.name
message += "Uncheck the <b>No changes</b> check box and select a tool panel section to load the tools into that section."
status = 'done'
+ install_tool_dependencies_check_box = CheckboxField( 'install_tool_dependencies', checked=True )
return trans.fill_template( '/admin/tool_shed_repository/reselect_tool_panel_section.mako',
repository=repository,
no_changes_check_box=no_changes_check_box,
original_section_name=original_section_name,
+ install_tool_dependencies_check_box=install_tool_dependencies_check_box,
tool_panel_section_select_field=tool_panel_section_select_field,
+ repo_info_dict=tool_shed_encode( repo_info_dict ),
+ dict_with_tool_dependencies=dict_with_tool_dependencies,
+ includes_tool_dependencies=includes_tool_dependencies,
message=message,
status=status )
@web.expose
diff -r e241ff58404830172524fb099fee7b5d7324f026 -r 0bf342288c79f417e7fbb6e0e7ac992024936e6e templates/admin/tool_shed_repository/common.mako
--- a/templates/admin/tool_shed_repository/common.mako
+++ b/templates/admin/tool_shed_repository/common.mako
@@ -67,6 +67,73 @@
</script></%def>
+<%def name="render_tool_dependency_section( install_tool_dependencies_check_box, dict_with_tool_dependencies )">
+ <% import os %>
+ <div class="form-row">
+ <div class="toolParamHelp" style="clear: both;">
+ <p>
+ These tool dependencies can be automatically installed with the repository. Installing them provides significant benefits and
+ Galaxy includes various features to manage them.
+ </p>
+ <p>
+ Each of these dependencies may require their own build requirements (e.g., CMake, g++, etc). Galaxy will not attempt to install
+ these build requirements, so tool dependency installation may partially fail if any are missing from your environment, but the
+ repository and all of it's contents will be installed. You can install the missing build requirements and have Galaxy attempt
+ to install the tool dependencies again if tool dependency installation fails in any way.
+ </p>
+ </div>
+ </div>
+ <div class="form-row">
+ <label>Install tool dependencies?</label>
+ ${install_tool_dependencies_check_box.get_html()}
+ <div class="toolParamHelp" style="clear: both;">
+ Un-check to skip automatic installation of these tool dependencies.
+ </div>
+ </div>
+ <div style="clear: both"></div>
+ <div class="form-row">
+ <table class="grid">
+ <tr><td colspan="4" bgcolor="#D8D8D8"><b>Tool dependencies</b></td></tr>
+ <tr>
+ <th>Name</th>
+ <th>Version</th>
+ <th>Type</th>
+ <th>Install directory</th>
+ </tr>
+ %for repository_name, repo_info_tuple in dict_with_tool_dependencies.items():
+ <% description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple %>
+ %for dependency_key, requirements_dict in tool_dependencies.items():
+ <%
+ name = requirements_dict[ 'name' ]
+ version = requirements_dict[ 'version' ]
+ type = requirements_dict[ 'type' ]
+ install_dir = os.path.join( trans.app.config.tool_dependency_dir,
+ name,
+ version,
+ repository_owner,
+ repository_name,
+ changeset_revision )
+ tool_dependency_readme_text = requirements_dict.get( 'readme', None )
+ %>
+ %if not os.path.exists( install_dir ):
+ <tr>
+ <td>${name}</td>
+ <td>${version}</td>
+ <td>${type}</td>
+ <td>${install_dir}</td>
+ </tr>
+ %if tool_dependency_readme_text:
+ <tr><td colspan="4" bgcolor="#FFFFCC">${name} ${version} requirements and installation information</td></tr>
+ <tr><td colspan="4"><pre>${tool_dependency_readme_text}</pre></td></tr>
+ %endif
+ %endif
+ %endfor
+ %endfor
+ </table>
+ <div style="clear: both"></div>
+ </div>
+</%def>
+
<%def name="dependency_status_updater()"><script type="text/javascript">
// Tool dependency status updater - used to update the installation status on the Tool Dependencies Grid.
diff -r e241ff58404830172524fb099fee7b5d7324f026 -r 0bf342288c79f417e7fbb6e0e7ac992024936e6e templates/admin/tool_shed_repository/initiate_repository_installation.mako
--- a/templates/admin/tool_shed_repository/initiate_repository_installation.mako
+++ b/templates/admin/tool_shed_repository/initiate_repository_installation.mako
@@ -11,15 +11,15 @@
<%def name="repository_installation_javascripts()"><script type="text/javascript">
$(document).ready(function( ){
- initiate_repository_installation( "${initiate_repository_installation_ids}", "${encoded_kwd}" );
+ initiate_repository_installation( "${initiate_repository_installation_ids}", "${encoded_kwd}", "${reinstalling}" );
});
- var initiate_repository_installation = function ( iri_ids, encoded_kwd ) {
+ var initiate_repository_installation = function ( iri_ids, encoded_kwd, reinstalling ) {
// Make ajax call
$.ajax( {
type: "POST",
url: "${h.url_for( controller='admin_toolshed', action='manage_repositories' )}",
dataType: "html",
- data: { operation: "install", tool_shed_repository_ids: iri_ids, encoded_kwd: encoded_kwd },
+ data: { operation: "install", tool_shed_repository_ids: iri_ids, encoded_kwd: encoded_kwd, reinstalling: reinstalling },
success : function ( data ) {
//alert( "Initializing repository installation succeeded" );
},
diff -r e241ff58404830172524fb099fee7b5d7324f026 -r 0bf342288c79f417e7fbb6e0e7ac992024936e6e templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
--- a/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
+++ b/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
@@ -1,5 +1,6 @@
<%inherit file="/base.mako"/><%namespace file="/message.mako" import="render_msg" />
+<%namespace file="/admin/tool_shed_repository/common.mako" import="render_tool_dependency_section" />
%if message:
${render_msg( message, status )}
@@ -8,7 +9,12 @@
<div class="toolForm"><div class="toolFormTitle">Choose the tool panel section to contain the installed tools (optional)</div><div class="toolFormBody">
- <form name="reselect_tool_panel_section" id="reselect_tool_panel_section" action="${h.url_for( controller='admin_toolshed', action='reinstall_repository', id=trans.security.encode_id( repository.id ) )}" method="post" >
+ <form name="reselect_tool_panel_section" id="reselect_tool_panel_section" action="${h.url_for( controller='admin_toolshed', action='reinstall_repository', id=trans.security.encode_id( repository.id ), repo_info_dict=repo_info_dict )}" method="post" >
+ <div style="clear: both"></div>
+ %if includes_tool_dependencies:
+ ${render_tool_dependency_section( install_tool_dependencies_check_box, dict_with_tool_dependencies )}
+ %endif
+ <div style="clear: both"></div><div class="form-row">
${no_changes_check_box.get_html()}
<label style="display: inline;">No changes</label>
diff -r e241ff58404830172524fb099fee7b5d7324f026 -r 0bf342288c79f417e7fbb6e0e7ac992024936e6e templates/admin/tool_shed_repository/select_tool_panel_section.mako
--- a/templates/admin/tool_shed_repository/select_tool_panel_section.mako
+++ b/templates/admin/tool_shed_repository/select_tool_panel_section.mako
@@ -1,7 +1,6 @@
<%inherit file="/base.mako"/><%namespace file="/message.mako" import="render_msg" />
-
-<% import os %>
+<%namespace file="/admin/tool_shed_repository/common.mako" import="render_tool_dependency_section" />
%if message:
${render_msg( message, status )}
@@ -29,69 +28,7 @@
<form name="select_tool_panel_section" id="select_tool_panel_section" action="${h.url_for( controller='admin_toolshed', action='install_repository', tool_shed_url=tool_shed_url, repo_info_dict=repo_info_dict, includes_tools=includes_tools, includes_tool_dependencies=includes_tool_dependencies )}" method="post" ><div style="clear: both"></div>
%if includes_tool_dependencies:
- <div class="form-row">
- <div class="toolParamHelp" style="clear: both;">
- <p>
- These tool dependencies can be automatically installed with the repository. Installing them provides significant benefits and
- Galaxy includes various features to manage them.
- </p>
- <p>
- Each of these dependencies may require their own build requirements (e.g., CMake, g++, etc). Galaxy will not attempt to install
- these build requirements, so tool dependency installation may partially fail if any are missing from your environment, but the
- repository and all of it's contents will be installed. You can install the missing build requirements and have Galaxy attempt
- to install the tool dependencies again if tool dependency installation fails in any way.
- </p>
- </div>
- </div>
- <div class="form-row">
- <label>Install tool dependencies?</label>
- ${install_tool_dependencies_check_box.get_html()}
- <div class="toolParamHelp" style="clear: both;">
- Un-check to skip automatic installation of these tool dependencies.
- </div>
- </div>
- <div style="clear: both"></div>
- <div class="form-row">
- <table class="grid">
- <tr><td colspan="4" bgcolor="#D8D8D8"><b>Tool dependencies</b></td></tr>
- <tr>
- <th>Name</th>
- <th>Version</th>
- <th>Type</th>
- <th>Install directory</th>
- </tr>
- %for repository_name, repo_info_tuple in dict_with_tool_dependencies.items():
- <% description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple %>
- %for dependency_key, requirements_dict in tool_dependencies.items():
- <%
- name = requirements_dict[ 'name' ]
- version = requirements_dict[ 'version' ]
- type = requirements_dict[ 'type' ]
- install_dir = os.path.join( trans.app.config.tool_dependency_dir,
- name,
- version,
- repository_owner,
- repository_name,
- changeset_revision )
- tool_dependency_readme_text = requirements_dict.get( 'readme', None )
- %>
- %if not os.path.exists( install_dir ):
- <tr>
- <td>${name}</td>
- <td>${version}</td>
- <td>${type}</td>
- <td>${install_dir}</td>
- </tr>
- %if tool_dependency_readme_text:
- <tr><td colspan="4" bgcolor="#FFFFCC">${name} ${version} requirements and installation information</td></tr>
- <tr><td colspan="4"><pre>${tool_dependency_readme_text}</pre></td></tr>
- %endif
- %endif
- %endfor
- %endfor
- </table>
- <div style="clear: both"></div>
- </div>
+ ${render_tool_dependency_section( install_tool_dependencies_check_box, dict_with_tool_dependencies )}
%endif
<div style="clear: both"></div><div class="form-row">
diff -r e241ff58404830172524fb099fee7b5d7324f026 -r 0bf342288c79f417e7fbb6e0e7ac992024936e6e templates/webapps/galaxy/admin/index.mako
--- a/templates/webapps/galaxy/admin/index.mako
+++ b/templates/webapps/galaxy/admin/index.mako
@@ -70,10 +70,10 @@
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='reload_tool' )}" target="galaxy_main">Reload a tool's configuration</a></div><div class="toolTitle"><a href="${h.url_for( controller='admin', action='memdump' )}" target="galaxy_main">Profile memory usage</a></div><div class="toolTitle"><a href="${h.url_for( controller='admin', action='jobs' )}" target="galaxy_main">Manage jobs</a></div>
+ <div class="toolTitle"><a href="${h.url_for( controller='admin_toolshed', action='monitor_repository_installation' )}" target="galaxy_main">Monitor installing tool shed repositories</a></div>
%if cloned_repositories:
<div class="toolTitle"><a href="${h.url_for( controller='admin_toolshed', action='browse_repositories' )}" target="galaxy_main">Manage installed tool shed repositories</a></div>
%endif
- <div class="toolTitle"><a href="${h.url_for( controller='admin_toolshed', action='monitor_repository_installation' )}" target="galaxy_main">Monitor installing tool shed repositories</a></div></div></div>
%if trans.app.tool_shed_registry and trans.app.tool_shed_registry.tool_sheds:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: natefoo: Create CLI job runner for submitting jobs via a (remote) shell.
by Bitbucket 02 Jul '12
by Bitbucket 02 Jul '12
02 Jul '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/e241ff584048/
changeset: e241ff584048
user: natefoo
date: 2012-07-02 19:05:08
summary: Create CLI job runner for submitting jobs via a (remote) shell.
affected #: 13 files
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/__init__.py
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -89,9 +89,11 @@
self.__user_system_pwent = None
self.__galaxy_system_pwent = None
- def get_job_runner( self ):
- job_runner = self.job_runner_mapper.get_job_runner( self.params )
- return job_runner
+ def get_job_runner_url( self ):
+ return self.job_runner_mapper.get_job_runner_url( self.params )
+
+ # legacy naming
+ get_job_runner = get_job_runner_url
def get_job( self ):
return self.sa_session.query( model.Job ).get( self.job_id )
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/handler.py
--- a/lib/galaxy/jobs/handler.py
+++ b/lib/galaxy/jobs/handler.py
@@ -55,7 +55,6 @@
# Contains new jobs. Note this is not used if track_jobs_in_database is True
self.queue = Queue()
# Contains jobs that are waiting (only use from monitor thread)
- ## This and jobs_to_check[] are closest to a "Job Queue"
self.waiting_jobs = []
# Helper for interruptable sleep
self.sleeper = Sleeper()
@@ -392,13 +391,12 @@
if self.app.config.use_tasked_jobs and job_wrapper.tool.parallelism is not None and not isinstance(job_wrapper, TaskWrapper):
runner_name = "tasks"
else:
- runner_name = ( job_wrapper.get_job_runner().split(":", 1) )[0]
+ runner_name = ( job_wrapper.get_job_runner_url().split(":", 1) )[0]
return runner_name
def put( self, job_wrapper ):
try:
runner_name = self.__get_runner_name( job_wrapper )
- log.debug( "Runner_name: " + runner_name )
if self.app.config.use_tasked_jobs and job_wrapper.tool.parallelism is not None and isinstance(job_wrapper, TaskWrapper):
#DBTODO Refactor
log.debug( "dispatching task %s, of job %d, to %s runner" %( job_wrapper.task_id, job_wrapper.job_id, runner_name ) )
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/mapper.py
--- a/lib/galaxy/jobs/mapper.py
+++ b/lib/galaxy/jobs/mapper.py
@@ -11,7 +11,7 @@
class JobRunnerMapper( object ):
"""
This class is responsible to managing the mapping of jobs
- (in the form of job_wrappers) to job runner strings.
+ (in the form of job_wrappers) to job runner url strings.
"""
def __init__( self, job_wrapper ):
@@ -103,7 +103,7 @@
return rule_module
return None
- def __expand_dynamic_job_runner( self, options_str ):
+ def __expand_dynamic_job_runner_url( self, options_str ):
option_parts = options_str.split( '/' )
expand_type = option_parts[ 0 ]
if expand_type == "python":
@@ -113,18 +113,18 @@
else:
raise Exception( "Unhandled dynamic job runner type specified - %s" % calculation_type )
- def __cache_job_runner( self, params ):
- raw_job_runner = self.job_wrapper.tool.get_job_runner( params )
- if raw_job_runner.startswith( DYNAMIC_RUNNER_PREFIX ):
- job_runner = self.__expand_dynamic_job_runner( raw_job_runner[ len( DYNAMIC_RUNNER_PREFIX ) : ] )
+ def __cache_job_runner_url( self, params ):
+ raw_job_runner_url = self.job_wrapper.tool.get_job_runner_url( params )
+ if raw_job_runner_url.startswith( DYNAMIC_RUNNER_PREFIX ):
+ job_runner_url = self.__expand_dynamic_job_runner_url( raw_job_runner_url[ len( DYNAMIC_RUNNER_PREFIX ) : ] )
else:
- job_runner = raw_job_runner
- self.cached_job_runner = job_runner
+ job_runner_url = raw_job_runner_url
+ self.cached_job_runner_url = job_runner_url
- def get_job_runner( self, params ):
+ def get_job_runner_url( self, params ):
"""
- Cache the job_runner string to avoid recalculation.
+ Cache the job_runner_url string to avoid recalculation.
"""
- if not hasattr( self, 'cached_job_runner' ):
- self.__cache_job_runner( params )
- return self.cached_job_runner
+ if not hasattr( self, 'cached_job_runner_url' ):
+ self.__cache_job_runner_url( params )
+ return self.cached_job_runner_url
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/runners/cli.py
--- /dev/null
+++ b/lib/galaxy/jobs/runners/cli.py
@@ -0,0 +1,380 @@
+"""
+Job control via a command line interface (e.g. qsub/qstat), possibly over a remote connection (e.g. ssh).
+"""
+
+import os
+import time
+import glob
+import logging
+import threading
+import subprocess
+
+from Queue import Queue, Empty
+
+from galaxy import model
+from galaxy.jobs.runners import BaseJobRunner
+
+log = logging.getLogger( __name__ )
+
+__all__ = [ 'ShellJobRunner' ]
+
+class RunnerJobState( object ):
+ def __init__( self ):
+ """
+ Encapsulates state related to a job that is being run and that we need to monitor.
+ """
+ self.job_wrapper = None
+ self.external_job_id = None
+ self.old_state = None
+ self.running = False
+ self.job_file = None
+ self.ofile = None
+ self.efile = None
+ self.runner_url = None
+
+class ShellJobRunner( BaseJobRunner ):
+ """
+ Job runner backed by a finite pool of worker threads. FIFO scheduling
+ """
+ STOP_SIGNAL = object()
+ def __init__( self, app ):
+ """Initialize this job runner and start the monitor thread"""
+ # Check if drmaa was importable, fail if not
+ self.app = app
+ self.sa_session = app.model.context
+ self.remote_home_directory = None
+ # 'watched' and 'queue' are both used to keep track of jobs to watch.
+ # 'queue' is used to add new watched jobs, and can be called from
+ # any thread (usually by the 'queue_job' method). 'watched' must only
+ # be modified by the monitor thread, which will move items from 'queue'
+ # to 'watched' and then manage the watched jobs.
+ self.watched = []
+ self.monitor_queue = Queue()
+ self.monitor_thread = threading.Thread( target=self.monitor )
+ self.monitor_thread.start()
+ self.work_queue = Queue()
+ self.work_threads = []
+ nworkers = app.config.cluster_job_queue_workers
+
+ self.cli_shells = None
+ self.cli_job_interfaces = None
+ self.__load_cli_plugins()
+
+ for i in range( nworkers ):
+ worker = threading.Thread( target=self.run_next )
+ worker.start()
+ self.work_threads.append( worker )
+ log.debug( "%d workers ready" % nworkers )
+
+ def __load_cli_plugins(self):
+ def __load(module_path, d):
+ for file in glob.glob(os.path.join(os.path.join(os.getcwd(), 'lib', *module_path.split('.')), '*.py')):
+ if os.path.basename(file).startswith('_'):
+ continue
+ module_name = '%s.%s' % (module_path, os.path.basename(file).rsplit('.py', 1)[0])
+ module = __import__(module_name)
+ for comp in module_name.split( "." )[1:]:
+ module = getattr(module, comp)
+ for name in module.__all__:
+ log.debug('Loaded cli plugin %s' % name)
+ d[name] = getattr(module, name)
+
+ self.cli_shells = {}
+ self.cli_job_interfaces = {}
+ __load('galaxy.jobs.runners.cli_shell', self.cli_shells)
+ __load('galaxy.jobs.runners.cli_job', self.cli_job_interfaces)
+
+ def get_cli_plugins(self, runner_url):
+ shell_params, job_params = runner_url.split('/')[2:4]
+ # split 'foo=bar&baz=quux' into { 'foo' : 'bar', 'baz' : 'quux' }
+ shell_params = dict ( [ ( k, v ) for k, v in [ kv.split('=', 1) for kv in shell_params.split('&') ] ] )
+ job_params = dict ( [ ( k, v ) for k, v in [ kv.split('=', 1) for kv in job_params.split('&') ] ] )
+ # load shell plugin
+ shell = self.cli_shells[shell_params['plugin']](**shell_params)
+ job_interface = self.cli_job_interfaces[job_params['plugin']](**job_params)
+ return shell, job_interface
+
+ def run_next( self ):
+ """
+ Run the next item in the queue (a job waiting to run or finish )
+ """
+ while 1:
+ ( op, obj ) = self.work_queue.get()
+ if op is self.STOP_SIGNAL:
+ return
+ try:
+ if op == 'queue':
+ self.queue_job( obj )
+ elif op == 'finish':
+ self.finish_job( obj )
+ elif op == 'fail':
+ self.fail_job( obj )
+ except:
+ log.exception( "Uncaught exception %sing job" % op )
+
+ def queue_job( self, job_wrapper ):
+ """Create job script and submit it to the DRM"""
+ try:
+ job_wrapper.prepare()
+ command_line = self.build_command_line( job_wrapper, include_metadata=True )
+ except:
+ job_wrapper.fail( "failure preparing job", exception=True )
+ log.exception("failure running job %s" % job_wrapper.get_id_tag())
+ return
+
+ # This is silly, why would we queue a job with no command line?
+ if not command_line:
+ job_wrapper.finish( '', '' )
+ return
+
+ # Check for deletion before we change state
+ if job_wrapper.get_state() == model.Job.states.DELETED:
+ log.debug( "Job %s deleted by user before it entered the queue" % job_wrapper.get_id_tag() )
+ if self.app.config.cleanup_job in ( "always", "onsuccess" ):
+ job_wrapper.cleanup()
+ return
+
+ # Get shell and job execution interface
+ runner_url = job_wrapper.get_job_runner_url()
+ shell, job_interface = self.get_cli_plugins(runner_url)
+
+ # Change to queued state immediately
+ job_wrapper.change_state( model.Job.states.QUEUED )
+
+ # define job attributes
+ ofile = "%s.gjout" % os.path.join(job_wrapper.working_directory, job_wrapper.get_id_tag())
+ efile = "%s.gjerr" % os.path.join(job_wrapper.working_directory, job_wrapper.get_id_tag())
+ ecfile = "%s.gjec" % os.path.join(job_wrapper.working_directory, job_wrapper.get_id_tag())
+ job_name = "g%s_%s_%s" % ( job_wrapper.job_id, job_wrapper.tool.id, job_wrapper.user )
+
+ # fill in the DRM's job run template
+ script = job_interface.get_job_template(ofile, efile, job_name, job_wrapper, command_line, ecfile)
+ script_file = "%s/galaxy_%s.sh" % (self.app.config.cluster_files_directory, job_wrapper.get_id_tag())
+
+ try:
+ fh = file(script_file, "w")
+ fh.write(script)
+ fh.close()
+ except:
+ job_wrapper.fail("failure preparing job script", exception=True)
+ log.exception("failure running job %s" % job_wrapper.get_id_tag())
+ return
+
+ # job was deleted while we were preparing it
+ if job_wrapper.get_state() == model.Job.states.DELETED:
+ log.info("Job %s deleted by user before it entered the queue" % job_wrapper.get_id_tag())
+ if self.app.config.cleanup_job in ("always", "onsuccess"):
+ job_wrapper.cleanup()
+ return
+
+ # wrapper.get_id_tag() instead of job_id for compatibility with TaskWrappers.
+ galaxy_id_tag = job_wrapper.get_id_tag()
+
+ log.debug("(%s) submitting file: %s" % (galaxy_id_tag, script_file ))
+ log.debug("(%s) command is: %s" % (galaxy_id_tag, command_line ) )
+
+ cmd_out = shell.execute(job_interface.submit(script_file))
+ if cmd_out.returncode != 0:
+ log.error('(%s) submission failed (stdout): %s' % (galaxy_id_tag, cmd_out.stdout))
+ log.error('(%s) submission failed (stderr): %s' % (galaxy_id_tag, cmd_out.stderr))
+ job_wrapper.fail("failure submitting job")
+ return
+ external_job_id = cmd_out.stdout.strip()
+ if not external_job_id:
+ log.error('(%s) submission did not return a job identifier, failing job' % galaxy_id_tag)
+ job_wrapper.fail("failure submitting job")
+ return
+
+ log.info("(%s) queued with identifier: %s" % ( galaxy_id_tag, external_job_id ) )
+
+ # store runner information for tracking if Galaxy restarts
+ job_wrapper.set_runner( runner_url, external_job_id )
+
+ # Store state information for job
+ runner_job_state = RunnerJobState()
+ runner_job_state.job_wrapper = job_wrapper
+ runner_job_state.external_job_id = external_job_id
+ runner_job_state.ofile = ofile
+ runner_job_state.efile = efile
+ runner_job_state.ecfile = ecfile
+ runner_job_state.job_file = script_file
+ runner_job_state.old_state = 'new'
+ runner_job_state.running = False
+ runner_job_state.runner_url = runner_url
+
+ # Add to our 'queue' of jobs to monitor
+ self.monitor_queue.put( runner_job_state )
+
+ def monitor( self ):
+ """
+ Watches jobs currently in the PBS queue and deals with state changes
+ (queued to running) and job completion
+ """
+ while 1:
+ # Take any new watched jobs and put them on the monitor list
+ try:
+ while 1:
+ runner_job_state = self.monitor_queue.get_nowait()
+ if runner_job_state is self.STOP_SIGNAL:
+ # TODO: This is where any cleanup would occur
+ return
+ self.watched.append( runner_job_state )
+ except Empty:
+ pass
+ # Iterate over the list of watched jobs and check state
+ try:
+ self.check_watched_items()
+ except:
+ log.exception('Uncaught exception checking job state:')
+ # Sleep a bit before the next state check
+ time.sleep( 15 )
+
+ def check_watched_items( self ):
+ """
+ Called by the monitor thread to look at each watched job and deal
+ with state changes.
+ """
+ new_watched = []
+
+ job_states = self.__get_job_states()
+
+ for runner_job_state in self.watched:
+ external_job_id = runner_job_state.external_job_id
+ galaxy_job_id = runner_job_state.job_wrapper.job_id
+ old_state = runner_job_state.old_state
+ state = job_states.get(external_job_id, None)
+ if state is None:
+ log.debug("(%s/%s) job not found in batch state check" % ( galaxy_job_id, external_job_id ) )
+ shell, job_interface = self.get_cli_plugins(runner_job_state.runner_url)
+ cmd_out = shell.execute(job_interface.get_single_status(external_job_id))
+ state = job_interface.parse_single_status(cmd_out.stdout, external_job_id)
+ if state == model.Job.states.OK:
+ log.debug('(%s/%s) job execution finished, running job wrapper finish method' % ( galaxy_job_id, external_job_id ) )
+ self.work_queue.put( ( 'finish', runner_job_state ) )
+ continue
+ else:
+ log.warning('(%s/%s) job not found in batch state check, but found in individual state check' % ( galaxy_job_id, external_job_id ) )
+ if state != old_state:
+ runner_job_state.job_wrapper.change_state( state )
+ else:
+ if state != old_state:
+ log.debug("(%s/%s) state change: %s" % ( galaxy_job_id, external_job_id, state ) )
+ runner_job_state.job_wrapper.change_state( state )
+ if state == model.Job.states.RUNNING and not runner_job_state.running:
+ runner_job_state.running = True
+ runner_job_state.job_wrapper.change_state( model.Job.states.RUNNING )
+ runner_job_state.old_state = state
+ new_watched.append( runner_job_state )
+ # Replace the watch list with the updated version
+ self.watched = new_watched
+
+ def __get_job_states(self):
+ runner_urls = {}
+ job_states = {}
+ for runner_job_state in self.watched:
+ # remove any job plugin options from the runner URL since they should not affect doing a batch state check
+ runner_url = runner_job_state.runner_url.split('/')
+ job_params = runner_url[3]
+ job_params = dict ( [ ( k, v ) for k, v in [ kv.split('=', 1) for kv in job_params.split('&') ] ] )
+ runner_url[3] = 'plugin=%s' % job_params['plugin']
+ runner_url = '/'.join(runner_url)
+ # create the list of job ids to check for each runner url
+ if runner_job_state.runner_url not in runner_urls:
+ runner_urls[runner_job_state.runner_url] = [runner_job_state.external_job_id]
+ else:
+ runner_urls[runner_job_state.runner_url].append(runner_job_state.external_job_id)
+ # check each runner url for the listed job ids
+ for runner_url, job_ids in runner_urls.items():
+ shell, job_interface = self.get_cli_plugins(runner_url)
+ cmd_out = shell.execute(job_interface.get_status(job_ids))
+ assert cmd_out.returncode == 0, cmd_out.stderr
+ job_states.update(job_interface.parse_status(cmd_out.stdout, job_ids))
+ return job_states
+
+ def finish_job( self, runner_job_state ):
+ """
+ Get the output/error for a finished job, pass to `job_wrapper.finish`
+ and cleanup all the DRM temporary files.
+ """
+ ofile = runner_job_state.ofile
+ efile = runner_job_state.efile
+ ecfile = runner_job_state.ecfile
+ job_file = runner_job_state.job_file
+ # collect the output
+ # wait for the files to appear
+ which_try = 0
+ while which_try < (self.app.config.retry_job_output_collection + 1):
+ try:
+ ofh = file(ofile, "r")
+ efh = file(efile, "r")
+ ecfh = file(ecfile, "r")
+ stdout = ofh.read( 32768 )
+ stderr = efh.read( 32768 )
+ exit_code = ecfh.read(32)
+ which_try = (self.app.config.retry_job_output_collection + 1)
+ except:
+ if which_try == self.app.config.retry_job_output_collection:
+ stdout = ''
+ stderr = 'Job output not returned from cluster'
+ log.debug( stderr )
+ else:
+ time.sleep(1)
+ which_try += 1
+
+ try:
+ runner_job_state.job_wrapper.finish( stdout, stderr, exit_code )
+ except:
+ log.exception("Job wrapper finish method failed")
+
+ def fail_job( self, job_state ):
+ """
+ Seperated out so we can use the worker threads for it.
+ """
+ self.stop_job( self.sa_session.query( self.app.model.Job ).get( job_state.job_wrapper.job_id ) )
+ job_state.job_wrapper.fail( job_state.fail_message )
+
+ def put( self, job_wrapper ):
+ """Add a job to the queue (by job identifier)"""
+ # Change to queued state before handing to worker thread so the runner won't pick it up again
+ job_wrapper.change_state( model.Job.states.QUEUED )
+ self.work_queue.put( ( 'queue', job_wrapper ) )
+
+ def shutdown( self ):
+ """Attempts to gracefully shut down the monitor thread"""
+ log.info( "sending stop signal to worker threads" )
+ self.monitor_queue.put( self.STOP_SIGNAL )
+ for i in range( len( self.work_threads ) ):
+ self.work_queue.put( ( self.STOP_SIGNAL, None ) )
+ log.info( "drmaa job runner stopped" )
+
+ def stop_job( self, job ):
+ """Attempts to delete a dispatched job"""
+ try:
+ shell, job_interface = self.get_cli_plugins( job.job_runner )
+ cmd_out = shell.execute(job_interface.delete( job.job_runner_external_id ))
+ assert cmd_out.returncode == 0, cmd_out.stderr
+ log.debug( "(%s/%s) Terminated at user's request" % ( job.id, job.job_runner_external_id ) )
+ except Exception, e:
+ log.debug( "(%s/%s) User killed running job, but error encountered during termination: %s" % ( job.id, job.job_runner_external_id, e ) )
+
+ def recover( self, job, job_wrapper ):
+ """Recovers jobs stuck in the queued/running state when Galaxy started"""
+ runner_job_state = RunnerJobState()
+ runner_job_state.ofile = "%s.gjout" % os.path.join(job_wrapper.working_directory, job_wrapper.get_id_tag())
+ runner_job_state.efile = "%s.gjerr" % os.path.join(job_wrapper.working_directory, job_wrapper.get_id_tag())
+ runner_job_state.ecfile = "%s.gjec" % os.path.join(job_wrapper.working_directory, job_wrapper.get_id_tag())
+ runner_job_state.job_file = "%s/galaxy_%s.sh" % (self.app.config.cluster_files_directory, job_wrapper.get_id_tag())
+ runner_job_state.external_job_id = str( job.job_runner_external_id )
+ job_wrapper.command_line = job.command_line
+ runner_job_state.job_wrapper = job_wrapper
+ runner_job_state.runner_url = job.job_runner_name
+ if job.state == model.Job.states.RUNNING:
+ log.debug( "(%s/%s) is still in running state, adding to the runner monitor queue" % ( job.id, job.job_runner_external_id ) )
+ runner_job_state.old_state = model.Job.states.RUNNING
+ runner_job_state.running = True
+ self.monitor_queue.put( runner_job_state )
+ elif job.state == model.Job.states.QUEUED:
+ log.debug( "(%s/%s) is still in queued state, adding to the runner monitor queue" % ( job.id, job.job_runner_external_id ) )
+ runner_job_state.old_state = model.Job.states.QUEUED
+ runner_job_state.running = False
+ self.monitor_queue.put( runner_job_state )
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/runners/cli_job/__init__.py
--- /dev/null
+++ b/lib/galaxy/jobs/runners/cli_job/__init__.py
@@ -0,0 +1,21 @@
+"""
+Base class for cli job plugins
+"""
+
+class BaseJobExec(object):
+ def __init__(self, **params):
+ raise NotImplementedError()
+ def get_job_template(self, ofile, efile, job_name, job_wrapper, command_line, ecfile):
+ raise NotImplementedError()
+ def submit(self, script_file):
+ raise NotImplementedError()
+ def delete(self, job_id):
+ raise NotImplementedError()
+ def get_status(self, job_ids=None):
+ raise NotImplementedError()
+ def get_single_status(self, job_id):
+ raise NotImplementedError()
+ def parse_status(self, status, job_ids):
+ raise NotImplementedError()
+ def parse_single_status(self, status, job_id):
+ raise NotImplementedError()
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/runners/cli_job/torque.py
--- /dev/null
+++ b/lib/galaxy/jobs/runners/cli_job/torque.py
@@ -0,0 +1,132 @@
+"""
+Command-line interface to TORQUE PBS
+"""
+
+import os
+import logging
+
+from galaxy.model import Job
+job_states = Job.states
+
+from galaxy.jobs.runners.cli_job import BaseJobExec
+
+log = logging.getLogger( __name__ )
+
+__all__ = ('Torque',)
+
+try:
+ import xml.etree.cElementTree as et
+except:
+ import xml.etree.ElementTree as et
+
+job_template = """#!/bin/sh
+%s
+GALAXY_LIB="%s"
+if [ "$GALAXY_LIB" != "None" ]; then
+ if [ -n "$PYTHONPATH" ]; then
+ export PYTHONPATH="$GALAXY_LIB:$PYTHONPATH"
+ else
+ export PYTHONPATH="$GALAXY_LIB"
+ fi
+fi
+%s
+cd %s
+%s
+echo $? > %s
+"""
+
+argmap = { 'Execution_Time' : '-a',
+ 'Account_Name' : '-A',
+ 'Checkpoint' : '-c',
+ 'Error_Path' : '-e',
+ 'Group_List' : '-g',
+ 'Hold_Types' : '-h',
+ 'Join_Paths' : '-j',
+ 'Keep_Files' : '-k',
+ 'Resource_List' : '-l',
+ 'Mail_Points' : '-m',
+ 'Mail_Users' : '-M',
+ 'Job_Name' : '-N',
+ 'Output_Path' : '-o',
+ 'Priority' : '-p',
+ 'Rerunable' : '-r',
+ 'Shell_Path_List' : '-S',
+ 'job_array_request' : '-t',
+ 'User_List' : '-u',
+ 'Variable_List' : '-v' }
+
+class Torque(BaseJobExec):
+ def __init__(self, **params):
+ self.params = {}
+ for k, v in params.items():
+ self.params[k] = v
+
+ def get_job_template(self, ofile, efile, job_name, job_wrapper, command_line, ecfile):
+ pbsargs = { '-o' : ofile,
+ '-e' : efile,
+ '-N' : job_name }
+ for k, v in self.params.items():
+ if k == 'plugin':
+ continue
+ try:
+ if not k.startswith('-'):
+ k = argmap[k]
+ pbsargs[k] = v
+ except:
+ log.warning('Unrecognized long argument passed to Torque CLI plugin: %s' % k)
+ template_pbsargs = ''
+ for k, v in pbsargs.items():
+ template_pbsargs += '#PBS %s %s\n' % (k, v)
+ return job_template % (template_pbsargs,
+ job_wrapper.galaxy_lib_dir,
+ job_wrapper.get_env_setup_clause(),
+ os.path.abspath(job_wrapper.working_directory),
+ command_line,
+ ecfile)
+
+ def submit(self, script_file):
+ return 'qsub %s' % script_file
+
+ def delete(self, job_id):
+ return 'qdel %s' % job_id
+
+ def get_status(self, job_ids=None):
+ return 'qstat -x'
+
+ def get_single_status(self, job_id):
+ return 'qstat -f %s' % job_id
+
+ def parse_status(self, status, job_ids):
+ # in case there's noise in the output, find the big blob 'o xml
+ tree = None
+ rval = {}
+ for line in status.strip().splitlines():
+ try:
+ tree = et.fromstring(line.strip())
+ assert tree.tag == 'Data'
+ break
+ except Exception, e:
+ tree = None
+ if tree is None:
+ log.warning('No valid qstat XML return from `qstat -x`, got the following: %s' % status)
+ return None
+ else:
+ for job in tree.findall('Job'):
+ id = job.find('Job_Id').text
+ if id in job_ids:
+ state = job.find('job_state').text
+ # map PBS job states to Galaxy job states.
+ rval[id] = self.__get_job_state(state)
+ return rval
+
+ def parse_single_status(self, status, job_id):
+ for line in status.splitlines():
+ line = line.split(' = ')
+ if line[0] == 'job_state':
+ return line[1]
+ # no state found, job has exited
+ return job_states.OK
+
+ def __get_job_state(self, state):
+ return { 'R' : job_states.RUNNING,
+ 'Q' : job_states.QUEUED }.get(state, state)
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/runners/cli_shell/__init__.py
--- /dev/null
+++ b/lib/galaxy/jobs/runners/cli_shell/__init__.py
@@ -0,0 +1,11 @@
+"""
+Base class for runners which execute commands via a shell
+"""
+
+class BaseShellExec(object):
+ def __init__(self, *args, **kwargs):
+ raise NotImplementedError()
+ def copy(self, rcp_cmd, files, dest):
+ raise NotImplementedError()
+ def execute(self, cmd, persist=False, timeout=60):
+ raise NotImplementedError()
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/runners/cli_shell/rsh.py
--- /dev/null
+++ b/lib/galaxy/jobs/runners/cli_shell/rsh.py
@@ -0,0 +1,59 @@
+"""
+Interface for remote shell commands (rsh, rcp) and derivatives that use the same syntax (ssh, scp)
+"""
+
+import time
+import logging
+import subprocess
+
+from galaxy.util.bunch import Bunch
+from galaxy.jobs.runners.cli_shell import BaseShellExec
+
+log = logging.getLogger( __name__ )
+
+__all__ = ('RemoteShell', 'SecureShell', 'GlobusSecureShell')
+
+class RemoteShell(BaseShellExec):
+ def __init__(self, rsh='rsh', rcp='rcp', hostname=None, username=None, **kwargs):
+ self.rsh = rsh
+ self.rcp = rcp
+ self.hostname = hostname
+ self.username = username
+ self.sessions = {}
+ def copy(self, rcp_cmd, files, dest):
+ pass
+ def execute(self, cmd, persist=False, timeout=60):
+ # TODO: implement persistence
+ if self.username is None:
+ fullcmd = '%s %s %s' % (self.rsh, self.hostname, cmd)
+ else:
+ fullcmd = '%s -l %s %s %s' % (self.rsh, self.username, self.hostname, cmd)
+ p = subprocess.Popen(fullcmd, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ # poll until timeout
+ for i in range(timeout/3):
+ r = p.poll()
+ if r is not None:
+ break
+ time.sleep(3)
+ else:
+ pid = int(p.pid)
+ for sig in (15, 9):
+ try:
+ os.kill(pid, sig)
+ time.sleep(3)
+ except:
+ log.warning('Killing pid %s (cmd: "%s") with signal %s failed' % (p.pid, fullcmd, sig))
+ return Bunch(stdout='', stderr='Execution timed out', returncode=-1)
+ return Bunch(stdout=p.stdout.read(), stderr=p.stderr.read(), returncode=p.returncode)
+
+
+class SecureShell(RemoteShell):
+ SSH_NEW_KEY_STRING = 'Are you sure you want to continue connecting'
+ def __init__(self, rsh='ssh', rcp='scp', **kwargs):
+ rsh += ' -oStrictHostKeyChecking=yes -oConnectTimeout=60'
+ rcp += ' -oStrictHostKeyChecking=yes -oConnectTimeout=60'
+ super(SecureShell, self).__init__(rsh=rsh, rcp=rcp, **kwargs)
+
+class GlobusSecureShell(SecureShell):
+ def __init__(self, rsh='gsissh', rcp='gsiscp', **kwargs):
+ super(SecureShell, self).__init__(rsh=rsh, rcp=rcp, **kwargs)
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/runners/drmaa.py
--- a/lib/galaxy/jobs/runners/drmaa.py
+++ b/lib/galaxy/jobs/runners/drmaa.py
@@ -155,7 +155,7 @@
log.exception("failure running job %s" % job_wrapper.get_id_tag())
return
- runner_url = job_wrapper.get_job_runner()
+ runner_url = job_wrapper.get_job_runner_url()
# This is silly, why would we queue a job with no command line?
if not command_line:
@@ -404,7 +404,7 @@
drm_job_state.ecfile = "%s.drmec" % os.path.join(os.getcwd(), job_wrapper.working_directory, job_wrapper.get_id_tag())
drm_job_state.job_file = "%s/galaxy_%s.sh" % (self.app.config.cluster_files_directory, job.id)
drm_job_state.job_id = str( job.job_runner_external_id )
- drm_job_state.runner_url = job_wrapper.get_job_runner()
+ drm_job_state.runner_url = job_wrapper.get_job_runner_url()
job_wrapper.command_line = job.command_line
drm_job_state.job_wrapper = job_wrapper
if job.state == model.Job.states.RUNNING:
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/runners/lwr.py
--- a/lib/galaxy/jobs/runners/lwr.py
+++ b/lib/galaxy/jobs/runners/lwr.py
@@ -236,7 +236,7 @@
return lwr_url
def get_client_from_wrapper(self, job_wrapper):
- return self.get_client( job_wrapper.get_job_runner(), job_wrapper.job_id )
+ return self.get_client( job_wrapper.get_job_runner_url(), job_wrapper.job_id )
def get_client(self, job_runner, job_id):
lwr_url = self.determine_lwr_url( job_runner )
@@ -245,7 +245,7 @@
def run_job( self, job_wrapper ):
stderr = stdout = command_line = ''
- runner_url = job_wrapper.get_job_runner()
+ runner_url = job_wrapper.get_job_runner_url()
try:
job_wrapper.prepare()
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/runners/pbs.py
--- a/lib/galaxy/jobs/runners/pbs.py
+++ b/lib/galaxy/jobs/runners/pbs.py
@@ -213,7 +213,7 @@
log.exception("failure running job %d" % job_wrapper.job_id)
return
- runner_url = job_wrapper.get_job_runner()
+ runner_url = job_wrapper.get_job_runner_url()
# This is silly, why would we queue a job with no command line?
if not command_line:
@@ -623,7 +623,7 @@
pbs_job_state.ecfile = "%s/%s.ec" % (self.app.config.cluster_files_directory, job.id)
pbs_job_state.job_file = "%s/%s.sh" % (self.app.config.cluster_files_directory, job.id)
pbs_job_state.job_id = str( job.job_runner_external_id )
- pbs_job_state.runner_url = job_wrapper.get_job_runner()
+ pbs_job_state.runner_url = job_wrapper.get_job_runner_url()
job_wrapper.command_line = job.command_line
pbs_job_state.job_wrapper = job_wrapper
if job.state == model.Job.states.RUNNING:
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/jobs/runners/sge.py
--- a/lib/galaxy/jobs/runners/sge.py
+++ b/lib/galaxy/jobs/runners/sge.py
@@ -164,7 +164,7 @@
log.exception("failure running job %d" % job_wrapper.job_id)
return
- runner_url = job_wrapper.get_job_runner()
+ runner_url = job_wrapper.get_job_runner_url()
# This is silly, why would we queue a job with no command line?
if not command_line:
@@ -377,7 +377,7 @@
sge_job_state.efile = "%s/database/pbs/%s.e" % (os.getcwd(), job.id)
sge_job_state.job_file = "%s/database/pbs/galaxy_%s.sh" % (os.getcwd(), job.id)
sge_job_state.job_id = str( job.job_runner_external_id )
- sge_job_state.runner_url = job_wrapper.get_job_runner()
+ sge_job_state.runner_url = job_wrapper.get_job_runner_url()
job_wrapper.command_line = job.command_line
sge_job_state.job_wrapper = job_wrapper
if job.state == model.Job.states.RUNNING:
diff -r 05f25cefa1751a165d76882919ba3f7ecafe0bb1 -r e241ff58404830172524fb099fee7b5d7324f026 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -846,7 +846,7 @@
if match:
available_configs.append( config )
return random.choice( available_configs )[ key ]
- def get_job_runner( self, job_params=None ):
+ def get_job_runner_url( self, job_params=None ):
return self.__get_job_run_config( self.job_runners, key='url', job_params=job_params )
def get_job_handler( self, job_params=None ):
return self.__get_job_run_config( self.job_handlers, key='name', job_params=job_params )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0