1
+ import warnings
2
+
1
3
from django import forms
2
4
from django .apps import apps
3
5
from django .contrib .auth import get_permission_codename , get_user_model
35
37
PageUser ,
36
38
PageUserGroup ,
37
39
Placeholder ,
38
- TreeNode ,
39
40
)
40
41
from cms .models .permissionmodels import User
41
42
from cms .operations import ADD_PAGE_TRANSLATION , CHANGE_PAGE_TRANSLATION
46
47
from cms .plugin_pool import plugin_pool
47
48
from cms .signals .apphook import set_restart_trigger
48
49
from cms .utils .compat .forms import UserChangeForm
50
+ from cms .utils .compat .warnings import RemovedInDjangoCMS43Warning
49
51
from cms .utils .conf import get_cms_setting
50
52
from cms .utils .i18n import get_language_list , get_site_language_from_request
51
53
from cms .utils .page import get_clean_username
@@ -246,8 +248,8 @@ class AddPageForm(BasePageContentForm):
246
248
required = False ,
247
249
widget = forms .HiddenInput (),
248
250
)
249
- parent_node = forms .ModelChoiceField (
250
- queryset = TreeNode .objects .all (),
251
+ parent_page = forms .ModelChoiceField (
252
+ queryset = Page .objects .all (),
251
253
required = False ,
252
254
widget = forms .HiddenInput (),
253
255
)
@@ -275,7 +277,7 @@ def __init__(self, *args, **kwargs):
275
277
page_field = self .fields .get ("cms_page" )
276
278
277
279
if page_field :
278
- page_field .queryset = page_field .queryset .filter (node__site = self ._site )
280
+ page_field .queryset = page_field .queryset .filter (site = self ._site )
279
281
280
282
root_page = PageType .get_root_page (site = self ._site )
281
283
@@ -302,11 +304,10 @@ def clean(self):
302
304
# addressed first.
303
305
return data
304
306
305
- parent_node = data .get ("parent_node" )
306
-
307
- if parent_node :
307
+ parent_page = data .get ("parent_page" )
308
+ if parent_page :
308
309
slug = data ["slug" ]
309
- parent_path = parent_node . item .get_path (self ._language )
310
+ parent_path = parent_page .get_path (self ._language )
310
311
path = f"{ parent_path } /{ slug } " if parent_path else slug
311
312
else :
312
313
path = data ["slug" ]
@@ -325,12 +326,11 @@ def clean(self):
325
326
data ["path" ] = path
326
327
return data
327
328
328
- def clean_parent_node (self ):
329
- parent_node = self .cleaned_data .get ("parent_node" )
330
-
331
- if parent_node and parent_node .site_id != self ._site .pk :
329
+ def clean_parent_page (self ):
330
+ parent_page = self .cleaned_data .get ("parent_page" )
331
+ if parent_page and parent_page .site_id != self ._site .pk :
332
332
raise ValidationError ("Site doesn't match the parent's page site" )
333
- return parent_node
333
+ return parent_page
334
334
335
335
def create_translation (self , page ):
336
336
data = self .cleaned_data
@@ -358,7 +358,7 @@ def create_translation(self, page):
358
358
def from_source (self , source , parent = None ):
359
359
new_page = source .copy (
360
360
site = self ._site ,
361
- parent_node = parent ,
361
+ parent_page = parent ,
362
362
language = self ._language ,
363
363
translations = False ,
364
364
permissions = False ,
@@ -377,7 +377,7 @@ def get_template(self):
377
377
def save (self , * args , ** kwargs ):
378
378
page = self .cleaned_data .get ("cms_page" )
379
379
source = self .cleaned_data .get ("source" )
380
- parent = self .cleaned_data .get ("parent_node " )
380
+ parent = self .cleaned_data .get ("parent_page " )
381
381
382
382
operation_token = send_pre_page_operation (
383
383
request = self ._request ,
@@ -390,8 +390,8 @@ def save(self, *args, **kwargs):
390
390
elif source :
391
391
new_page = self .from_source (source , parent = parent )
392
392
else :
393
- new_page = Page ()
394
- new_page .set_tree_node ( self . _site , target = parent , position = " last-child" )
393
+ new_page = Page (site = self . _site , parent = parent )
394
+ new_page .add_to_tree ( position = ' last-child' )
395
395
new_page .save ()
396
396
397
397
translation = self .create_translation (new_page )
@@ -415,8 +415,8 @@ def save(self, *args, **kwargs):
415
415
)
416
416
417
417
is_first = not (
418
- TreeNode .objects .get_for_site (self ._site )
419
- .exclude (pk = new_page .node_id )
418
+ Page .objects .on_site (self ._site )
419
+ .exclude (pk = new_page .id )
420
420
.exists ()
421
421
)
422
422
@@ -456,7 +456,6 @@ def get_or_create_root(self):
456
456
for the current site if it doesn't exist.
457
457
"""
458
458
root_page = PageType .get_root_page (site = self ._site )
459
-
460
459
if not root_page :
461
460
root_page = Page (is_page_type = True )
462
461
root_page .set_tree_node (self ._site )
@@ -471,24 +470,24 @@ def get_or_create_root(self):
471
470
path = PAGE_TYPES_ID ,
472
471
in_navigation = False ,
473
472
)
474
- return root_page . node
473
+ return root_page
475
474
476
- def clean_parent_node (self ):
477
- parent_node = super ().clean_parent_node ()
475
+ def clean_parent_page (self ):
476
+ parent_page = super ().clean_parent_page ()
478
477
479
- if parent_node and not parent_node .item .is_page_type :
478
+ if parent_page and not parent_page .item .is_page_type :
480
479
raise ValidationError ("Parent has to be a page type." )
481
480
482
- if not parent_node :
481
+ if not parent_page :
483
482
# parent was not explicitly selected.
484
483
# fallback to the page types root
485
- parent_node = self .get_or_create_root ()
486
- return parent_node
484
+ parent_page = self .get_or_create_root ()
485
+ return parent_page
487
486
488
487
def from_source (self , source , parent = None ):
489
488
new_page = source .copy (
490
489
site = self ._site ,
491
- parent_node = parent ,
490
+ parent_page = parent ,
492
491
language = self ._language ,
493
492
translations = False ,
494
493
permissions = False ,
@@ -604,15 +603,15 @@ def clean(self):
604
603
605
604
slug = data ["slug" ]
606
605
path_override = self .cleaned_data .get ("overwrite_url" )
607
- parent_page = page .parent_page
608
606
609
607
if path_override :
610
608
path = path_override .strip ("/" )
611
- elif parent_page and parent_page .is_home :
612
- path = slug
613
- elif parent_page :
614
- base_path = parent_page .get_path (self ._language )
615
- path = f"{ base_path } /{ slug } " if base_path else None
609
+ elif page .parent :
610
+ if page .parent .is_home :
611
+ path = slug
612
+ else :
613
+ base_path = page .parent .get_path (self ._language )
614
+ path = f'{ base_path } /{ slug } ' if base_path else None
616
615
else :
617
616
path = slug
618
617
@@ -926,49 +925,49 @@ def __init__(self, *args, **kwargs):
926
925
self ._site = kwargs .pop ("site" , Site .objects .get_current ())
927
926
super ().__init__ (* args , ** kwargs )
928
927
self .fields ["target" ].queryset = Page .objects .filter (
929
- node__site = self ._site ,
928
+ site = self ._site ,
930
929
is_page_type = self .page .is_page_type ,
931
930
)
932
931
932
+ def get_root_pages (self ):
933
+ pages = Page .get_root_nodes ()
934
+ return pages .exclude (is_page_type = not self .page .is_page_type )
935
+
933
936
def get_root_nodes (self ):
934
- # TODO: this needs to avoid using the pages accessor directly
935
- nodes = TreeNode .get_root_nodes ()
936
- return nodes .exclude (cms_pages__is_page_type = not self .page .is_page_type )
937
+ warnings .warn (
938
+ "Method `get_root_nodes()` is deprecated. Instead use method `get_root_pages`." ,
939
+ RemovedInDjangoCMS43Warning ,
940
+ stacklevel = 2
941
+ )
942
+ return self .get_root_pages ()
937
943
938
944
def get_tree_options (self ):
939
945
position = self .cleaned_data ["position" ]
940
- target_page = self .cleaned_data .get ("target" )
941
- parent_node = target_page .node if target_page else None
942
-
943
- if parent_node :
944
- return self ._get_tree_options_for_parent (parent_node , position )
946
+ if target_page := self .cleaned_data .get ("target" ):
947
+ return self ._get_tree_options_for_parent (target_page , position )
945
948
return self ._get_tree_options_for_root (position )
946
949
947
950
def _get_tree_options_for_root (self , position ):
948
- siblings = self .get_root_nodes ().filter (site = self ._site )
949
-
951
+ siblings = Page .get_root_nodes ().filter (site = self ._site )
950
952
try :
951
- target_node = siblings [position ]
953
+ return siblings [position ], 'left'
952
954
except IndexError :
953
955
# The position requested is not occupied.
954
956
# Add the node as the last root node,
955
957
# relative to the current site.
956
- return (siblings .reverse ()[0 ], "right" )
957
- return (target_node , "left" )
958
+ return siblings .reverse ()[0 ], 'right'
958
959
959
- def _get_tree_options_for_parent (self , parent_node , position ):
960
+ def _get_tree_options_for_parent (self , parent_page , position ):
960
961
if position == 0 :
961
- return (parent_node , "first-child" )
962
-
963
- siblings = parent_node .get_children ().filter (site = self ._site )
962
+ return parent_page , 'first-child'
964
963
964
+ siblings = parent_page .get_children ().filter (site = self ._site )
965
965
try :
966
- target_node = siblings [position ]
966
+ return siblings [position ], 'left'
967
967
except IndexError :
968
968
# The position requested is not occupied.
969
969
# Add the node to be the parent's first child
970
- return (parent_node , "last-child" )
971
- return (target_node , "left" )
970
+ return parent_page , 'last-child'
972
971
973
972
974
973
class MovePageForm (PageTreeForm ):
@@ -984,30 +983,23 @@ def clean(self):
984
983
return cleaned_data
985
984
986
985
def get_tree_options (self ):
987
- options = super ().get_tree_options ()
988
- target_node , target_node_position = options
989
-
990
- if target_node_position != "left" :
991
- return (target_node , target_node_position )
992
-
993
- node = self .page .node
994
- node_is_first = node .path < target_node .path
995
-
996
- if node_is_first and node .is_sibling_of (target_node ):
997
- # The node being moved appears before the target node
998
- # and is a sibling of the target node.
999
- # The user is moving from left to right.
1000
- target_node_position = "right"
1001
- elif node_is_first :
1002
- # The node being moved appears before the target node
1003
- # but is not a sibling of the target node.
1004
- # The user is moving from right to left.
1005
- target_node_position = "left"
1006
- else :
1007
- # The node being moved appears after the target node.
986
+ target_page , target_page_position = super ().get_tree_options ()
987
+ if target_page_position != 'left' :
988
+ return target_page , target_page_position
989
+
990
+ if self .page .path < target_page .path :
991
+ if self .page .is_sibling_of (target_page ):
992
+ # The page being moved appears before the target page and is a sibling of the target node.
993
+ # The user is moving from left to right.
994
+ return target_page , 'right'
995
+
996
+ # The node being moved appears before the target node but is not a sibling of the target node.
1008
997
# The user is moving from right to left.
1009
- target_node_position = "left"
1010
- return (target_node , target_node_position )
998
+ return target_page , 'left'
999
+
1000
+ # The node being moved appears after the target node.
1001
+ # The user is moving from right to left.
1002
+ return target_page , 'left'
1011
1003
1012
1004
def move_page (self ):
1013
1005
self .page .move_page (* self .get_tree_options ())
@@ -1018,10 +1010,10 @@ class CopyPageForm(PageTreeForm):
1018
1010
copy_permissions = forms .BooleanField (initial = False , required = False )
1019
1011
1020
1012
def copy_page (self , user ):
1021
- target , position = self .get_tree_options ()
1013
+ target_page , position = self .get_tree_options ()
1022
1014
copy_permissions = self .cleaned_data .get ("copy_permissions" , False )
1023
1015
new_page = self .page .copy_with_descendants (
1024
- target_node = target ,
1016
+ target_page = target_page ,
1025
1017
position = position ,
1026
1018
copy_permissions = copy_permissions ,
1027
1019
target_site = self ._site ,
@@ -1035,7 +1027,7 @@ def _get_tree_options_for_root(self, position):
1035
1027
except IndexError :
1036
1028
# The user is copying a page to a site with no pages
1037
1029
# Add the node as the last root node.
1038
- siblings = self .get_root_nodes ().reverse ()
1030
+ siblings = self .get_root_pages ().reverse ()
1039
1031
return (siblings [0 ], "right" )
1040
1032
1041
1033
0 commit comments