Skip to content

Commit eca1218

Browse files
authored
Merge pull request #3 from maykinmedia/feature/1234-correct-page-content
Feature/1234 correct page content
2 parents 779459a + 9e59ca0 commit eca1218

10 files changed

+100
-72
lines changed

changes/1234.feature

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fix toolbar page content

cms_helper.py

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def gettext(s):
1919
"taggit",
2020
"taggit_autosuggest",
2121
"meta",
22+
"djangocms_versioning",
2223
# "djangocms_page_tags",
2324
"tests.test_utils",
2425
],

djangocms_page_meta/cms_toolbars.py

+18-21
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
from cms.cms_toolbars import PAGE_MENU_SECOND_BREAK
2+
from cms.models import PageContent
23
from cms.toolbar.items import Break
34
from cms.toolbar_base import CMSToolbar
45
from cms.toolbar_pool import toolbar_pool
6+
from cms.utils.conf import get_cms_setting
57
from cms.utils.i18n import get_language_list, get_language_object
68
from cms.utils.permissions import has_page_permission
79
from django.urls import NoReverseMatch, reverse
810
from django.utils.translation import gettext_lazy as _
911

1012
from .models import DefaultMetaImage, PageMeta, TitleMeta
1113

12-
try:
13-
from cms.utils import get_cms_setting
14-
except ImportError:
15-
from cms.utils.conf import get_cms_setting
16-
17-
1814
PAGE_META_MENU_TITLE = _("Meta-information")
1915
PAGE_META_ITEM_TITLE = _("Common")
2016
PAGE_META_DEFAULT_META_IMAGE_TITLE = _("Default meta image")
@@ -23,8 +19,6 @@
2319
@toolbar_pool.register
2420
class PageToolbarMeta(CMSToolbar):
2521
def populate(self):
26-
# always use draft if we have a page
27-
# self.page = get_page_draft(self.request.current_page)
2822
self.page = self.request.current_page
2923
if not self.page:
3024
# Nothing to do
@@ -41,10 +35,9 @@ def populate(self):
4135
else:
4236
has_global_current_page_change_permission = False
4337
# check if user has page edit permission
44-
permission = self.request.current_page.has_change_permission(self.request.user)
45-
can_change = self.request.current_page and permission
38+
permission = self.page.has_change_permission(self.request.user)
39+
can_change = self.page and permission
4640
if has_global_current_page_change_permission or can_change:
47-
not_edit_mode = not self.toolbar.edit_mode_active
4841

4942
current_page_menu = self.toolbar.get_or_create_menu("page")
5043
super_item = current_page_menu.find_first(Break, identifier=PAGE_MENU_SECOND_BREAK)
@@ -76,30 +69,34 @@ def populate(self):
7669
# not in urls
7770
pass
7871
else:
79-
meta_menu.add_modal_item(PAGE_META_ITEM_TITLE, url=url, disabled=not_edit_mode, position=position)
80-
# Title tags
72+
meta_menu.add_modal_item(PAGE_META_ITEM_TITLE, url=url, position=position)
73+
# Content tags
8174
site_id = self.page.node.site_id
82-
titles = self.page.pagecontent_set.filter(language__in=get_language_list(site_id))
8375

76+
contents = PageContent.admin_manager.filter(
77+
page=self.page, language__in=get_language_list(site_id)
78+
).current_content()
79+
80+
# TODO: rename to content extensions
8481
title_extensions = {
8582
t.extended_object_id: t
86-
for t in TitleMeta.objects.filter(extended_object_id__in=[title.id for title in titles])
83+
for t in TitleMeta.objects.filter(extended_object_id__in=[content.id for content in contents])
8784
}
8885

89-
for title in titles:
86+
for content in contents:
9087
try:
91-
if title.pk in title_extensions:
88+
if content.pk in title_extensions:
9289
url = reverse(
93-
"admin:djangocms_page_meta_titlemeta_change", args=(title_extensions[title.pk].pk,)
90+
"admin:djangocms_page_meta_titlemeta_change", args=(title_extensions[content.pk].pk,)
9491
)
9592
else:
9693
url = "{}?extended_object={}".format(
97-
reverse("admin:djangocms_page_meta_titlemeta_add"), title.pk
94+
reverse("admin:djangocms_page_meta_titlemeta_add"), content.pk
9895
)
9996
except NoReverseMatch:
10097
# not in urls
10198
pass
10299
else:
103100
position += 1
104-
language = get_language_object(title.language)
105-
meta_menu.add_modal_item(language["name"], url=url, disabled=not_edit_mode, position=position)
101+
language = get_language_object(content.language)
102+
meta_menu.add_modal_item(language["name"], url=url, position=position)

djangocms_page_meta/models.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
except ImportError:
2525
registry = None
2626

27+
from djangocms_versioning.constants import INDICATOR_DESCRIPTIONS
28+
2729

2830
class PageMeta(PageExtension):
2931
image = FilerFileField(
@@ -127,8 +129,12 @@ class Meta:
127129
verbose_name = _("Page meta info (language-dependent)")
128130
verbose_name_plural = _("Page meta info (language-dependent)")
129131

132+
def get_version_status(self):
133+
state = self.extended_object.versions.first().state
134+
return INDICATOR_DESCRIPTIONS[state]
135+
130136
def __str__(self):
131-
return _("Title Meta for {0}").format(self.extended_object)
137+
return _("Page Content Meta for {0}").format(self.extended_object) + f": {self.get_version_status()}"
132138

133139
@property
134140
def locale(self):

djangocms_page_meta/utils.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from cms.models import PageContent
12
from django.template.loader import render_to_string
23
from django.utils.safestring import mark_safe
34
from django.utils.translation import get_language_from_request
@@ -39,7 +40,7 @@ def get_page_meta(page, language):
3940
meta = cache.get(meta_key)
4041
if not meta:
4142
meta = Meta()
42-
title = page.get_content_obj(language)
43+
title = PageContent.admin_manager.filter(page=page, language=language).current_content().get()
4344
default_meta_image = DefaultMetaImage.objects.first().image
4445
meta.extra_custom_props = []
4546

setup.cfg

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ install_requires =
3333
django-cms~=4.1
3434
django-meta>=2.4.0
3535
django-filer>=3.0
36+
djangocms-versioning>=2
3637
setup_requires =
3738
setuptools
3839
packages = djangocms_page_meta

tests/base.py

+8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from app_helper.base_test import CreateTestDataMixin
55
from cms.api import create_page, create_page_content
6+
from cms.models import PageContent
67
from cms.test_utils.testcases import CMSTestCase
78
from django.contrib.auth.models import Permission
89
from django.core.cache import cache
@@ -90,12 +91,14 @@ def create_pages(self):
9091

9192
main_data = deepcopy(page_data[self.language])
9293
main_data["language"] = self.language
94+
main_data["created_by"] = self.superuser
9395
page = create_page(**main_data)
9496

9597
for lang in self.languages[1:]:
9698
context_data = deepcopy(page_data[lang])
9799
context_data["language"] = lang
98100
context_data["page"] = page
101+
context_data["created_by"] = self.superuser
99102
create_page_content(**context_data)
100103

101104
if not home_set:
@@ -118,3 +121,8 @@ def _add_default_permissions(self, user):
118121
def create_filer_image_object(self):
119122
self.filer_image = self.create_filer_image(self.staff_user, self.image_name)
120123
return self.filer_image
124+
125+
def publish_page(self, page, language):
126+
content = PageContent.admin_manager.get(page=page, language=language)
127+
version = content.versions.first()
128+
version.publish(self.superuser)

tests/test_general.py

+37-28
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
from cms.models import PageContent
12
from django.conf import settings
23
from django.core.cache import cache
34
from django.template.base import Parser
45
from django.test import override_settings
56
from django.utils.functional import SimpleLazyObject
7+
from djangocms_versioning.constants import INDICATOR_DESCRIPTIONS
68

79
from djangocms_page_meta import models
810
from djangocms_page_meta.forms import PageMetaAdminForm, TitleMetaAdminForm
@@ -182,7 +184,8 @@ def test_custom_extra(self):
182184
page1 = self.create_pages()[0]
183185
page_meta = models.PageMeta.objects.create(extended_object=page1)
184186
page_meta.save()
185-
title_meta = models.TitleMeta.objects.create(extended_object=page1.get_content_obj("en"))
187+
content = PageContent.admin_manager.get(page=page1, language="en")
188+
title_meta = models.TitleMeta.objects.create(extended_object=content)
186189
title_meta.save()
187190

188191
models.GenericMetaAttribute.objects.create(page=page_meta, attribute="custom", name="attr", value="foo")
@@ -196,37 +199,41 @@ def test_custom_extra(self):
196199
meta = get_page_meta(page1, "it")
197200
self.assertEqual(meta.extra_custom_props, [("custom", "attr", "foo")])
198201

199-
# def test_publish_extra(self):
200-
# """
201-
# Test that modified GenericMetaAttribute are not copied multiple times on page publish
202-
# See issue #78
203-
# """
204-
# page1 = self.create_pages()[0]
205-
# page_meta = models.PageMeta.objects.create(extended_object=page1)
206-
# title_meta = models.TitleMeta.objects.create(extended_object=page1.get_content_obj("en"))
207-
# models.GenericMetaAttribute.objects.create(page=page_meta, attribute="custom", name="attr", value="foo")
208-
# models.GenericMetaAttribute.objects.create(title=title_meta, attribute="custom", name="attr", value="bar")
209-
#
210-
# page1.publish("en")
211-
# page_meta.extra.first().attribute = "new"
212-
# page_meta.extra.first().save()
213-
# title_meta.extra.first().attribute = "new"
214-
# title_meta.extra.first().save()
215-
#
216-
# page1.publish("en")
217-
# public = page1.get_public_object()
218-
# page_meta = models.PageMeta.objects.get(extended_object=public)
219-
# title_meta = models.TitleMeta.objects.get(extended_object=public.get_content_obj("en"))
220-
# self.assertEqual(page_meta.extra.count(), 1)
221-
# self.assertEqual(title_meta.extra.count(), 1)
202+
def test_publish_extra(self):
203+
"""
204+
Test that modified GenericMetaAttribute are not copied multiple times on page publish
205+
See issue #78
206+
"""
207+
page1 = self.create_pages()[0]
208+
page_meta = models.PageMeta.objects.create(extended_object=page1)
209+
content = PageContent.admin_manager.get(page=page1, language="en")
210+
title_meta = models.TitleMeta.objects.create(extended_object=content)
211+
models.GenericMetaAttribute.objects.create(page=page_meta, attribute="custom", name="attr", value="foo")
212+
models.GenericMetaAttribute.objects.create(title=title_meta, attribute="custom", name="attr", value="bar")
213+
214+
version = content.versions.first()
215+
version.publish(self.superuser)
216+
page_meta.extra.first().attribute = "new"
217+
page_meta.extra.first().save()
218+
title_meta.extra.first().attribute = "new"
219+
title_meta.extra.first().save()
220+
221+
new_version = version.copy(self.superuser)
222+
new_version.publish(self.superuser)
223+
public = page1 # page no longer versioned
224+
page_meta = models.PageMeta.objects.get(extended_object=public)
225+
title_meta = models.TitleMeta.objects.get(extended_object=public.get_content_obj("en"))
226+
self.assertEqual(page_meta.extra.count(), 1)
227+
self.assertEqual(title_meta.extra.count(), 1)
222228

223229
def test_str_methods(self):
224230
"""
225231
Models str are created
226232
"""
227233
page1 = self.create_pages()[0]
228234
page_meta = models.PageMeta.objects.create(extended_object=page1)
229-
title_meta = models.TitleMeta.objects.create(extended_object=page1.get_content_obj("en"))
235+
content = PageContent.admin_manager.get(page=page1, language="en")
236+
title_meta = models.TitleMeta.objects.create(extended_object=content)
230237
default_meta_image = models.DefaultMetaImage.objects.first()
231238
page_attr = models.GenericMetaAttribute.objects.create(
232239
page=page_meta, attribute="custom", name="attr", value="foo"
@@ -236,7 +243,7 @@ def test_str_methods(self):
236243
)
237244

238245
self.assertEqual(str(page_meta), f"Page Meta for {page1}")
239-
self.assertEqual(str(title_meta), f"Title Meta for {page1.get_content_obj('en')}")
246+
self.assertEqual(str(title_meta), f"Page Content Meta for {content}: {INDICATOR_DESCRIPTIONS['draft']}")
240247
self.assertEqual(str(default_meta_image), f"{default_meta_image.pk}")
241248
self.assertEqual(str(page_attr), f"Attribute {page_attr.name} for {page_meta}")
242249
self.assertEqual(str(title_attr), f"Attribute {title_attr.name} for {title_meta}")
@@ -258,7 +265,8 @@ def test_cache_cleanup_on_update_delete_meta(self):
258265
"""
259266
page1 = self.create_pages()[0]
260267
page_meta = models.PageMeta.objects.create(extended_object=page1)
261-
title_meta = models.TitleMeta.objects.create(extended_object=page1.get_content_obj("en"))
268+
content = PageContent.admin_manager.get(page=page1, language="en")
269+
title_meta = models.TitleMeta.objects.create(extended_object=content)
262270

263271
# cache objects
264272
for language in page1.get_languages():
@@ -299,7 +307,8 @@ def test_cache_cleanup_on_update_delete_page(self):
299307
"""
300308
page1 = self.create_pages()[0]
301309
page_meta = models.PageMeta.objects.create(extended_object=page1)
302-
title_meta = models.TitleMeta.objects.create(extended_object=page1.get_content_obj("en"))
310+
content = PageContent.admin_manager.get(page=page1, language="en")
311+
title_meta = models.TitleMeta.objects.create(extended_object=content)
303312

304313
# cache objects - cache keys must be pre calculated as the page will not exist anymore when running the
305314
# asserts

0 commit comments

Comments
 (0)