8000 Refactored PageNode into TreeNode · django-cms/django-cms@29000ef · GitHub
[go: up one dir, main page]

Skip to content

Commit 29000ef

Browse files
committed
Refactored PageNode into TreeNode
1 parent d3eb7b9 commit 29000ef

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+870
-1159
lines changed

cms/admin/forms.py

Lines changed: 35 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
from cms.constants import PAGE_TYPES_ID, PUBLISHER_STATE_DIRTY, ROOT_USER_LEVEL
2020
from cms.forms.validators import validate_relative_url, validate_url_uniqueness
2121
from cms.forms.widgets import UserSelectAdminWidget, AppHookSelect, ApplicationConfigSelect
22-
from cms.models import (CMSPlugin, Page, PageNode, PageType, PagePermission, PageUser, PageUserGroup, Title,
23-
Placeholder, GlobalPagePermission)
22+
from cms.models import (CMSPlugin, Page, PageType, PagePermission, PageUser, PageUserGroup, Title,
23+
Placeholder, GlobalPagePermission, TreeNode)
2424
from cms.models.permissionmodels import User
2525
from cms.plugin_pool import plugin_pool
2626
from cms.signals.apphook import set_restart_trigger
@@ -152,7 +152,7 @@ class AddPageForm(BasePageForm):
152152
required=False,
153153
)
154154
parent_node = forms.ModelChoiceField(
155-
queryset=PageNode.objects.all(),
155+
queryset=TreeNode.objects.all(),
156156
required=False,
157157
widget=forms.HiddenInput(),
158158
)
@@ -169,16 +169,12 @@ def __init__(self, *args, **kwargs):
169169
if not source_field or source_field.widget.is_hidden:
170170
return
171171

172-
root_node = PageType.get_root_node(site=self._site)
172+
root_page = PageType.get_root_page(site=self.< F438 span class="pl-c1">_site)
173173

174-
if root_node:
174+
if root_page:
175175
# Set the choicefield's choices to the various page_types
176-
descendants = root_node.get_descendants()
177-
titles = Title.objects.filter(
178-
page__is_page_type=True,
179-
page__nodes__in=descendants,
180-
language=self._language,
181-
)
176+
descendants = root_page.get_descendant_pages().filter(is_page_type=True)
177+
titles = Title.objects.filter(page__in=descendants, language=self._language)
182178
choices = [('', '---------')]
183179
choices.extend((title.page_id, title.title) for title in titles)
184180
source_field.choices = choices
@@ -200,7 +196,7 @@ def clean(self):
200196

201197
if parent_node:
202198
slug = data['slug']
203-
parent_path = parent_node.page.get_path(self._language)
199+
parent_path = parent_node.item.get_path(self._language)
204200
path = u'%s/%s' % (parent_path, slug) if parent_path else slug
205201
else:
206202
path = data['slug']
@@ -225,15 +221,6 @@ def clean_parent_node(self):
225221
raise ValidationError("Site doesn't match the parent's page site")
226222
return parent_node
227223

228-
def create_page_node(self, page, parent=None):
229-
new_node = PageNode(page=page, site=page.site)
230-
231-
if parent:
232-
parent.add_child(instance=new_node)
233-
else:
234-
PageNode.add_root(instance=new_node)
235-
return new_node
236-
237224
def create_translation(self, page):
238225
data = self.cleaned_data
239226
title_kwargs = {
@@ -275,16 +262,14 @@ def save(self, *args, **kwargs):
275262

276263
if source:
277264
new_page = self.from_source(source, parent=parent)
278-
new_node = new_page.get_node_object(self._site)
279265

280266
for lang in source.get_languages():
281267
source._copy_contents(new_page, lang)
282268
else:
283269
new_page = super(AddPageForm, self).save(commit=False)
284270
new_page.template = self.get_template()
285-
new_page.site = self._site
271+
new_page.set_tree_node(self._site, target=parent, position='last-child')
286272
new_page.save()
287-
new_node = self.create_page_node(new_page, parent=parent)
288273

289274
translation = self.create_translation(new_page)
290275

@@ -296,10 +281,10 @@ def save(self, *args, **kwargs):
296281
)
297282

298283
is_first = not (
299-
PageNode
284+
TreeNode
300285
.objects
301286
.get_for_site(self._site)
302-
.exclude(pk=new_node.pk)
287+
.exclude(pk=new_page.node_id)
303288
.exists()
304289
)
305290
new_page.rescan_placeholders()
@@ -326,18 +311,16 @@ def get_or_create_root(self):
326311
Creates the root node used to store all page types
327312
for the current site if it doesn't exist.
328313
"""
329-
root_node = PageType.get_root_node(site=self._site)
314+
root_page = PageType.get_root_page(site=self._site)
330315

331-
if root_node:
332-
root_page = root_node.page
333-
else:
334-
root_page = Page.objects.create(
316+
if not root_page:
317+
root_page = Page(
335318
publisher_is_draft=True,
336-
site=self._site,
337319
in_navigation=False,
338320
is_page_type=True,
339321
)
340-
root_node = root_page.attach_site(self._site)
322+
root_page.set_tree_node(self._site)
323+
root_page.save()
341324

342325
if not root_page.has_translation(self._language):
343326
api.create_title(
@@ -347,12 +330,12 @@ def get_or_create_root(self):
347330
slug=PAGE_TYPES_ID,
348331
path=PAGE_TYPES_ID,
349332
)
350-
return root_node
333+
return root_page.node
351334

352335
def clean_parent_node(self):
353336
parent_node = super(AddPageTypeForm, self).clean_parent_node()
354337

355-
if parent_node and not parent_node.page.is_page_type:
338+
if parent_node and not parent_node.item.is_page_type:
356339
raise ValidationError("Parent has to be a page type.")
357340

358341
if not parent_node:
@@ -437,11 +420,9 @@ def clean(self):
437420
# as a result, slug might not always be there.
438421
return data
439422

440-
node = page.get_node_object(site=self._site)
441-
442-
if node.parent:
423+
if page.parent_page:
443424
slug = data['slug']
444-
parent_path = node.parent.page.get_path(self._language)
425+
parent_path = page.parent_page.get_path(self._language)
445426
path = u'%s/%s' % (parent_path, slug) if parent_path else slug
446427
else:
447428
path = data['slug']
@@ -483,7 +464,7 @@ def save(self, commit=True):
483464
if update_count == 0:
484465
api.create_title(language=self._language, page=cms_page, **translation_data)
485466
else:
486-
cms_page._update_title_path_recursive(self._language, self._site)
467+
cms_page._update_title_path_recursive(self._language)
487468
return cms_page
488469

489470

@@ -611,9 +592,7 @@ def get_navigation_extenders(self):
611592
return menu_pool.get_menus_by_attribute("cms_enabled", True)
612593

613594
def _check_unique_namespace_instance(self, namespace):
614-
return Page.objects.filter(
615-
publisher_is_draft=True,
616-
site_id=self.instance.site_id,
595+
return Page.objects.drafts().on_site(self._site).filter(
617596
application_namespace=namespace
618597
).exclude(pk=self.instance.pk).exists()
619598

@@ -628,7 +607,7 @@ def clean(self):
628607
# so we know it exists.
629608
language_name = get_language_object(
630609
self._language,
631-
site_id=self.instance.site_id,
610+
site_id=self._site.pk,
632611
)['name']
633612

634613
if not self.title_obj.slug:
@@ -640,11 +619,10 @@ def clean(self):
640619
raise ValidationError(message % {'language': language_name})
641620

642621
if 'reverse_id' in self.fields:
643-
id = cleaned_data['reverse_id']
644-
site_id = self.instance.site_id
645-
if id:
646-
if Page.objects.filter(reverse_id=id, site=site_id, publisher_is_draft=True).exclude(
647-
pk=self.instance.pk).exists():
622+
reverse_id = cleaned_data['reverse_id']
623+
if reverse_id:
624+
lookup = Page.objects.drafts().on_site(self._site).filter(reverse_id=reverse_id)
625+
if lookup.exclude(pk=self.instance.pk).exists():
648626
self._errors['reverse_id'] = self.error_class(
649627
[_('A page with this reverse URL id exists already.')])
650628
apphook = cleaned_data.get('application_urls', None)
@@ -780,23 +758,19 @@ def __init__(self, *args, **kwargs):
780758
self._site = kwargs.pop('site', Site.objects.get_current())
781759
super(PageTreeForm, self).__init__(*args, **kwargs)
782760
self.fields['target'].queryset = Page.objects.drafts().filter(
783-
nodes__site=self._site,
761+
node__site=self._site,
784762
is_page_type=self.page.is_page_type,
785763
)
786764

787765
def get_root_nodes(self):
788-
return PageNode.get_root_nodes().filter(page__is_page_type=self.page.is_page_type)
789-
790-
def get_parent_node(self, site):
791-
target_page = self.cleaned_data.get('target')
792-
793-
if target_page:
794-
return target_page.get_node_object(site)
795-
return
766+
# TODO: this needs to avoid using the pages accessor directly
767+
nodes = TreeNode.get_root_nodes()
768+
return nodes.exclude(cms_pages__is_page_type=not(self.page.is_page_type))
796769

797770
def get_tree_options(self):
798771
position = self.cleaned_data['position']
799-
parent_node = self.get_parent_node(self._site)
772+
target_page = self.cleaned_data.get('target')
773+
parent_node = target_page.node if target_page else None
800774

801775
if parent_node:
802776
return self._get_tree_options_for_parent(parent_node, position)
@@ -838,7 +812,7 @@ def get_tree_options(self):
838812
if target_node_position != 'left':
839813
return (target_node, target_node_position)
840814

841-
node = self.page.get_node_object(self._site)
815+
node = self.page.node
842816
node_is_first = node.path < target_node.path
843817

844818
if node_is_first and node.is_sibling_of(target_node):
@@ -866,11 +840,9 @@ class CopyPageForm(PageTreeForm):
866840
copy_permissions = forms.BooleanField(initial=False, required=False)
867841

868842
def copy_page(self):
869-
source_site = self.cleaned_data['source_site']
870843
target, position = self.get_tree_options()
871844
copy_permissions = self.cleaned_data.get('copy_permissions', False)
872845
new_page = self.page.copy_with_descendants(
873-
source_site,
874846
target_ 78C1 node=target,
875847
position=position,
876848
copy_permissions=copy_permissions,
@@ -922,7 +894,7 @@ def get_filter_items(self):
922894

923895
def run_filters(self, queryset):
924896
for field, value in self.get_filter_items():
925-
query = {'page__{}__exact'.format(field): value}
897+
query = {'{}__exact'.format(field): value}
926898
queryset = queryset.filter(**query)
927899
return queryset
928900

0 commit comments

Comments
 (0)
0