diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3070c08..9ad71f1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,9 +11,11 @@ jobs: msgcheck: runs-on: ubuntu-latest steps: - - uses: actions/setup-python@v3 - - uses: actions/checkout@v3 - - run: sudo apt install -y gettext aspell libenchant-dev + - uses: actions/setup-python@v4 + with: + python-version: "3.10" + - uses: actions/checkout@v4 + - run: sudo apt install -y gettext aspell libenchant-2-dev - uses: actions/cache@v3 with: path: ~/.cache/pip @@ -35,8 +37,10 @@ jobs: - "pydocstyle ." runs-on: ubuntu-latest steps: - - uses: actions/setup-python@v3 - - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: "3.10" + - uses: actions/checkout@v4 - uses: actions/cache@v3 with: path: ~/.cache/pip @@ -49,8 +53,10 @@ jobs: dist: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v3 + - uses: actions/checkout@v4 + - 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,11 +84,11 @@ 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 - - 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 19f0b4e..a71d600 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,8 +9,10 @@ jobs: PyPi: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v3 + - uses: actions/checkout@v4 + - 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 diff --git a/lint-requirements.txt b/lint-requirements.txt index 7aae3f5..9279c0e 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,6 +1,6 @@ -bandit==1.7.4 -black==22.3.0 -flake8==4.0.1 -isort==5.10.1 +bandit==1.7.5 +black==23.10.0 +flake8==6.1.0 +isort==5.12.0 msgcheck==4.0.0 -pydocstyle==6.1.1 +pydocstyle==6.3.0 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"""