Taggit seems to have trouble with case
In an empty database:
>>> from taggit.models import Tag
>>>
>>> from ideascube.mediacenter.models import Document
>>> from ideascube.mediacenter.tests.conftest import DocumentFactory
>>>
>>> Tag(name='musique').save()
>>> Tag(name='Musique').save()
>>> Tag(name='MUSIQUE').save()
>>>
>>> for tag in Tag.objects.all():
... print('%s: %s' % (tag.name, tag.slug))
...
musique: musique
Musique: musique_1
MUSIQUE: musique_2
>>>
>>> DocumentFactory(tags=['musique'])
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/mathieu/.local/share/virtualenvs/ideascube/lib/python3.5/site-packages/factory/base.py", line 69, in __call__
return cls.create(**kwargs)
File "/home/mathieu/.local/share/virtualenvs/ideascube/lib/python3.5/site-packages/factory/base.py", line 623, in create
return cls._generate(True, attrs)
File "/home/mathieu/.local/share/virtualenvs/ideascube/lib/python3.5/site-packages/factory/base.py", line 554, in _generate
results[name] = decl.call(obj, create, extraction_context)
File "/home/mathieu/.local/share/virtualenvs/ideascube/lib/python3.5/site-packages/factory/declarations.py", line 577, in call
extraction_context.value, **extraction_context.extra)
File "/home/mathieu/Projects/bsf/ideascube/ideascube/mediacenter/tests/factories.py", line 22, in tags
self.tags.add(*extracted)
File "/home/mathieu/.local/share/virtualenvs/ideascube/lib/python3.5/site-packages/taggit/utils.py", line 153, in inner
return func(self, *args, **kwargs)
File "/home/mathieu/.local/share/virtualenvs/ideascube/lib/python3.5/site-packages/taggit/managers.py", line 153, in add
tag_objs = self._to_tag_model_instances(tags)
File "/home/mathieu/.local/share/virtualenvs/ideascube/lib/python3.5/site-packages/taggit/managers.py", line 210, in _to_tag_model_instances
.get(name__iexact=name))
File "/home/mathieu/.local/share/virtualenvs/ideascube/lib/python3.5/site-packages/django/db/models/query.py", line 389, in get
(self.model._meta.object_name, num)
taggit.models.MultipleObjectsReturned: get() returned more than one Tag -- it returned 3!
The query run at line 389 of django/db/models/query.py
in the above traceback is basically a Tag.objects.get(name__iexact='musique')
.
This is great: taggit lets us create tags with names which only differ by their case, but then it queries case-insensitively and considers their can be only one.
We have a box with such tags in its database, and that's blocking the import of more media into it.
@mgautierfr If you can think about it on Wednesday it would be nice, because I'm all out of ideas for fixing this.