From fb5780aa54b27539e9ccec7d97f378168a12838d Mon Sep 17 00:00:00 2001
From: Loic Dachary <loic@dachary.org>
Date: Mon, 25 Jan 2016 19:08:52 +0700
Subject: [PATCH] Fix #5079 - tags unicity is on the slug, not the name

Signed-off-by: Loic Dachary <loic@dachary.org>
---
 mediagoblin/tests/test_tags.py |  4 ++++
 mediagoblin/tools/text.py      | 12 ++++++------
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/mediagoblin/tests/test_tags.py b/mediagoblin/tests/test_tags.py
index e25cc28..8358b05 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 96df49d..41b7eae 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 <http://www.gnu.org/licenses/>.
 
+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):
-- 
2.7.0

