diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 2392720..28d03a1 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,10 +1,12 @@ Changelog ========= -Unreleased +django-fsm-2 4.1.0 unreleased ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- Add support for Django 6.0 - Add support for Django 5.2 +- Add support for python 3.14 - Add support for python 3.13 diff --git a/django_fsm/__init__.py b/django_fsm/__init__.py index 77c3234..117a147 100644 --- a/django_fsm/__init__.py +++ b/django_fsm/__init__.py @@ -8,6 +8,7 @@ from functools import partialmethod from functools import wraps +from django import VERSION as DJANGO_VERSION from django.apps import apps as django_apps from django.db import models from django.db.models import Field @@ -479,7 +480,7 @@ def __init__(self, *args, **kwargs): def state_fields(self): return filter(lambda field: isinstance(field, FSMFieldMixin), self._meta.fields) - def _do_update(self, base_qs, using, pk_val, values, update_fields, forced_update): + def _do_update(self, base_qs, using, pk_val, values, update_fields, forced_update, returning_fields=None): # _do_update is called once for each model class in the inheritance hierarchy. # We can only filter the base_qs on state fields (can be more than one!) present in this particular model. @@ -489,14 +490,26 @@ def _do_update(self, base_qs, using, pk_val, values, update_fields, forced_updat # state filter will be used to narrow down the standard filter checking only PK state_filter = {field.attname: self.__initial_states[field.attname] for field in filter_on} - updated = super()._do_update( - base_qs=base_qs.filter(**state_filter), - using=using, - pk_val=pk_val, - values=values, - update_fields=update_fields, - forced_update=forced_update, - ) + # Django 6.0+ added returning_fields parameter to _do_update + if DJANGO_VERSION >= (6, 0): + updated = super()._do_update( + base_qs=base_qs.filter(**state_filter), + using=using, + pk_val=pk_val, + values=values, + update_fields=update_fields, + forced_update=forced_update, + returning_fields=returning_fields, + ) + else: + updated = super()._do_update( + base_qs=base_qs.filter(**state_filter), + using=using, + pk_val=pk_val, + values=values, + update_fields=update_fields, + forced_update=forced_update, + ) # It may happen that nothing was updated in the original _do_update method not because of unmatching state, # but because of missing PK. This codepath is possible when saving a new model instance with *preset PK*. diff --git a/pyproject.toml b/pyproject.toml index 017f147..6011a3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ classifiers = [ "Framework :: Django :: 5.0", "Framework :: Django :: 5.1", "Framework :: Django :: 5.2", + "Framework :: Django :: 6.0", 'Programming Language :: Python', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.8', @@ -29,6 +30,7 @@ classifiers = [ 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3.13', + 'Programming Language :: Python :: 3.14', 'Topic :: Software Development :: Libraries :: Python Modules', ] packages = [{ include = "django_fsm" }] diff --git a/tox.ini b/tox.ini index 709c2ec..2660218 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,8 @@ envlist = py{310,311,312}-dj50 py{310,311,312}-dj51 py{310,311,312,313,314}-dj52 - # py{312,313,314}-djmain + py{312,313,314}-dj60 + py{312,313,314}-djmain skipsdist = True @@ -14,6 +15,7 @@ deps = dj50: Django==5.0 dj51: Django==5.1 dj52: Django==5.2 + dj60: Django>=6.0a1,<6.1 djmain: https://github.com/django/django/tarball/main django-guardian