diff --git a/client/src/components/Libraries/LibrariesList.vue b/client/src/components/Libraries/LibrariesList.vue
index dc9db927fe7..df1e5a6d85e 100644
--- a/client/src/components/Libraries/LibrariesList.vue
+++ b/client/src/components/Libraries/LibrariesList.vue
@@ -9,7 +9,9 @@
Library
- include deleted
+
+ include deleted
+
exclude restricted
@@ -158,6 +160,7 @@
id="paginationPerPage"
autocomplete="off"
type="number"
+ onkeyup="this.value|=0;if(this.value<1)this.value=1"
v-model="perPage"
/>
diff --git a/client/src/components/Libraries/LibraryFolder/TopToolbar/FolderTopBar.vue b/client/src/components/Libraries/LibraryFolder/TopToolbar/FolderTopBar.vue
index f269faafa4b..a9fddc56612 100644
--- a/client/src/components/Libraries/LibraryFolder/TopToolbar/FolderTopBar.vue
+++ b/client/src/components/Libraries/LibraryFolder/TopToolbar/FolderTopBar.vue
@@ -303,12 +303,13 @@ export default {
// helper function to make legacy code compatible
findCheckedItems: async function (idOnly = true) {
const datasets = [];
- const folder = [];
+ const folders = [];
const selected = await this.getSelected();
selected.forEach((item) => {
- item.type === "file" ? datasets.push(idOnly ? item.id : item) : idOnly ? item.id : item;
+ const selected_item = idOnly ? item.id : item;
+ item.type === "file" ? datasets.push(selected_item) : folders.push(selected_item);
});
- return { datasets: datasets, folders: folder };
+ return { datasets: datasets, folders: folders };
},
importToHistoryModal: function (isCollection) {
this.findCheckedItems(!isCollection).then(({ datasets, folders }) => {
diff --git a/client/src/components/Libraries/LibraryFolder/TopToolbar/import-to-history/import-dataset.js b/client/src/components/Libraries/LibraryFolder/TopToolbar/import-to-history/import-dataset.js
index d57051a0f37..f9d17e703e7 100644
--- a/client/src/components/Libraries/LibraryFolder/TopToolbar/import-to-history/import-dataset.js
+++ b/client/src/components/Libraries/LibraryFolder/TopToolbar/import-to-history/import-dataset.js
@@ -79,13 +79,13 @@ var ImportDatasetModal = Backbone.View.extend({
Toast.error("An error occurred.");
})
.always(() => {
- this.modal.enableButton("Import");
+ this.modal.disableButton("Import");
});
} else {
var history_id = $("select[name=import_to_history] option:selected").val();
var history_name = $("select[name=import_to_history] option:selected").text();
this.processImportToHistory(history_id, history_name);
- this.modal.enableButton("Import");
+ this.modal.disableButton("Import");
}
},
diff --git a/client/src/components/Libraries/library-utils.js b/client/src/components/Libraries/library-utils.js
index 11b4b1af569..ac4ba93c5e3 100644
--- a/client/src/components/Libraries/library-utils.js
+++ b/client/src/components/Libraries/library-utils.js
@@ -13,9 +13,12 @@ export function onError(error) {
// legacy code
export function extractRoles(role_list) {
const selected_roles = [];
- role_list.forEach((item) => {
- selected_roles.push({ name: item[0], id: item[1] });
- });
+
+ if (role_list) {
+ role_list.forEach((item) => {
+ selected_roles.push({ name: item[0], id: item[1] });
+ });
+ }
return selected_roles;
}
diff --git a/client/src/components/Upload/Collection.vue b/client/src/components/Upload/Collection.vue
index 9dc2f04474b..22b872a63fe 100644
--- a/client/src/components/Upload/Collection.vue
+++ b/client/src/components/Upload/Collection.vue
@@ -242,6 +242,7 @@ export default {
file_mode: file.mode || "local",
file_path: file.path,
file_data: file,
+ file_uri: file.uri,
extension: this.extension,
genome: this.genome,
};
diff --git a/client/src/components/Upload/Default.vue b/client/src/components/Upload/Default.vue
index b73cefdf61e..b8cdfb00eb0 100644
--- a/client/src/components/Upload/Default.vue
+++ b/client/src/components/Upload/Default.vue
@@ -249,6 +249,7 @@ export default {
file_size: file.size,
file_mode: file.mode || "local",
file_path: file.path,
+ file_uri: file.uri,
file_data: file,
};
},
diff --git a/client/src/components/Upload/UploadBoxMixin.js b/client/src/components/Upload/UploadBoxMixin.js
index 97a9dc485ac..6b4c7cfed39 100644
--- a/client/src/components/Upload/UploadBoxMixin.js
+++ b/client/src/components/Upload/UploadBoxMixin.js
@@ -242,6 +242,7 @@ export default {
name: ftp_file.path,
size: ftp_file.size,
path: ftp_file.path,
+ uri: ftp_file.uri,
},
]);
},
diff --git a/client/src/components/Upload/UploadModalContent.vue b/client/src/components/Upload/UploadModalContent.vue
index dad838fe24a..adb7a993247 100644
--- a/client/src/components/Upload/UploadModalContent.vue
+++ b/client/src/components/Upload/UploadModalContent.vue
@@ -292,24 +292,23 @@ export default {
auto_decompress: true,
};
- // Composite does not use the fetch API, so we can just
- // index into the first element of items
- const item = items[0];
- let urls;
- if (item.get("file_mode") == "ftp") {
- urls = [item.get("file_path")];
- } else {
- urls = item.get("url_paste").split("\n");
- }
- urls.forEach((url) => {
- if (url != "") {
- data.targets[0].elements.push({
- url: url.trim(),
- src: "url",
- dbkey: item.get("genome", "?"),
- ext: item.get("extension", "auto"),
- });
+ items.forEach((item) => {
+ let urls;
+ if (item.get("file_mode") == "ftp") {
+ urls = [item.get("file_uri") || item.get("file_path")];
+ } else {
+ urls = item.get("url_paste").split("\n");
}
+ urls.forEach((url) => {
+ if (url != "") {
+ data.targets[0].elements.push({
+ url: url.trim(),
+ src: "url",
+ dbkey: item.get("genome", "?"),
+ ext: item.get("extension", "auto"),
+ });
+ }
+ });
});
return data;
},
diff --git a/client/src/components/Workflow/Editor/Index.vue b/client/src/components/Workflow/Editor/Index.vue
index 23b31e6ea4c..2789c869b7c 100644
--- a/client/src/components/Workflow/Editor/Index.vue
+++ b/client/src/components/Workflow/Editor/Index.vue
@@ -469,7 +469,7 @@ export default {
}
},
onUpgrade() {
- this.attemptRefactor([{ action_type: "upgrade_all_steps" }]);
+ this.onAttemptRefactor([{ action_type: "upgrade_all_steps" }]);
},
onEdit() {
this.isCanvas = true;
diff --git a/client/src/components/Workflow/TrsImport.vue b/client/src/components/Workflow/TrsImport.vue
index 04a22a1ec57..3ec341dbdba 100644
--- a/client/src/components/Workflow/TrsImport.vue
+++ b/client/src/components/Workflow/TrsImport.vue
@@ -105,9 +105,20 @@ export default {
this.trsTool = tool;
this.errorMessage = null;
if (this.isAutoImport) {
- const version = this.trsTool.versions.find((version) => version.id === this.queryTrsVersionId);
+ /* Resolve discrepancy between workflowhub, which sends an id as query parameter,
+ and dockstore, which uses the version name as the query parameter.
+ Should just be one of them eventually. */
+ let versionField = "name";
+ const version = this.trsTool.versions.find((version) => {
+ if (version.name === this.queryTrsVersionId) {
+ return true;
+ } else if (version.id === this.queryTrsVersionId) {
+ versionField = "id";
+ return true;
+ }
+ });
if (version) {
- this.importVersion(this.trsTool.id, version, this.isRun);
+ this.importVersion(this.trsTool.id, version[versionField], this.isRun);
} else {
Toast.warning(`Specified version: ${this.queryTrsVersionId} doesn't exist`);
this.isAutoImport = false;
diff --git a/client/src/components/Workflow/trsMixin.js b/client/src/components/Workflow/trsMixin.js
index dfd944df435..32a9ab780f0 100644
--- a/client/src/components/Workflow/trsMixin.js
+++ b/client/src/components/Workflow/trsMixin.js
@@ -11,7 +11,7 @@ export default {
methods: {
importVersion(toolId, version, isRunFormRedirect = false) {
this.services
- .importTrsTool(this.trsSelection.id, toolId, version.name)
+ .importTrsTool(this.trsSelection.id, toolId, version)
.then((response_data) => {
redirectOnImport(getAppRoot(), response_data, isRunFormRedirect);
})
diff --git a/client/src/mvc/library/library-dataset-view.js b/client/src/mvc/library/library-dataset-view.js
index 0f326e6a8e2..931f013dc7e 100644
--- a/client/src/mvc/library/library-dataset-view.js
+++ b/client/src/mvc/library/library-dataset-view.js
@@ -492,12 +492,12 @@ var LibraryDatasetView = Backbone.View.extend({
-
- Libraries
+ Libraries
<% _.each(item.get("full_path"), function(path_item) { %>
<% if (path_item[0] != item.id) { %>
-
-
+
<%- path_item[1] %>
diff --git a/client/src/mvc/upload/upload-model.js b/client/src/mvc/upload/upload-model.js
index 51876ccf91e..37ea008e2d5 100644
--- a/client/src/mvc/upload/upload-model.js
+++ b/client/src/mvc/upload/upload-model.js
@@ -12,6 +12,7 @@ var Model = Backbone.Model.extend({
file_size: 0,
file_type: null,
file_path: "",
+ file_uri: null,
file_data: null,
percentage: 0,
space_to_tab: false,
diff --git a/lib/galaxy/managers/libraries.py b/lib/galaxy/managers/libraries.py
index 639cac2f518..050c737e613 100644
--- a/lib/galaxy/managers/libraries.py
+++ b/lib/galaxy/managers/libraries.py
@@ -147,32 +147,35 @@ class LibraryManager:
query = query.filter(trans.app.model.Library.table.c.deleted == false())
else:
# Nonadmins can't see deleted libraries
- query = query.filter(trans.app.model.Library.table.c.deleted == false())
- current_user_role_ids = [role.id for role in trans.get_current_user_roles()]
- all_actions = trans.sa_session.query(trans.model.LibraryPermissions).filter(trans.model.LibraryPermissions.table.c.role_id.in_(current_user_role_ids))
- library_add_action = trans.app.security_agent.permitted_actions.LIBRARY_ADD.action
- library_modify_action = trans.app.security_agent.permitted_actions.LIBRARY_MODIFY.action
- library_manage_action = trans.app.security_agent.permitted_actions.LIBRARY_MANAGE.action
- accessible_restricted_library_ids = set()
- allowed_library_add_ids = set()
- allowed_library_modify_ids = set()
- allowed_library_manage_ids = set()
- for action in all_actions:
- if action.action == library_access_action:
- accessible_restricted_library_ids.add(action.library_id)
- if action.action == library_add_action:
- allowed_library_add_ids.add(action.library_id)
- if action.action == library_modify_action:
- allowed_library_modify_ids.add(action.library_id)
- if action.action == library_manage_action:
- allowed_library_manage_ids.add(action.library_id)
- query = query.filter(or_(
- not_(trans.model.Library.table.c.id.in_(restricted_library_ids)),
- trans.model.Library.table.c.id.in_(accessible_restricted_library_ids)
- ))
- prefetched_ids['allowed_library_add_ids'] = allowed_library_add_ids
- prefetched_ids['allowed_library_modify_ids'] = allowed_library_modify_ids
- prefetched_ids['allowed_library_manage_ids'] = allowed_library_manage_ids
+ if deleted:
+ raise exceptions.AdminRequiredException()
+ else:
+ query = query.filter(trans.app.model.Library.table.c.deleted == false())
+ current_user_role_ids = [role.id for role in trans.get_current_user_roles()]
+ all_actions = trans.sa_session.query(trans.model.LibraryPermissions).filter(trans.model.LibraryPermissions.table.c.role_id.in_(current_user_role_ids))
+ library_add_action = trans.app.security_agent.permitted_actions.LIBRARY_ADD.action
+ library_modify_action = trans.app.security_agent.permitted_actions.LIBRARY_MODIFY.action
+ library_manage_action = trans.app.security_agent.permitted_actions.LIBRARY_MANAGE.action
+ accessible_restricted_library_ids = set()
+ allowed_library_add_ids = set()
+ allowed_library_modify_ids = set()
+ allowed_library_manage_ids = set()
+ for action in all_actions:
+ if action.action == library_access_action:
+ accessible_restricted_library_ids.add(action.library_id)
+ if action.action == library_add_action:
+ allowed_library_add_ids.add(action.library_id)
+ if action.action == library_modify_action:
+ allowed_library_modify_ids.add(action.library_id)
+ if action.action == library_manage_action:
+ allowed_library_manage_ids.add(action.library_id)
+ query = query.filter(or_(
+ not_(trans.model.Library.table.c.id.in_(restricted_library_ids)),
+ trans.model.Library.table.c.id.in_(accessible_restricted_library_ids)
+ ))
+ prefetched_ids['allowed_library_add_ids'] = allowed_library_add_ids
+ prefetched_ids['allowed_library_modify_ids'] = allowed_library_modify_ids
+ prefetched_ids['allowed_library_manage_ids'] = allowed_library_manage_ids
return query, prefetched_ids
def secure(self, trans, library, check_accessible=True):
diff --git a/test/integration_selenium/test_upload_ftp.py b/test/integration_selenium/test_upload_ftp.py
index 13f62a51aee..ac7b2002382 100644
--- a/test/integration_selenium/test_upload_ftp.py
+++ b/test/integration_selenium/test_upload_ftp.py
@@ -20,20 +20,40 @@ class UploadFtpSeleniumIntegrationTestCase(SeleniumIntegrationTestCase):
def ftp_dir(cls):
return cls.temp_config_dir("ftp")
- @selenium_test
- def test_upload_simplest(self):
- email = self.get_logged_in_user()["email"]
- user_ftp_dir = os.path.join(self.ftp_dir(), email)
- os.makedirs(user_ftp_dir)
- file_path = os.path.join(user_ftp_dir, "1.txt")
- with open(file_path, "w")as f:
- f.write("Hello World!")
-
+ def _upload_all(self):
self.home()
self.components.upload.start.wait_for_and_click()
self.components.upload.ftp_add.wait_for_and_click()
self.components.upload.ftp_popup.wait_for_visible()
- self.components.upload.ftp_items().all()[0].click()
+ for item in self.components.upload.ftp_items().all():
+ item.click()
self.components.upload.ftp_close.wait_for_and_click()
self.components.upload.row(n=0).wait_for_visible()
self.upload_start()
+ self.sleep_for(self.wait_types.UX_RENDER)
+ self.wait_for_history()
+
+ def _create_ftp_dir(self):
+ email = self.get_logged_in_user()["email"]
+ user_ftp_dir = os.path.join(self.ftp_dir(), email)
+ os.makedirs(user_ftp_dir)
+ return user_ftp_dir
+
+ @selenium_test
+ def test_upload_simplest(self):
+ user_ftp_dir = self._create_ftp_dir()
+ file_path = os.path.join(user_ftp_dir, "1.txt")
+ with open(file_path, "w") as f:
+ f.write("Hello World!")
+ self._upload_all()
+
+ @selenium_test
+ def test_upload_multiple(self):
+ user_ftp_dir = self._create_ftp_dir()
+ file_path = os.path.join(user_ftp_dir, "1.txt")
+ with open(file_path, "w") as f:
+ f.write("Hello World!")
+ file_path = os.path.join(user_ftp_dir, "2.txt")
+ with open(file_path, "w") as f:
+ f.write("Hello Galaxy!")
+ self._upload_all()
diff --git a/tools/extract/liftOver_wrapper.py b/tools/extract/liftOver_wrapper.py
index 9cd077e3baf..90385814c8a 100644
--- a/tools/extract/liftOver_wrapper.py
+++ b/tools/extract/liftOver_wrapper.py
@@ -26,7 +26,7 @@ def safe_bed_file(infile):
https://lists.soe.ucsc.edu/pipermail/genome/2007-May/013561.html
"""
fix_pat = re.compile("^(track|browser)")
- with tempfile.NamedTemporaryFile(mode='w', delete=False) as out_handle, open(infile, 'w') as in_handle:
+ with tempfile.NamedTemporaryFile(mode='w', delete=False) as out_handle, open(infile, 'r') as in_handle:
for line in in_handle:
if fix_pat.match(line):
line = "#" + line