Fix #5079 - tags unicity is on the slug, not the name
authorLoic Dachary <loic@dachary.org>
Mon, 25 Jan 2016 12:08:52 +0000 (19:08 +0700)
committerAndrew Browning <ayleph@thisshitistemp.com>
Sat, 6 Feb 2016 19:33:49 +0000 (14:33 -0500)
Signed-off-by: Loic Dachary <loic@dachary.org>
Signed-off-by: Andrew Browning <ayleph@thisshitistemp.com>
mediagoblin/tests/test_tags.py
mediagoblin/tools/text.py

index e25cc283fe1184b19d9c53dd8c0dd940384e2f70..8358b052997498052d63d20fc9acac256523f63d 100644 (file)
@@ -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'}]) == \
index 96df49d27a929d894d074c06459c853df0354244..41b7eaeab2d70b3564ceff21bd121dfdf1a1b953 100644 (file)
@@ -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):