Skip to content

Commit 02931f7

Browse files
committed
Merge pull request django-cms#4724 from yakky/merge/3.1.4.pre
Forwardport 3.1.x fixes
2 parents 2bb13b4 + 7934e09 commit 02931f7

File tree

7 files changed

+104
-13
lines changed

7 files changed

+104
-13
lines changed

CHANGELOG.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
- Fix JS error when using PageSelectWidget
6262
- Fix whitespace markup issues in draft mode
6363
- Detect plugin migrations layout in tests
64+
- Fix some treebeard corruption issues
6465

6566

6667
=== 3.1.3 (2015-09-01) ===
@@ -601,3 +602,4 @@ Please see Install/2.4 release notes *before* attempting to upgrade to version 2
601602
- home is now graphically designated in tree-view
602603

603604
==== 2.0.0 (2009-11-12) ====
605+

cms/admin/permissionadmin.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.contrib.admin import site
55
from django.contrib.auth import get_user_model, get_permission_codename
66
from django.contrib.auth.admin import UserAdmin
7+
from django.db import OperationalError
78
from django.utils.translation import ugettext as _
89

910
from cms.admin.forms import GlobalPagePermissionAdminForm, PagePermissionInlineAdminForm, ViewRestrictionInlineAdminForm
@@ -37,9 +38,18 @@ class PagePermissionInlineAdmin(TabularInline):
3738
def raw_id_fields(cls):
3839
# Dynamically set raw_id_fields based on settings
3940
threshold = get_cms_setting('RAW_ID_USERS')
40-
if threshold and get_user_model().objects.count() > threshold:
41-
return ['user']
42-
return []
41+
42+
# Given a fresh django-cms install and a django settings with the
43+
# CMS_RAW_ID_USERS = CMS_PERMISSION = True
44+
# django throws an OperationalError when running
45+
# ./manage migrate
46+
# because auth_user doesn't exists yet
47+
try:
48+
threshold = threshold and get_user_model().objects.count() > threshold
49+
except OperationalError:
50+
threshold = False
51+
52+
return ['user'] if threshold else []
4353

4454
def get_queryset(self, request):
4555
"""

cms/models/pagemodel.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,12 @@ def copy_page(self, target, site, position='first-child',
445445
menu_pool.clear(site_id=site.pk)
446446
return first_page
447447

448+
def delete(self):
449+
pages = [self.pk]
450+
if self.publisher_public_id:
451+
pages.append(self.publisher_public_id)
452+
self.__class__.objects.filter(pk__in=pages).delete()
453+
448454
def save(self, no_signals=False, commit=True, **kwargs):
449455
"""
450456
Args:

cms/templates/cms/toolbar/plugin.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% spaceless %}{% load i18n l10n sekizai_tags static cms_tags %}
1+
{% spaceless %}{% load i18n l10n sekizai_tags staticfiles cms_tags %}
22

33
<div class="cms-plugin cms-plugin-{% if generic %}{{ generic.app_label }}-{{ generic.model_name }}-{% if attribute_name %}{{ attribute_name|slugify }}-{% endif %}{% endif %}{{ instance.pk|unlocalize }}{% if render_model_icon %} cms-render-model-icon{% elif render_model %} cms-render-model{% elif render_model_block %} cms-render-model cms-render-model-block{% elif render_model_add %} cms-render-model-add{% endif %}">{% endspaceless %}{% if content %}{{ content }}{% elif render_model_icon %}<img src="{% static 'cms/img/toolbar/render_model_placeholder.png' %}">{% elif render_model_add %}<img src="{% static 'cms/img/toolbar/render_model_placeholder.png' %}">{% else %}{{ rendered_content }}{% endif %}{% spaceless %}</div>
44

cms/tests/test_page.py

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,12 @@ def test_treebeard_delete(self):
103103
page1 = create_page('home', 'nav_playground.html', 'en')
104104
page2 = create_page('page2', 'nav_playground.html', 'en', parent=page1)
105105
page3 = create_page('page3', 'nav_playground.html', 'en', parent=page2)
106-
page1 = page1.reload()
107-
page2 = page2.reload()
108-
page3 = page3.reload()
106+
page1.publish('en')
107+
page2.publish('en')
108+
page3.publish('en')
109+
page1 = page1.reload().get_draft_object()
110+
page2 = page2.reload().get_draft_object()
111+
page3 = page3.reload().get_draft_object()
109112

110113
self.assertEqual(page1.depth, 1)
111114
self.assertEqual(page1.numchild, 1)
@@ -120,16 +123,67 @@ def test_treebeard_delete(self):
120123
self.assertTrue(page3.is_leaf())
121124

122125
page3.delete()
123-
page1 = page1.reload()
124-
page2 = page2.reload()
126+
page1 = page1.reload().get_draft_object()
127+
page2 = page2.reload().get_draft_object()
128+
129+
self.assertEqual(page2.depth, 2)
130+
self.assertEqual(page2.numchild, 0)
131+
self.assertTrue(page2.is_leaf())
132+
133+
page3 = create_page('page3', 'nav_playground.html', 'en', parent=page2, reverse_id='page3')
134+
page1 = page1.reload().get_draft_object()
135+
page2 = page2.reload().get_draft_object()
136+
page3 = page3.reload().get_draft_object()
137+
138+
self.assertEqual(page2.depth, 2)
139+
self.assertEqual(page2.numchild, 1)
140+
self.assertFalse(page2.is_leaf())
141+
142+
self.assertEqual(page3.depth, 3)
143+
self.assertEqual(page3.numchild, 0)
144+
self.assertTrue(page3.is_leaf())
145+
146+
page1.publish('en')
147+
page1 = page1.reload().get_draft_object()
148+
page2 = page2.reload().get_draft_object()
149+
page3 = page3.reload().get_draft_object()
150+
151+
page2.publish('en')
152+
page1 = page1.reload().get_draft_object()
153+
page2 = page2.reload().get_draft_object()
154+
page3 = page3.reload().get_draft_object()
155+
156+
page3.publish('en')
157+
page1 = page1.reload().get_draft_object()
158+
page2 = page2.reload().get_draft_object()
159+
page3 = page3.reload().get_draft_object()
160+
page1_p = page1.reload().get_public_object()
161+
page2_p = page2.reload().get_public_object()
162+
page3_p = page3.reload().get_public_object()
125163

126164
self.assertEqual(page1.depth, 1)
127165
self.assertEqual(page1.numchild, 1)
128166
self.assertFalse(page1.is_leaf())
129167

130168
self.assertEqual(page2.depth, 2)
131-
self.assertEqual(page2.numchild, 0)
132-
self.assertTrue(page2.is_leaf())
169+
self.assertEqual(page2.numchild, 1)
170+
self.assertFalse(page2.is_leaf())
171+
172+
self.assertEqual(page3.depth, 3)
173+
self.assertEqual(page3.numchild, 0)
174+
self.assertTrue(page3.is_leaf())
175+
176+
self.assertEqual(page1_p.depth, 1)
177+
self.assertEqual(page1_p.numchild, 1)
178+
self.assertFalse(page1_p.is_leaf())
179+
180+
self.assertEqual(page2_p.depth, 2)
181+
self.assertEqual(page2_p.numchild, 1)
182+
self.assertFalse(page2_p.is_leaf())
183+
184+
self.assertEqual(page3_p.depth, 3)
185+
self.assertEqual(page3_p.numchild, 0)
186+
self.assertTrue(page3_p.is_leaf())
133187

134188
def test_create_page_admin(self):
135189
"""

cms/tests/test_publisher.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,9 +537,18 @@ def test_publish_ordering2(self):
537537
pageC = self.create_page('pageC', published=False, parent=pageA)
538538
pageB = self.create_page('pageB', published=False, parent=pageA)
539539
page = page.reload()
540+
pageA = pageA.reload()
541+
pageB = pageB.reload()
542+
pageC = pageC.reload()
540543
pageA.publish('en')
544+
page = page.reload()
545+
pageB = pageB.reload()
546+
pageC = pageC.reload()
541547
pageB.publish('en')
548+
page = page.reload()
549+
pageC = pageC.reload()
542550
pageC.publish('en')
551+
page = page.reload()
543552
page.publish('en')
544553

545554
drafts = Page.objects.filter(publisher_is_draft=True).order_by('path')
@@ -550,7 +559,6 @@ def test_publish_ordering2(self):
550559
self.assertEqual(draft.publisher_public_id, publics[x].pk)
551560
x += 1
552561

553-
554562
def test_unpublish_unpublish(self):
555563
name = self._testMethodName
556564
page = self.create_page(name, published=True)

docs/upgrade/3.1.4.rst

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,23 @@ Bug Fixes
1212
=========
1313

1414
* Fix use structure migration
15-
* Fix fix_tree command
15+
* Fix fix-tree command
1616
* Remove some warning for Django 1.9
1717
* Fix using scroll bar of plugin menu in Firefox & IE moves plugins
1818
* Fix JS error when using PageSelectWidget
1919
* Fix whitespace markup issues in draft mode
2020
* Detect plugin migrations layout in tests
21+
* Fix some treebeard corruption issues
22+
23+
24+
Treebeard corruptions
25+
=====================
26+
27+
Prior to 3.1.4 deleting pages may lead to some non-fatal tree
28+
corruptions when results in error 500 when publishing, deleting,
29+
moving pages.
30+
To fix these issues, upgrade to 3.1.4 and then executes
31+
``manage.py cms fix-tree`` command to restore the correct data.
2132

2233

2334

0 commit comments

Comments
 (0)