Skip to content

Commit

Permalink
Add code to initiate repository installation.
Browse files Browse the repository at this point in the history
  • Loading branch information
davebx committed Nov 25, 2015
1 parent a4bf833 commit 83a9c6d
Show file tree
Hide file tree
Showing 6 changed files with 179 additions and 47 deletions.
18 changes: 15 additions & 3 deletions lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
Expand Up @@ -1235,9 +1235,21 @@ def prepare_for_install( self, trans, **kwd ):
def preview_repository( self, trans, **kwd ):
toolshed_url = kwd.get( 'toolshed_url', '' )
tsr_id = kwd.get( 'tsr_id', '' )
json_data = common_util.tool_shed_get( trans.app, toolshed_url, pathspec=[ 'api', 'repositories', tsr_id ] )
return trans.fill_template( '/admin/tool_shed_repository/preview_repository.mako', repository=json.loads( json_data ) )

json_data = json.loads( common_util.tool_shed_get( trans.app, toolshed_url, pathspec=[ 'api', 'repositories', tsr_id ] ) )
json_data[ 'metadata' ] = dict()
revisions = common_util.tool_shed_get( trans.app, toolshed_url, pathspec=[ 'api', 'repositories', 'get_ordered_installable_revisions' ], params=dict( tsr_id=tsr_id ) )
for revision in json.loads( revisions ):
pathspec = [ 'api', 'repositories', tsr_id, revision, 'metadata' ]
json_data[ 'metadata' ][ revision ] = json.loads( common_util.tool_shed_get( trans.app, toolshed_url, pathspec=pathspec ) )
log.debug( len( str( json_data ) ) )
shed_tool_conf_select_field = tool_util.build_shed_tool_conf_select_field( trans.app )
tool_panel_section_select_field = tool_util.build_tool_panel_section_select_field( trans.app )
log.debug( tool_panel_section_select_field )
return trans.fill_template( '/admin/tool_shed_repository/preview_repository.mako',
toolshed_url=toolshed_url,
repository=json_data,
tool_panel_section_select_field=tool_panel_section_select_field,
shed_tool_conf_select_field=shed_tool_conf_select_field )

@web.expose
@web.require_admin
Expand Down
50 changes: 39 additions & 11 deletions lib/galaxy/webapps/tool_shed/api/repositories.py
Expand Up @@ -87,7 +87,7 @@ def add_repository_registry_entry( self, trans, payload, **kwd ):
return response_dict

@web.expose_api_anonymous
def get_ordered_installable_revisions( self, trans, name, owner, **kwd ):
def get_ordered_installable_revisions( self, trans, **kwd ):
"""
GET /api/repositories/get_ordered_installable_revisions
Expand All @@ -98,22 +98,20 @@ def get_ordered_installable_revisions( self, trans, name, owner, **kwd ):
As in the changelog, the list is ordered oldest to newest.
"""
# Example URL: http://localhost:9009/api/repositories/get_installable_revisions?name=add_column&owner=test
if name and owner:
name = kwd.get( 'name', None )
owner = kwd.get( 'owner', None )
tsr_id = kwd.get( 'tsr_id', None )
if None not in [ name, owner ]:
# Get the repository information.
repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
if repository is None:
error_message = "Error in the Tool Shed repositories API in get_ordered_installable_revisions: "
error_message += "cannot locate repository %s owned by %s." % ( str( name ), str( owner ) )
log.debug( error_message )
return []
repo = hg_util.get_repo_for_repository( trans.app, repository=repository, repo_path=None, create=False )
ordered_installable_revisions = suc.get_ordered_metadata_changeset_revisions( repository, repo, downloadable=True )
return ordered_installable_revisions
elif tsr_id is not None:
repository = suc.get_repository_in_tool_shed( trans.app, tsr_id )
else:
error_message = "Error in the Tool Shed repositories API in get_ordered_installable_revisions: "
error_message += "invalid name %s or owner %s received." % ( str( name ), str( owner ) )
error_message += "invalid parameters received." % ( str( name ), str( owner ) )
log.debug( error_message )
return []
return repository.ordered_installable_revisions( trans.app )

@web.expose_api_anonymous
def get_repository_revision_install_info( self, trans, name, owner, changeset_revision, **kwd ):
Expand Down Expand Up @@ -691,6 +689,36 @@ def show( self, trans, id, **kwd ):
[ trans.security.encode_id( x.category.id ) for x in repository.categories ]
return repository_dict

@expose_api_anonymous_and_sessionless
def metadata( self, trans, id, changeset, **kwd ):
"""
GET /api/repositories/{encoded_repository_id}/{changeset}/metadata
Returns information about a repository in the Tool Shed.
Example URL: http://localhost:9009/api/repositories/f9cad7b01a472135/4a129b2343bb/metadata
:param id: the encoded id of the Repository object
:type id: encoded str
:returns: the given changeset's metadata
:raises: ObjectNotFound, MalformedId
"""
try:
trans.security.decode_id( id )
except Exception:
raise MalformedId( 'The given id is invalid.' )

repository = suc.get_repository_in_tool_shed( trans.app, id )
metadata = suc.get_current_repository_metadata_for_changeset_revision( trans.app, repository, changeset )
if metadata is None:
raise ObjectNotFound( 'Unable to locate metadata for the given id and changeset.' )
toolshed_url = str( web.url_for( '/', qualified=True ) ).rstrip( '/' )
metadata_dict = metadata.to_dict( value_mapper={ 'id': trans.security.encode_id, 'repository_id': trans.security.encode_id } )
metadata_dict['repository_dependencies'] = repository.get_repository_dependencies( trans.app, changeset, toolshed_url )
metadata_dict['tool_dependencies'] = repository.get_tool_dependencies( changeset )
return metadata_dict

@expose_api
def update( self, trans, id, **kwd ):
"""
Expand Down
25 changes: 15 additions & 10 deletions lib/galaxy/webapps/tool_shed/buildapp.py
Expand Up @@ -112,21 +112,21 @@ def app_factory( global_conf, **kwargs ):
webapp.mapper.resource( 'repository',
'repositories',
controller='repositories',
collection={ 'add_repository_registry_entry' : 'POST',
'get_repository_revision_install_info' : 'GET',
'get_ordered_installable_revisions' : 'GET',
'remove_repository_registry_entry' : 'POST',
'repository_ids_for_setting_metadata' : 'GET',
'reset_metadata_on_repositories' : 'POST',
'reset_metadata_on_repository' : 'POST' },
collection={ 'add_repository_registry_entry': 'POST',
'get_repository_revision_install_info': 'GET',
'get_ordered_installable_revisions': 'GET',
'remove_repository_registry_entry': 'POST',
'repository_ids_for_setting_metadata': 'GET',
'reset_metadata_on_repositories': 'POST',
'reset_metadata_on_repository': 'POST' },
name_prefix='repository_',
path_prefix='/api',
new={ 'import_capsule' : 'POST' },
new={ 'import_capsule': 'POST' },
parent_resources=dict( member_name='repository', collection_name='repositories' ) )
webapp.mapper.resource( 'repository_revision',
'repository_revisions',
member={ 'repository_dependencies' : 'GET',
'export' : 'POST' },
member={ 'repository_dependencies': 'GET',
'export': 'POST' },
controller='repository_revisions',
name_prefix='repository_revision_',
path_prefix='/api',
Expand All @@ -147,6 +147,11 @@ def app_factory( global_conf, **kwargs ):
controller='repositories',
action='create_changeset_revision',
conditions=dict( method=[ "POST" ] ) )
webapp.mapper.connect( 'repository_show_dependencies',
'/api/repositories/{id}/{changeset}/metadata',
controller='repositories',
action='metadata',
conditions=dict( method=[ "GET" ] ) )
webapp.mapper.connect( 'create_repository',
'/api/repositories',
controller='repositories',
Expand Down
29 changes: 6 additions & 23 deletions lib/galaxy/webapps/tool_shed/controllers/repository.py
Expand Up @@ -1618,22 +1618,9 @@ def get_repository_dependencies( self, trans, **kwd ):
owner = kwd.get( 'owner', None )
changeset_revision = kwd.get( 'changeset_revision', None )
repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
# We aren't concerned with repositories of type tool_dependency_definition here if a
# repository_metadata record is not returned because repositories of this type will never
# have repository dependencies. However, if a readme file is uploaded, or some other change
# is made that does not create a new downloadable changeset revision but updates the existing
# one, we still want to be able to get repository dependencies.
repository_metadata = suc.get_current_repository_metadata_for_changeset_revision( trans.app,
repository,
changeset_revision )
if repository_metadata:
metadata = repository_metadata.metadata
if metadata:
toolshed_base_url = str( web.url_for( '/', qualified=True ) ).rstrip( '/' )
rb = relation_builder.RelationBuilder( trans.app, repository, repository_metadata, toolshed_base_url )
repository_dependencies = rb.get_repository_dependencies_for_changeset_revision()
if repository_dependencies:
return encoding_util.tool_shed_encode( repository_dependencies )
dependencies = repository.get_repository_dependencies( changeset_revision )
if dependencies:
return encoding_util.tool_shed_encode( dependencies )
return ''

@web.expose
Expand Down Expand Up @@ -1716,13 +1703,9 @@ def get_tool_dependencies( self, trans, **kwd ):
owner = kwd.get( 'owner', None )
changeset_revision = kwd.get( 'changeset_revision', None )
repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
for downloadable_revision in repository.downloadable_revisions:
if downloadable_revision.changeset_revision == changeset_revision:
break
metadata = downloadable_revision.metadata
tool_dependencies = metadata.get( 'tool_dependencies', '' )
if tool_dependencies:
return encoding_util.tool_shed_encode( tool_dependencies )
dependencies = repository.get_tool_dependencies( changeset_revision )
if dependencies is not None:
return encoding_util.tool_shed_encode( dependencies )
return ''

@web.expose
Expand Down
33 changes: 33 additions & 0 deletions lib/galaxy/webapps/tool_shed/model/__init__.py
Expand Up @@ -8,6 +8,8 @@
from galaxy.util.hash_util import new_secure_hash
from galaxy.model.item_attrs import Dictifiable
import tool_shed.repository_types.util as rt_util
from tool_shed.dependencies.repository import relation_builder
from tool_shed.util import shed_util_common as suc

from mercurial import hg
from mercurial import ui
Expand Down Expand Up @@ -221,14 +223,45 @@ def get_changesets_for_setting_metadata( self, app ):
type_class = self.get_type_class( app )
return type_class.get_changesets_for_setting_metadata( app, self )

def get_repository_dependencies( self, app, changeset, toolshed_url ):
# We aren't concerned with repositories of type tool_dependency_definition here if a
# repository_metadata record is not returned because repositories of this type will never
# have repository dependencies. However, if a readme file is uploaded, or some other change
# is made that does not create a new downloadable changeset revision but updates the existing
# one, we still want to be able to get repository dependencies.
repository_metadata = suc.get_current_repository_metadata_for_changeset_revision( app,
self,
changeset )
if repository_metadata:
metadata = repository_metadata.metadata
if metadata:
rb = relation_builder.RelationBuilder( app, self, repository_metadata, toolshed_url )
repository_dependencies = rb.get_repository_dependencies_for_changeset_revision()
if repository_dependencies:
return repository_dependencies
return None

def get_type_class( self, app ):
return app.repository_types_registry.get_class_by_label( self.type )

def get_tool_dependencies( self, changeset_revision ):
for downloadable_revision in self.downloadable_revisions:
if downloadable_revision.changeset_revision == changeset_revision:
break
metadata = downloadable_revision.metadata
return metadata.get( 'tool_dependencies', None )

def is_new( self, app ):
repo = hg.repository( ui.ui(), self.repo_path( app ) )
tip_ctx = repo.changectx( repo.changelog.tip() )
return tip_ctx.rev() < 0

def ordered_installable_revisions( self, app ):
repo = hg.repository( ui.ui(), self.repo_path( app ) )
log.debug( repo )
ordered_installable_revisions = suc.get_ordered_metadata_changeset_revisions( self, repo, downloadable=True )
return ordered_installable_revisions

def repo_path( self, app ):
return app.hgweb_config_manager.get_entry( os.path.join( "repos", self.user.username, self.name ) )

Expand Down
71 changes: 71 additions & 0 deletions templates/admin/tool_shed_repository/preview_repository.mako
Expand Up @@ -15,4 +15,75 @@
%if message:
${render_msg( message, status )}
%endif
<script type="text/javascript">
$(document).ready(function() {
$('#install_repository').click(function() {
var params = {};
params['tool_shed_url'] = $("#toolshed_url").val();
params['install_tool_dependencies'] = $("#install_tool_dependencies").val();
params['install_repository_dependencies'] = $("#install_repository_dependencies").val();
params['tool_panel_section_id'] = $("#tool_panel_section_id").val();
params['new_tool_panel_section_label'] = $("#new_tool_panel_section").val();
params['changeset'] = $("#changeset").val();
url = $('#repository_installation').attr('action');
console.log(url);
$.post(url, params, function(data) {
console.log(data);
});
});
});
</script>
<pre>${repository}</pre>
<h1>${repository['name']}</h1>
<form id="repository_installation" action="${h.url_for(controller='/api/tool_shed_repositories', action='install', async=True)}">
<label for="install_tool_dependencies">Install tool dependencies</label>
<input type="checkbox" checked id="install_tool_dependencies" />
<label for="install_tool_dependencies">Install repository dependencies</label>
<input type="checkbox" checked id="install_repository_dependencies" />
<input type="hidden" name="tsr_id" value="${repository['id']}" />
<input type="hidden" name="toolshed_url" value="${toolshed_url}" />
%if shed_tool_conf_select_field:
<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 len( shed_tool_conf_select_field.options ) == 1:
select_help = "Your Galaxy instance is configured with 1 shed-related tool configuration file, so repositories will be "
select_help += "installed using its <b>tool_path</b> setting."
else:
select_help = "Your Galaxy instance is configured with %d shed-related tool configuration files, " % len( shed_tool_conf_select_field.options )
select_help += "so select the file whose <b>tool_path</b> setting you want used for installing repositories."
%>
<div class="form-row">
<label>Shed tool configuration file:</label>
${shed_tool_conf_select_field.get_html()}
<div class="toolParamHelp" style="clear: both;">
${select_help|h}
</div>
</div>
<div style="clear: both"></div>
%endif
<div class="form-row">
<label>Add new tool panel section:</label>
<input id="new_tool_panel_section" name="new_tool_panel_section_label" type="textfield" value="" size="40"/>
<div class="toolParamHelp" style="clear: both;">
Add a new tool panel section to contain the installed tools (optional).
</div>
</div>
<div class="form-row">
<label>Select existing tool panel section:</label>
${tool_panel_section_select_field.get_html()}
<div class="toolParamHelp" style="clear: both;">
Choose an existing section in your tool panel to contain the installed tools (optional).
</div>
</div>
<select id="changeset" name="changeset">
%for changeset in repository['metadata'].keys():
<option value="${changeset}">${changeset}</option>
%endfor
</select>
<input type="button" id="install_repository" name="install_repository" value="Install" />
</form>

0 comments on commit 83a9c6d

Please sign in to comment.