Skip to content

Commit f23bc04

Browse files
fsbraunsourcery-ai[bot]vinitkumar
authored
fix: Respect site-specific language configurations (#480)
* fix: Respect site-specific language configurations * Update djangocms_versioning/admin.py Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update djangocms_versioning/admin.py Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update djangocms_versioning/cms_config.py Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: Take get_current_site from Django * Update admin markup * Fix: Archive form markup * fix: Ruff linting * fix: make the python 3.10 plus * fix: lint issues --------- Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: Vinit kumar <[email protected]>
1 parent 0012ee5 commit f23bc04

26 files changed

+174
-241
lines changed

djangocms_versioning/admin.py

Lines changed: 118 additions & 155 deletions
Large diffs are not rendered by default.

djangocms_versioning/cms_config.py

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from cms.utils.urlutils import admin_reverse
99
from django.conf import settings
1010
from django.contrib.admin.utils import flatten_fieldsets
11+
from django.contrib.sites.shortcuts import get_current_site
1112
from django.core.exceptions import (
1213
ImproperlyConfigured,
1314
ObjectDoesNotExist,
@@ -52,13 +53,10 @@ def __init__(self):
5253
@cached_property
5354
def versionables_by_content(self):
5455
"""Returns a dict of {content_model_cls: VersionableItem obj}"""
55-
return {
56-
versionable.content_model: versionable for versionable in self.versionables
57-
}
56+
return {versionable.content_model: versionable for versionable in self.versionables}
5857

5958
def is_content_model_versioned(self, content_model):
60-
"""Returns if the content model is registered for versioning.
61-
"""
59+
"""Returns if the content model is registered for versioning."""
6260
return content_model in self.versionables_by_content
6361

6462
@cached_property
@@ -91,9 +89,7 @@ def handle_versioning_setting(self, cms_config):
9189
# still changing and needs to be calculated on the fly
9290
registered_so_far = [v.content_model for v in self.versionables]
9391
if versionable.content_model in registered_so_far:
94-
raise ImproperlyConfigured(
95-
f"{versionable.content_model!r} has already been registered"
96-
)
92+
raise ImproperlyConfigured(f"{versionable.content_model!r} has already been registered")
9793
# Checks passed. Add versionable to our master list
9894
self.versionables.append(versionable)
9995

@@ -118,15 +114,13 @@ def handle_admin_classes(self, cms_config):
118114
with an admin model class that inherits from `versionable.content_admin_mixin`.
119115
"""
120116
replace_admin_for_models(
121-
[
122-
(versionable.content_model, versionable.content_admin_mixin)
123-
for versionable in cms_config.versioning
124-
]
117+
[(versionable.content_model, versionable.content_admin_mixin) for versionable in cms_config.versioning]
125118
)
126119
replace_admin_for_models(
127120
[
128121
(versionable.grouper_model, versionable.grouper_admin_mixin)
129-
for versionable in cms_config.versioning if versionable.grouper_admin_mixin is not None
122+
for versionable in cms_config.versioning
123+
if versionable.grouper_admin_mixin is not None
130124
]
131125
)
132126

@@ -153,12 +147,15 @@ def handle_content_model_manager(self, cms_config):
153147
"""
154148
for versionable in cms_config.versioning:
155149
replace_manager(versionable.content_model, "objects", PublishedContentManagerMixin)
156-
replace_manager(versionable.content_model, "admin_manager", AdminManagerMixin,
157-
_group_by_key=list(versionable.grouping_fields))
150+
replace_manager(
151+
versionable.content_model,
152+
"admin_manager",
153+
AdminManagerMixin,
154+
_group_by_key=list(versionable.grouping_fields),
155+
)
158156

159157
def handle_admin_field_modifiers(self, cms_config):
160-
"""Allows for the transformation of a given field in the ExtendedVersionAdminMixin
161-
"""
158+
"""Allows for the transformation of a given field in the ExtendedVersionAdminMixin"""
162159
extended_admin_field_modifiers = getattr(cms_config, "extended_admin_field_modifiers", None)
163160
if not isinstance(extended_admin_field_modifiers, list):
164161
raise ImproperlyConfigured("extended_admin_field_modifiers must be list of dictionaries")
@@ -171,9 +168,7 @@ def configure_app(self, cms_config):
171168
self.handle_admin_field_modifiers(cms_config)
172169
# Validation to ensure either the versioning or the
173170
# versioning_add_to_confirmation_context config has been defined
174-
has_extra_context = hasattr(
175-
cms_config, "versioning_add_to_confirmation_context"
176-
)
171+
has_extra_context = hasattr(cms_config, "versioning_add_to_confirmation_context")
177172
has_models_to_register = hasattr(cms_config, "versioning")
178173
if not has_extra_context and not has_models_to_register:
179174
raise ImproperlyConfigured(
@@ -257,9 +252,11 @@ def get_readonly_fields(self, request, obj=None):
257252
return fields
258253

259254
def get_queryset(self, request):
260-
queryset = super().get_queryset(request)\
255+
return (
256+
super()
257+
.get_queryset(request)
261258
.prefetch_related(Prefetch("versions", to_attr="prefetched_versions"))
262-
return queryset
259+
)
263260

264261
def copy_language(self, request, object_id):
265262
target_language = request.POST.get("target_language")
@@ -338,18 +335,18 @@ def get_indicator_menu(cls, request, page_content):
338335

339336

340337
class VersioningCMSConfig(CMSAppConfig):
341-
"""Implement versioning for core cms models
342-
"""
338+
"""Implement versioning for core cms models"""
339+
343340
cms_enabled = True
344-
djangocms_versioning_enabled = getattr(
345-
settings, "VERSIONING_CMS_MODELS_ENABLED", True
346-
)
341+
djangocms_versioning_enabled = getattr(settings, "VERSIONING_CMS_MODELS_ENABLED", True)
347342
versioning = [
348343
VersionableItem(
349344
content_model=PageContent,
350345
grouper_field_name="page",
351346
extra_grouping_fields=["language"],
352-
version_list_filter_lookups={"language": get_language_tuple},
347+
version_list_filter_lookups={
348+
"language": lambda *args: get_language_tuple(site_id=get_current_site(args[0]).pk)
349+
},
353350
copy_function=copy_page_content,
354351
grouper_selector_option_label=label_from_instance,
355352
on_publish=on_page_content_publish,

djangocms_versioning/cms_toolbars.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
from __future__ import annotations
2+
13
from collections import OrderedDict
24
from copy import copy
3-
from typing import Optional
45

56
from cms import __version__ as cms_version
67
from cms.cms_toolbars import (
@@ -297,10 +298,10 @@ class VersioningPageToolbar(PageToolbar):
297298
"""
298299

299300
def __init__(self, *args, **kwargs):
300-
self.page_content: Optional[PageContent] = None
301+
self.page_content: PageContent | None = None
301302
super().__init__(*args, **kwargs)
302303

303-
def get_page_content(self, language: Optional[str] = None) -> PageContent:
304+
def get_page_content(self, language: str | None = None) -> PageContent:
304305
# This method overwrites the method in django CMS core. Not necessary
305306
# for django CMS 4.2+
306307
if not language:

djangocms_versioning/datastructures.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from __future__ import annotations
2+
13
from collections.abc import Iterable
24
from itertools import chain
3-
from typing import Any, Optional
5+
from typing import Any
46

57
from cms.extensions.models import BaseExtension
68
from cms.models import Placeholder, PlaceholderRelationField
@@ -16,7 +18,7 @@
1618
class BaseVersionableItem:
1719
concrete = False
1820

19-
def __init__(self, content_model: type[models.Model], content_admin_mixin: Optional[type] = None):
21+
def __init__(self, content_model: type[models.Model], content_admin_mixin: type | None = None):
2022
self.content_model = content_model
2123
self.content_admin_mixin = content_admin_mixin or VersioningAdminMixin
2224

@@ -29,15 +31,15 @@ def __init__(
2931
content_model: type[models.Model],
3032
grouper_field_name: str,
3133
copy_function: callable,
32-
extra_grouping_fields: Optional[Iterable[str]] = None,
33-
version_list_filter_lookups: Optional[dict[str, Any]] = None,
34+
extra_grouping_fields: Iterable[str] | None = None,
35+
version_list_filter_lookups: dict[str, Any] | None = None,
3436
on_publish=None,
3537
on_unpublish=None,
3638
on_draft_create=None,
3739
on_archive=None,
3840
grouper_selector_option_label=False,
39-
grouper_admin_mixin: Optional[type] = None,
40-
content_admin_mixin: Optional[type] = None,
41+
grouper_admin_mixin: type | None = None,
42+
content_admin_mixin: type | None = None,
4143
preview_url=None,
4244
):
4345
super().__init__(content_model, content_admin_mixin)
@@ -161,7 +163,7 @@ def grouper_choices_queryset(self) -> models.QuerySet:
161163
cache_name = self.grouper_field.remote_field.get_accessor_name()
162164
return self.grouper_model._base_manager.prefetch_related(models.Prefetch(cache_name, queryset=content_objects))
163165

164-
def get_grouper_with_fallbacks(self, grouper_id) -> Optional[models.Model]:
166+
def get_grouper_with_fallbacks(self, grouper_id) -> models.Model | None:
165167
return self.grouper_choices_queryset().filter(pk=grouper_id).first()
166168

167169
def _get_content_types(self) -> set[int]:
@@ -193,7 +195,7 @@ class VersionableItemAlias(BaseVersionableItem):
193195
"""
194196

195197
def __init__(
196-
self, content_model: type[models.Model], to: BaseVersionableItem, content_admin_mixin: Optional[type] = None
198+
self, content_model: type[models.Model], to: BaseVersionableItem, content_admin_mixin: type | None = None
197199
):
198200
super().__init__(content_model, content_admin_mixin)
199201
self.to = to

djangocms_versioning/emails.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import typing
21
from urllib.parse import urljoin
32

43
from cms.toolbar.utils import get_object_preview_url
@@ -11,7 +10,7 @@
1110
from djangocms_versioning.helpers import send_email
1211

1312

14-
def get_full_url(location: str, site: typing.Union[Site, None] = None) -> str:
13+
def get_full_url(location: str, site: Site | None = None) -> str:
1514
if not site:
1615
site = Site.objects.get_current()
1716

djangocms_versioning/helpers.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
from __future__ import annotations
2+
13
import copy
24
import warnings
35
from collections.abc import Iterable
46
from contextlib import contextmanager
5-
from typing import Optional
67

78
from cms.models import Page, PageContent, Placeholder
89
from cms.toolbar.utils import get_object_edit_url, get_object_preview_url
@@ -71,7 +72,7 @@ def _replace_admin_for_model(modeladmin: type[admin.ModelAdmin], mixin: type, ad
7172
admin_site.register(modeladmin.model, new_admin_class)
7273

7374

74-
def replace_admin_for_models(pairs: tuple[type[models.Model], type], admin_site: Optional[admin.AdminSite] = None):
75+
def replace_admin_for_models(pairs: tuple[type[models.Model], type], admin_site: admin.AdminSite | None = None):
7576
"""
7677
:param models: List of (model class, admin mixin class) tuples
7778
:param admin_site: AdminSite instance
@@ -86,7 +87,7 @@ def replace_admin_for_models(pairs: tuple[type[models.Model], type], admin_site:
8687
_replace_admin_for_model(modeladmin, mixin, admin_site)
8788

8889

89-
def register_versionadmin_proxy(versionable, admin_site: Optional[admin.AdminSite] = None):
90+
def register_versionadmin_proxy(versionable, admin_site: admin.AdminSite | None = None):
9091
"""Creates a model admin class based on `VersionAdmin` and registers
9192
it with `admin_site` for `versionable.version_model_proxy`.
9293
@@ -281,7 +282,7 @@ def get_content_types_with_subclasses(models: Iterable[type[models.Model]], usin
281282

282283

283284
def get_preview_url(
284-
content_obj: models.Model, language: Optional[str] = None
285+
content_obj: models.Model, language: str | None = None
285286
) -> str:
286287
"""If the object is editable the cms preview view should be used, with the toolbar.
287288
This method provides the URL for it. It falls back the standard change view

djangocms_versioning/indicators.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import typing
1+
from __future__ import annotations
22

33
from cms.utils.urlutils import admin_reverse
44
from django.contrib.auth import get_permission_codename
@@ -92,8 +92,8 @@ def content_indicator_menu(request, status, versions, back=""):
9292

9393
def content_indicator(
9494
content_obj: models.Model,
95-
versions: typing.Optional[list[Version]] = None
96-
) -> typing.Optional[str]:
95+
versions: list[Version] | None = None
96+
) -> str | None:
9797
"""Translates available versions into status to be reflected by the indicator.
9898
Function caches the result in the page_content object"""
9999

djangocms_versioning/migrations/0001_initial.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
# -*- coding: utf-8 -*-
21
# Generated by Django 1.11.13 on 2018-06-12 12:21
3-
from __future__ import unicode_literals
42

53
from django.db import migrations, models
64

djangocms_versioning/migrations/0002_delete_campaign.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
# -*- coding: utf-8 -*-
21
# Generated by Django 1.11.14 on 2018-07-24 12:42
3-
from __future__ import unicode_literals
42

53
from django.db import migrations
64

djangocms_versioning/migrations/0003_version.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
# -*- coding: utf-8 -*-
21
# Generated by Django 1.11 on 2018-07-30 14:41
3-
from __future__ import unicode_literals
42

53
from django.db import migrations, models
64
import django.db.models.deletion

0 commit comments

Comments
 (0)