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',