Skip to content

Commit e552e8e

Browse files
authored
Merge branch 'master' into feat/protect-published
2 parents 7c3416a + e0c5e64 commit e552e8e

File tree

25 files changed

+1554
-171
lines changed

25 files changed

+1554
-171
lines changed

.github/workflows/codeql.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424

2525
steps:
2626
- name: Checkout
27-
uses: actions/checkout@v5
27+
uses: actions/checkout@v6
2828

2929
- name: Initialize CodeQL
3030
uses: github/codeql-action/init@v4

.github/workflows/docs.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ jobs:
1212
name: build
1313
steps:
1414
- name: Checkout
15-
uses: actions/checkout@v5
15+
uses: actions/checkout@v6
1616
- name: Set up Python
1717
uses: actions/setup-python@v6
1818
with:
1919
python-version: '3.11'
2020
cache: 'pip'
2121
- name: Cache dependencies
22-
uses: actions/cache@v4.3.0
22+
uses: actions/cache@v5.0.3
2323
with:
2424
path: ~/.cache/pip
2525
key: ${{ runner.os }}-pip-${{ hashFiles('docs/requirements.txt') }}
@@ -37,14 +37,14 @@ jobs:
3737
needs: build
3838
steps:
3939
- name: Checkout
40-
uses: actions/checkout@v5
40+
uses: actions/checkout@v6
4141
- name: Set up Python
4242
uses: actions/setup-python@v6
4343
with:
4444
python-version: '3.11'
4545
cache: 'pip'
4646
- name: Cache dependencies
47-
uses: actions/cache@v4.3.0
47+
uses: actions/cache@v5.0.3
4848
with:
4949
path: ~/.cache/pip
5050
key: ${{ runner.os }}-pip-${{ hashFiles('docs/requirements.txt') }}

.github/workflows/frontend.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
runs-on: ubuntu-latest
1717

1818
steps:
19-
- uses: actions/checkout@v5
19+
- uses: actions/checkout@v6
2020

2121
- name: Set up Node.js
2222
uses: actions/setup-node@v6

.github/workflows/lint.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
runs-on: ubuntu-latest
1010

1111
steps:
12-
- uses: actions/checkout@v5
12+
- uses: actions/checkout@v6
1313

1414
- name: Install uv
1515
uses: astral-sh/setup-uv@v7

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
permissions:
1616
id-token: write
1717
steps:
18-
- uses: actions/checkout@v5
18+
- uses: actions/checkout@v6
1919
- name: Set up Python 3.13
2020
uses: actions/setup-python@v6
2121
with:

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
permissions:
1717
id-token: write
1818
steps:
19-
- uses: actions/checkout@v5
19+
- uses: actions/checkout@v6
2020
- name: Set up Python 3.13
2121
uses: actions/setup-python@v6
2222
with:

.github/workflows/test.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
python-version: "3.14"
4343

4444
steps:
45-
- uses: actions/checkout@v5
45+
- uses: actions/checkout@v6
4646
- name: Set up Python ${{ matrix.python-version }}
4747
uses: actions/setup-python@v6
4848
with:
@@ -115,7 +115,7 @@ jobs:
115115
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
116116

117117
steps:
118-
- uses: actions/checkout@v5
118+
- uses: actions/checkout@v6
119119
- name: Set up Python ${{ matrix.python-version }}
120120
uses: actions/setup-python@v6
121121
with:
@@ -182,7 +182,7 @@ jobs:
182182
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
183183

184184
steps:
185-
- uses: actions/checkout@v5
185+
- uses: actions/checkout@v6
186186
- name: Set up Python ${{ matrix.python-version }}
187187
uses: actions/setup-python@v6
188188
with:
@@ -217,7 +217,7 @@ jobs:
217217
]
218218

219219
steps:
220-
- uses: actions/checkout@v5
220+
- uses: actions/checkout@v6
221221
- name: Set up Python ${{ matrix.python-version }}
222222
uses: actions/setup-python@v6
223223
with:
@@ -252,7 +252,7 @@ jobs:
252252
requirements-file: ['dj60_cms50.txt']
253253

254254
steps:
255-
- uses: actions/checkout@v5
255+
- uses: actions/checkout@v6
256256
- name: Set up Python ${{ matrix.python-version }}
257257
uses: actions/setup-python@v6
258258
with:

djangocms_versioning/admin.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@
4747
content_is_unlocked_for_user,
4848
create_version_lock,
4949
get_admin_url,
50+
get_current_site,
5051
get_editable_url,
5152
get_latest_admin_viewable_content,
53+
get_object_live_url,
5254
get_preview_url,
5355
proxy_model,
5456
remove_version_lock,
@@ -1097,9 +1099,9 @@ def publish_view(self, request, object_id):
10971099
self.message_user(request, _("Version published"))
10981100

10991101
# Redirect to published?
1100-
if conf.ON_PUBLISH_REDIRECT == "published":
1102+
if not requested_redirect and conf.ON_PUBLISH_REDIRECT == "published":
11011103
if hasattr(version.content, "get_absolute_url"):
1102-
requested_redirect = requested_redirect or version.content.get_absolute_url()
1104+
redirect_url = get_object_live_url(version.content, site=get_current_site(request)) or redirect_url
11031105

11041106
return self._internal_redirect(requested_redirect, redirect_url)
11051107

@@ -1220,7 +1222,7 @@ def edit_redirect_view(self, request, object_id):
12201222
return redirect(version_list_url(version.content))
12211223

12221224
# Redirect
1223-
return redirect(get_editable_url(target.content, request.GET.get("force_admin")))
1225+
return redirect(get_editable_url(target.content, request.GET.get("force_admin"), request.GET))
12241226

12251227
def revert_view(self, request, object_id):
12261228
"""Reverts to the specified version i.e. creates a draft from it."""

djangocms_versioning/cms_toolbars.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
from djangocms_versioning.conf import ALLOW_DELETING_VERSIONS, LOCK_VERSIONS
3333
from djangocms_versioning.constants import DRAFT
3434
from djangocms_versioning.helpers import (
35+
get_current_site,
3536
get_latest_admin_viewable_content,
37+
get_object_live_url,
3638
version_list_url,
3739
)
3840
from djangocms_versioning.models import Version
@@ -105,6 +107,8 @@ def _add_edit_button(self, disabled=False):
105107
f"admin:{proxy_model._meta.app_label}_{proxy_model.__name__.lower()}_edit_redirect",
106108
args=(version.pk,),
107109
)
110+
if self.request.GET:
111+
edit_url += "?" + self.request.GET.urlencode()
108112
pks_for_grouper = version.versionable.for_content_grouping_values(version.content).values_list(
109113
"pk", flat=True
110114
)
@@ -250,7 +254,10 @@ def _add_view_published_button(self):
250254
if not published_version:
251255
return
252256

253-
url = published_version.get_absolute_url() if hasattr(published_version, "get_absolute_url") else None
257+
url = None
258+
if hasattr(published_version, "get_absolute_url"):
259+
request = self.toolbar.request
260+
url = get_object_live_url(published_version, site=get_current_site(request), params=request.GET)
254261
if url and (self.toolbar.edit_mode_active or self.toolbar.preview_mode_active):
255262
item = ButtonList(side=self.toolbar.RIGHT)
256263
item.add_button(

djangocms_versioning/helpers.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from django.http import HttpRequest
1919
from django.template.loader import render_to_string
2020
from django.utils.encoding import force_str
21-
from django.utils.translation import get_language
21+
from django.utils.translation import get_language, override as force_language
2222

2323
from . import versionables
2424
from .conf import EMAIL_NOTIFICATIONS_FAIL_SILENTLY
@@ -29,6 +29,21 @@
2929
except ImportError:
3030
emit_content_change = None
3131

32+
try:
33+
# django CMS >= 5.1
34+
from cms.toolbar.utils import get_object_live_url # noqa F401
35+
from cms.utils import get_current_site # noqa F401
36+
except ImportError:
37+
# cms < 5.1
38+
def get_object_live_url(obj, language=None, site=None, params=None) -> str:
39+
with force_language(language):
40+
return obj.get_absolute_url()
41+
42+
def get_current_site(request) -> models.Model:
43+
from django.contrib.sites.models import Site
44+
45+
return Site.objects.get_current()
46+
3247

3348
def is_editable(content_obj: models.Model, request: HttpRequest) -> bool:
3449
"""Check of content_obj is editable"""
@@ -72,9 +87,7 @@ def _replace_admin_for_model(modeladmin: type[admin.ModelAdmin], mixin: type, ad
7287
admin_site.register(modeladmin.model, new_admin_class)
7388

7489

75-
def replace_admin_for_models(
76-
pairs: Iterable[tuple[type[models.Model], type]], admin_site: admin.AdminSite | None = None
77-
):
90+
def replace_admin_for_models(pairs: tuple[type[models.Model], type], admin_site: admin.AdminSite | None = None):
7891
"""
7992
:param pairs: Iterable of (model class, admin mixin class) tuples
8093
:param admin_site: AdminSite instance
@@ -252,13 +265,15 @@ def is_content_editable(placeholder: Placeholder, user: models.Model) -> bool:
252265
return version.state == DRAFT
253266

254267

255-
def get_editable_url(content_obj, force_admin=False):
268+
def get_editable_url(content_obj, force_admin=False, params=None):
256269
"""If the object is editable the cms editable view should be used, with the toolbar.
257270
This method provides the URL for it.
258271
"""
259272
if is_editable_model(content_obj.__class__) and not force_admin:
260273
language = getattr(content_obj, "language", None)
261274
url = get_object_edit_url(content_obj, language)
275+
if params:
276+
url += "?" + params.urlencode()
262277
# Or else, the standard edit view should be used
263278
else:
264279
url = admin_reverse(

0 commit comments

Comments
 (0)