8000 Refactored PageNode into TreeNode by czpython · Pull Request #6217 · django-cms/django-cms · GitHub
[go: up one dir, main page]

Skip to content

Refactored PageNode into TreeNode #6217

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 9, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Refactored PageNode into TreeNode
  • Loading branch information
czpython committed Jan 9, 2018
commit da5d807f65ec0c0108e6be47f377caf0c53ab41f
98 changes: 35 additions & 63 deletions cms/admin/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
from cms.constants import PAGE_TYPES_ID, PUBLISHER_STATE_DIRTY, ROOT_USER_LEVEL
from cms.forms.validators import validate_relative_url, validate_url_uniqueness
from cms.forms.widgets import UserSelectAdminWidget, AppHookSelect, ApplicationConfigSelect
from cms.models import (CMSPlugin, Page, PageNode, PageType, PagePermission, PageUser, PageUserGroup, Title,
Placeholder, GlobalPagePermission)
from cms.models import (CMSPlugin, Page, PageType, PagePermission, PageUser, PageUserGroup, Title,
Placeholder, GlobalPagePermission, TreeNode)
from cms.models.permissionmodels import User
from cms.plugin_pool import plugin_pool
from cms.signals.apphook import set_restart_trigger
Expand Down Expand Up @@ -152,7 +152,7 @@ class AddPageForm(BasePageForm):
required=False,
)
parent_node = forms.ModelChoiceField(
queryset=PageNode.objects.all(),
queryset=TreeNode.objects.all(),
required=False,
widget=forms.HiddenInput(),
)
Expand All @@ -169,16 +169,12 @@ def __init__(self, *args, **kwargs):
if not source_field or source_field.widget.is_hidden:
return

root_node = PageType.get_root_node(site=self._site)
root_page = PageType.get_root_page(site=self._site)

if root_node:
if root_page:
# Set the choicefield's choices to the various page_types
descendants = root_node.get_descendants()
titles = Title.objects.filter(
page__is_page_type=True,
page__nodes__in=descendants,
language=self._language,
)
descendants = root_page.get_descendant_pages().filter(is_page_type=True)
titles = Title.objects.filter(page__in=descendants, language=self._language)
choices = [('', '---------')]
choices.extend((title.page_id, title.title) for title in titles)
source_field.choices = choices
Expand All @@ -200,7 +196,7 @@ def clean(self):

if parent_node:
slug = data['slug']
parent_path = parent_node.page.get_path(self._language)
parent_path = parent_node.item.get_path(self._language)
path = u'%s/%s' % (parent_path, slug) if parent_path else slug
else:
path = data['slug']
Expand All @@ -225,15 +221,6 @@ def clean_parent_node(self):
raise ValidationError("Site doesn't match the parent's page site")
return parent_node

def create_page_node(self, page, parent=None):
new_node = PageNode(page=page, site=page.site)

if parent:
parent.add_child(instance=new_node)
else:
PageNode.add_root(instance=new_node)
return new_node

def create_translation(self, page):
data = self.cleaned_data
title_kwargs = {
Expand Down Expand Up @@ -275,16 +262,14 @@ def save(self, *args, **kwargs):

if source:
new_page = self.from_source(source, parent=parent)
new_node = new_page.get_node_object(self._site)

for lang in source.get_languages():
source._copy_contents(new_page, lang)
else:
new_page = super(AddPageForm, self).save(commit=False)
new_page.template = self.get_template()
new_page.site = self._site
new_page.set_tree_node(self._site, target=parent, position='last-child')
new_page.save()
new_node = self.create_page_node(new_page, parent=parent)

translation = self.create_translation(new_page)

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

is_first = not (
PageNode
TreeNode
.objects
.get_for_site(self._site)
.exclude(pk=new_node.pk)
.exclude(pk=new_page.node_id)
.exists()
)
new_page.rescan_placeholders()
9E12 Expand All @@ -326,18 +311,16 @@ def get_or_create_root(self):
Creates the root node used to store all page types
for the current site if it doesn't exist.
"""
root_node = PageType.get_root_node(site=self._site)
root_page = PageType.get_root_page(site=self._site)

if root_node:
root_page = root_node.page
else:
root_page = Page.objects.create(
if not root_page:
root_page = Page(
publisher_is_draft=True,
site=self._site,
in_navigation=False,
is_page_type=True,
)
root_node = root_page.attach_site(self._site)
root_page.set_tree_node(self._site)
root_page.save()

if not root_page.has_translation(self._language):
api.create_title(
Expand All @@ -347,12 +330,12 @@ def get_or_create_root(self):
slug=PAGE_TYPES_ID,
path=PAGE_TYPES_ID,
)
return root_node
return root_page.node

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

if parent_node and not parent_node.page.is_page_type:
if parent_node and not parent_node.item.is_page_type:
raise ValidationError("Parent has to be a page type.")

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

node = page.get_node_object(site=self._site)

if node.parent:
if page.parent_page:
slug = data['slug']
parent_path = node.parent.page.get_path(self._language)
parent_path = page.parent_page.get_path(self._language)
path = u'%s/%s' % (parent_path, slug) if parent_path else slug
else:
path = data['slug']
Expand Down Expand Up @@ -483,7 +464,7 @@ def save(self, commit=True):
if update_count == 0:
api.create_title(language=self._language, page=cms_page, **translation_data)
else:
cms_page._update_title_path_recursive(self._language, self._site)
cms_page._update_title_path_recursive(self._language)
return cms_page


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

def _check_unique_namespace_instance(self, namespace):
return Page.objects.filter(
publisher_is_draft=True,
site_id=self.instance.site_id,
return Page.objects.drafts().on_site(self._site).filter(
application_namespace=namespace
).exclude(pk=self.instance.pk).exists()

Expand All @@ -628,7 +607,7 @@ def clean(self):
# so we know it exists.
language_name = get_language_object(
self._language,
site_id=self.instance.site_id,
site_id=self._site.pk,
)['name']

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

if 'reverse_id' in self.fields:
id = cleaned_data['reverse_id']
site_id = self.instance.site_id
if id:
if Page.objects.filter(reverse_id=id, site=site_id, publisher_is_draft=True).exclude(
pk=self.instance.pk).exists():
reverse_id = cleaned_data['reverse_id']
if reverse_id:
lookup = Page.objects.drafts().on_site(self._site).filter(reverse_id=reverse_id)
if lookup.exclude(pk=self.instance.pk).exists():
self._errors['reverse_id'] = self.error_class(
[_('A page with this reverse URL id exists already.')])
apphook = cleaned_data.get('application_urls', None)
Expand Down Expand Up @@ -780,23 +758,19 @@ def __init__(self, *args, **kwargs):
self._site = kwargs.pop('site', Site.objects.get_current())
super(PageTreeForm, self).__init__(*args, **kwargs)
self.fields['target'].queryset = Page.objects.drafts().filter(
nodes__site=self._site,
node__site=self._site,
is_page_type=self.page.is_page_type,
)

def get_root_nodes(self):
return PageNode.get_root_nodes().filter(page__is_page_type=self.page.is_page_type)

def get_parent_node(self, site):
target_page = self.cleaned_data.get('target')

if target_page:
return target_page.get_node_object(site)
return
# TODO: this needs to avoid using the pages accessor directly
nodes = TreeNode.get_root_nodes()
return nodes.exclude(cms_pages__is_page_type=not(self.page.is_page_type))

def get_tree_options(self):
position = self.cleaned_data['position']
parent_node = self.get_parent_node(self._site)
target_page = self.cleaned_data.get('target')
parent_node = target_page.node if target_page else None

if parent_node:
return self._get_tree_options_for_parent(parent_node, position)
Expand Down Expand Up @@ -838,7 +812,7 @@ def get_tree_options(self):
if target_node_position != 'left':
return (target_node, target_node_position)

node = self.page.get_node_object(self._site)
node = self.page.node
node_is_first = node.path < target_node.path

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

def copy_page(self):
source_site = self.cleaned_data['source_site']
target, position = self.get_tree_options()
copy_permissions = self.cleaned_data.get('copy_permissions', False)
new_page = self.page.copy_with_descendants(
source_site,
target_node=target,
position=position,
copy_permissions=copy_permissions,
Expand Down Expand Up @@ -922,7 +894,7 @@ def get_filter_items(self):

def run_filters(self, queryset):
for field, value in self.get_filter_items():
query = {'page__{}__exact'.format(field): value}
query = {'{}__exact'.format(field): value}
queryset = queryset.filter(**query)
return queryset

Expand Down
Loading
0