1
+ − 1 #!/usr/bin/python
+ − 2 #
+ − 3 import os
+ − 4 import sys
+ − 5
+ − 6 # Extra step enables this script to locate vdb_common and vdb_retrieval
+ − 7 # From http://code.activestate.com/recipes/66062-determining-current-function-name/
+ − 8 _self_dir = os.path.dirname(sys._getframe().f_code.co_filename)
+ − 9 sys.path.append(_self_dir)
+ − 10
+ − 11 import vdb_common
+ − 12 import vdb_retrieval
+ − 13
+ − 14 retrieval_obj = None # Global used here to manage user's currently selected retrieval info.
+ − 15
+ − 16
+ − 17 def vdb_init_tool_user(trans):
+ − 18 """
+ − 19 Retrieves a user's api key if they have one, otherwise lets them know they need one
+ − 20 This function is automatically called from versioned_data.xml form on presentation to user
+ − 21 Note that this is how self.api_url gets back into form, for passage back to 2nd call via versioned_data.py
+ − 22 self.api_key is passed via secure <configfile> construct.
+ − 23 ALSO: squeezing history_id in this way since no other way to pass it.
+ − 24 "trans" is provided only by tool form presentation via <code file="...">
+ − 25 BUT NOW SEE John Chilton's: https://gist.github.com/jmchilton/27c5bb05e155a611294d
+ − 26 See galaxy source code at https://galaxy-dist.readthedocs.org/en/latest/_modules/galaxy/web/framework.html,
+ − 27 See http://dev.list.galaxyproject.org/error-using-get-user-id-in-xml-file-in-new-Galaxy-td4665274.html
+ − 28 See http://dev.list.galaxyproject.org/hg-galaxy-2780-Real-Job-tm-support-for-the-library-upload-to-td4133384.html
+ − 29 master api key, set in galaxy config: #self.master_api_key = trans.app.config.master_api_key
+ − 30 """
+ − 31 global retrieval_obj
+ − 32
+ − 33 api_url = trans.request.application_url + '/api'
+ − 34 history_id = str(trans.security.encode_id(trans.history.id))
+ − 35 user_api_key = None
+ − 36 #master_api_key = trans.app.config.master_api_key
+ − 37
+ − 38 if trans.user:
+ − 39
+ − 40 user_name = trans.user.username
+ − 41
+ − 42 if trans.user.api_keys and len(trans.user.api_keys) > 0:
+ − 43 user_api_key = trans.user.api_keys[0].key #First key is always the active one?
+ − 44 items = [ { 'name': user_name, 'value': api_url + '-' + history_id, 'options':[], 'selected': True } ]
+ − 45
+ − 46 else:
+ − 47 items = [ { 'name': user_name + ' - Note: you need a key (see "User" menu)!', 'value': '0', 'options':[], 'selected': False } ]
+ − 48
+ − 49 else:
+ − 50 items = [ { 'name': 'You need to be logged in to use this tool!', 'value': '1', 'options':[], 'selected': False } ]
+ − 51
+ − 52 retrieval_obj = vdb_retrieval.VDBRetrieval()
+ − 53 retrieval_obj.set_trans(api_url, history_id, user_api_key) #, master_api_key
+ − 54
+ − 55 return items
+ − 56
+ − 57
+ − 58 def vdb_get_databases():
+ − 59 """
+ − 60 Called by Tool Form, retrieves list of versioned databases from galaxy library called "Versioned Data"
+ − 61
+ − 62 @return [name,value,selected] array
+ − 63 """
+ − 64 global retrieval_obj
+ − 65 items = retrieval_obj.get_library_data_store_list()
+ − 66
+ − 67 if len(items) == 0:
+ − 68 # Not great: Communicating library problem by text in form select pulldown input.
+ − 69 items = [[vdb_retrieval.VDB_DATA_LIBRARY_FOLDER_ERROR, None, False]]
+ − 70
+ − 71 return items
+ − 72
+ − 73
+ − 74 def vdb_get_versions(spec_file_id, global_retrieval_date):
+ − 75 """
+ − 76 Retrieve applicable versions of given database.
+ − 77 Unfortunately this is only refreshed when form screen is refreshed
+ − 78
+ − 79 @param dbKey [folder_id]
+ − 80
+ − 81 @return [name,value,selected] array
+ − 82 """
+ − 83 global retrieval_obj
+ − 84
+ − 85 items = []
+ − 86 if spec_file_id:
+ − 87
+ − 88 data_store_spec = retrieval_obj.user_api.libraries.show_folder(retrieval_obj.library_id, spec_file_id)
+ − 89
+ − 90 if data_store_spec: #OTHERWISE DOES THIS MEAN USER DOESN'T HAVE PERMISSIONS? VALIDATE
+ − 91
+ − 92 file_name = data_store_spec['name'] # Short (no path), original file name, not galaxy-assigned file_name
+ − 93 data_store_type = retrieval_obj.test_data_store_type(file_name)
+ − 94 library_label_path = retrieval_obj.get_library_label_path(spec_file_id)
+ − 95
+ − 96 if not data_store_type or not library_label_path:
+ − 97 # Cludgy method of sending message to user
+ − 98 items.append([vdb_retrieval.VDB_DATA_LIBRARY_FOLDER_ERROR, None, False])
+ − 99 items.append([vdb_retrieval.VDB_DATA_LIBRARY_CONFIG_ERROR + '"' + vdb_retrieval.VDB_DATA_LIBRARY + '/' + str(library_label_path) + '/' + file_name + '"', None, False])
+ − 100 return items
+ − 101
+ − 102 _retrieval_date = vdb_common.parse_date(global_retrieval_date)
+ − 103
+ − 104 # Loads interface for appropriate data source retrieval
+ − 105 ds_obj = retrieval_obj.get_data_store_gateway(data_store_type, spec_file_id)
+ − 106 items = ds_obj.get_version_options(global_retrieval_date=_retrieval_date)
+ − 107
+ − 108 else:
+ − 109 items.append(['Unable to find' + spec_file_id + ':Check permissions?','',False])
+ − 110
+ − 111 return items
+ − 112
+ − 113
+ − 114 def vdb_get_workflows(dbKey):
+ − 115 """
+ − 116 List appropriate workflows for database. These are indicated by prefix "Versioning:" in name.
+ − 117 Currently can see ALL workflows that are published; admin_api() receives this in all galaxy versions.
+ − 118 Seems like only some galaxy versions allow user_api() to also see published workflows.
+ − 119 Only alternative is to list only individual workflows that current user can see - ones they created, and published workflows; but versioneddata user needs to have permissions on these too.
+ − 120
+ − 121 Future: Sensitivity: Some workflows apply only to some kinds of database
+ − 122
+ − 123 @param dbKey [data_spec_id]
+ − 124 @return [name,value,selected] array
+ − 125 """
+ − 126 global retrieval_obj
+ − 127
+ − 128 data = []
+ − 129 try:
+ − 130 workflows = retrieval_obj.admin_api.workflows.get_workflows(published=True)
+ − 131
+ − 132 except Exception as err:
+ − 133 if err.message[-21:] == 'HTTP status code: 403':
+ − 134 data.append(['Error: User does not have permissions to see workflows (or they need to be published).' , 0, False])
+ − 135 else:
+ − 136 data.append(['Error: In getting workflows: %s' % err.message , 0, False])
+ − 137 return data
+ − 138
+ − 139 oldName = ""
+ − 140 for workflow in workflows:
+ − 141 name = workflow['name']
+ − 142 if name[0:11].lower() == "versioning:" and name != oldName:
+ − 143 # Interface Bug: If an item is published and is also shared personally with a user, it is shown twice.
+ − 144 data.append([name, workflow['id'], False])
+ − 145 oldName = name
+ − 146
+ − 147 return data
+ − 148
+ − 149