66from cms .cms_toolbars import (
77 ADD_PAGE_LANGUAGE_BREAK ,
88 LANGUAGE_MENU_IDENTIFIER ,
9+ BasicToolbar ,
910 PageToolbar ,
1011 PlaceholderToolbar ,
1112)
@@ -243,7 +244,7 @@ def _get_published_page_version(self):
243244
244245 return PageContent ._original_manager .filter (
245246 page = self .page , language = language , versions__state = PUBLISHED
246- ).first ()
247+ ).select_related ( "page" ). first ()
247248
248249 def _add_view_published_button (self ):
249250 """Helper method to add a publish button to the toolbar
@@ -321,7 +322,6 @@ def populate(self):
321322 self .page_content = self .get_page_content () if self .page else None
322323 self .permissions_activated = get_cms_setting ("PERMISSION" )
323324
324- self .override_language_menu ()
325325 self .change_admin_menu ()
326326 self .add_page_menu ()
327327 self .change_language_menu ()
@@ -402,8 +402,9 @@ def change_language_menu(self):
402402 url = add_url_parameters (translation_delete_url , language = code )
403403 on_close = REFRESH_PAGE
404404 if self .toolbar .get_object () == pagecontent and not disabled :
405- other_content = next ((self .page .get_admin_content (lang )for lang in self .page .get_languages ()
406- if lang != pagecontent .language and lang in languages ), None )
405+ other_content = next (
406+ (self .page .get_admin_content (lang ) for lang in self .page .get_languages ()
407+ if lang != pagecontent .language and lang in languages ), None )
407408 on_close = get_object_preview_url (other_content )
408409 remove_plugins_menu .add_modal_item (name , url = url , disabled = disabled , on_close = on_close )
409410
@@ -433,10 +434,31 @@ def change_language_menu(self):
433434 )
434435
435436
437+ class VersioningBasicToolbar (BasicToolbar ):
438+ def add_language_menu (self ):
439+ """
440+ Originally did override the default language menu for pages that are versioned.
441+ Now creates the menu from scratch, since VersiongBasicToolbar prevents the
442+ core from creating the too generic default language menu.
443+ """
444+ if not settings .USE_I18N or not self .request .current_page :
445+ # Only add if no page is shown
446+ super ().add_language_menu ()
447+ return
448+
449+ language_menu = self .toolbar .get_or_create_menu (
450+ LANGUAGE_MENU_IDENTIFIER , _ ("Language" ), position = - 1
451+ )
452+ for code , name in get_language_tuple (self .current_site .pk ):
453+ # Get the page content, it could be draft too!
454+ page_content = self .page .get_admin_content (language = code )
455+ if page_content :
456+ url = get_object_preview_url (page_content , code )
457+ language_menu .add_link_item (name , url = url , active = self .current_lang == code )
458+
459+
436460def replace_toolbar (old , new ):
437- """Replace `old` toolbar class with `new` class,
438- while keeping its position in toolbar_pool.
439- """
461+ """Replace `old` toolbar class with `new` class, while keeping its position in toolbar_pool."""
440462 new_name = "." .join ((new .__module__ , new .__name__ ))
441463 old_name = "." .join ((old .__module__ , old .__name__ ))
442464 toolbar_pool .toolbars = OrderedDict (
@@ -447,3 +469,4 @@ def replace_toolbar(old, new):
447469
448470replace_toolbar (PageToolbar , VersioningPageToolbar )
449471replace_toolbar (PlaceholderToolbar , VersioningToolbar )
472+ replace_toolbar (BasicToolbar , VersioningBasicToolbar )
0 commit comments