diff --git a/taggit/models.py b/taggit/models.py index 091d733b..823eb362 100644 --- a/taggit/models.py +++ b/taggit/models.py @@ -9,9 +9,20 @@ try: from unidecode import unidecode + + unidecode_installed = True except ImportError: + unidecode_installed = False + - def unidecode(tag): +def slugify_unicode_stripping_prep(tag): + """ + This handles stripping via unidecode if it's installed, + otherwise is a no-op + """ + if unidecode_installed: + return unidecode(tag) + else: return tag @@ -97,7 +108,7 @@ def save(self, *args, **kwargs): def slugify(self, tag, i=None): if getattr(settings, "TAGGIT_STRIP_UNICODE_WHEN_SLUGIFYING", False): - slug = slugify(unidecode(tag)) + slug = slugify(slugify_unicode_stripping_prep(tag)) else: slug = slugify(tag, allow_unicode=True) if i is not None: diff --git a/tests/test_models.py b/tests/test_models.py index 4a9b748c..9f08d32c 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,5 +1,9 @@ +from unittest import skipIf + from django.test import TestCase, override_settings +from taggit import models as taggit_models + from tests.models import TestModel @@ -22,7 +26,30 @@ def test_unicode_slugs(self): sample_obj.tags.add("あい うえお") self.assertEqual([tag.slug for tag in sample_obj.tags.all()], ["あい-うえお"]) - def test_old_slugs(self): + def test_old_slugs_wo_unidecode(self): + """ + Test that the setting that gives us the old slugification behavior + is in place + """ + with override_settings(TAGGIT_STRIP_UNICODE_WHEN_SLUGIFYING=True): + old_installed_value = taggit_models.unidecode_installed + taggit_models.unidecode_installed = False + try: + sample_obj = TestModel.objects.create() + # a unicode tag will be slugified for space reasons but + # unicode-ness will be kept by default + sample_obj.tags.add("あい うえお") + self.assertEqual( + [tag.slug for tag in sample_obj.tags.all()], ["ai-ueo"] + ) + finally: + taggit_models.unidecode_installed = old_installed_value + + @skipIf( + not taggit_models.unidecode_installed, + "This test requires unidecode to be installed", + ) + def test_old_slugs_with_unidecode(self): """ Test that the setting that gives us the old slugification behavior is in place diff --git a/tox.ini b/tox.ini index d3152f08..6db8634b 100644 --- a/tox.ini +++ b/tox.ini @@ -25,6 +25,7 @@ deps = djmain: https://github.com/django/django/archive/main.tar.gz coverage djangorestframework + unidecode setenv = PYTHONWARNINGS=all commands =