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

Skip to content

Commit e4650ec

Browse files
fsbraunGithub Release Action
andcommitted
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 842f347 commit e4650ec

File tree

7 files changed

+29
-8
lines changed

7 files changed

+29
-8
lines changed

.github/workflows/test_startcmsproject.yml

Lines changed: 2 additions & 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-
'3.2', '4.2',
16+
'4.2', '5.0', '5.1'
1717
]
1818
python-version: ['3.11']
1919
requirements-file: ['requirements_base.txt']
@@ -34,5 +34,6 @@ jobs:
3434
python -m venv .venv
3535
source ./.venv/bin/activate
3636
python -m pip install --upgrade pip
37+
pip install Django~=${{ matrix.django-version }}
3738
pip install -e .
3839
djangocms mysite --noinput

cms/admin/placeholderadmin.py

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

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

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
@@ -575,7 +575,7 @@ def _get_content(self, context, instance, attribute, language, filters):
575575
if not attr_value:
576576
attr_value = getattr(instance, attribute, '')
577577
extra_context['content'] = attr_value
578-
# This allow the requested item to be a method, a property or an
578+
# This allows the requested item to be a method, a property or an
579579
# attribute
580580
if callable(extra_context['content']):
581581
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
static_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