From: Loic Dachary Date: Mon, 25 Jan 2016 12:08:52 +0000 (+0700) Subject: Fix #5079 - tags unicity is on the slug, not the name X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=679f729221a1d93d1ca48ff6899a548e9daf8f95;p=mediagoblin.git Fix #5079 - tags unicity is on the slug, not the name Signed-off-by: Loic Dachary Signed-off-by: Andrew Browning --- diff --git a/mediagoblin/tests/test_tags.py b/mediagoblin/tests/test_tags.py index e25cc283..8358b052 100644 --- a/mediagoblin/tests/test_tags.py +++ b/mediagoblin/tests/test_tags.py @@ -33,6 +33,10 @@ def test_list_of_dicts_conversion(test_app): assert text.convert_to_tag_list_of_dicts('echo,echo') == [{'name': u'echo', 'slug': u'echo'}] + # When checking for duplicates, use the slug, not the tag + assert text.convert_to_tag_list_of_dicts('echo,#echo') == [{'name': u'#echo', + 'slug': u'echo'}] + # Make sure converting the list of dicts to a string works assert text.media_tags_as_string([{'name': u'yin', 'slug': u'yin'}, {'name': u'yang', 'slug': u'yang'}]) == \ diff --git a/mediagoblin/tools/text.py b/mediagoblin/tools/text.py index 96df49d2..41b7eaea 100644 --- a/mediagoblin/tools/text.py +++ b/mediagoblin/tools/text.py @@ -14,6 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import collections import wtforms import markdown from lxml.html.clean import Cleaner @@ -60,7 +61,7 @@ def convert_to_tag_list_of_dicts(tag_string): Strips trailing, leading, and internal whitespace, and also converts the "tags" text into an array of tags """ - taglist = [] + slug_to_name = collections.OrderedDict() if tag_string: # Strip out internal, trailing, and leading whitespace @@ -69,11 +70,10 @@ def convert_to_tag_list_of_dicts(tag_string): # Split the tag string into a list of tags for tag in stripped_tag_string.split(','): tag = tag.strip() - # Ignore empty or duplicate tags - if tag and tag not in [t['name'] for t in taglist]: - taglist.append({'name': tag, - 'slug': url.slugify(tag)}) - return taglist + # Ignore empty tags or duplicate slugs + if tag: + slug_to_name[url.slugify(tag)] = tag + return [{'name': v, 'slug': k} for (k,v) in slug_to_name.iteritems()] def media_tags_as_string(media_entry_tags):