Skip to content

Commit 02ed07c

Browse files
committed
Merge pull request #1821 from davebx/toolshed_decouple_api
Cherry-picked changes from pull request #1392.
2 parents 7797938 + b15a7ff commit 02ed07c

File tree

13 files changed

+262
-104
lines changed

13 files changed

+262
-104
lines changed

lib/galaxy/web/form_builder.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,9 @@ class SelectField(BaseField):
288288
<div><input type="checkbox" name="bar" value="3" id="bar|3"><label class="inline" for="bar|3">automatic</label></div>
289289
<div><input type="checkbox" name="bar" value="4" id="bar|4" checked='checked'><label class="inline" for="bar|4">bazooty</label></div>
290290
"""
291-
def __init__( self, name, multiple=None, display=None, refresh_on_change=False, refresh_on_change_values=None, size=None ):
291+
def __init__( self, name, multiple=None, display=None, refresh_on_change=False, refresh_on_change_values=None, size=None, field_id=None ):
292292
self.name = name
293+
self.field_id = field_id
293294
self.multiple = multiple or False
294295
self.size = size
295296
self.options = list()
@@ -312,7 +313,11 @@ def __init__( self, name, multiple=None, display=None, refresh_on_change=False,
312313
def add_option( self, text, value, selected=False ):
313314
self.options.append( ( text, value, selected ) )
314315

315-
def get_html( self, prefix="", disabled=False ):
316+
def get_html( self, prefix="", disabled=False, extra_attr=None ):
317+
if extra_attr is not None:
318+
self.extra_attributes = ' %s' % ' '.join( [ '%s="%s"' % ( k, escape( v ) ) for k, v in extra_attr.items() ] )
319+
else:
320+
self.extra_attributes = ''
316321
if self.display == "checkboxes":
317322
return self.get_html_checkboxes( prefix, disabled )
318323
elif self.display == "radio":
@@ -335,8 +340,8 @@ def get_html_checkboxes( self, prefix="", disabled=False ):
335340
selected_text = ""
336341
if selected:
337342
selected_text = " checked='checked'"
338-
rval.append( '<div%s><input type="checkbox" name="%s%s" value="%s" id="%s"%s%s><label class="inline" for="%s">%s</label></div>'
339-
% ( style, prefix, self.name, escaped_value, uniq_id, selected_text, self.get_disabled_str( disabled ), uniq_id, escape( text, quote=True ) ) )
343+
rval.append( '<div%s><input type="checkbox" name="%s%s" value="%s" id="%s"%s%s%s><label class="inline" for="%s">%s</label></div>'
344+
% ( style, prefix, self.name, escaped_value, uniq_id, selected_text, self.get_disabled_str( disabled ), self.extra_attributes, uniq_id, escape( text, quote=True ) ) )
340345
ctr += 1
341346
return unicodify( "\n".join( rval ) )
342347

@@ -352,7 +357,7 @@ def get_html_radio( self, prefix="", disabled=False ):
352357
selected_text = ""
353358
if selected:
354359
selected_text = " checked='checked'"
355-
rval.append( '<div%s><input type="radio" name="%s%s"%s value="%s" id="%s"%s%s><label class="inline" for="%s">%s</label></div>'
360+
rval.append( '<div%s><input type="radio" name="%s%s"%s value="%s" id="%s"%s%s%s><label class="inline" for="%s">%s</label></div>'
356361
% ( style,
357362
prefix,
358363
self.name,
@@ -361,6 +366,7 @@ def get_html_radio( self, prefix="", disabled=False ):
361366
uniq_id,
362367
selected_text,
363368
self.get_disabled_str( disabled ),
369+
self.extra_attributes,
364370
uniq_id,
365371
text ) )
366372
ctr += 1
@@ -388,8 +394,12 @@ def get_html_default( self, prefix="", disabled=False ):
388394
rval.append( '<option value="%s"%s>%s</option>' % ( escape( unicodify( value ), quote=True ), selected_text, escape( unicodify( text ), quote=True ) ) )
389395
if last_selected_value:
390396
last_selected_value = ' last_selected_value="%s"' % escape( unicodify( last_selected_value ), quote=True )
391-
rval.insert( 0, '<select name="%s%s"%s%s%s%s%s>'
392-
% ( prefix, self.name, multiple, size, self.refresh_on_change_text, last_selected_value, self.get_disabled_str( disabled ) ) )
397+
if self.field_id is not None:
398+
id_string = ' id="%s"' % self.field_id
399+
else:
400+
id_string = ''
401+
rval.insert( 0, '<select name="%s%s"%s%s%s%s%s%s%s>'
402+
% ( prefix, self.name, multiple, size, self.refresh_on_change_text, last_selected_value, self.get_disabled_str( disabled ), id_string, self.extra_attributes ) )
393403
rval.append( '</select>' )
394404
return unicodify( "\n".join( rval ) )
395405

lib/galaxy/webapps/tool_shed/api/categories.py

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515
class CategoriesController( BaseAPIController ):
1616
"""RESTful controller for interactions with categories in the Tool Shed."""
1717

18+
def __get_repository_count( self, trans, category_name ):
19+
return self.app.repository_registry.viewable_repositories_and_suites_by_category.get( category_name, 0 )
20+
1821
def __get_value_mapper( self, trans ):
19-
value_mapper = { 'id' : trans.security.encode_id }
22+
value_mapper = { 'id': trans.security.encode_id }
2023
return value_mapper
2124

2225
@expose_api
@@ -41,11 +44,11 @@ def create( self, trans, payload, **kwd ):
4144
if not description:
4245
# Default the description to the name.
4346
description = name
44-
if suc.get_category_by_name( trans.app, name ):
47+
if suc.get_category_by_name( self.app, name ):
4548
raise exceptions.Conflict( 'A category with that name already exists.' )
4649
else:
4750
# Create the category
48-
category = trans.app.model.Category( name=name, description=description )
51+
category = self.app.model.Category( name=name, description=description )
4952
trans.sa_session.add( category )
5053
trans.sa_session.flush()
5154
category_dict = category.to_dict( view='element',
@@ -58,6 +61,30 @@ def create( self, trans, payload, **kwd ):
5861
raise exceptions.RequestParameterMissingException( 'Missing required parameter "name".' )
5962
return category_dict
6063

64+
@expose_api_anonymous_and_sessionless
65+
def get_repositories( self, trans, category_id, **kwd ):
66+
"""
67+
GET /api/categories/{encoded_category_id}/repositories
68+
Return information about the provided category and the repositories in that category.
69+
70+
:param id: the encoded id of the Category object
71+
72+
Example: GET localhost:9009/api/categories/f9cad7b01a472135/repositories
73+
"""
74+
category = suc.get_category( self.app, category_id )
75+
if category is None:
76+
category_dict = dict( message='Unable to locate category record for id %s.' % ( str( id ) ),
77+
status='error' )
78+
return category_dict
79+
category_dict = category.to_dict( view='element',
80+
value_mapper=self.__get_value_mapper( trans ) )
81+
category_dict[ 'url' ] = web.url_for( controller='categories',
82+
action='show',
83+
id=trans.security.encode_id( category.id ) )
84+
repositories = suc.get_repositories_by_category( self.app, category.id )
85+
category_dict[ 'repositories' ] = repositories
86+
return category_dict
87+
6188
@expose_api_anonymous_and_sessionless
6289
def index( self, trans, deleted=False, **kwd ):
6390
"""
@@ -72,14 +99,15 @@ def index( self, trans, deleted=False, **kwd ):
7299
deleted = util.asbool( deleted )
73100
if deleted and not trans.user_is_admin():
74101
raise exceptions.AdminRequiredException( 'Only administrators can query deleted categories.' )
75-
for category in trans.sa_session.query( trans.app.model.Category ) \
76-
.filter( trans.app.model.Category.table.c.deleted == deleted ) \
77-
.order_by( trans.app.model.Category.table.c.name ):
102+
for category in trans.sa_session.query( self.app.model.Category ) \
103+
.filter( self.app.model.Category.table.c.deleted == deleted ) \
104+
.order_by( self.app.model.Category.table.c.name ):
78105
category_dict = category.to_dict( view='collection',
79106
value_mapper=self.__get_value_mapper( trans ) )
80107
category_dict[ 'url' ] = web.url_for( controller='categories',
81108
action='show',
82109
id=trans.security.encode_id( category.id ) )
110+
category_dict[ 'repositories' ] = self.app.repository_registry.viewable_repositories_and_suites_by_category.get( category.name, 0 )
83111
category_dicts.append( category_dict )
84112
return category_dicts
85113

@@ -93,7 +121,7 @@ def show( self, trans, id, **kwd ):
93121
94122
Example: GET localhost:9009/api/categories/f9cad7b01a472135
95123
"""
96-
category = suc.get_category( trans.app, id )
124+
category = suc.get_category( self.app, id )
97125
if category is None:
98126
category_dict = dict( message='Unable to locate category record for id %s.' % ( str( id ) ),
99127
status='error' )

0 commit comments

Comments
 (0)