8000 fix: Respect ContentAdminManager pattern for frontend-editable models… · django-cms/django-cms@a56decf · GitHub
[go: up one dir, main page]

Skip to content

Commit a56decf

Browse files
fsbraunGithub Release Action
andauthored
fix: Respect ContentAdminManager pattern for frontend-editable models (#7998)
* fix: Respect ContentAdminManager pattern for frontend-editable models * Add test * Fix test * Remove unnecessary imports * Remove breadcrumbs from plugin error form * Fix: Also respect admin manager (cache) in toolbar --------- Co-authored-by: Github Release Action <info@django-cms.org>
1 parent 00f6f9e commit a56decf

File tree

8 files changed

+29
-9
lines changed

8 files changed

+29
-9
lines changed

.github/workflows/test_startcmsproject.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
fail-fast: false
1414
matrix:
1515
django-version: [
16-
'4.2', '5.0',
16+
'4.2', '5.0', '5.1'
1717
]
1818
python-version: ['3.11']
1919
requirements-file: ['requirements_base.txt']

cms/admin/placeholderadmin.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,15 @@ def _get_object_for_single_field(self, object_id, language):
104104
# Quick and dirty way to retrieve objects for django-hvad
105105
# Cleaner implementation will extend this method in a child mixin
106106
try:
107-
return self.model.objects.language(language).get(pk=object_id)
107+
# First see if the model uses the admin manager pattern from cms.models.manager.ContentAdminManager
108+
manager = self.model.admin_manager
108109
except AttributeError:
109-
return self.model.objects.get(pk=object_id)
110+
# If not, use the default manager
111+
manager = self.model.objects
112+
try:
113+
return manager.language(language).get(pk=object_id)
114+
except AttributeError:
115+
return manager.get(pk=object_id)
110116

111117
def edit_field(self, request, object_id, language):
112118
obj = self._get_object_for_single_field(object_id, language)

cms/cms_toolbars.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ def get_page_content(self):
393393
# Toolbar object already set (e.g., in edit or preview mode)
394394
return self.obj
395395
# Get from db
396-
page_content = self.page.get_content_obj(language=self.current_lang, fallback=False)
396+
page_content = self.page.get_admin_content(language=self.current_lang, fallback=False)
397397
return page_content or None
398398

399399
def has_page_change_permission(self):

cms/models/fields.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,6 @@ class Post(models.Model):
130130
@cached_property
131131
def content(self):
132132
return get_placeholder_from_slot(self.placeholders, "content") # A specific placeholder
133-
134-
135-
136133
"""
137134
default_checks = []
138135

cms/templates/admin/cms/page/plugin/error_form.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{% load i18n l10n static %}
33

44
{% block title %}{% trans "Edit model" %}{% endblock %}
5-
5+
{% block breadcrumbs %}{% endblock %}
66
{% block content %}
77
<form action="." method="post" id="cmsplugin_form">
88
{% csrf_token %}

cms/templatetags/cms_tags.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ def _get_content(self, context, instance, attribute, language, filters):
608608
if not attr_value:
609609
attr_value = getattr(instance, attribute, '')
610610
extra_context['content'] = attr_value
611-
# This allow the requested item to be a method, a property or an
611+
# This allows the requested item to be a method, a property or an
612612
# attribute
613613
if callable(extra_context['content']):
614614
if isinstance(instance, Page):

cms/test_utils/project/placeholderapp/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.db import models
22
from django.urls import reverse
33

4+
from cms.models import ContentAdminManager
45
from cms.models.fields import PlaceholderField
56
from cms.utils import get_language_from_request
67
from cms.utils.urlutils import admin_reverse
@@ -26,6 +27,9 @@ class Example1(models.Model):
2627
max_digits=5, decimal_places=1,
2728
blank=True, null=True,)
2829

30+
admin_manager = ContentAdminManager()
31+
objects = models.Manager()
32+
2933
st A3E2 atic_admin_url = ''
3034

3135
def __init__(self, *args, **kwargs):

cms/tests/test_toolbar.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1724,6 +1724,19 @@ def test_view_method(self):
17241724
self.assertContains(
17251725
response, "edit_plugin: '/admin/placeholderapp/example1/edit-field/%s/en/" % ex1.pk)
17261726

1727+
def test_edit_field_respects_content_admin_mixin(self):
1728+
user = self.get_staff()
1729+
ex1 = self._get_example_obj()
1730+
edit_url = admin_reverse('placeholderapp_example1_edit_field', args=(ex1.pk, "en"))
1731+
1732+
with patch('cms.test_utils.project.placeholderapp.models.Example1.admin_manager.get') as get_mock:
1733+
with self.login_user_context(user):
1734+
get_mock.return_value = ex1
1735+
self.client.get(edit_url + "?edit_fields=char_1")
1736+
1737+
self.assertEqual(edit_url, f"/admin/placeholderapp/example1/edit-field/{ex1.pk}/en/")
1738+
Example1.admin_manager.get.assert_called_once_with(pk=str(ex1.pk))
1739+
17271740
def test_view_url(self):
17281741
user = self.get_staff()
17291742
page = create_page('Test', 'col_two.html', 'en')

0 commit comments

Comments
 (0)
0