6
6
from cms import constants
7
7
from cms .apphook_pool import apphook_pool
8
8
from cms .models import EmptyTitle
9
+ from cms .utils import i18n
9
10
from cms .utils .compat import DJANGO_1_9
10
11
from cms .utils .conf import get_cms_setting
11
12
from cms .utils .i18n import get_fallback_languages , hide_untranslated
@@ -117,7 +118,7 @@ def get_menu_node_for_page(renderer, page, language):
117
118
# Only run this if we have a translation in the requested language for this
118
119
# object. The title cache should have been prepopulated in CMSMenu.get_nodes
119
120
# but otherwise, just request the title normally
120
- if language in page .title_cache and page .application_urls :
121
+ if page .title_cache . get ( language ) and page .application_urls :
121
122
# it means it is an apphook
122
123
app = apphook_pool .get_apphook (page .application_urls )
123
124
@@ -136,7 +137,7 @@ def get_menu_node_for_page(renderer, page, language):
136
137
if exts :
137
138
attr ['navigation_extenders' ] = exts
138
139
139
- translation = page .get_title_obj (language )
140
+ translation = page .get_title_obj (language , fallback = True )
140
141
141
142
# Do we have a redirectURL?
142
143
attr ['redirect_url' ] = translation .redirect # save redirect URL if any
@@ -149,7 +150,8 @@ def get_menu_node_for_page(renderer, page, language):
149
150
parent_id = parent_id ,
150
151
attr = attr ,
151
152
visible = page .in_navigation ,
152
- path = translation .path or translation .slug
153
+ path = translation .path or translation .slug ,
154
+ language = (translation .language if translation .language != language else None ),
153
155
)
154
156
return ret_node
155
157
@@ -158,6 +160,8 @@ class CMSNavigationNode(NavigationNode):
158
160
159
161
def __init__ (self , * args , ** kwargs ):
160
162
self .path = kwargs .pop ('path' )
163
+ # language is only used when we're dealing with a fallback
164
+ self .language = kwargs .pop ('language' , None )
161
165
super (CMSNavigationNode , self ).__init__ (* args , ** kwargs )
162
166
163
167
def is_selected (self , request ):
@@ -167,11 +171,17 @@ def is_selected(self, request):
167
171
return False
168
172
return page_id == self .id
169
173
170
- def get_absolute_url (self ):
174
+ def _get_absolute_url (self ):
171
175
if self .attr ['is_home' ]:
172
176
return reverse ('pages-root' )
173
177
return reverse ('pages-details-by-slug' , kwargs = {"slug" : self .path })
174
178
179
+ def get_absolute_url (self ):
180
+ if self .language :
181
+ with i18n .force_language (self .language ):
182
+ return self ._get_absolute_url ()
183
+ return self ._get_absolute_url ()
184
+
175
185
176
186
class CMSMenu (Menu ):
177
187
@@ -186,7 +196,10 @@ def get_nodes(self, request):
186
196
)
187
197
188
198
if hide_untranslated (lang , site .pk ):
189
- nodes = nodes .filter (page__title_set__language = lang )
199
+ if self .renderer .draft_mode_active :
200
+ nodes = nodes .filter (page__title_set__language = lang )
201
+ else :
202
+ nodes = nodes .filter (page__publisher_public__title_set__language = lang )
190
203
languages = [lang ]
191
204
else :
192
205
fallbacks = get_fallback_languages (lang , site_id = site .pk )
@@ -210,10 +223,15 @@ def get_nodes(self, request):
210
223
if not pages :
211
224
return []
212
225
226
+ titles = Title .objects .filter (
227
+ language__in = languages ,
228
+ publisher_is_draft = bool (self .renderer .draft_mode_active ),
229
+ )
230
+
213
231
lookup = Prefetch (
214
232
'title_set' ,
215
233
to_attr = 'filtered_translations' ,
216
- queryset = Title . objects . filter ( language__in = languages )
234
+ queryset = titles ,
217
235
)
218
236
219
237
if DJANGO_1_9 :
@@ -233,13 +251,7 @@ def _page_to_node(page):
233
251
# EmptyTitle is used to prevent the cms from trying
234
252
# to find a translation in the database
235
253
page .title_cache .setdefault (language , blank_title_cache [language ])
236
-
237
- menu_node = get_menu_node_for_page (
238
- renderer = self .renderer ,
239
- page = page ,
240
- language = lang ,
241
- )
242
- return menu_node
254
+ return get_menu_node_for_page (self .renderer , page , language = lang )
243
255
return [_page_to_node (page = page ) for page in pages ]
244
256
245
257
0 commit comments