From 984195af7a12f77857d216a781e17d10e6bcb9d9 Mon Sep 17 00:00:00 2001 From: Martin Cech Date: Thu, 7 Nov 2019 16:23:59 -0500 Subject: [PATCH 1/5] trim the loaded value, since Galaxy tends to start with a newline --- client/galaxy/scripts/mvc/library/library-dataset-view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; } From bcf219ee702a81388973365db344fb06c93eeb1f Mon Sep 17 00:00:00 2001 From: Martin Cech Date: Thu, 7 Nov 2019 16:48:54 -0500 Subject: [PATCH 2/5] strip the named tag prefix do not store tags like "name:name:value" --- lib/galaxy/managers/library_datasets.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/managers/library_datasets.py b/lib/galaxy/managers/library_datasets.py index 2f844e57c15..f8bb1cb2766 100644 --- a/lib/galaxy/managers/library_datasets.py +++ b/lib/galaxy/managers/library_datasets.py @@ -106,7 +106,10 @@ class LibraryDatasetsManager(datasets.DatasetAssociationManager): 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) + new_tag = tag + if new_tag.startswith("name:"): + new_tag = new_tag[5:] + self.tag_handler.apply_item_tag(item=ldda, user=trans.user, name='name', value=new_tag) changed = True if changed: ldda.update_parent_folder_update_times() From e5b5e04ef6632eb260ab5396ac65a79eca88470b Mon Sep 17 00:00:00 2001 From: Martin Cech Date: Fri, 8 Nov 2019 12:53:34 -0500 Subject: [PATCH 3/5] bring some clarity to library tag handling fix tag list handling when updating ldda add test for ldda tag update add doc tests for tag parsing methods refactor --- lib/galaxy/managers/library_datasets.py | 8 +++----- lib/galaxy/model/tags.py | 21 +++++++++++++++++---- test/api/test_libraries.py | 8 ++++++++ 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/galaxy/managers/library_datasets.py b/lib/galaxy/managers/library_datasets.py index f8bb1cb2766..4990ae1e40a 100644 --- a/lib/galaxy/managers/library_datasets.py +++ b/lib/galaxy/managers/library_datasets.py @@ -105,11 +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: - new_tag = tag - if new_tag.startswith("name:"): - new_tag = new_tag[5:] - self.tag_handler.apply_item_tag(item=ldda, user=trans.user, name='name', value=new_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..63fbf1d9e05 100644 --- a/lib/galaxy/model/tags.py +++ b/lib/galaxy/model/tags.py @@ -254,8 +254,11 @@ 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") + >>> th.parse_tags(u"name:Lancelot of Camelot;#Holy Grail;blue") + [(u'name', u'LancelotofCamelot'), (u'name', u'HolyGrail'), (u'blue', None)] """ # Gracefully handle None. if not tag_str: @@ -265,9 +268,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") + >>> th.parse_tags_list(["name:Lancelot of Camelot", "#Holy Grail", "blue"]) + [('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'} From ffce700fe1e1d32acdcb2b896f025928e7bc441e Mon Sep 17 00:00:00 2001 From: Martin Cech Date: Fri, 8 Nov 2019 13:04:54 -0500 Subject: [PATCH 4/5] prevent bootstrap to inject "!important" overflow css rule it makes library dataset page unscrollable xref https://github.com/galaxyproject/galaxy/pull/8787 --- client/galaxy/style/scss/base.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/client/galaxy/style/scss/base.scss b/client/galaxy/style/scss/base.scss index d396284960e..50a2b886287 100644 --- a/client/galaxy/style/scss/base.scss +++ b/client/galaxy/style/scss/base.scss @@ -86,7 +86,6 @@ body { @extend .p-0; @extend .w-100; @extend .h-100; - @extend .overflow-hidden; @extend .position-absolute; background: $body-bg; color: $text-color; From 86e6dc983e8ed9ecefc8e8362c0dcce8b2705dac Mon Sep 17 00:00:00 2001 From: Martin Cech Date: Fri, 8 Nov 2019 15:05:40 -0500 Subject: [PATCH 5/5] avoid different unicode str behavior on py2/3 --- lib/galaxy/model/tags.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/model/tags.py b/lib/galaxy/model/tags.py index 63fbf1d9e05..a1590d7efb8 100644 --- a/lib/galaxy/model/tags.py +++ b/lib/galaxy/model/tags.py @@ -257,8 +257,9 @@ class TagHandler(object): Return a list of tag tuples (name, value) pairs derived from a string. >>> th = TagHandler("bridge_of_death") - >>> th.parse_tags(u"name:Lancelot of Camelot;#Holy Grail;blue") - [(u'name', u'LancelotofCamelot'), (u'name', u'HolyGrail'), (u'blue', None)] + >>> 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: @@ -276,8 +277,8 @@ class TagHandler(object): Method scrubs tag names and values as well. >>> th = TagHandler("bridge_of_death") - >>> th.parse_tags_list(["name:Lancelot of Camelot", "#Holy Grail", "blue"]) - [('name', 'LancelotofCamelot'), ('name', 'HolyGrail'), ('blue', None)] + >>> 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 tags_list: