Changelog
=========

(Unreleased)
~~~~~~~~~~~~

5.0.0 (2023-10-24)
~~~~~~~~~~~~~~~~~~
* **Backwards icompatible:** Rename the (``content_type``, ``object_id``) index on ``TaggedItem``.
  It is very unlikely for this to affect your code itself, and a migration will rename the index. This should not cause any downtime according to my research (Postgres does not lock the table for index renames, and Oracle holds a tiny lock to do it, and the change is only to the metadata, so is not dependent on table size).

* **Backwards incompatible:** Remove the ``.indexed_together`` and ``.unique_together`` attributes on ``TaggedItem``

  We are instead using ``constraints`` and ``indexes`` to set up these properties.
* Remove support for Django 3.2.
* Remove usage of deprecated APIs for Django 4.2
* Remove support for Python 3.7 (no code changes involved)
* Fix ``tag_kwargs`` and ``TAGGIT_CASE_INSENSITIVE=True`` discrepency.

4.0.0 (2023-05-04)
~~~~~~~~~~~~~~~~~~
* Remove Python 3.6 support (no code changes occurred, but we no longer test this release).
* Remove Django 4.0 support (no code changes occurred, but we no longer test this release).
* Add Django 4.2 support.

3.1.0 (2022-11-08)
~~~~~~~~~~~~~~~~~~

* Add Python 3.11 support (no code changes were needed, but now we test this release).
* Add Django 4.1 support (no code changes were needed, but now we test this release).
* Fixed an issue where object caches would not be properly cleared after updating tags, leading
  to stale reads in cases where ``prefetch_related`` is used.
* Change ``TagListSerializerField`` to be a subclass of ``ListField``. This should improve support for API document generation. This change should not affect API behavior, but might affect metaprogramming code, so please procede carefully during this update.

3.0.0 (2022-05-02)
~~~~~~~~~~~~~~~~~~

* **Backwards incompatible:** Tag slugification used to silently strip non-ASCII characters
  from the tag name to make the slug. This leads to a lot of confusion for anyone using
  languages with non-latin alphabets, as well as weird performance issues.

  Tag slugification will now, by default, maintain unicode characters as-is during
  slugification. This will lead to less surprises, but might cause issues for you if you are
  expecting all of your tag slugs to fit within a regex like ``[a-zA-Z0-9]`` (for example in
  URL routing configurations).

  Generally speaking, this should not require action on your part as a library user, as
  existing tag slugs are persisted in the database, and only new tags will receive the
  enhanced unicode-compatible slug.

  If you wish to maintain the old stripping behavior, set the setting
  ``TAGGIT_STRIP_UNICODE_WHEN_SLUGIFYING`` to ``True``.

  As a reminder, custom tag models can easily customize slugification behavior by overriding
  the ``slugify`` method to your business needs.

`` Drop Django 2.2 support.

2.1.0 (2022-01-24)
~~~~~~~~~~~~~~~~~~

* Add Python 3.10 support.
* Add Django 4.0 support.
* Drop Django 3.1 support.


2.0.0 (2021-11-14)
~~~~~~~~~~~~~~~~~~

* **Backwards incompatible:** ``TaggableManager.set`` now takes a list of tags
  (instead of varargs) so that its API matches Django's ``RelatedManager.set``. Example:

  - previously: ``item.tags.set("red", "blue")``
  - now: ``item.tags.set(["red", "blue"])``

* Fix issue where ``TagField`` would incorrectly report that a field has changed on empty values.
* Update Russian translation.
* Add Persian translation
* Fix issue for many languages where content types were not being properly translated.
* Provide translators additional context regarding strings in TagBase model.


1.5.1 (2021-07-01)
~~~~~~~~~~~~~~~~~~

* Fix compiled Ukranian translation (which would cause a failure on load for this locale).
* Update compiled Danish translation.


1.5.0 (2021-06-30)
~~~~~~~~~~~~~~~~~~

* Vendor in the `django-taggit-serializer` project (under `taggit.serializers`).
* Add Arabic translation.
* Add Ukranian translation.


1.4.0 (2021-04-19)
~~~~~~~~~~~~~~~~~~

* Add Python 3.9 support.
* Remove Python 3.5 support.
* Add Django 3.2 support.
* Remove Django 1.11 and 3.0 support.
* Add Danish translation.
* Fix crashing that could occur with ``similar_objects`` in multi-inheritance contexts.
* Add support for custom fields on through table models with `through_defaults` for ``TaggedManager.add`` and ``TaggedManager.set``.


1.3.0 (2020-05-19)
~~~~~~~~~~~~~~~~~~

* Model and field ``verbose_name`` and ``verbose_name_plural`` attributes are
  now lowercase. This simplifies using the name in the middle of a sentence.
  When used as a header, title, or at the beginning of a sentence, a text
  transformed can be used to adjust the case.
* Fix prefetch_related when using UUIDTaggedItem.
* Allow for passing in extra constructor parameters when using
  ``TaggableManager.add``. This is especially useful when using custom
  tag models.

1.2.0 (2019-12-03)
~~~~~~~~~~~~~~~~~~

* **Removed** support for end-of-life Django 2.0 and 2.1.
* Added support for Django 3.0.
* Added support for Python 3.8.
* Moved ``TaggedItemBase.tags_for()`` to ItemBase.
* Replaced reference to removed Django's ``.virtual_fields`` with
  ``.private_field``.
* Added ``TextareaTagWidget``.

1.1.0 (2019-03-22)
~~~~~~~~~~~~~~~~~~

* Added Finnish translation.
* Updated Chinese translation.
* Updated Esperanto translation.
* Fix ``form.changed_data`` to allow early access for a tags defined with
  ``blank=True``.

1.0.0 (2019-03-17)
~~~~~~~~~~~~~~~~~~

* **Backwards incompatible:** Remove support for Python 2.
* Added ``has_changed()`` method to ``taggit.forms.TagField``.
* Added multi-column unique constraint to model ``TaggedItem`` on fields
  ``content_type``, ``object_id``, and ``tag``. Databases that contain
  duplicates will need to add a data migration to resolve these duplicates.
* Fixed ``TaggableManager.most_common()`` to always evaluate lazily. Allows
  placing a ``.most_common()`` query at the top level of a module.
* Fixed setting the ``related_name`` on a tags manager that exists on a model
  named ``Name``.

0.24.0 (2019-02-19)
~~~~~~~~~~~~~~~~~~~

* The project has moved to `Jazzband <https://jazzband.co/>`_. This is the
  first release under the new organization. The new repository URL is
  `<https://github.com/jazzband/django-taggit>`_.
* Added support for Django 2.2.
* Fixed a race condition in ``TaggableManager``.
* Removed method ``ItemBase.bulk_lookup_kwargs()``.
* Fixed view ``tagged_object_list`` to set ``queryset.model`` as
  ``ListView.model`` (was previously set as a ``ContentType`` instance).
* ``_TaggableManager`` and ``TaggableManager`` now always call the parent
  class ``__init__``.
* Removed ``TaggableRel`` and replaced uses with ``ManyToManyRel``.

0.23.0 (2018-08-07)
~~~~~~~~~~~~~~~~~~~

* **Backwards incompatible:** Remove support for Django < 1.11
* Added support for Django 2.1 and Python 3.7
* Moved TagWidget value conversion from TagWidget.render() to TagWidget.format_value()

0.22.2 (2017-12-27)
~~~~~~~~~~~~~~~~~~~

* Added support for Django 2.0
* **Backwards incompatible:** Dropped support for EOL Python 3.3

0.22.1 (2017-04-22)
~~~~~~~~~~~~~~~~~~~

* Update spanish translation
* Add testing for Django 1.11 and Python 3.6
* introduce isort and flake8 in the CI
* [docs] Fixed links to external apps
* Improved auto-slug in TagBase to support UUID pk
* [docs] Added contribution guidelines

0.22.0 (2017-01-29)
~~~~~~~~~~~~~~~~~~~

* **Backwards incompatible:** Drop support for Django 1.7

0.21.6 (2017-01-25)
~~~~~~~~~~~~~~~~~~~

* Fix case-insensitive tag creation when setting to a mix of new and existing
  tags are used

0.21.5 (2017-01-21)
~~~~~~~~~~~~~~~~~~~

* Check for case-insensitive duplicates when creating new tags

0.21.4 (2017-01-10)
~~~~~~~~~~~~~~~~~~~

* Support __gt__ and __lt__ ordering on Tags

0.21.3 (2016-10-07)
~~~~~~~~~~~~~~~~~~~

* Fix list view

0.21.2 (2016-08-31)
~~~~~~~~~~~~~~~~~~~

* Update Python version classifiers in setup.py
* Add Greek translation

0.21.1 (2016-08-25)
~~~~~~~~~~~~~~~~~~~

* Document supported versions of Django; fix Travis to test these versions.

0.21.0 (2016-08-22)
~~~~~~~~~~~~~~~~~~~

* Fix form tests on Django 1.10
* Address list_display and fieldsets in admin docs
* external_apps.txt improvements
* Remove support for Django 1.4-1.6, again.

0.20.2 (2016-07-11)
~~~~~~~~~~~~~~~~~~~

* Add extra_filters argument to the manager's most_common method

0.20.1 (2016-06-23)
~~~~~~~~~~~~~~~~~~~

* Specify `app_label` for `Tag` and `TaggedItem`

0.20.0 (2016-06-19)
~~~~~~~~~~~~~~~~~~~

* Fix UnboundLocalError in _TaggableManager.set(..)
* Update doc links to reflect RTD domain changes
* Improve Russian translations

0.19.1 (2016-05-25)
~~~~~~~~~~~~~~~~~~~

* Add app config, add simplified Chinese translation file

0.19.0 (2016-05-23)
~~~~~~~~~~~~~~~~~~~

* Implementation of m2m_changed signal sending
* Code and tooling improvements

0.18.3 (2016-05-12)
~~~~~~~~~~~~~~~~~~~

* Added Spanish and Turkish translations

0.18.2 (2016-05-08)
~~~~~~~~~~~~~~~~~~~

* Add the min_count parameter to managers.most_common function

0.18.1 (2016-03-30)
~~~~~~~~~~~~~~~~~~~

* Address deprecation warnings

0.18.0 (2016-01-18)
~~~~~~~~~~~~~~~~~~~

* Add option to override default tag string parsing
* Drop support for Python 2.6

0.17.6 (2015-12-09)
~~~~~~~~~~~~~~~~~~~

* Silence Django 1.9 warning

0.17.5 (2015-11-27)
~~~~~~~~~~~~~~~~~~~

* Django 1.9 compatibility fix

0.17.4 (2015-11-25)
~~~~~~~~~~~~~~~~~~~

* Allows custom Through Model with GenericForeignKey

0.17.3 (2015-10-26)
~~~~~~~~~~~~~~~~~~~

* Silence Django 1.9 warning about on_delete

0.17.2 (2015-10-25)
~~~~~~~~~~~~~~~~~~~

* Django 1.9 beta compatibility

0.17.1 (2015-09-10)
~~~~~~~~~~~~~~~~~~~

* Fix unknown column `object_id` issue with Django 1.6+

0.17.0 (2015-08-14)
~~~~~~~~~~~~~~~~~~~

* Database index added on TaggedItem fields content_type & object_id

0.16.4 (2015-08-13)
~~~~~~~~~~~~~~~~~~~

* Access default manager via class instead of instance

0.16.3 (2015-08-08)
~~~~~~~~~~~~~~~~~~~

* Prevent IntegrityError with custom TagBase classes

0.16.2 (2015-07-13)
~~~~~~~~~~~~~~~~~~~

* Fix an admin bug related to the `Manager` property `through_fields`

0.16.1 (2015-07-09)
~~~~~~~~~~~~~~~~~~~

* Fix bug that assumed all primary keys are named 'id'

0.16.0 (2015-07-04)
~~~~~~~~~~~~~~~~~~~

* Add option to allow case-insensitive tags

0.15.0 (2015-06-23)
~~~~~~~~~~~~~~~~~~~

* Fix wrong slugs for non-latin chars. Only works if optional GPL dependency
  (unidecode) is installed.

0.14.0 (2015-04-26)
~~~~~~~~~~~~~~~~~~~

* Prevent extra JOIN when prefetching
* Prevent _meta warnings with Django 1.8

0.13.0 (2015-04-02)
~~~~~~~~~~~~~~~~~~~

* Django 1.8 support

0.12.3 (2015-03-03)
~~~~~~~~~~~~~~~~~~~

* Specify that the internal type of the TaggitManager is a ManyToManyField

0.12.2 (2014-21-09)
~~~~~~~~~~~~~~~~~~~

* Fixed 1.7 migrations.

0.12.1 (2014-10-08)
~~~~~~~~~~~~~~~~~~~

* Final (hopefully) fixes for the upcoming Django 1.7 release.
* Added Japanese translation.

0.12.0 (2014-20-04)
~~~~~~~~~~~~~~~~~~~

* **Backwards incompatible:** Support for Django 1.7 migrations. South users
  have to set ``SOUTH_MIGRATION_MODULES`` to use ``taggit.south_migrations``
  for taggit.
* **Backwards incompatible:** Django's new transaction handling is used on
  Django 1.6 and newer.
* **Backwards incompatible:** ``Tag.save`` got changed to opportunistically try
  to save the tag and if that fails fall back to selecting existing similar
  tags and retry -- if that fails too an ``IntegrityError`` is raised by the
  database, your app will have to handle that.
* Added Italian and Esperanto translations.

0.11.2 (2013-13-12)
~~~~~~~~~~~~~~~~~~~

* Forbid multiple TaggableManagers via generic foreign keys.

0.11.1 (2013-25-11)
~~~~~~~~~~~~~~~~~~~

* Fixed support for Django 1.4 and 1.5.

0.11.0 (2013-25-11)
~~~~~~~~~~~~~~~~~~~

* Added support for prefetch_related on tags fields.
* Fixed support for Django 1.7.
* Made the tagging relations unserializeable again.
* Allow more than one TaggableManager on models (assuming concrete FKs are
   used for the relations).

0.10.0 (2013-17-08)
~~~~~~~~~~~~~~~~~~~

* Support for Django 1.6 and 1.7.
* Python3 support
* **Backwards incompatible:** Dropped support for Django < 1.4.5.
* Tag names are unique now, use the provided South migrations to upgrade.

0.9.2 (2011-01-17)
~~~~~~~~~~~~~~~~~~

* **Backwards incompatible:** Forms containing a :class:`TaggableManager` by
  default now require tags, to change this provide ``blank=True`` to the
  :class:`TaggableManager`.
* Now works with Django 1.3 (as of beta-1).

0.9.0 (2010-09-22)
~~~~~~~~~~~~~~~~~~

* Added a Hebrew locale.
* Added an index on the ``object_id`` field of ``TaggedItem``.
* When displaying tags always join them with commas, never spaces.
* The docs are now available `online <https://django-taggit.readthedocs.io/>`_.
* Custom ``Tag`` models are now allowed.
* **Backwards incompatible:** Filtering on tags is no longer
  ``filter(tags__in=["foo"])``, it is written
  ``filter(tags__name__in=["foo"])``.
* Added a German locale.
* Added a Dutch locale.
* Removed ``taggit.contrib.suggest``, it now lives in an external application,
   see :doc:`external_apps` for more information.

0.8.0 (2010-06-22)
~~~~~~~~~~~~~~~~~~

* Fixed querying for objects using ``exclude(tags__in=tags)``.
* Marked strings as translatable.
* Added a Russian translation.
* Created a `mailing list <http://groups.google.com/group/django-taggit>`_.
* Smarter tagstring parsing for form field; ported from Jonathan Buchanan's
  `django-tagging <http://django-tagging.googlecode.com>`_. Now supports tags
  containing commas. See :ref:`tags-in-forms` for details.
* Switched to using savepoints around the slug generation for tags. This
  ensures that it works fine on databases (such as Postgres) which dirty a
  transaction with an ``IntegrityError``.
* Added Python 2.4 compatibility.
* Added Django 1.1 compatibility.
