1
+ import warnings
2
+
1
3
from django .urls import NoReverseMatch
2
4
5
+ from cms .models import PageContent
3
6
from cms .toolbar_base import CMSToolbar
4
7
from cms .utils import get_language_list
5
8
from cms .utils .page_permissions import user_can_change_page
6
9
from cms .utils .urlutils import admin_reverse
7
10
8
11
9
12
class ExtensionToolbar (CMSToolbar ):
13
+ """Offers simplified API for providing the user access to the admin of page extensions and
14
+ page content extensions through the toolbar."""
10
15
model = None
11
16
page = None
17
+ page_content = None
12
18
13
19
def _setup_extension_toolbar (self ):
14
20
"""
@@ -22,12 +28,18 @@ def _setup_extension_toolbar(self):
22
28
page = self ._get_page ()
23
29
24
30
if page and user_can_change_page (self .request .user , page = page ):
25
- return self .toolbar .get_or_create_menu (' page' )
31
+ return self .toolbar .get_or_create_menu (" page" )
26
32
return
27
33
28
34
def _get_page (self ):
29
35
if not self .page :
30
- self .page = self .request .current_page
36
+ obj = self .toolbar .get_object () # Try getting the PageContent object from the toolbar
37
+ if isinstance (obj , PageContent ):
38
+ self .page = obj .page
39
+ self .page_content = obj
40
+ else :
41
+ self .page = self .request .current_page # Otherwise get Page object from the request
42
+ self .page_content = self .page .get_content_obj (self .current_lang )
31
43
return self .page
32
44
33
45
def get_page_extension_admin (self ):
@@ -45,60 +57,81 @@ def get_page_extension_admin(self):
45
57
except self .model .DoesNotExist :
46
58
page_extension = None
47
59
try :
48
- model_name = self .model .__name__ .lower ()
60
+ app_label , model_name = self . model . _meta . app_label , self .model .__name__ .lower ()
49
61
if page_extension :
50
- admin_url = admin_reverse (
51
- '%s_%s_change' % (self .model ._meta .app_label , model_name ),
52
- args = (page_extension .pk ,))
62
+ admin_url = admin_reverse (f"{ app_label } _{ model_name } _change" , args = (page_extension .pk ,))
53
63
else :
54
- admin_url = "%s ?extended_object=%s" % (
55
- admin_reverse ('%s_%s_add' % ( self . model . _meta . app_label , model_name )),
56
- self . page . pk )
64
+ admin_url = "{} ?extended_object={}" . format (
65
+ admin_reverse (f" { app_label } _ { model_name } _add" ), self . page . pk
66
+ )
57
67
except NoReverseMatch : # pragma: no cover
58
68
admin_url = None
59
69
return page_extension , admin_url
60
70
61
71
def get_title_extension_admin (self , language = None ):
62
72
"""
63
- Get the admin urls for the title extensions menu items, depending on whether a TitleExtension instance exists
64
- for each PageContent in the current page.
65
- A single language can be passed to only work on a single title.
73
+ Deprecated.
66
74
67
- Return a list of tuples of the title extension and the url; the extension is None if no instance exists,
68
- the url is None is no admin is registered for the extension.
75
+ Reflects now obsolete behavior in django CMS 3.x:
76
+
77
+ Get the admin urls for the page content extensions menu items, depending on whether a
78
+ :class:`~cms.extensions.models.PageContentExtension` instance exists for each
79
+ :class:`~cms.models.contentmodels.PageContent` in the current page.
80
+ A single language can be passed to only work on a single page content object.
81
+
82
+ Return a list of tuples of the page content extension and the url; the extension is None
83
+ if no instance exists, the url is None is no admin is registered for the extension.
69
84
"""
85
+ warnings .warn (
86
+ "get_title_extension_admin has been deprecated and replaced by get_page_content_extension_admin" ,
87
+ DeprecationWarning ,
88
+ stacklevel = 2 ,
89
+ )
70
90
page = self ._get_page ()
91
+
92
+ page_contents = (
93
+ page .pagecontent_set (manager = "admin_manager" )
94
+ .latest_content ()
95
+ .filter (language__in = get_language_list (page .node .site_id ))
96
+ )
71
97
urls = []
72
- if language :
73
- titles = page .get_content_obj (language ),
74
- else :
75
- titles = page .pagecontent_set .filter (language__in = get_language_list (page .node .site_id ))
76
- # Titles
77
- for title in titles :
78
- try :
79
- title_extension = self .model .objects .get (extended_object_id = title .pk )
80
- except self .model .DoesNotExist :
81
- title_extension = None
82
- try :
83
- model_name = self .model .__name__ .lower ()
84
- if title_extension :
85
- admin_url = admin_reverse (
86
- '%s_%s_change' % (self .model ._meta .app_label , model_name ),
87
- args = (title_extension .pk ,))
88
- else :
89
- admin_url = "%s?extended_object=%s" % (
90
- admin_reverse ('%s_%s_add' % (self .model ._meta .app_label , model_name )),
91
- title .pk )
92
- except NoReverseMatch : # pragma: no cover
93
- admin_url = None
98
+
99
+ for page_content in page_contents :
100
+ admin_url = self .get_page_content_extension_admin (page_content )
94
101
if admin_url :
95
- urls .append (( title_extension , admin_url ) )
102
+ urls .append (admin_url )
96
103
return urls
97
104
105
+ def get_page_content_extension_admin (self , page_content_obj = None ):
106
+ """
107
+ Get the admin url for the page content extensions menu item, depending on whether a
108
+ :class:`~cms.extensions.models.PageContentExtension` instance exists for the
109
+ :class:`~cms.models.contentmodels.PageContent` displayed.
110
+
111
+ Return a tuple of the page content extension and the url; the extension is None
112
+ if no instance exists, the url is None is no admin is registered for the extension.
113
+ """
114
+ self ._get_page ()
115
+ page_content = page_content_obj or self .page_content
116
+ try :
117
+ pagecontent_extension = self .model .objects .get (extended_object_id = page_content .pk )
118
+ except self .model .DoesNotExist :
119
+ pagecontent_extension = None
120
+ try :
121
+ app_label , model_name = self .model ._meta .app_label , self .model .__name__ .lower ()
122
+ if pagecontent_extension :
123
+ admin_url = admin_reverse (f"{ app_label } _{ model_name } _change" , args = (pagecontent_extension .pk ,))
124
+ else :
125
+ admin_url = "{}?extended_object={}" .format (
126
+ admin_reverse (f"{ app_label } _{ model_name } _add" ), page_content .pk
127
+ )
128
+ except NoReverseMatch : # pragma: no cover
129
+ admin_url = None
130
+ return pagecontent_extension , admin_url
131
+
98
132
def _get_sub_menu (self , current_menu , key , label , position = None ):
99
133
"""
100
134
Utility function to get a submenu of the current menu
101
135
"""
102
- extension_menu = current_menu .get_or_create_menu (
103
- key , label , position = position )
136
+ extension_menu = current_menu .get_or_create_menu (key , label , position = position )
104
137
return extension_menu
0 commit comments