From 6f636a9f0bae5cc377dcd8b0b58220500a2a19f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Apr 2022 21:06:47 +0000 Subject: [PATCH 01/39] Bump actions/upload-artifact from 2 to 3 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c6569c7..3cdbc39 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,7 +57,7 @@ jobs: - uses: actions/checkout@v3 - run: python setup.py sdist bdist_wheel - run: python -m twine check dist/* - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: path: dist/* From c2aa355b7a0af30a0715062e12adb204a99119e1 Mon Sep 17 00:00:00 2001 From: J Harley <502818+julzhk@users.noreply.github.com> Date: Tue, 26 Apr 2022 15:51:21 -0300 Subject: [PATCH 02/39] minor type in readme Otherwise: spelling --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cc70313..2144030 100644 --- a/README.md +++ b/README.md @@ -191,5 +191,5 @@ python manage.py rendervariations 'app_name.model_name.field_name' [--replace] [ ``` The `replace` option will replace all existing files. The `ignore-missing` option will suspend missing source file errors and keep -rendering variations for other files. Othervise command will stop on first +rendering variations for other files. Otherwise command will stop on first missing file. From 39e2306f29863ab6cb22cb264d606afc8127cc88 Mon Sep 17 00:00:00 2001 From: J Harley <502818+julzhk@users.noreply.github.com> Date: Wed, 27 Apr 2022 10:58:09 -0300 Subject: [PATCH 03/39] Update Readme.md More extensive edit for clarity and readability --- README.md | 86 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 2144030..b006efc 100644 --- a/README.md +++ b/README.md @@ -4,19 +4,29 @@ # Django Standardized Image Field -Django Field that implement the following features: +## Why would I want this? -* Django-Storages compatible (S3) -* Resize images to different sizes +This is a drop-in replacement for the [Django ImageField](https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.ImageField) that provides a standardized way to handle image uploads. +It is designed to be as easy to use as possible, and to provide a consistent interface for all image fields. +It allows images to be presented in various size variants (eg:thumbnails, mid, and hi-res versions) +and it provides a way to handle images that are too large with validators. + + +## Features + +Django Standardized Image Field implements the following features: + +* [Django-Storages](https://django-storages.readthedocs.io/en/latest/) compatible (eg: S3, Azure, Google Cloud Storage, etc) +* Resizes images to different sizes * Access thumbnails on model level, no template tags required -* Preserves original image -* Asynchronous rendering (Celery & Co) -* Restrict accepted image dimensions -* Rename files to a standardized name (using a callable upload_to) +* Preserves original images +* Can be rendered asynchronously (ie as a [Celery job](https://realpython.com/asynchronous-tasks-with-django-and-celery/)) +* Restricts acceptable image dimensions +* Renames file to a standardized name format (using a callable `upload_to` function, see below) ## Installation -Simply install the latest stable package using the command +Simply install the latest stable package using the following command ```bash pip install django-stdimage @@ -28,11 +38,13 @@ and add `'stdimage'` to `INSTALLED_APP`s in your settings.py, that's it! ## Usage +Now it's instally you can use either: `StdImageField` or `JPEGField`. + `StdImageField` works just like Django's own [ImageField](https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield) -except that you can specify different sized variations. +except that you can specify different size variations. -The `JPEGField` works similar to the `StdImageField` but all size variations are +The `JPEGField` is the same as the `StdImageField` but all images are converted to JPEGs, no matter what type the original file is. ### Variations @@ -58,7 +70,7 @@ class MyModel(models.Model): # is the same as dictionary-style call image = StdImageField(upload_to='path/to/img', variations={'thumbnail': (100, 75)}) - # variations are converted to JPEGs + # JPEGField variations are converted to JPEGs. jpeg = JPEGField( upload_to='path/to/img', variations={'full': (None, None), 'thumbnail': (100, 75)}, @@ -77,7 +89,7 @@ class MyModel(models.Model): }, delete_orphans=True) ``` -For using generated variations in templates use `myimagefield.variation_name`. +To use these variations in templates use `myimagefield.variation_name`. Example: @@ -85,15 +97,32 @@ Example: ``` -### Utils +### Upload to function + +You can use a function for the `upload_to` argument. Using [Django Dynamic Filenames][dynamic_filenames].[dynamic_filenames]: https://github.com/codingjoe/django-dynamic-filenames -Since version 4 the custom `upload_to` utils have been dropped in favor of -[Django Dynamic Filenames][dynamic_filenames]. +This allows images to be given unique paths and filenames based on the model instance. -[dynamic_filenames]: https://github.com/codingjoe/django-dynamic-filenames +Example + +```python +from django.db import models +from stdimage import StdImageField +from dynamic_filenames import FilePattern + +upload_to_pattern = FilePattern( + filename_pattern='my_model/{app_label:.25}/{model_name:.30}/{uuid:base32}{ext}', +) + + +class MyModel(models.Model): + # works just like django's ImageField + image = StdImageField(upload_to=upload_to_pattern) +``` ### Validators -The `StdImageField` doesn't implement any size validation. Validation can be specified using the validator attribute +The `StdImageField` doesn't implement any size validation out-of-the-box. +However, Validation can be specified using the validator attribute and using a set of validators shipped with this package. Validators can be used for both Forms and Models. @@ -120,9 +149,9 @@ Django [dropped support](https://docs.djangoproject.com/en/dev/releases/1.3/#del for automated deletions in version 1.3. Since version 5, this package supports a `delete_orphans` argument. It will delete -orphaned files, should a file be delete or replaced via Django form or and object with -a `StdImageField` be deleted. It will not be deleted if the field value is changed or -reassigned programatically. In those rare cases, you will need to handle proper deletion +orphaned files, should a file be deleted or replaced via a Django form and the object with +the `StdImageField` be deleted. It will not delete files if the field value is changed or +reassigned programatically. In these rare cases, you will need to handle proper deletion yourself. ```python @@ -141,10 +170,10 @@ class MyModel(models.Model): ### Async image processing Tools like celery allow to execute time-consuming tasks outside of the request. If you don't want -to wait for your variations to be rendered in request, StdImage provides your the option to pass a -async keyword and a util. -Note that the callback is not transaction save, but the file will be there. -This example is based on celery. +to wait for your variations to be rendered in request, StdImage provides you the option to pass an +async keyword and a 'render_variations' function that triggers the async task. +Note that the callback is not transaction save, but the file variations will be present. +The example below is based on celery. `tasks.py`: ```python @@ -177,19 +206,18 @@ def image_processor(file_name, variations, storage): class AsyncImageModel(models.Model): image = StdImageField( # above task definition can only handle one model object per image filename - upload_to='path/to/file/', + upload_to='path/to/file/', # or use a function render_variations=image_processor # pass boolean or callable ) processed = models.BooleanField(default=False) # flag that could be used for view querysets ``` ### Re-rendering variations -You might want to add new variations to a field. That means you need to render new variations for missing fields. +You might have added or changed variations to an existing field. That means you will need to render new variations. This can be accomplished using a management command. ```bash python manage.py rendervariations 'app_name.model_name.field_name' [--replace] [-i/--ignore-missing] ``` The `replace` option will replace all existing files. -The `ignore-missing` option will suspend missing source file errors and keep -rendering variations for other files. Otherwise command will stop on first -missing file. +The `ignore-missing` option will suspend 'missing source file' errors and keep +rendering variations for other files. Otherwise, the command will stop on first missing file. From bec1c82fde5958eba0743c6733ade5fafaacb0bc Mon Sep 17 00:00:00 2001 From: J Harley <502818+julzhk@users.noreply.github.com> Date: Tue, 3 May 2022 09:08:34 -0300 Subject: [PATCH 04/39] Update README.md Co-authored-by: Johannes Maron --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b006efc..e1d3f63 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Django Standardized Image Field implements the following features: * Preserves original images * Can be rendered asynchronously (ie as a [Celery job](https://realpython.com/asynchronous-tasks-with-django-and-celery/)) * Restricts acceptable image dimensions -* Renames file to a standardized name format (using a callable `upload_to` function, see below) +* Renames a file to a standardized name format (using a callable `upload_to` function, see below) ## Installation From bed5fed42062d14a43c55c1335cbbf3d3f05ed49 Mon Sep 17 00:00:00 2001 From: J Harley <502818+julzhk@users.noreply.github.com> Date: Tue, 3 May 2022 09:08:48 -0300 Subject: [PATCH 05/39] Update README.md Co-authored-by: Johannes Maron --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e1d3f63..cac50c5 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Django Standardized Image Field implements the following features: ## Installation -Simply install the latest stable package using the following command +Simply install the latest stable package using the following command: ```bash pip install django-stdimage From f6d953b0cd480a037964b259d379e8d1b2ab9b88 Mon Sep 17 00:00:00 2001 From: J Harley <502818+julzhk@users.noreply.github.com> Date: Tue, 3 May 2022 09:09:14 -0300 Subject: [PATCH 06/39] Update README.md Co-authored-by: Johannes Maron --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cac50c5..c602c24 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Now it's instally you can use either: `StdImageField` or `JPEGField`. [ImageField](https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield) except that you can specify different size variations. -The `JPEGField` is the same as the `StdImageField` but all images are +The `JPEGField` is identical to the `StdImageField` but all images are converted to JPEGs, no matter what type the original file is. ### Variations From 7db39615f709dccf839f90503b2baa76cbd48896 Mon Sep 17 00:00:00 2001 From: Johannes Maron Date: Sat, 21 May 2022 11:53:17 +0200 Subject: [PATCH 07/39] Update CI pipline (#288) --- .github/workflows/ci.yml | 27 ++++++++++++--------------- .github/workflows/release.yml | 10 ++++++---- setup.cfg | 16 +++++++--------- 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3cdbc39..3070c08 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,16 +46,14 @@ jobs: - run: python -m pip install -r lint-requirements.txt - run: ${{ matrix.lint-command }} - dist: runs-on: ubuntu-latest steps: - - name: Install gettext - run: sudo apt install gettext -y - - uses: actions/setup-python@v3 - - run: python -m pip install --upgrade pip setuptools wheel twine readme-renderer - uses: actions/checkout@v3 - - run: python setup.py sdist bdist_wheel + - uses: actions/setup-python@v3 + - run: sudo apt install gettext -y + - run: python -m pip install --upgrade pip build wheel twine readme-renderer + - run: python -m build --sdist --wheel - run: python -m twine check dist/* - uses: actions/upload-artifact@v3 with: @@ -73,11 +71,11 @@ jobs: - "3.9" - "3.10" django-version: - - "3.2a" - - "4.0a" + - "3.2" + - "4.0" extra: - - "" - - "progressbar" + - "test" + - "test,progressbar" steps: - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v3 @@ -85,10 +83,9 @@ jobs: python-version: ${{ matrix.python-version }} - run: sudo apt install gettext -y - uses: actions/checkout@v3 - - run: python -m pip install --upgrade pip setuptools codecov wheel - - run: python -m pip install .[${{ matrix.extra }}] + - run: python -m pip install --upgrade pip codecov + - run: python -m pip install -e .[${{ matrix.extra }}] if: ${{ matrix.extra }} - - run: python -m pip install django~=${{ matrix.django-version }} - - name: Test with pytest - run: python setup.py test + - run: python -m pip install django~=${{ matrix.django-version }}a + - run: python -m pytest - run: codecov diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ff70343..19f0b4e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,10 +1,12 @@ -name: PyPi Release +name: Release -on: [release] +on: + release: + types: [published] jobs: - build: + PyPi: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -14,5 +16,5 @@ jobs: - run: python -m build --sdist --wheel - run: python -m twine upload dist/* env: - TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }} + TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} diff --git a/setup.cfg b/setup.cfg index 10e8e2b..e6adaf7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -38,11 +38,6 @@ install_requires = setup_requires = setuptools_scm - pytest-runner -tests_require = - pytest - pytest-cov - pytest-django [options.package_data] * = *.txt, *.rst, *.html, *.po @@ -52,20 +47,23 @@ exclude = tests [options.extras_require] +test = + pytest + pytest-cov + pytest-django progressbar = progressbar2>=3.0.0 [bdist_wheel] universal = 1 -[aliases] -test = pytest - [tool:pytest] +testpaths = + tests norecursedirs=venv env .eggs DJANGO_SETTINGS_MODULE=tests.settings addopts = --cov=stdimage --nomigrations --tb=short filterwarnings = - error + ignore:DeprecationWarning [coverage:run] source = . From 62dbd15f1e1e6b07199fbe2be552a81d73053842 Mon Sep 17 00:00:00 2001 From: Johannes Maron Date: Sat, 21 May 2022 11:55:00 +0200 Subject: [PATCH 08/39] Fix Pillow ANTIALIAS deprecation warning --- setup.cfg | 2 +- stdimage/models.py | 3 ++- tests/test_utils.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/setup.cfg b/setup.cfg index e6adaf7..d93790f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -63,7 +63,7 @@ norecursedirs=venv env .eggs DJANGO_SETTINGS_MODULE=tests.settings addopts = --cov=stdimage --nomigrations --tb=short filterwarnings = - ignore:DeprecationWarning + error [coverage:run] source = . diff --git a/stdimage/models.py b/stdimage/models.py index 97ff514..ff13cff 100644 --- a/stdimage/models.py +++ b/stdimage/models.py @@ -11,6 +11,7 @@ ImageFileDescriptor, ) from PIL import Image, ImageFile, ImageOps +from PIL.Image import Resampling from .validators import MinSizeValidator @@ -186,7 +187,7 @@ class StdImageField(ImageField): "width": None, "height": None, "crop": False, - "resample": Image.ANTIALIAS, + "resample": Resampling.LANCZOS, } def __init__( diff --git a/tests/test_utils.py b/tests/test_utils.py index 2ab2c68..7180204 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,7 +1,7 @@ import os import pytest -from PIL import Image +from PIL.Image import Resampling from stdimage.utils import render_variations from tests.models import ManualVariationsModel @@ -24,7 +24,7 @@ def test_render_variations(self, image_upload_file): "width": 150, "height": 150, "crop": True, - "resample": Image.ANTIALIAS, + "resample": Resampling.LANCZOS, } }, ) From c8c389f7a9b9b4bcb0521e9ec68a3893826c672b Mon Sep 17 00:00:00 2001 From: Johannes Maron Date: Sat, 21 May 2022 11:48:02 +0200 Subject: [PATCH 09/39] Add migrations to enable a smooth transition to django-pictures We to migrate from django-stimage to pictures, we need to include variations into the migration model state. This allows deleting obsolite files during the migration. --- stdimage/models.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/stdimage/models.py b/stdimage/models.py index ff13cff..528bc4c 100644 --- a/stdimage/models.py +++ b/stdimage/models.py @@ -307,6 +307,19 @@ def save_form_data(self, instance, data): file.delete(save=False) super().save_form_data(instance, data) + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + return ( + name, + path, + args, + { + **kwargs, + "variations": self._variations, + "force_min_size": self.force_min_size, + }, + ) + class JPEGFieldFile(StdImageFieldFile): @classmethod From 0730fccdb5223e93b225e112dbaada05c3ce8097 Mon Sep 17 00:00:00 2001 From: Johannes Maron Date: Sat, 21 May 2022 12:02:46 +0200 Subject: [PATCH 10/39] Set developent status classifiert to inactive --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index d93790f..54c817c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -9,7 +9,7 @@ url = https://github.com/codingjoe/django-stdimage license = MIT license_file = LICENSE classifier = - Development Status :: 5 - Production/Stable + Development Status :: 7 - Inactive Environment :: Web Environment Framework :: Django Topic :: Multimedia :: Graphics :: Graphics Conversion From 0c5b5e58e966e125d5c35d8fb2199983a94cdc10 Mon Sep 17 00:00:00 2001 From: Johannes Maron Date: Sat, 21 May 2022 12:23:40 +0200 Subject: [PATCH 11/39] Add deprecation warning and migration notes. --- README.md | 85 ++++++++++++++++++++++++++++++++++++++++++++-- setup.cfg | 2 +- stdimage/models.py | 9 +++++ 3 files changed, 93 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c602c24..77fe5f6 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,92 @@ # Django Standardized Image Field +This package has been deprecated in favor of [django-pictures][django-pictures]. + +## Migration Instructions + +First, make sure you understand the differences between the two packages and +how to serve images in a modern web application via the [picture][picture-tag]-Element. + +Next, follow the setup instructions for [django-pictures][django-pictures]. + +Once you are set up, change your models to use the new `PictureField` and provide the + `aspect_ratios` you'd like to serve. Do create migrations just yet. + +This step should be followed by changing your templates and frontend. +The new placeholders feature for local development should help you +to do this almost effortlessly. + +Finally, run `makemigrations` and replace the `AlterField` operation with +`AlterPictureField`. + +We highly recommend to use Django's `image_width` and `image_height` fields, to avoid +unnecessary IO. If you can add these fields to your model, you can use the following +snippet to populate them: + +```python +import django.core.files.storage +from django.db import migrations, models +import pictures.models +from pictures.migrations import AlterPictureField + +def forward(apps, schema_editor): + for obj in apps.get_model("my-app.MyModel").objects.all().iterator(): + obj.image_width = obj.logo.width + obj.image_height = obj.logo.height + obj.save(update_fields=["image_height", "image_width"]) + +def backward(apps, schema_editor): + apps.get_model("my-app.MyModel").objects.all().update( + image_width=None, + image_height=None, + ) + +class Migration(migrations.Migration): + dependencies = [ + ('my-app', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name="mymodel", + name="image_height", + field=models.PositiveIntegerField(editable=False, null=True), + ), + migrations.AddField( + model_name="mymodel", + name="image_width", + field=models.PositiveIntegerField(editable=False, null=True), + ), + migrations.RunPython(forward, backward), + AlterPictureField( + model_name="mymodel", + name="image", + field=pictures.models.PictureField( + aspect_ratios=["3/2", "3/1"], + breakpoints={"desktop": 1024, "mobile": 576}, + container_width=1200, + file_types=["WEBP"], + grid_columns=12, + height_field="image_height", + pixel_densities=[1, 2], + storage=django.core.files.storage.FileSystemStorage(), + upload_to="pictures/", + verbose_name="image", + width_field="image_width", + ), + ), + ] +``` + +[django-pictures]: https://github.com/codingjoe/django-pictures +[picture-tag]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture + ## Why would I want this? This is a drop-in replacement for the [Django ImageField](https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.ImageField) that provides a standardized way to handle image uploads. It is designed to be as easy to use as possible, and to provide a consistent interface for all image fields. -It allows images to be presented in various size variants (eg:thumbnails, mid, and hi-res versions) +It allows images to be presented in various size variants (eg:thumbnails, mid, and hi-res versions) and it provides a way to handle images that are too large with validators. @@ -103,7 +184,7 @@ You can use a function for the `upload_to` argument. Using [Django Dynamic Filen This allows images to be given unique paths and filenames based on the model instance. -Example +Example ```python from django.db import models diff --git a/setup.cfg b/setup.cfg index 54c817c..5262f42 100644 --- a/setup.cfg +++ b/setup.cfg @@ -63,7 +63,7 @@ norecursedirs=venv env .eggs DJANGO_SETTINGS_MODULE=tests.settings addopts = --cov=stdimage --nomigrations --tb=short filterwarnings = - error + ignore::DeprecationWarning [coverage:run] source = . diff --git a/stdimage/models.py b/stdimage/models.py index 528bc4c..bed00d7 100644 --- a/stdimage/models.py +++ b/stdimage/models.py @@ -1,5 +1,6 @@ import logging import os +import warnings from io import BytesIO from django.core.files.base import ContentFile @@ -18,6 +19,14 @@ logger = logging.getLogger() +warnings.warn( + "The django-stdimage is deprecated in favor of django-pictures.\n" + "Migration instructions are available in the README:\n" + "https://github.com/codingjoe/django-stdimage#migration-instructions", + DeprecationWarning, +) + + class StdImageFileDescriptor(ImageFileDescriptor): """The variation property of the field is accessible in instance cases.""" From 3e473c12b52b0eb89cb625074f84911370976bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Lebleu?= Date: Thu, 12 May 2022 14:52:05 +0200 Subject: [PATCH 12/39] Fix #229 -- Delete old file after validation is passed Previously files were deleted even if the from validation failed. Co-Authored-By: codingjoe --- stdimage/models.py | 15 ++++++++++++++- tests/forms.py | 6 ++++++ tests/models.py | 6 +++++- tests/test_forms.py | 13 +++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/stdimage/models.py b/stdimage/models.py index bed00d7..6e0083d 100644 --- a/stdimage/models.py +++ b/stdimage/models.py @@ -264,6 +264,9 @@ def __init__( super().__init__(verbose_name=verbose_name, name=name, **kwargs) + # The attribute name of the old file to use on the model object + self._old_attname = "_old_%s" % name + def add_variation(self, name, params): variation = self.def_variation.copy() variation["kwargs"] = {} @@ -313,9 +316,19 @@ def save_form_data(self, instance, data): if self.delete_orphans and (data is False or data is not None): file = getattr(instance, self.name) if file and file._committed and file != data: - file.delete(save=False) + # Store the old file which should be deleted if the new one is valid + setattr(instance, self._old_attname, file) super().save_form_data(instance, data) + def pre_save(self, model_instance, add): + if hasattr(model_instance, self._old_attname): + # Delete the old file and its variations from the storage + old_file = getattr(model_instance, self._old_attname) + old_file.delete_variations() + old_file.storage.delete(old_file.name) + delattr(model_instance, self._old_attname) + return super().pre_save(model_instance, add) + def deconstruct(self): name, path, args, kwargs = super().deconstruct() return ( diff --git a/tests/forms.py b/tests/forms.py index c70347d..ff3927f 100644 --- a/tests/forms.py +++ b/tests/forms.py @@ -7,3 +7,9 @@ class ThumbnailModelForm(forms.ModelForm): class Meta: model = models.ThumbnailModel fields = "__all__" + + +class MinSizeModelForm(forms.ModelForm): + class Meta: + model = models.MinSizeModel + fields = "__all__" diff --git a/tests/models.py b/tests/models.py index 68a702f..4e91627 100644 --- a/tests/models.py +++ b/tests/models.py @@ -95,7 +95,11 @@ class MaxSizeModel(models.Model): class MinSizeModel(models.Model): - image = StdImageField(upload_to=upload_to, validators=[MinSizeValidator(200, 200)]) + image = StdImageField( + upload_to=upload_to, + delete_orphans=True, + validators=[MinSizeValidator(200, 200)], + ) class ForceMinSizeModel(models.Model): diff --git a/tests/test_forms.py b/tests/test_forms.py index 81b3360..03629b0 100644 --- a/tests/test_forms.py +++ b/tests/test_forms.py @@ -45,3 +45,16 @@ def test_save_form_data__none(self, db): obj = form.save() assert obj.image assert os.path.exists(org_path) + + def test_save_form_data__invalid(self, db): + instance = models.MinSizeModel.objects.create( + image=self.fixtures["600x400.jpg"] + ) + org_path = instance.image.path + assert os.path.exists(org_path) + form = forms.MinSizeModelForm( + files={"image": self.fixtures["100.gif"]}, + instance=instance, + ) + assert not form.is_valid() + assert os.path.exists(org_path) From b4eef1c28b1fd0a5aa32ace8b8d84470cf996c1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Jun 2022 12:00:26 +0200 Subject: [PATCH 13/39] Bump actions/setup-python from 3 to 4 (#297) * Bump actions/setup-python from 3 to 4 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 3 to 4. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Johannes Maron --- .github/workflows/ci.yml | 14 ++++++++++---- .github/workflows/release.yml | 4 +++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3070c08..f1072c5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,9 @@ jobs: msgcheck: runs-on: ubuntu-latest steps: - - uses: actions/setup-python@v3 + - uses: actions/setup-python@v4 + with: + python-version: "3.10" - uses: actions/checkout@v3 - run: sudo apt install -y gettext aspell libenchant-dev - uses: actions/cache@v3 @@ -35,7 +37,9 @@ jobs: - "pydocstyle ." runs-on: ubuntu-latest steps: - - uses: actions/setup-python@v3 + - uses: actions/setup-python@v4 + with: + python-version: "3.10" - uses: actions/checkout@v3 - uses: actions/cache@v3 with: @@ -50,7 +54,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: actions/setup-python@v3 + - uses: actions/setup-python@v4 + with: + python-version: "3.10" - run: sudo apt install gettext -y - run: python -m pip install --upgrade pip build wheel twine readme-renderer - run: python -m build --sdist --wheel @@ -78,7 +84,7 @@ jobs: - "test,progressbar" steps: - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - run: sudo apt install gettext -y diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 19f0b4e..4ee1915 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: actions/setup-python@v3 + - uses: actions/setup-python@v4 + with: + python-version: "3.10" - run: sudo apt-get install gettext -y - run: python -m pip install --upgrade pip build wheel twine - run: python -m build --sdist --wheel From 5215f9db99d47ae3ef42a9dc80f210972609ed79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 21:09:29 +0000 Subject: [PATCH 14/39] Bump black from 22.3.0 to 22.6.0 Bumps [black](https://github.com/psf/black) from 22.3.0 to 22.6.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.3.0...22.6.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 7aae3f5..b90e490 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,5 +1,5 @@ bandit==1.7.4 -black==22.3.0 +black==22.6.0 flake8==4.0.1 isort==5.10.1 msgcheck==4.0.0 From f8be2e9828500dea58ab057b486c00018ef19965 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Aug 2022 21:11:17 +0000 Subject: [PATCH 15/39] Bump flake8 from 4.0.1 to 5.0.2 Bumps [flake8](https://github.com/pycqa/flake8) from 4.0.1 to 5.0.2. - [Release notes](https://github.com/pycqa/flake8/releases) - [Commits](https://github.com/pycqa/flake8/compare/4.0.1...5.0.2) --- updated-dependencies: - dependency-name: flake8 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index b90e490..9a16eec 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,6 +1,6 @@ bandit==1.7.4 black==22.6.0 -flake8==4.0.1 +flake8==5.0.2 isort==5.10.1 msgcheck==4.0.0 pydocstyle==6.1.1 From be30d1a708a875cbaa5a5fafd96a602db5c0ef52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Aug 2022 21:07:01 +0000 Subject: [PATCH 16/39] Bump flake8 from 5.0.2 to 5.0.3 Bumps [flake8](https://github.com/pycqa/flake8) from 5.0.2 to 5.0.3. - [Release notes](https://github.com/pycqa/flake8/releases) - [Commits](https://github.com/pycqa/flake8/compare/5.0.2...5.0.3) --- updated-dependencies: - dependency-name: flake8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 9a16eec..4495c42 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,6 +1,6 @@ bandit==1.7.4 black==22.6.0 -flake8==5.0.2 +flake8==5.0.3 isort==5.10.1 msgcheck==4.0.0 pydocstyle==6.1.1 From 3cb50a9ff64aeaa05ef87629251bcaa5d3fcc3d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Aug 2022 21:08:32 +0000 Subject: [PATCH 17/39] Bump flake8 from 5.0.3 to 5.0.4 Bumps [flake8](https://github.com/pycqa/flake8) from 5.0.3 to 5.0.4. - [Release notes](https://github.com/pycqa/flake8/releases) - [Commits](https://github.com/pycqa/flake8/compare/5.0.3...5.0.4) --- updated-dependencies: - dependency-name: flake8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 4495c42..305be9d 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,6 +1,6 @@ bandit==1.7.4 black==22.6.0 -flake8==5.0.3 +flake8==5.0.4 isort==5.10.1 msgcheck==4.0.0 pydocstyle==6.1.1 From 3ba5a669ddc12feee84de109c904ab41e5893c66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Sep 2022 21:10:17 +0000 Subject: [PATCH 18/39] Bump black from 22.6.0 to 22.8.0 Bumps [black](https://github.com/psf/black) from 22.6.0 to 22.8.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.6.0...22.8.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 305be9d..fc89439 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,5 +1,5 @@ bandit==1.7.4 -black==22.6.0 +black==22.8.0 flake8==5.0.4 isort==5.10.1 msgcheck==4.0.0 From b2bac24273d1bd732d10c127253688c11b76210c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Oct 2022 21:09:39 +0000 Subject: [PATCH 19/39] Bump black from 22.8.0 to 22.10.0 Bumps [black](https://github.com/psf/black) from 22.8.0 to 22.10.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.8.0...22.10.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index fc89439..9ff7507 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,5 +1,5 @@ bandit==1.7.4 -black==22.8.0 +black==22.10.0 flake8==5.0.4 isort==5.10.1 msgcheck==4.0.0 From fcaad7ef1d3df9aea666601268c86b425ccff07d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Nov 2022 21:04:33 +0000 Subject: [PATCH 20/39] Bump flake8 from 5.0.4 to 6.0.0 Bumps [flake8](https://github.com/pycqa/flake8) from 5.0.4 to 6.0.0. - [Release notes](https://github.com/pycqa/flake8/releases) - [Commits](https://github.com/pycqa/flake8/compare/5.0.4...6.0.0) --- updated-dependencies: - dependency-name: flake8 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 9ff7507..f333a90 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,6 +1,6 @@ bandit==1.7.4 black==22.10.0 -flake8==5.0.4 +flake8==6.0.0 isort==5.10.1 msgcheck==4.0.0 pydocstyle==6.1.1 From b816c03426266b7b6471e433b279803756cb177e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 21:01:48 +0000 Subject: [PATCH 21/39] Bump black from 22.10.0 to 22.12.0 Bumps [black](https://github.com/psf/black) from 22.10.0 to 22.12.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.10.0...22.12.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index f333a90..cdfb313 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,5 +1,5 @@ bandit==1.7.4 -black==22.10.0 +black==22.12.0 flake8==6.0.0 isort==5.10.1 msgcheck==4.0.0 From 775058a27a295542a7b9d30410b5a5dd61122ea0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Dec 2022 21:03:23 +0000 Subject: [PATCH 22/39] Bump isort from 5.10.1 to 5.11.1 Bumps [isort](https://github.com/pycqa/isort) from 5.10.1 to 5.11.1. - [Release notes](https://github.com/pycqa/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md) - [Commits](https://github.com/pycqa/isort/compare/5.10.1...5.11.1) --- updated-dependencies: - dependency-name: isort dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index cdfb313..764cc68 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,6 +1,6 @@ bandit==1.7.4 black==22.12.0 flake8==6.0.0 -isort==5.10.1 +isort==5.11.1 msgcheck==4.0.0 pydocstyle==6.1.1 From fc36b733cf953865733f6edc0dde54b6b92d9fc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Dec 2022 21:03:16 +0000 Subject: [PATCH 23/39] Bump isort from 5.11.1 to 5.11.2 Bumps [isort](https://github.com/pycqa/isort) from 5.11.1 to 5.11.2. - [Release notes](https://github.com/pycqa/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md) - [Commits](https://github.com/pycqa/isort/compare/5.11.1...5.11.2) --- updated-dependencies: - dependency-name: isort dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 764cc68..3c490b1 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,6 +1,6 @@ bandit==1.7.4 black==22.12.0 flake8==6.0.0 -isort==5.11.1 +isort==5.11.2 msgcheck==4.0.0 pydocstyle==6.1.1 From 2d40a5168feef7575120ee66c46bfb5ab109b8a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Dec 2022 21:02:00 +0000 Subject: [PATCH 24/39] Bump isort from 5.11.2 to 5.11.4 Bumps [isort](https://github.com/pycqa/isort) from 5.11.2 to 5.11.4. - [Release notes](https://github.com/pycqa/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md) - [Commits](https://github.com/pycqa/isort/compare/5.11.2...5.11.4) --- updated-dependencies: - dependency-name: isort dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 3c490b1..7452f0e 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,6 +1,6 @@ bandit==1.7.4 black==22.12.0 flake8==6.0.0 -isort==5.11.2 +isort==5.11.4 msgcheck==4.0.0 pydocstyle==6.1.1 From 9aa5c6ac4e08fa31094528972eac6f7569cf0c87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 21:03:17 +0000 Subject: [PATCH 25/39] Bump pydocstyle from 6.1.1 to 6.2.2 Bumps [pydocstyle](https://github.com/PyCQA/pydocstyle) from 6.1.1 to 6.2.2. - [Release notes](https://github.com/PyCQA/pydocstyle/releases) - [Changelog](https://github.com/PyCQA/pydocstyle/blob/master/docs/release_notes.rst) - [Commits](https://github.com/PyCQA/pydocstyle/compare/6.1.1...6.2.2) --- updated-dependencies: - dependency-name: pydocstyle dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 7452f0e..f85f6b6 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -3,4 +3,4 @@ black==22.12.0 flake8==6.0.0 isort==5.11.4 msgcheck==4.0.0 -pydocstyle==6.1.1 +pydocstyle==6.2.2 From 00cf902499a53112a26a02f11617397758f1cd53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jan 2023 21:03:01 +0000 Subject: [PATCH 26/39] Bump pydocstyle from 6.2.2 to 6.2.3 Bumps [pydocstyle](https://github.com/PyCQA/pydocstyle) from 6.2.2 to 6.2.3. - [Release notes](https://github.com/PyCQA/pydocstyle/releases) - [Changelog](https://github.com/PyCQA/pydocstyle/blob/master/docs/release_notes.rst) - [Commits](https://github.com/PyCQA/pydocstyle/compare/6.2.2...6.2.3) --- updated-dependencies: - dependency-name: pydocstyle dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index f85f6b6..9ed3f40 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -3,4 +3,4 @@ black==22.12.0 flake8==6.0.0 isort==5.11.4 msgcheck==4.0.0 -pydocstyle==6.2.2 +pydocstyle==6.2.3 From 1075bfa40d2e3427ccd9cc172c631dc58e15f216 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jan 2023 21:01:45 +0000 Subject: [PATCH 27/39] Bump pydocstyle from 6.2.3 to 6.3.0 Bumps [pydocstyle](https://github.com/PyCQA/pydocstyle) from 6.2.3 to 6.3.0. - [Release notes](https://github.com/PyCQA/pydocstyle/releases) - [Changelog](https://github.com/PyCQA/pydocstyle/blob/master/docs/release_notes.rst) - [Commits](https://github.com/PyCQA/pydocstyle/compare/6.2.3...6.3.0) --- updated-dependencies: - dependency-name: pydocstyle dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 9ed3f40..3e2b541 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -3,4 +3,4 @@ black==22.12.0 flake8==6.0.0 isort==5.11.4 msgcheck==4.0.0 -pydocstyle==6.2.3 +pydocstyle==6.3.0 From cea0f4e8b44f22291ba34ab9986dbc215260e7e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 21:01:57 +0000 Subject: [PATCH 28/39] Bump isort from 5.11.4 to 5.12.0 Bumps [isort](https://github.com/pycqa/isort) from 5.11.4 to 5.12.0. - [Release notes](https://github.com/pycqa/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md) - [Commits](https://github.com/pycqa/isort/compare/5.11.4...5.12.0) --- updated-dependencies: - dependency-name: isort dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 3e2b541..a681fcd 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,6 +1,6 @@ bandit==1.7.4 black==22.12.0 flake8==6.0.0 -isort==5.11.4 +isort==5.12.0 msgcheck==4.0.0 pydocstyle==6.3.0 From 0dcee913073c2a541234aa6a9daf26ea03578a03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Feb 2023 21:02:52 +0000 Subject: [PATCH 29/39] Bump black from 22.12.0 to 23.1.0 Bumps [black](https://github.com/psf/black) from 22.12.0 to 23.1.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.12.0...23.1.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index a681fcd..0a6ca91 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,5 +1,5 @@ bandit==1.7.4 -black==22.12.0 +black==23.1.0 flake8==6.0.0 isort==5.12.0 msgcheck==4.0.0 From 17e45ed2167901d2fc2a48f4a557a8c326d17031 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 21:57:14 +0000 Subject: [PATCH 30/39] Bump bandit from 1.7.4 to 1.7.5 Bumps [bandit](https://github.com/PyCQA/bandit) from 1.7.4 to 1.7.5. - [Release notes](https://github.com/PyCQA/bandit/releases) - [Commits](https://github.com/PyCQA/bandit/compare/1.7.4...1.7.5) --- updated-dependencies: - dependency-name: bandit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 0a6ca91..cbc6a6d 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,4 +1,4 @@ -bandit==1.7.4 +bandit==1.7.5 black==23.1.0 flake8==6.0.0 isort==5.12.0 From c0e60b05168f2ef33fdeb3d311a39e4989af4dde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 21:57:42 +0000 Subject: [PATCH 31/39] Bump black from 23.1.0 to 23.3.0 Bumps [black](https://github.com/psf/black) from 23.1.0 to 23.3.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.1.0...23.3.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index cbc6a6d..e4f279c 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,5 +1,5 @@ bandit==1.7.5 -black==23.1.0 +black==23.3.0 flake8==6.0.0 isort==5.12.0 msgcheck==4.0.0 From fbdd69f78f7335ac5a435d9986695d04a5d9e90b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jul 2023 21:10:01 +0000 Subject: [PATCH 32/39] Bump black from 23.3.0 to 23.7.0 Bumps [black](https://github.com/psf/black) from 23.3.0 to 23.7.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.3.0...23.7.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index e4f279c..05f4804 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,5 +1,5 @@ bandit==1.7.5 -black==23.3.0 +black==23.7.0 flake8==6.0.0 isort==5.12.0 msgcheck==4.0.0 From 7100350161c540dcd949ab2cb1ea47b1e9de0208 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 21:33:00 +0000 Subject: [PATCH 33/39] Bump flake8 from 6.0.0 to 6.1.0 Bumps [flake8](https://github.com/pycqa/flake8) from 6.0.0 to 6.1.0. - [Commits](https://github.com/pycqa/flake8/compare/6.0.0...6.1.0) --- updated-dependencies: - dependency-name: flake8 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 05f4804..27126cc 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,6 +1,6 @@ bandit==1.7.5 black==23.7.0 -flake8==6.0.0 +flake8==6.1.0 isort==5.12.0 msgcheck==4.0.0 pydocstyle==6.3.0 From 3ad53aeda50da50088f1c1c216bcdce11d1338f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 21:38:34 +0000 Subject: [PATCH 34/39] Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 8 ++++---- .github/workflows/release.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1072c5..3f89486 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/setup-python@v4 with: python-version: "3.10" - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: sudo apt install -y gettext aspell libenchant-dev - uses: actions/cache@v3 with: @@ -40,7 +40,7 @@ jobs: - uses: actions/setup-python@v4 with: python-version: "3.10" - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/cache@v3 with: path: ~/.cache/pip @@ -53,7 +53,7 @@ jobs: dist: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: "3.10" @@ -88,7 +88,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - run: sudo apt install gettext -y - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: python -m pip install --upgrade pip codecov - run: python -m pip install -e .[${{ matrix.extra }}] if: ${{ matrix.extra }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4ee1915..a71d600 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,7 +9,7 @@ jobs: PyPi: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: "3.10" From 207b7ac9a35f6f7ef8a4c5311f01423e0dbf8649 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 21:40:05 +0000 Subject: [PATCH 35/39] Bump black from 23.7.0 to 23.9.1 Bumps [black](https://github.com/psf/black) from 23.7.0 to 23.9.1. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.7.0...23.9.1) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 27126cc..821eac4 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,5 +1,5 @@ bandit==1.7.5 -black==23.7.0 +black==23.9.1 flake8==6.1.0 isort==5.12.0 msgcheck==4.0.0 From bf0ff6857a4fd67edc1141a55b07d213adab12a8 Mon Sep 17 00:00:00 2001 From: Johannes Maron Date: Wed, 11 Oct 2023 10:07:51 +0200 Subject: [PATCH 36/39] Update to libenchate 2 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3f89486..9ad71f1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: with: python-version: "3.10" - uses: actions/checkout@v4 - - run: sudo apt install -y gettext aspell libenchant-dev + - run: sudo apt install -y gettext aspell libenchant-2-dev - uses: actions/cache@v3 with: path: ~/.cache/pip From a1427a5cc78a2f183822d34f9331046f38f2e61b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 21:50:29 +0000 Subject: [PATCH 37/39] Bump black from 23.9.1 to 23.10.0 Bumps [black](https://github.com/psf/black) from 23.9.1 to 23.10.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.9.1...23.10.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 821eac4..9279c0e 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,5 +1,5 @@ bandit==1.7.5 -black==23.9.1 +black==23.10.0 flake8==6.1.0 isort==5.12.0 msgcheck==4.0.0 From bc9af2adf043f6457198d2142b84d522813e5852 Mon Sep 17 00:00:00 2001 From: Denis Cornehl Date: Mon, 6 Nov 2023 18:25:07 +0100 Subject: [PATCH 38/39] Fix deepcopy & pickle for unsaved model instances & empty image fields (#324) --- stdimage/models.py | 8 ++++---- tests/test_models.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/stdimage/models.py b/stdimage/models.py index 6e0083d..dd429d8 100644 --- a/stdimage/models.py +++ b/stdimage/models.py @@ -158,9 +158,9 @@ def __getstate__(self): state = super().__getstate__() state["variations"] = {} for variation_name in self.field.variations: - variation = getattr(self, variation_name) - variation_state = variation.__getstate__() - state["variations"][variation_name] = variation_state + if variation := getattr(self, variation_name, None): + variation_state = variation.__getstate__() + state["variations"][variation_name] = variation_state return state def __setstate__(self, state): @@ -207,7 +207,7 @@ def __init__( render_variations=True, force_min_size=False, delete_orphans=False, - **kwargs + **kwargs, ): """ Standardized ImageField for Django. diff --git a/tests/test_models.py b/tests/test_models.py index e8d47f2..e234521 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -174,6 +174,20 @@ def test_defer(self, db, django_assert_num_queries): deferred.image assert instance.image.thumbnail == deferred.image.thumbnail + @pytest.mark.django_db + def test_variations_deepcopy_unsaved(self): + instance_original = ResizeModel(image=self.fixtures["600x400.jpg"]) + instance = deepcopy(instance_original) + assert isinstance(instance.image, StdImageFieldFile) + assert instance.image == instance_original.image + + @pytest.mark.django_db + def test_variations_deepcopy_without_image(self): + instance_original = ThumbnailModel.objects.create(image=None) + instance = deepcopy(instance_original) + assert isinstance(instance.image, StdImageFieldFile) + assert instance.image == instance_original.image + @pytest.mark.django_db def test_variations_deepcopy(self): """Tests test_variations() with a deep copied object""" From 59ff17674de24483c6cddd64f99e47871792f6c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 21:29:11 +0000 Subject: [PATCH 39/39] Bump black from 23.10.0 to 24.3.0 Bumps [black](https://github.com/psf/black) from 23.10.0 to 24.3.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.10.0...24.3.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- lint-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-requirements.txt b/lint-requirements.txt index 9279c0e..e0936be 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,5 +1,5 @@ bandit==1.7.5 -black==23.10.0 +black==24.3.0 flake8==6.1.0 isort==5.12.0 msgcheck==4.0.0