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