# Changelog

## (Unreleased)

<!--next-version-placeholder-->

## v4.1.0 (2023-05-09)
### Feature
* **tags:** Rename models ready for adding fields #66 ([`a21fec8`](https://github.com/imAsparky/django-tag-fields/commit/a21fec833f4745682228260e8f77886c0b8ddfd3))

### Fix
* **ver:** Update conf.py location in sem_ver #68 ([`14ff854`](https://github.com/imAsparky/django-tag-fields/commit/14ff8549930c0c46a5ed097f92d61a36f5f281ed))

### Documentation
* **models:** Update model names #66 ([`de364b4`](https://github.com/imAsparky/django-tag-fields/commit/de364b48ecf9afe09279b2c9d74f9f3fd7004c09))
* **structure:** Update to standard Sphinx #63 ([`f03086a`](https://github.com/imAsparky/django-tag-fields/commit/f03086acd78a8ad5d0af36dfb122e09444865ab0))
* **config:** Add readthedocs and extra deps #63 ([`94e4374`](https://github.com/imAsparky/django-tag-fields/commit/94e437496323dd5545d9ccd1f6b768fd653e9db5))
* **deps:** Update docutils #61 ([`c5a4ed3`](https://github.com/imAsparky/django-tag-fields/commit/c5a4ed3802cd421d2dab2d22a4fe814fb6305acd))

## v4.0.2 (2023-05-06)
### Fix
* **settings:** Update Constant names #59 ([`c2a9b3a`](https://github.com/imAsparky/django-tag-fields/commit/c2a9b3ab5047023464ff4a032f2eafce68c7d06b))

### Documentation
* **settings:** Update Constant names #59 ([`1395043`](https://github.com/imAsparky/django-tag-fields/commit/13950430a4300365259f5e99c560f70c29069fca))
* **manager:** Add docstrings to select areas #57 ([`d524d44`](https://github.com/imAsparky/django-tag-fields/commit/d524d44ba99f4214ba05080903997593d6c6849f))
* **changelog:** Change .rst to .md #55 ([`5b5b6d9`](https://github.com/imAsparky/django-tag-fields/commit/5b5b6d9414a801cf9888440a9b388157fe164ad9))
* **typo:** Improve wording and layout #53 ([`0970e28`](https://github.com/imAsparky/django-tag-fields/commit/0970e28d52e37a6c25962c3a6d000bd857306281))

## v4.0.1 (2023-05-04)

### Fix

- **dev:** Add pre-commit to requirements #51 ([`5a27789`](https://github.com/imAsparky/django-tag-fields/commit/5a277893dd2b112fb57ac439c44c04b3f3e3183e))

### Documentation

- **all:** Update with all model changes #38 ([`0efc84b`](https://github.com/imAsparky/django-tag-fields/commit/0efc84b6b16789990a097318e58ffa92c44bf413))

## 4.0.0 (2023-03-30)

- Initial release of django-tag-fields.
- A renaming of cloned `django-taggit`

This release functions the same as `django-taggit v3.1.0`. The changes here are simply
getting the project to be `django-tag-fields`, with all the necessary downstream changes
of renaming.

## 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
  `TAGS_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.
