/lib/galaxy/web/api/request_types.py

https://bitbucket.org/cistrome/cistrome-harvard/ · Python · 102 lines · 77 code · 6 blank · 19 comment · 15 complexity · cecaed808567b50bf1b3777c0a883cc2 MD5 · raw file

  1. """
  2. API operations on RequestType objects.
  3. """
  4. import logging
  5. from galaxy.web.base.controller import BaseAPIController, url_for
  6. from galaxy import web
  7. from galaxy.sample_tracking.request_types import request_type_factory
  8. from elementtree.ElementTree import XML
  9. log = logging.getLogger( __name__ )
  10. class RequestTypeAPIController( BaseAPIController ):
  11. @web.expose_api
  12. def index( self, trans, **kwd ):
  13. """
  14. GET /api/request_types
  15. Displays a collection (list) of request_types.
  16. """
  17. rval = []
  18. for request_type in trans.app.security_agent.get_accessible_request_types( trans, trans.user ):
  19. item = request_type.get_api_value( value_mapper={ 'id': trans.security.encode_id, 'request_form_id': trans.security.encode_id, 'sample_form_id': trans.security.encode_id } )
  20. encoded_id = trans.security.encode_id( request_type.id )
  21. item['url'] = url_for( 'request_type', id=encoded_id )
  22. rval.append( item )
  23. return rval
  24. @web.expose_api
  25. def show( self, trans, id, **kwd ):
  26. """
  27. GET /api/request_types/{encoded_request_type_id}
  28. Displays information about a request_type.
  29. """
  30. request_type_id = id
  31. try:
  32. decoded_request_type_id = trans.security.decode_id( request_type_id )
  33. except TypeError:
  34. trans.response.status = 400
  35. return "Malformed request type id ( %s ) specified, unable to decode." % str( request_type_id )
  36. try:
  37. request_type = trans.sa_session.query( trans.app.model.RequestType ).get( decoded_request_type_id )
  38. except:
  39. request_type = None
  40. if not request_type:# or not trans.user_is_admin():
  41. trans.response.status = 400
  42. return "Invalid request_type id ( %s ) specified." % str( request_type_id )
  43. if not trans.app.security_agent.can_access_request_type( trans.user.all_roles(), request_type ):
  44. trans.response.status = 400
  45. return "No permission to access request_type ( %s )." % str( request_type_id )
  46. item = request_type.get_api_value( view='element', value_mapper={ 'id': trans.security.encode_id, 'request_form_id': trans.security.encode_id, 'sample_form_id': trans.security.encode_id } )
  47. item['url'] = url_for( 'request_type', id=request_type_id )
  48. return item
  49. @web.expose_api
  50. def create( self, trans, payload, **kwd ):
  51. """
  52. POST /api/request_types
  53. Creates a new request type (external_service configuration).
  54. """
  55. if not trans.user_is_admin():
  56. trans.response.status = 403
  57. return "You are not authorized to create a new request type (external_service configuration)."
  58. xml_text = payload.get( 'xml_text', None )
  59. if xml_text is None:
  60. trans.response.status = 400
  61. return "Missing required parameter 'xml_text'."
  62. elem = XML( xml_text )
  63. request_form_id = payload.get( 'request_form_id', None )
  64. if request_form_id is None:
  65. trans.response.status = 400
  66. return "Missing required parameter 'request_form_id'."
  67. request_form = trans.sa_session.query( trans.app.model.FormDefinition ).get( trans.security.decode_id( request_form_id ) )
  68. sample_form_id = payload.get( 'sample_form_id', None )
  69. if sample_form_id is None:
  70. trans.response.status = 400
  71. return "Missing required parameter 'sample_form_id'."
  72. sample_form = trans.sa_session.query( trans.app.model.FormDefinition ).get( trans.security.decode_id( sample_form_id ) )
  73. external_service_id = payload.get( 'external_service_id', None )
  74. if external_service_id is None:
  75. trans.response.status = 400
  76. return "Missing required parameter 'external_service_id'."
  77. external_service = trans.sa_session.query( trans.app.model.ExternalService ).get( trans.security.decode_id( external_service_id ) )
  78. request_type = request_type_factory.from_elem( elem, request_form, sample_form, external_service )
  79. #FIXME: move permission building/setting to separate abstract method call and
  80. #allow setting individual permissions by role (currently only one action, so not strictly needed)
  81. role_ids = payload.get( 'role_ids', [] )
  82. roles = [ trans.sa_session.query( trans.model.Role ).get( trans.security.decode_id( i ) ) for i in role_ids ]# if trans.app.security_agent.ok_to_display( trans.user, i ) ]
  83. permissions = {}
  84. if roles:
  85. #yikes, there has to be a better way?
  86. for k, v in trans.model.RequestType.permitted_actions.items():
  87. permissions[ trans.app.security_agent.get_action( v.action ) ] = roles
  88. if permissions:
  89. trans.app.security_agent.set_request_type_permissions( request_type, permissions )
  90. #flush objects
  91. trans.sa_session.add( request_type )
  92. trans.sa_session.flush()
  93. encoded_id = trans.security.encode_id( request_type.id )
  94. item = request_type.get_api_value( view='element', value_mapper={ 'id': trans.security.encode_id, 'request_form_id': trans.security.encode_id, 'sample_form_id': trans.security.encode_id } )
  95. item['url'] = url_for( 'request_type', id=encoded_id )
  96. return [ item ]