"""
API operations on Quota objects.
"""
import logging
from galaxy.web.base.controller import BaseAPIController, UsesQuotaMixin, url_for
from galaxy.web.base.controllers.admin import Admin
from galaxy import web, util
from galaxy.web.params import QuotaParamParser
from galaxy.actions.admin import AdminActions
from paste.httpexceptions import HTTPBadRequest
from galaxy.exceptions import ActionInputError
log = logging.getLogger( __name__ )
[docs]class QuotaAPIController( BaseAPIController, Admin, AdminActions, UsesQuotaMixin, QuotaParamParser ):
@web.expose_api
@web.require_admin
[docs] def index( self, trans, deleted='False', **kwd ):
"""
GET /api/quotas
GET /api/quotas/deleted
Displays a collection (list) of quotas.
"""
rval = []
deleted = util.string_as_bool( deleted )
query = trans.sa_session.query( trans.app.model.Quota )
if deleted:
route = 'deleted_quota'
query = query.filter( trans.app.model.Quota.table.c.deleted == True )
else:
route = 'quota'
query = query.filter( trans.app.model.Quota.table.c.deleted == False )
for quota in query:
item = quota.to_dict( value_mapper={ 'id': trans.security.encode_id } )
encoded_id = trans.security.encode_id( quota.id )
item['url'] = url_for( route, id=encoded_id )
rval.append( item )
return rval
@web.expose_api
@web.require_admin
[docs] def show( self, trans, id, deleted='False', **kwd ):
"""
GET /api/quotas/{encoded_quota_id}
GET /api/quotas/deleted/{encoded_quota_id}
Displays information about a quota.
"""
quota = self.get_quota( trans, id, deleted=util.string_as_bool( deleted ) )
return quota.to_dict( view='element', value_mapper={ 'id': trans.security.encode_id } )
@web.expose_api
@web.require_admin
[docs] def create( self, trans, payload, **kwd ):
"""
POST /api/quotas
Creates a new quota.
"""
try:
self.validate_in_users_and_groups( trans, payload )
except Exception, e:
raise HTTPBadRequest( detail=str( e ) )
params = self.get_quota_params( payload )
try:
quota, message = self._create_quota( params )
except ActionInputError, e:
raise HTTPBadRequest( detail=str( e ) )
item = quota.to_dict( value_mapper={ 'id': trans.security.encode_id } )
item['url'] = url_for( 'quota', id=trans.security.encode_id( quota.id ) )
item['message'] = message
return item
@web.expose_api
@web.require_admin
[docs] def update( self, trans, id, payload, **kwd ):
"""
PUT /api/quotas/{encoded_quota_id}
Modifies a quota.
"""
try:
self.validate_in_users_and_groups( trans, payload )
except Exception, e:
raise HTTPBadRequest( detail=str( e ) )
quota = self.get_quota( trans, id, deleted=False )
# FIXME: Doing it this way makes the update non-atomic if a method fails after an earlier one has succeeded.
payload['id'] = id
params = self.get_quota_params( payload )
methods = []
if payload.get( 'name', None ) or payload.get( 'description', None ):
methods.append( self._rename_quota )
if payload.get( 'amount', None ):
methods.append( self._edit_quota )
if payload.get( 'default', None ) == 'no':
methods.append( self._unset_quota_default )
elif payload.get( 'default', None ):
methods.append( self._set_quota_default )
if payload.get( 'in_users', None ) or payload.get( 'in_groups', None ):
methods.append( self._manage_users_and_groups_for_quota )
messages = []
for method in methods:
try:
message = method( quota, params )
except ActionInputError, e:
raise HTTPBadRequest( detail=str( e ) )
messages.append( message )
return '; '.join( messages )
@web.expose_api
@web.require_admin
[docs] def delete( self, trans, id, **kwd ):
"""
DELETE /api/quotas/{encoded_quota_id}
Deletes a quota
"""
quota = self.get_quota( trans, id, deleted=False ) # deleted quotas are not technically members of this collection
# a request body is optional here
payload = kwd.get( 'payload', {} )
payload['id'] = id
params = self.get_quota_params( payload )
try:
message = self._mark_quota_deleted( quota, params )
if util.string_as_bool( payload.get( 'purge', False ) ):
message += self._purge_quota( quota, params )
except ActionInputError, e:
raise HTTPBadRequest( detail=str( e ) )
return message
@web.expose_api
@web.require_admin
[docs] def undelete( self, trans, id, **kwd ):
"""
POST /api/quotas/deleted/{encoded_quota_id}/undelete
Undeletes a quota
"""
quota = self.get_quota( trans, id, deleted=True )
try:
return self._undelete_quota( quota )
except ActionInputError, e:
raise HTTPBadRequest( detail=str( e ) )