Fix #5079 - tags unicity is on the slug, not the name

Signed-off-by: Loic Dachary <loic@dachary.org>
Signed-off-by: Andrew Browning <ayleph@thisshitistemp.com>
This commit is contained in:
Loic Dachary 2016-01-25 19:08:52 +07:00 committed by Andrew Browning
parent 05f26e3abc
commit 679f729221
2 changed files with 10 additions and 6 deletions

View 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', assert text.convert_to_tag_list_of_dicts('echo,echo') == [{'name': u'echo',
'slug': 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 # Make sure converting the list of dicts to a string works
assert text.media_tags_as_string([{'name': u'yin', 'slug': u'yin'}, assert text.media_tags_as_string([{'name': u'yin', 'slug': u'yin'},
{'name': u'yang', 'slug': u'yang'}]) == \ {'name': u'yang', 'slug': u'yang'}]) == \

View File

@ -14,6 +14,7 @@
# You should have received a copy of the GNU Affero General Public License # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import collections
import wtforms import wtforms
import markdown import markdown
from lxml.html.clean import Cleaner 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 Strips trailing, leading, and internal whitespace, and also converts
the "tags" text into an array of tags the "tags" text into an array of tags
""" """
taglist = [] slug_to_name = collections.OrderedDict()
if tag_string: if tag_string:
# Strip out internal, trailing, and leading whitespace # 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 # Split the tag string into a list of tags
for tag in stripped_tag_string.split(','): for tag in stripped_tag_string.split(','):
tag = tag.strip() tag = tag.strip()
# Ignore empty or duplicate tags # Ignore empty tags or duplicate slugs
if tag and tag not in [t['name'] for t in taglist]: if tag:
taglist.append({'name': tag, slug_to_name[url.slugify(tag)] = tag
'slug': url.slugify(tag)}) return [{'name': v, 'slug': k} for (k,v) in slug_to_name.iteritems()]
return taglist
def media_tags_as_string(media_entry_tags): def media_tags_as_string(media_entry_tags):