diff --git a/client/galaxy/scripts/mvc/library/library-dataset-view.js b/client/galaxy/scripts/mvc/library/library-dataset-view.js index 44756043871..58d6edb26f5 100644 --- a/client/galaxy/scripts/mvc/library/library-dataset-view.js +++ b/client/galaxy/scripts/mvc/library/library-dataset-view.js @@ -438,7 +438,7 @@ var LibraryDatasetView = Backbone.View.extend({ } } var new_info = this.$el.find(".input_dataset_misc_info").val(); - if (typeof new_info !== "undefined" && new_info !== ld.get("misc_info")) { + if (typeof new_info !== "undefined" && new_info !== ld.get("misc_info").trim()) { ld.set("misc_info", new_info); is_changed = true; } diff --git a/client/galaxy/style/scss/base.scss b/client/galaxy/style/scss/base.scss index 1cabc8ff862..f9ac0766b5e 100644 --- a/client/galaxy/style/scss/base.scss +++ b/client/galaxy/style/scss/base.scss @@ -87,7 +87,6 @@ body { @extend .p-0; @extend .w-100; @extend .h-100; - @extend .overflow-hidden; @extend .position-absolute; background: $body-bg; color: $text-color; diff --git a/lib/galaxy/managers/library_datasets.py b/lib/galaxy/managers/library_datasets.py index 3b52b6a6227..f21cfd3cfdc 100644 --- a/lib/galaxy/managers/library_datasets.py +++ b/lib/galaxy/managers/library_datasets.py @@ -105,8 +105,9 @@ class LibraryDatasetsManager(datasets.DatasetAssociationManager): new_tags = new_data.get('tags', None) if new_tags is not None and new_tags != ldda.tags: self.tag_handler.delete_item_tags(item=ldda, user=trans.user) - for tag in new_tags: - self.tag_handler.apply_item_tag(item=ldda, user=trans.user, name='name', value=tag) + tag_list = self.tag_handler.parse_tags_list(new_tags) + for tag in tag_list: + self.tag_handler.apply_item_tag(item=ldda, user=trans.user, name=tag[0], value=tag[1]) changed = True if changed: ldda.update_parent_folder_update_times() diff --git a/lib/galaxy/model/tags.py b/lib/galaxy/model/tags.py index 3b72f31a223..a1590d7efb8 100644 --- a/lib/galaxy/model/tags.py +++ b/lib/galaxy/model/tags.py @@ -254,8 +254,12 @@ class TagHandler(object): def parse_tags(self, tag_str): """ - Returns a list of raw (tag-name, value) pairs derived from a string; method scrubs tag names and values as well. - Return value is a list of (tag_name, tag_value) tuples. + Return a list of tag tuples (name, value) pairs derived from a string. + + >>> th = TagHandler("bridge_of_death") + >>> assert th.parse_tags("#ARTHUR") == [('name', 'ARTHUR')] + >>> tags = th.parse_tags("name:Lancelot of Camelot;#Holy Grail;blue") + >>> assert tags == [('name', 'LancelotofCamelot'), ('name', 'HolyGrail'), ('blue', None)] """ # Gracefully handle None. if not tag_str: @@ -265,9 +269,19 @@ class TagHandler(object): # Split tags based on separators. reg_exp = re.compile('[' + self.tag_separators + ']') raw_tags = reg_exp.split(tag_str) - # Extract name-value pairs. + return self.parse_tags_list(raw_tags) + + def parse_tags_list(self, tags_list): + """ + Return a list of tag tuples (name, value) pairs derived from a list. + Method scrubs tag names and values as well. + + >>> th = TagHandler("bridge_of_death") + >>> tags = th.parse_tags_list(["name:Lancelot of Camelot", "#Holy Grail", "blue"]) + >>> assert tags == [('name', 'LancelotofCamelot'), ('name', 'HolyGrail'), ('blue', None)] + """ name_value_pairs = [] - for raw_tag in raw_tags: + for raw_tag in tags_list: nv_pair = self._get_name_value_pair(raw_tag) scrubbed_name = self._scrub_tag_name(nv_pair[0]) scrubbed_value = self._scrub_tag_value(nv_pair[1]) diff --git a/test/api/test_libraries.py b/test/api/test_libraries.py index 80981ec3cbe..2cc91c491b6 100644 --- a/test/api/test_libraries.py +++ b/test/api/test_libraries.py @@ -287,6 +287,14 @@ class LibrariesApiTestCase(api.ApiTestCase, TestsDatasets): self._assert_status_code_is(create_response, 200) self._assert_has_keys(create_response.json(), "name", "file_ext", "misc_info", "genome_build") + def test_update_dataset_tags(self): + ld = self._create_dataset_in_folder_in_library("ForTagtestDataset") + data = {"tags": ["#Lancelot", "name:Holy Grail", "blue"]} + create_response = self._patch("libraries/datasets/%s" % ld.json()["id"], data=data) + self._assert_status_code_is(create_response, 200) + self._assert_has_keys(create_response.json(), "tags") + assert create_response.json()["tags"] == "name:Lancelot, name:HolyGrail, blue" + def test_invalid_update_dataset_in_folder(self): ld = self._create_dataset_in_folder_in_library("ForInvalidUpdateDataset") data = {'file_ext': 'nonexisting_type'}