New Upstream Snapshot - django-cleanup

Ready changes

Summary

Merged new upstream version: 6.0.0+git20220723.1.47e3fd8 (was: 5.2.0).

Resulting package

Built on 2023-01-22T08:41 (took 12m42s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots python3-django-cleanup

Lintian Result

Diff

diff --git a/CHANGELOG.md b/CHANGELOG.md
index bd64ac7..7d4fe2a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 ## [Unreleased]
+## [6.0.0] - 2022-01-24
+### Added
+- Update to run tests for python 3.10. PR [#88] from [@johnthagen](https://github.com/johnthagen).
+- GitHub Actions. Resolves issue [#89] for [@johnthagen](https://github.com/johnthagen).
+
+### Changed
+- Fix default_app_config deprecation. PR [#86] from [@nikolaik](https://github.com/nikolaik).
+
+### Removed
+- Dropped support for django 3.0 and 3.1.
+- Travis configuration.
 
 ## [5.2.0] - 2021-04-18
 ### Added
@@ -58,7 +69,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ## [0.1.4] - 2012-08-16
 ## [0.1.0] - 2012-08-14
 
-[Unreleased]: https://github.com/un1t/django-cleanup/compare/5.1.0...HEAD
+[Unreleased]: https://github.com/un1t/django-cleanup/compare/6.0.0...HEAD
+[6.0.0]: https://github.com/un1t/django-cleanup/compare/5.2.0...6.0.0
 [5.2.0]: https://github.com/un1t/django-cleanup/compare/5.1.0...5.2.0
 [5.1.0]: https://github.com/un1t/django-cleanup/compare/5.0.0...5.1.0
 [5.0.0]: https://github.com/un1t/django-cleanup/compare/4.0.1...5.0.0
@@ -92,6 +104,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 [0.1.4]: https://github.com/un1t/django-cleanup/compare/0.1.0...0.1.4
 [0.1.0]: https://github.com/un1t/django-cleanup/releases/tag/0.1.0
 
+[#89]: https://github.com/un1t/django-cleanup/issues/89
+[#88]: https://github.com/un1t/django-cleanup/pull/88
+[#86]: https://github.com/un1t/django-cleanup/pull/86
 [#81]: https://github.com/un1t/django-cleanup/pull/81
 [#80]: https://github.com/un1t/django-cleanup/pull/80
 [#76]: https://github.com/un1t/django-cleanup/pull/76
diff --git a/PKG-INFO b/PKG-INFO
index 7f158d8..fe04b53 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,212 +1,19 @@
 Metadata-Version: 2.1
 Name: django-cleanup
-Version: 5.2.0
+Version: 6.0.0
 Summary: Deletes old files.
 Home-page: https://github.com/un1t/django-cleanup
+Download-URL: https://github.com/un1t/django-cleanup/tarball/master
 Author: Ilya Shalyapin
 Author-email: ishalyapin@gmail.com
 License: MIT License
-Download-URL: https://github.com/un1t/django-cleanup/tarball/master
-Description: Django Cleanup
-        **************
-        |Version| |Status| |License|
-        
-        Features
-        ========
-        The django-cleanup app automatically deletes files for :code:`FileField`, :code:`ImageField` and
-        subclasses. When a :code:`FileField`'s value is changed and the model is saved, the old file is
-        deleted. When a model that has a :code:`FileField` is deleted, the file is also deleted. A file that
-        is set as the :code:`FileField`'s default value will not be deleted.
-        
-        Compatibility
-        -------------
-        - Django 2.2, 3.0, 3.1, 3.2 (`See Django Supported Versions <https://www.djangoproject.com/download/#supported-versions>`_)
-        - Python 3.5+
-        - Compatible with `sorl-thumbnail <https://github.com/jazzband/sorl-thumbnail>`_
-        - Compatible with `easy-thumbnail <https://github.com/SmileyChris/easy-thumbnails>`_
-        
-        How does it work?
-        =================
-        In order to track changes of a :code:`FileField` and facilitate file deletions, django-cleanup
-        connects :code:`post_init`, :code:`pre_save`, :code:`post_save` and :code:`post_delete` signals to
-        signal handlers for each :code:`INSTALLED_APPS` model that has a :code:`FileField`. In order to tell
-        whether or not a :code:`FileField`'s value has changed a local cache of original values is kept on
-        the model instance. If a condition is detected that should result in a file deletion, a function to
-        delete the file is setup and inserted into the commit phase of the current transaction.
-        
-        **Warning! If you are using a database that does not support transactions you may lose files if a
-        transaction will rollback at the right instance. This outcome is mitigated by our use of
-        post_save and post_delete signals, and by following the recommended configuration below. This
-        outcome will still occur if there are signals registered after app initialization and there are
-        exceptions when those signals are handled. In this case, the old file will be lost and the new file
-        will not be referenced in a model, though the new file will likely still exist on disk. If you are
-        concerned about this behavior you will need another solution for old file deletion in your project.**
-        
-        Installation
-        ============
-        ::
-        
-            pip install django-cleanup
-        
-        
-        Configuration
-        =============
-        Add ``django_cleanup`` to the bottom of ``INSTALLED_APPS`` in ``settings.py``
-        
-        .. code-block:: py
-        
-            INSTALLED_APPS = (
-                ...,
-                'django_cleanup.apps.CleanupConfig',
-            )
-        
-        That is all, no other configuration is necessary.
-        
-        Note: Order of ``INSTALLED_APPS`` is important. To ensure that exceptions inside other apps' signal
-        handlers do not affect the integrity of file deletions within transactions, ``django_cleanup``
-        should be placed last in ``INSTALLED_APPS``.
-        
-        Troubleshooting
-        ===============
-        If you notice that ``django-cleanup`` is not removing files when expected, check that your models
-        are being properly
-        `loaded <https://docs.djangoproject.com/en/stable/ref/applications/#how-applications-are-loaded>`_:
-        
-            You must define or import all models in your application's models.py or models/__init__.py.
-            Otherwise, the application registry may not be fully populated at this point, which could cause
-            the ORM to malfunction.
-        
-        If your models are not loaded, ``django-cleanup`` will not be able to discover their
-        ``FileField``'s.
-        
-        You can check if your ``Model`` is loaded by using
-        
-        .. code-block:: py
-        
-            from django.apps import apps
-            apps.get_models()
-        
-        Advanced
-        ========
-        This section contains additional functionality that can be used to interact with django-cleanup for
-        special cases.
-        
-        Signals
-        -------
-        To facilitate interactions with other django apps django-cleanup sends the following signals which
-        can be imported from :code:`django_cleanup.signals`:
-        
-        - :code:`cleanup_pre_delete`: just before a file is deleted. Passes a :code:`file` keyword argument.
-        - :code:`cleanup_post_delete`: just after a file is deleted. Passes a :code:`file` keyword argument.
-        
-        Signals example for sorl.thumbnail:
-        
-        .. code-block:: py
-        
-            from django_cleanup.signals import cleanup_pre_delete
-            from sorl.thumbnail import delete
-        
-            def sorl_delete(**kwargs):
-                delete(kwargs['file'])
-        
-            cleanup_pre_delete.connect(sorl_delete)
-        
-        Refresh the cache
-        -----------------
-        There have been rare cases where the cache would need to be refreshed. To do so the
-        :code:`django_cleanup.cleanup.refresh` method can be used:
-        
-        .. code-block:: py
-        
-            from django_cleanup import cleanup
-        
-            cleanup.refresh(model_instance)
-        
-        Ignore cleanup for a specific model
-        -----------------------------------
-        Ignore a model and do not perform cleanup when the model is deleted or its files change.
-        
-        .. code-block:: py
-        
-            from django_cleanup import cleanup
-        
-            @cleanup.ignore
-            class MyModel(models.Model):
-                image = models.FileField()
-        
-        How to run tests
-        ================
-        Install, setup and use pyenv_ to install all the required versions of cPython
-        (see the `tox.ini <https://github.com/un1t/django-cleanup/blob/master/tox.ini>`_).
-        
-        Setup pyenv_ to have all versions of python activated within your local django-cleanup repository.
-        Ensuring that the python 3.8 that was installed is first priority.
-        
-        Install tox_ on python 3.8 and run the :code:`tox` command from your local django-cleanup
-        repository.
-        
-        How to write tests
-        ==================
-        This app requires the use of django.test.TransactionTestCase_ when writing tests.
-        
-        For details on why this is required see `here
-        <https://docs.djangoproject.com/en/stable/topics/db/transactions/#use-in-tests>`_:
-        
-            Django's :code:`TestCase` class wraps each test in a transaction and rolls back that transaction
-            after each test, in order to provide test isolation. This means that no transaction is ever
-            actually committed, thus your :code:`on_commit()` callbacks will never be run. If you need to
-            test the results of an :code:`on_commit()` callback, use a :code:`TransactionTestCase` instead.
-        
-        License
-        =======
-        django-cleanup is free software under terms of the:
-        
-        MIT License
-        
-        Copyright (C) 2012 by Ilya Shalyapin, ishalyapin@gmail.com
-        
-        Permission is hereby granted, free of charge, to any person obtaining a copy
-        of this software and associated documentation files (the "Software"), to deal
-        in the Software without restriction, including without limitation the rights
-        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-        copies of the Software, and to permit persons to whom the Software is
-        furnished to do so, subject to the following conditions:
-        
-        The above copyright notice and this permission notice shall be included in all
-        copies or substantial portions of the Software.
-        
-        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-        SOFTWARE.
-        
-        
-        .. _django.test.TransactionTestCase: https://docs.djangoproject.com/en/stable/topics/testing/tools/#django.test.TransactionTestCase
-        .. _pyenv: https://github.com/pyenv/pyenv
-        .. _tox: https://tox.readthedocs.io/en/latest/
-        
-        .. |Version| image:: https://img.shields.io/pypi/v/django-cleanup.svg
-           :target: https://pypi.python.org/pypi/django-cleanup/
-           :alt: PyPI Package
-        .. |Status| image:: https://travis-ci.org/un1t/django-cleanup.svg?branch=master
-           :target: https://travis-ci.org/un1t/django-cleanup
-           :alt: Build Status
-        .. |License| image:: https://img.shields.io/badge/license-MIT-maroon
-           :target: https://github.com/un1t/django-cleanup/blob/master/LICENSE
-           :alt: MIT License
-        
 Keywords: django
-Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Web Environment
 Classifier: Framework :: Django
 Classifier: Framework :: Django :: 2.2
-Classifier: Framework :: Django :: 3.0
-Classifier: Framework :: Django :: 3.1
 Classifier: Framework :: Django :: 3.2
+Classifier: Framework :: Django :: 4.0
 Classifier: Intended Audience :: Developers
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Operating System :: OS Independent
@@ -217,9 +24,202 @@ Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Topic :: Utilities
 Requires: python (>=3.5)
 Requires: django (>=2.2)
 Description-Content-Type: text/x-rst
+License-File: LICENSE
+
+Django Cleanup
+**************
+|Version| |Status| |License|
+
+Features
+========
+The django-cleanup app automatically deletes files for :code:`FileField`, :code:`ImageField` and
+subclasses. When a :code:`FileField`'s value is changed and the model is saved, the old file is
+deleted. When a model that has a :code:`FileField` is deleted, the file is also deleted. A file that
+is set as the :code:`FileField`'s default value will not be deleted.
+
+Compatibility
+-------------
+- Django 2.2, 3.2, 4.0 (`See Django Supported Versions <https://www.djangoproject.com/download/#supported-versions>`_)
+- Python 3.5+
+- Compatible with `sorl-thumbnail <https://github.com/jazzband/sorl-thumbnail>`_
+- Compatible with `easy-thumbnail <https://github.com/SmileyChris/easy-thumbnails>`_
+
+How does it work?
+=================
+In order to track changes of a :code:`FileField` and facilitate file deletions, django-cleanup
+connects :code:`post_init`, :code:`pre_save`, :code:`post_save` and :code:`post_delete` signals to
+signal handlers for each :code:`INSTALLED_APPS` model that has a :code:`FileField`. In order to tell
+whether or not a :code:`FileField`'s value has changed a local cache of original values is kept on
+the model instance. If a condition is detected that should result in a file deletion, a function to
+delete the file is setup and inserted into the commit phase of the current transaction.
+
+**Warning! If you are using a database that does not support transactions you may lose files if a
+transaction will rollback at the right instance. This outcome is mitigated by our use of
+post_save and post_delete signals, and by following the recommended configuration below. This
+outcome will still occur if there are signals registered after app initialization and there are
+exceptions when those signals are handled. In this case, the old file will be lost and the new file
+will not be referenced in a model, though the new file will likely still exist on disk. If you are
+concerned about this behavior you will need another solution for old file deletion in your project.**
+
+Installation
+============
+::
+
+    pip install django-cleanup
+
+
+Configuration
+=============
+Add ``django_cleanup`` to the bottom of ``INSTALLED_APPS`` in ``settings.py``
+
+.. code-block:: py
+
+    INSTALLED_APPS = (
+        ...,
+        'django_cleanup.apps.CleanupConfig',
+    )
+
+That is all, no other configuration is necessary.
+
+Note: Order of ``INSTALLED_APPS`` is important. To ensure that exceptions inside other apps' signal
+handlers do not affect the integrity of file deletions within transactions, ``django_cleanup``
+should be placed last in ``INSTALLED_APPS``.
+
+Troubleshooting
+===============
+If you notice that ``django-cleanup`` is not removing files when expected, check that your models
+are being properly
+`loaded <https://docs.djangoproject.com/en/stable/ref/applications/#how-applications-are-loaded>`_:
+
+    You must define or import all models in your application's models.py or models/__init__.py.
+    Otherwise, the application registry may not be fully populated at this point, which could cause
+    the ORM to malfunction.
+
+If your models are not loaded, ``django-cleanup`` will not be able to discover their
+``FileField``'s.
+
+You can check if your ``Model`` is loaded by using
+
+.. code-block:: py
+
+    from django.apps import apps
+    apps.get_models()
+
+Advanced
+========
+This section contains additional functionality that can be used to interact with django-cleanup for
+special cases.
+
+Signals
+-------
+To facilitate interactions with other django apps django-cleanup sends the following signals which
+can be imported from :code:`django_cleanup.signals`:
+
+- :code:`cleanup_pre_delete`: just before a file is deleted. Passes a :code:`file` keyword argument.
+- :code:`cleanup_post_delete`: just after a file is deleted. Passes a :code:`file` keyword argument.
+
+Signals example for sorl.thumbnail:
+
+.. code-block:: py
+
+    from django_cleanup.signals import cleanup_pre_delete
+    from sorl.thumbnail import delete
+
+    def sorl_delete(**kwargs):
+        delete(kwargs['file'])
+
+    cleanup_pre_delete.connect(sorl_delete)
+
+Refresh the cache
+-----------------
+There have been rare cases where the cache would need to be refreshed. To do so the
+:code:`django_cleanup.cleanup.refresh` method can be used:
+
+.. code-block:: py
+
+    from django_cleanup import cleanup
+
+    cleanup.refresh(model_instance)
+
+Ignore cleanup for a specific model
+-----------------------------------
+Ignore a model and do not perform cleanup when the model is deleted or its files change.
+
+.. code-block:: py
+
+    from django_cleanup import cleanup
+
+    @cleanup.ignore
+    class MyModel(models.Model):
+        image = models.FileField()
+
+How to run tests
+================
+Install, setup and use pyenv_ to install all the required versions of cPython
+(see the `tox.ini <https://github.com/un1t/django-cleanup/blob/master/tox.ini>`_).
+
+Setup pyenv_ to have all versions of python activated within your local django-cleanup repository.
+Ensuring that the python 3.10 that was installed is first priority.
+
+Install tox_ on python 3.10 and run the :code:`tox` command from your local django-cleanup
+repository.
+
+How to write tests
+==================
+This app requires the use of django.test.TransactionTestCase_ when writing tests.
+
+For details on why this is required see `here
+<https://docs.djangoproject.com/en/stable/topics/db/transactions/#use-in-tests>`_:
+
+    Django's :code:`TestCase` class wraps each test in a transaction and rolls back that transaction
+    after each test, in order to provide test isolation. This means that no transaction is ever
+    actually committed, thus your :code:`on_commit()` callbacks will never be run. If you need to
+    test the results of an :code:`on_commit()` callback, use a :code:`TransactionTestCase` instead.
+
+License
+=======
+django-cleanup is free software under terms of the:
+
+MIT License
+
+Copyright (C) 2012 by Ilya Shalyapin, ishalyapin@gmail.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+.. _django.test.TransactionTestCase: https://docs.djangoproject.com/en/stable/topics/testing/tools/#django.test.TransactionTestCase
+.. _pyenv: https://github.com/pyenv/pyenv
+.. _tox: https://tox.readthedocs.io/en/latest/
+
+.. |Version| image:: https://img.shields.io/pypi/v/django-cleanup.svg
+   :target: https://pypi.python.org/pypi/django-cleanup/
+   :alt: PyPI Package
+.. |Status| image:: https://github.com/un1t/django-cleanup/actions/workflows/main.yml/badge.svg
+   :target: https://github.com/un1t/django-cleanup/actions/workflows/main.yml
+   :alt: Build Status
+.. |License| image:: https://img.shields.io/badge/license-MIT-maroon
+   :target: https://github.com/un1t/django-cleanup/blob/master/LICENSE
+   :alt: MIT License
diff --git a/README.rst b/README.rst
index 6314345..24ad841 100644
--- a/README.rst
+++ b/README.rst
@@ -11,7 +11,7 @@ is set as the :code:`FileField`'s default value will not be deleted.
 
 Compatibility
 -------------
-- Django 2.2, 3.0, 3.1, 3.2 (`See Django Supported Versions <https://www.djangoproject.com/download/#supported-versions>`_)
+- Django 2.2, 3.2, 4.0 (`See Django Supported Versions <https://www.djangoproject.com/download/#supported-versions>`_)
 - Python 3.5+
 - Compatible with `sorl-thumbnail <https://github.com/jazzband/sorl-thumbnail>`_
 - Compatible with `easy-thumbnail <https://github.com/SmileyChris/easy-thumbnails>`_
@@ -131,9 +131,9 @@ Install, setup and use pyenv_ to install all the required versions of cPython
 (see the `tox.ini <https://github.com/un1t/django-cleanup/blob/master/tox.ini>`_).
 
 Setup pyenv_ to have all versions of python activated within your local django-cleanup repository.
-Ensuring that the python 3.8 that was installed is first priority.
+Ensuring that the python 3.10 that was installed is first priority.
 
-Install tox_ on python 3.8 and run the :code:`tox` command from your local django-cleanup
+Install tox_ on python 3.10 and run the :code:`tox` command from your local django-cleanup
 repository.
 
 How to write tests
@@ -182,8 +182,8 @@ SOFTWARE.
 .. |Version| image:: https://img.shields.io/pypi/v/django-cleanup.svg
    :target: https://pypi.python.org/pypi/django-cleanup/
    :alt: PyPI Package
-.. |Status| image:: https://travis-ci.org/un1t/django-cleanup.svg?branch=master
-   :target: https://travis-ci.org/un1t/django-cleanup
+.. |Status| image:: https://github.com/un1t/django-cleanup/actions/workflows/main.yml/badge.svg
+   :target: https://github.com/un1t/django-cleanup/actions/workflows/main.yml
    :alt: Build Status
 .. |License| image:: https://img.shields.io/badge/license-MIT-maroon
    :target: https://github.com/un1t/django-cleanup/blob/master/LICENSE
diff --git a/debian/changelog b/debian/changelog
index 3f88bae..a3b1b63 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,9 @@
-django-cleanup (5.2.0-3) UNRELEASED; urgency=medium
+django-cleanup (6.0.0+git20220723.1.47e3fd8-1) UNRELEASED; urgency=medium
 
   * Update standards version to 4.6.1, no changes needed.
+  * New upstream snapshot.
 
- -- Debian Janitor <janitor@jelmer.uk>  Fri, 28 Oct 2022 06:54:45 -0000
+ -- Debian Janitor <janitor@jelmer.uk>  Sun, 22 Jan 2023 08:35:57 -0000
 
 django-cleanup (5.2.0-2) unstable; urgency=medium
 
diff --git a/django_cleanup.egg-info/PKG-INFO b/django_cleanup.egg-info/PKG-INFO
index 7f158d8..fe04b53 100644
--- a/django_cleanup.egg-info/PKG-INFO
+++ b/django_cleanup.egg-info/PKG-INFO
@@ -1,212 +1,19 @@
 Metadata-Version: 2.1
 Name: django-cleanup
-Version: 5.2.0
+Version: 6.0.0
 Summary: Deletes old files.
 Home-page: https://github.com/un1t/django-cleanup
+Download-URL: https://github.com/un1t/django-cleanup/tarball/master
 Author: Ilya Shalyapin
 Author-email: ishalyapin@gmail.com
 License: MIT License
-Download-URL: https://github.com/un1t/django-cleanup/tarball/master
-Description: Django Cleanup
-        **************
-        |Version| |Status| |License|
-        
-        Features
-        ========
-        The django-cleanup app automatically deletes files for :code:`FileField`, :code:`ImageField` and
-        subclasses. When a :code:`FileField`'s value is changed and the model is saved, the old file is
-        deleted. When a model that has a :code:`FileField` is deleted, the file is also deleted. A file that
-        is set as the :code:`FileField`'s default value will not be deleted.
-        
-        Compatibility
-        -------------
-        - Django 2.2, 3.0, 3.1, 3.2 (`See Django Supported Versions <https://www.djangoproject.com/download/#supported-versions>`_)
-        - Python 3.5+
-        - Compatible with `sorl-thumbnail <https://github.com/jazzband/sorl-thumbnail>`_
-        - Compatible with `easy-thumbnail <https://github.com/SmileyChris/easy-thumbnails>`_
-        
-        How does it work?
-        =================
-        In order to track changes of a :code:`FileField` and facilitate file deletions, django-cleanup
-        connects :code:`post_init`, :code:`pre_save`, :code:`post_save` and :code:`post_delete` signals to
-        signal handlers for each :code:`INSTALLED_APPS` model that has a :code:`FileField`. In order to tell
-        whether or not a :code:`FileField`'s value has changed a local cache of original values is kept on
-        the model instance. If a condition is detected that should result in a file deletion, a function to
-        delete the file is setup and inserted into the commit phase of the current transaction.
-        
-        **Warning! If you are using a database that does not support transactions you may lose files if a
-        transaction will rollback at the right instance. This outcome is mitigated by our use of
-        post_save and post_delete signals, and by following the recommended configuration below. This
-        outcome will still occur if there are signals registered after app initialization and there are
-        exceptions when those signals are handled. In this case, the old file will be lost and the new file
-        will not be referenced in a model, though the new file will likely still exist on disk. If you are
-        concerned about this behavior you will need another solution for old file deletion in your project.**
-        
-        Installation
-        ============
-        ::
-        
-            pip install django-cleanup
-        
-        
-        Configuration
-        =============
-        Add ``django_cleanup`` to the bottom of ``INSTALLED_APPS`` in ``settings.py``
-        
-        .. code-block:: py
-        
-            INSTALLED_APPS = (
-                ...,
-                'django_cleanup.apps.CleanupConfig',
-            )
-        
-        That is all, no other configuration is necessary.
-        
-        Note: Order of ``INSTALLED_APPS`` is important. To ensure that exceptions inside other apps' signal
-        handlers do not affect the integrity of file deletions within transactions, ``django_cleanup``
-        should be placed last in ``INSTALLED_APPS``.
-        
-        Troubleshooting
-        ===============
-        If you notice that ``django-cleanup`` is not removing files when expected, check that your models
-        are being properly
-        `loaded <https://docs.djangoproject.com/en/stable/ref/applications/#how-applications-are-loaded>`_:
-        
-            You must define or import all models in your application's models.py or models/__init__.py.
-            Otherwise, the application registry may not be fully populated at this point, which could cause
-            the ORM to malfunction.
-        
-        If your models are not loaded, ``django-cleanup`` will not be able to discover their
-        ``FileField``'s.
-        
-        You can check if your ``Model`` is loaded by using
-        
-        .. code-block:: py
-        
-            from django.apps import apps
-            apps.get_models()
-        
-        Advanced
-        ========
-        This section contains additional functionality that can be used to interact with django-cleanup for
-        special cases.
-        
-        Signals
-        -------
-        To facilitate interactions with other django apps django-cleanup sends the following signals which
-        can be imported from :code:`django_cleanup.signals`:
-        
-        - :code:`cleanup_pre_delete`: just before a file is deleted. Passes a :code:`file` keyword argument.
-        - :code:`cleanup_post_delete`: just after a file is deleted. Passes a :code:`file` keyword argument.
-        
-        Signals example for sorl.thumbnail:
-        
-        .. code-block:: py
-        
-            from django_cleanup.signals import cleanup_pre_delete
-            from sorl.thumbnail import delete
-        
-            def sorl_delete(**kwargs):
-                delete(kwargs['file'])
-        
-            cleanup_pre_delete.connect(sorl_delete)
-        
-        Refresh the cache
-        -----------------
-        There have been rare cases where the cache would need to be refreshed. To do so the
-        :code:`django_cleanup.cleanup.refresh` method can be used:
-        
-        .. code-block:: py
-        
-            from django_cleanup import cleanup
-        
-            cleanup.refresh(model_instance)
-        
-        Ignore cleanup for a specific model
-        -----------------------------------
-        Ignore a model and do not perform cleanup when the model is deleted or its files change.
-        
-        .. code-block:: py
-        
-            from django_cleanup import cleanup
-        
-            @cleanup.ignore
-            class MyModel(models.Model):
-                image = models.FileField()
-        
-        How to run tests
-        ================
-        Install, setup and use pyenv_ to install all the required versions of cPython
-        (see the `tox.ini <https://github.com/un1t/django-cleanup/blob/master/tox.ini>`_).
-        
-        Setup pyenv_ to have all versions of python activated within your local django-cleanup repository.
-        Ensuring that the python 3.8 that was installed is first priority.
-        
-        Install tox_ on python 3.8 and run the :code:`tox` command from your local django-cleanup
-        repository.
-        
-        How to write tests
-        ==================
-        This app requires the use of django.test.TransactionTestCase_ when writing tests.
-        
-        For details on why this is required see `here
-        <https://docs.djangoproject.com/en/stable/topics/db/transactions/#use-in-tests>`_:
-        
-            Django's :code:`TestCase` class wraps each test in a transaction and rolls back that transaction
-            after each test, in order to provide test isolation. This means that no transaction is ever
-            actually committed, thus your :code:`on_commit()` callbacks will never be run. If you need to
-            test the results of an :code:`on_commit()` callback, use a :code:`TransactionTestCase` instead.
-        
-        License
-        =======
-        django-cleanup is free software under terms of the:
-        
-        MIT License
-        
-        Copyright (C) 2012 by Ilya Shalyapin, ishalyapin@gmail.com
-        
-        Permission is hereby granted, free of charge, to any person obtaining a copy
-        of this software and associated documentation files (the "Software"), to deal
-        in the Software without restriction, including without limitation the rights
-        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-        copies of the Software, and to permit persons to whom the Software is
-        furnished to do so, subject to the following conditions:
-        
-        The above copyright notice and this permission notice shall be included in all
-        copies or substantial portions of the Software.
-        
-        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-        SOFTWARE.
-        
-        
-        .. _django.test.TransactionTestCase: https://docs.djangoproject.com/en/stable/topics/testing/tools/#django.test.TransactionTestCase
-        .. _pyenv: https://github.com/pyenv/pyenv
-        .. _tox: https://tox.readthedocs.io/en/latest/
-        
-        .. |Version| image:: https://img.shields.io/pypi/v/django-cleanup.svg
-           :target: https://pypi.python.org/pypi/django-cleanup/
-           :alt: PyPI Package
-        .. |Status| image:: https://travis-ci.org/un1t/django-cleanup.svg?branch=master
-           :target: https://travis-ci.org/un1t/django-cleanup
-           :alt: Build Status
-        .. |License| image:: https://img.shields.io/badge/license-MIT-maroon
-           :target: https://github.com/un1t/django-cleanup/blob/master/LICENSE
-           :alt: MIT License
-        
 Keywords: django
-Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Web Environment
 Classifier: Framework :: Django
 Classifier: Framework :: Django :: 2.2
-Classifier: Framework :: Django :: 3.0
-Classifier: Framework :: Django :: 3.1
 Classifier: Framework :: Django :: 3.2
+Classifier: Framework :: Django :: 4.0
 Classifier: Intended Audience :: Developers
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Operating System :: OS Independent
@@ -217,9 +24,202 @@ Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Topic :: Utilities
 Requires: python (>=3.5)
 Requires: django (>=2.2)
 Description-Content-Type: text/x-rst
+License-File: LICENSE
+
+Django Cleanup
+**************
+|Version| |Status| |License|
+
+Features
+========
+The django-cleanup app automatically deletes files for :code:`FileField`, :code:`ImageField` and
+subclasses. When a :code:`FileField`'s value is changed and the model is saved, the old file is
+deleted. When a model that has a :code:`FileField` is deleted, the file is also deleted. A file that
+is set as the :code:`FileField`'s default value will not be deleted.
+
+Compatibility
+-------------
+- Django 2.2, 3.2, 4.0 (`See Django Supported Versions <https://www.djangoproject.com/download/#supported-versions>`_)
+- Python 3.5+
+- Compatible with `sorl-thumbnail <https://github.com/jazzband/sorl-thumbnail>`_
+- Compatible with `easy-thumbnail <https://github.com/SmileyChris/easy-thumbnails>`_
+
+How does it work?
+=================
+In order to track changes of a :code:`FileField` and facilitate file deletions, django-cleanup
+connects :code:`post_init`, :code:`pre_save`, :code:`post_save` and :code:`post_delete` signals to
+signal handlers for each :code:`INSTALLED_APPS` model that has a :code:`FileField`. In order to tell
+whether or not a :code:`FileField`'s value has changed a local cache of original values is kept on
+the model instance. If a condition is detected that should result in a file deletion, a function to
+delete the file is setup and inserted into the commit phase of the current transaction.
+
+**Warning! If you are using a database that does not support transactions you may lose files if a
+transaction will rollback at the right instance. This outcome is mitigated by our use of
+post_save and post_delete signals, and by following the recommended configuration below. This
+outcome will still occur if there are signals registered after app initialization and there are
+exceptions when those signals are handled. In this case, the old file will be lost and the new file
+will not be referenced in a model, though the new file will likely still exist on disk. If you are
+concerned about this behavior you will need another solution for old file deletion in your project.**
+
+Installation
+============
+::
+
+    pip install django-cleanup
+
+
+Configuration
+=============
+Add ``django_cleanup`` to the bottom of ``INSTALLED_APPS`` in ``settings.py``
+
+.. code-block:: py
+
+    INSTALLED_APPS = (
+        ...,
+        'django_cleanup.apps.CleanupConfig',
+    )
+
+That is all, no other configuration is necessary.
+
+Note: Order of ``INSTALLED_APPS`` is important. To ensure that exceptions inside other apps' signal
+handlers do not affect the integrity of file deletions within transactions, ``django_cleanup``
+should be placed last in ``INSTALLED_APPS``.
+
+Troubleshooting
+===============
+If you notice that ``django-cleanup`` is not removing files when expected, check that your models
+are being properly
+`loaded <https://docs.djangoproject.com/en/stable/ref/applications/#how-applications-are-loaded>`_:
+
+    You must define or import all models in your application's models.py or models/__init__.py.
+    Otherwise, the application registry may not be fully populated at this point, which could cause
+    the ORM to malfunction.
+
+If your models are not loaded, ``django-cleanup`` will not be able to discover their
+``FileField``'s.
+
+You can check if your ``Model`` is loaded by using
+
+.. code-block:: py
+
+    from django.apps import apps
+    apps.get_models()
+
+Advanced
+========
+This section contains additional functionality that can be used to interact with django-cleanup for
+special cases.
+
+Signals
+-------
+To facilitate interactions with other django apps django-cleanup sends the following signals which
+can be imported from :code:`django_cleanup.signals`:
+
+- :code:`cleanup_pre_delete`: just before a file is deleted. Passes a :code:`file` keyword argument.
+- :code:`cleanup_post_delete`: just after a file is deleted. Passes a :code:`file` keyword argument.
+
+Signals example for sorl.thumbnail:
+
+.. code-block:: py
+
+    from django_cleanup.signals import cleanup_pre_delete
+    from sorl.thumbnail import delete
+
+    def sorl_delete(**kwargs):
+        delete(kwargs['file'])
+
+    cleanup_pre_delete.connect(sorl_delete)
+
+Refresh the cache
+-----------------
+There have been rare cases where the cache would need to be refreshed. To do so the
+:code:`django_cleanup.cleanup.refresh` method can be used:
+
+.. code-block:: py
+
+    from django_cleanup import cleanup
+
+    cleanup.refresh(model_instance)
+
+Ignore cleanup for a specific model
+-----------------------------------
+Ignore a model and do not perform cleanup when the model is deleted or its files change.
+
+.. code-block:: py
+
+    from django_cleanup import cleanup
+
+    @cleanup.ignore
+    class MyModel(models.Model):
+        image = models.FileField()
+
+How to run tests
+================
+Install, setup and use pyenv_ to install all the required versions of cPython
+(see the `tox.ini <https://github.com/un1t/django-cleanup/blob/master/tox.ini>`_).
+
+Setup pyenv_ to have all versions of python activated within your local django-cleanup repository.
+Ensuring that the python 3.10 that was installed is first priority.
+
+Install tox_ on python 3.10 and run the :code:`tox` command from your local django-cleanup
+repository.
+
+How to write tests
+==================
+This app requires the use of django.test.TransactionTestCase_ when writing tests.
+
+For details on why this is required see `here
+<https://docs.djangoproject.com/en/stable/topics/db/transactions/#use-in-tests>`_:
+
+    Django's :code:`TestCase` class wraps each test in a transaction and rolls back that transaction
+    after each test, in order to provide test isolation. This means that no transaction is ever
+    actually committed, thus your :code:`on_commit()` callbacks will never be run. If you need to
+    test the results of an :code:`on_commit()` callback, use a :code:`TransactionTestCase` instead.
+
+License
+=======
+django-cleanup is free software under terms of the:
+
+MIT License
+
+Copyright (C) 2012 by Ilya Shalyapin, ishalyapin@gmail.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+.. _django.test.TransactionTestCase: https://docs.djangoproject.com/en/stable/topics/testing/tools/#django.test.TransactionTestCase
+.. _pyenv: https://github.com/pyenv/pyenv
+.. _tox: https://tox.readthedocs.io/en/latest/
+
+.. |Version| image:: https://img.shields.io/pypi/v/django-cleanup.svg
+   :target: https://pypi.python.org/pypi/django-cleanup/
+   :alt: PyPI Package
+.. |Status| image:: https://github.com/un1t/django-cleanup/actions/workflows/main.yml/badge.svg
+   :target: https://github.com/un1t/django-cleanup/actions/workflows/main.yml
+   :alt: Build Status
+.. |License| image:: https://img.shields.io/badge/license-MIT-maroon
+   :target: https://github.com/un1t/django-cleanup/blob/master/LICENSE
+   :alt: MIT License
diff --git a/django_cleanup/__init__.py b/django_cleanup/__init__.py
index ee849fa..bc9786d 100644
--- a/django_cleanup/__init__.py
+++ b/django_cleanup/__init__.py
@@ -3,5 +3,8 @@
     subclasses. It will delete old files when a new file is being save and it
     will delete files on model instance deletion.
 '''
-__version__ = '5.2.0'
-default_app_config = 'django_cleanup.apps.CleanupConfig'
+import django
+
+__version__ = '6.0.0'
+if django.VERSION < (3, 2):
+    default_app_config = 'django_cleanup.apps.CleanupConfig'
diff --git a/setup.py b/setup.py
index c902f20..1590e0c 100644
--- a/setup.py
+++ b/setup.py
@@ -47,9 +47,8 @@ setup(
         'Environment :: Web Environment',
         'Framework :: Django',
         'Framework :: Django :: 2.2',
-        'Framework :: Django :: 3.0',
-        'Framework :: Django :: 3.1',
         'Framework :: Django :: 3.2',
+        'Framework :: Django :: 4.0',
         'Intended Audience :: Developers',
         'License :: OSI Approved :: MIT License',
         'Operating System :: OS Independent',
@@ -60,6 +59,7 @@ setup(
         'Programming Language :: Python :: 3.7',
         'Programming Language :: Python :: 3.8',
         'Programming Language :: Python :: 3.9',
+        'Programming Language :: Python :: 3.10',
         'Programming Language :: Python :: Implementation :: CPython',
         'Programming Language :: Python :: Implementation :: PyPy',
         'Topic :: Utilities',

More details

Full run details