8000 fix: Grouper admin raised AttributeError when used outside the admin views by fsbraun · Pull Request #8067 · django-cms/django-cms · GitHub
[go: up one dir, main page]

Skip to content

fix: Grouper admin raised AttributeError when used outside the admin views #8067

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Nov 6, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Fix: GrouperModelAdmin raised an AttributeError if used outside the a…
…dmin app
  • Loading branch information
Github Release Action authored and marksweb committed Nov 6, 2024
commit f532ee1912f19e57bc1b3edeebfb0f33e3a9a7dc
14 changes: 11 additions & 3 deletions cms/admin/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -387,16 +387,24 @@ def get_grouping_from_request(self, request: HttpRequest) -> None:
@property
def current_content_filters(self) -> dict[str, typing.Any]:
"""Filters needed to get the correct content model instance"""
return {field: getattr(self, field) for field in self.extra_grouping_fields}
return {field: getattr(self, field, self.get_extra_grouping_field(field)) for field in self.extra_grouping_fields}

def get_language(self) -> str:
"""Hook on how to get the current language. By default, Django provides it."""
return get_language()
"""Hook on how to get the current language. By default, if it is set as a
property, use the property, otherwise let Django provide it."""
return getattr(self, "language", get_language())

def get_language_tuple(self) -> tuple[tuple[str, str], ...]:
"""Hook on how to get all available languages for the language selector."""
return get_language_tuple()

def get_extra_grouping_field(self, field):
"""Retrieves the current value for grouping fields - by default by calling self.get_<field>, e.g.,
self.get_language(). If those are not implemented, this method will fail."""
if callable(getattr(self, f"get_{field}", None)):
return getattr(self, f"get_{field}")()
raise ValueError("Cannot get extra grouping field")

def get_changelist(self, request: HttpRequest, **kwargs) -> type:
"""Allow for extra grouping fields as a non-filter parameter"""
return type(
Expand Down
24 changes: 24 additions & 0 deletions cms/tests/test_grouper_admin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.contrib.admin import site
from django.templatetags.static import static
from django.utils.crypto import get_random_string
from django.utils.translation import get_language, override as force_language

from cms.admin.utils import CONTENT_PREFIX
from cms.test_utils.project.sampleapp.models import (
Expand Down Expand Up @@ -126,6 +127,29 @@ def test_content_model_detected(self) -> None:
admin = site._registry[GrouperModel]
self.assertEqual(admin.content_model, GrouperModelContent)

def test_extra_grouping_field_fixed(self):
"""Extra grouping fields are retrieved correctly"""
with force_language("en"):
expected_language = "zh"
self.admin.language = expected_language

admin_language = self.admin.get_language()
current_content_filters = self.admin.current_content_filters

self.assertEqual(admin_language, expected_language)
self.assertEqual(current_content_filters["language"], expected_language)

def test_extra_grouping_field_current(self):
"""Extra grouping fields (language) when not set return current default correctly"""
del self.admin.language # No pre-set language
expected_language = get_language()

admin_language = self.admin.get_language()
current_content_filters = self.admin.current_content_filters

self.assertEqual(admin_language, expected_language)
self.assertEqual(current_content_filters["language"], expected_language)


class GrouperChangeListTestCase(SetupMixin, CMSTestCase):
def test_language_selector(self):
Expand Down
0