Skip to content

Commit 48e16a6

Browse files
authored
Merge branch 'django-cms:master' into master
2 parents f6cadb9 + 1164e69 commit 48e16a6

31 files changed

+127
-90
lines changed

.github/workflows/publish-to-live-pypi.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ jobs:
1616
id-token: write
1717
steps:
1818
- uses: actions/checkout@v4
19-
- name: Set up Python
20-
uses: actions/setup-python@v4
19+
- name: Set up Python 3.12
20+
uses: actions/setup-python@v5
2121
with:
2222
python-version: '3.12'
2323

.github/workflows/publish-to-test-pypi.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ jobs:
1616
id-token: write
1717
steps:
1818
- uses: actions/checkout@v4
19-
- name: Set up Python
20-
uses: actions/setup-python@v4
19+
- name: Set up Python 3.12
20+
uses: actions/setup-python@v5
2121
with:
2222
python-version: '3.12'
2323

@@ -39,5 +39,5 @@ jobs:
3939
- name: Publish distribution 📦 to Test PyPI
4040
uses: pypa/gh-action-pypi-publish@release/v1
4141
with:
42-
repository-url: https://test.pypi.org/legacy/
43-
skip-existing: true
42+
repository_url: https://test.pypi.org/legacy/
43+
skip_existing: true

.github/workflows/test.yml

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,13 @@ jobs:
88
strategy:
99
fail-fast: false
1010
matrix:
11-
python-version: ['3.8', '3.9', '3.10', '3.11']
11+
python-version: ['3.10', '3.11', '3.12']
1212
requirements-file: [
13-
django-3.2.txt,
14-
django-4.0.txt,
15-
django-4.1.txt,
1613
django-4.2.txt,
1714
django-5.0.txt,
15+
django-main.txt,
1816
]
1917
custom-image-model: [false, true]
20-
exclude:
21-
- requirements-file: django-5.0.txt
22-
python-version: 3.8
23-
- requirements-file: django-5.0.txt
24-
python-version: 3.9
2518
os: [
2619
ubuntu-20.04,
2720
]

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ repos:
2121
# args: [--target-version, "2.2"]
2222

2323
- repo: https://github.com/PyCQA/flake8
24-
rev: 7.0.0
24+
rev: 7.1.0
2525
hooks:
2626
- id: flake8
2727

CHANGELOG.rst

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,24 @@
22
CHANGELOG
33
=========
44

5+
3.1.3 (2025-05-17)
6+
==================
7+
* Fix: Folder select widget did not render correctly with standard Django admin
8+
styles.
9+
10+
3.1.2 (2025-05-17)
11+
==================
12+
13+
* Made the filer check command compatible with custom image models.
14+
* Use the final image model's app label to determine the expand view URL.
15+
* Prepare the image expand URL in the admin code and pass it through to the template via context.
16+
* Fix #1377: Field `verbose_name` should use `gettext_lazy`.
17+
* Fix: styles for django 4.2+ admin.
18+
* Fix: Unintended scroll when clearing file widget.
19+
* Fix: Method `ImageAdminForm.clean_subject_location()` not implemented correctly causing invokation
20+
of `clean()` twice.
21+
22+
523
3.1.1 (2023-11-18)
624
==================
725

docs/settings.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ e.g::
6969

7070
Defaults to FileSystemStorage in ``<MEDIA_ROOT>/filer_public/`` and ``<MEDIA_ROOT>/filer_public_thumbnails/`` for public files and
7171
``<MEDIA_ROOT>/../smedia/filer_private/`` and ``<MEDIA_ROOT>/../smedia/filer_private_thumbnails/`` for private files.
72-
Public storage uses ``DEFAULT_FILE_STORAGE`` as default storage backend.
72+
Public storage uses the default storage's backend. This is taken from Django's ``STORAGES``
73+
setting if it exists or, if not, from the ``DEFAULT_FILE_STORAGE`` setting for compatibility
74+
with earlier Django versions (5.0 or below).
7375

7476
``UPLOAD_TO`` is the function to generate the path relative to the storage root. The
7577
default generates a random path like ``1d/a5/1da50fee-5003-46a1-a191-b547125053a8/filename.jpg``. This

filer/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
8. Publish the release and it will automatically release to pypi
1414
"""
1515

16-
__version__ = '3.1.1'
16+
__version__ = '3.1.3'

filer/admin/fileadmin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ def get_model_perms(self, request):
192192
def display_canonical(self, instance):
193193
canonical = instance.canonical_url
194194
if canonical:
195-
return mark_safe('<a href="{}">{}</a>'.format(canonical, canonical))
195+
return mark_safe(f'<a href="{canonical}">{canonical}</a>')
196196
else:
197197
return '-'
198198
display_canonical.allow_tags = True

filer/admin/folderadmin.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
from django.db.models import Case, F, OuterRef, Subquery, When
1717
from django.db.models.functions import Coalesce, Lower
1818
from django.http import HttpResponse, HttpResponseRedirect
19-
from django.shortcuts import get_object_or_404, render
19+
from django.shortcuts import get_object_or_404
20+
from django.template.response import TemplateResponse
2021
from django.urls import path, reverse
2122
from django.utils.encoding import force_str
2223
from django.utils.html import escape, format_html
@@ -253,10 +254,10 @@ def directory_listing(self, request, folder_id=None, viewtype=None):
253254
self.get_queryset(request).get(id=last_folder_id)
254255
except self.model.DoesNotExist:
255256
url = reverse('admin:filer-directory_listing-root')
256-
url = "{}{}".format(url, admin_url_params_encoded(request))
257+
url = f"{url}{admin_url_params_encoded(request)}"
257258
else:
258259
url = reverse('admin:filer-directory_listing', kwargs={'folder_id': last_folder_id})
259-
url = "{}{}".format(url, admin_url_params_encoded(request))
260+
url = f"{url}{admin_url_params_encoded(request)}"
260261
return HttpResponseRedirect(url)
261262
elif folder_id is None:
262263
folder = FolderRoot()
@@ -480,7 +481,7 @@ def directory_listing(self, request, folder_id=None, viewtype=None):
480481
'enable_permissions': settings.FILER_ENABLE_PERMISSIONS,
481482
'can_make_folder': request.user.is_superuser or (folder.is_root and settings.FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS) or permissions.get("has_add_children_permission"),
482483
})
483-
return render(request, self.directory_listing_template, context)
484+
return TemplateResponse(request, self.directory_listing_template, context)
484485

485486
def filter_folder(self, qs, terms=()):
486487
# Source: https://github.com/django/django/blob/1.7.1/django/contrib/admin/options.py#L939-L947 flake8: noqa
@@ -814,7 +815,7 @@ def delete_files_or_folders(self, request, files_queryset, folders_queryset):
814815
})
815816

816817
# Display the destination folder selection page
817-
return render(
818+
return TemplateResponse(
818819
request,
819820
"admin/filer/delete_selected_files_confirmation.html",
820821
context
@@ -840,7 +841,7 @@ def _format_callback(self, obj, user, admin_site, perms_needed):
840841
else:
841842
# Don't display link to edit, because it either has no
842843
# admin or is edited inline.
843-
return '{}: {}'.format(capfirst(opts.verbose_name), force_str(obj))
844+
return f'{capfirst(opts.verbose_name)}: {force_str(obj)}'
844845

845846
def _check_copy_perms(self, request, files_queryset, folders_queryset):
846847
try:
@@ -954,7 +955,7 @@ def move_files_and_folders(self, request, files_queryset, folders_queryset):
954955
})
955956

956957
# Display the destination folder selection page
957-
return render(request, "admin/filer/folder/choose_move_destination.html", context)
958+
return TemplateResponse(request, "admin/filer/folder/choose_move_destination.html", context)
958959

959960
move_files_and_folders.short_description = _("Move selected files and/or folders")
960961

@@ -1037,7 +1038,7 @@ def rename_files(self, request, files_queryset, folders_queryset):
10371038
})
10381039

10391040
# Display the rename format selection page
1040-
return render(request, "admin/filer/folder/choose_rename_format.html", context)
1041+
return TemplateResponse(request, "admin/filer/folder/choose_rename_format.html", context)
10411042

10421043
rename_files.short_description = _("Rename files")
10431044

@@ -1073,7 +1074,7 @@ def _get_available_name(self, destination, name):
10731074
count = itertools.count(1)
10741075
original = name
10751076
while destination.contains_folder(name):
1076-
name = "{}_{}".format(original, next(count))
1077+
name = f"{original}_{next(count)}"
10771078
return name
10781079

10791080
def _copy_folder(self, folder, destination, suffix, overwrite):
@@ -1169,7 +1170,7 @@ def copy_files_and_folders(self, request, files_queryset, folders_queryset):
11691170
})
11701171

11711172
# Display the destination folder selection page
1172-
return render(request, "admin/filer/folder/choose_copy_destination.html", context)
1173+
return TemplateResponse(request, "admin/filer/folder/choose_copy_destination.html", context)
11731174

11741175
copy_files_and_folders.short_description = _("Copy selected files and/or folders")
11751176

@@ -1298,6 +1299,6 @@ def resize_images(self, request, files_queryset, folders_queryset):
12981299
})
12991300

13001301
# Display the resize options page
1301-
return render(request, "admin/filer/folder/choose_images_resize_options.html", context)
1302+
return TemplateResponse(request, "admin/filer/folder/choose_images_resize_options.html", context)
13021303

13031304
resize_images.short_description = _("Resize selected images")

filer/admin/imageadmin.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django import forms
2-
from django.shortcuts import get_object_or_404, render
2+
from django.shortcuts import get_object_or_404
3+
from django.template.response import TemplateResponse
34
from django.urls import path
45
from django.utils.translation import gettext as _
56
from django.utils.translation import gettext_lazy
@@ -95,9 +96,13 @@ def get_urls(self):
9596

9697
def expand_view(self, request, file_id):
9798
image = get_object_or_404(self.model, pk=file_id)
98-
return render(request, "admin/filer/image/expand.html", context={
99-
"original_url": image.url
100-
})
99+
return TemplateResponse(
100+
request,
101+
"admin/filer/image/expand.html",
102+
context={
103+
"original_url": image.url
104+
},
105+
)
101106

102107

103108
if FILER_IMAGE_MODEL == 'filer.Image':

0 commit comments

Comments
 (0)