Skip to content

Commit

Permalink
Fix toolbar multiple populate
Browse files Browse the repository at this point in the history
  • Loading branch information
yakky committed Jun 7, 2015
1 parent dc80fb2 commit bf7a45e
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 31 deletions.
64 changes: 33 additions & 31 deletions cms/cms_toolbar.py
Expand Up @@ -98,6 +98,8 @@ class BasicToolbar(CMSToolbar):
Basic Toolbar for site and languages menu
"""
page = None
_language_menu = None
_admin_menu = None

def init_from_request(self):
self.page = get_page_draft(self.request.current_page)
Expand All @@ -112,39 +114,39 @@ def populate(self):
self.clipboard = user_settings.clipboard

def add_admin_menu(self):
admin_menu = self.toolbar.get_or_create_menu(ADMIN_MENU_IDENTIFIER, self.current_site.name)

# Users button
self.add_users_button(admin_menu)

# sites menu
if get_cms_setting('PERMISSION'):
sites_queryset = get_user_sites_queryset(self.request.user)
else:
sites_queryset = Site.objects.all()
if not self._admin_menu:
self._admin_menu = self.toolbar.get_or_create_menu(ADMIN_MENU_IDENTIFIER, self.current_site.name)
# Users button
self.add_users_button(self._admin_menu)

# sites menu
if get_cms_setting('PERMISSION'):
sites_queryset = get_user_sites_queryset(self.request.user)
else:
sites_queryset = Site.objects.all()

if len(sites_queryset) > 1:
sites_menu = admin_menu.get_or_create_menu('sites', _('Sites'))
sites_menu.add_sideframe_item(_('Admin Sites'), url=admin_reverse('sites_site_changelist'))
sites_menu.add_break(ADMIN_SITES_BREAK)
for site in sites_queryset:
sites_menu.add_link_item(site.name, url='http://%s' % site.domain,
active=site.pk == self.current_site.pk)
if len(sites_queryset) > 1:
sites_menu = self._admin_menu.get_or_create_menu('sites', _('Sites'))
sites_menu.add_sideframe_item(_('Admin Sites'), url=admin_reverse('sites_site_changelist'))
sites_menu.add_break(ADMIN_SITES_BREAK)
for site in sites_queryset:
sites_menu.add_link_item(site.name, url='http://%s' % site.domain,
active=site.pk == self.current_site.pk)

# admin
admin_menu.add_sideframe_item(_('Administration'), url=admin_reverse('index'))
admin_menu.add_break(ADMINISTRATION_BREAK)
# admin
self._admin_menu.add_sideframe_item(_('Administration'), url=admin_reverse('index'))
self._admin_menu.add_break(ADMINISTRATION_BREAK)

# cms users
admin_menu.add_sideframe_item(_('User settings'), url=admin_reverse('cms_usersettings_change'))
admin_menu.add_break(USER_SETTINGS_BREAK)
# cms users
self._admin_menu.add_sideframe_item(_('User settings'), url=admin_reverse('cms_usersettings_change'))
self._admin_menu.add_break(USER_SETTINGS_BREAK)

# Disable toolbar
admin_menu.add_link_item(_('Disable toolbar'), url='?%s' % get_cms_setting('CMS_TOOLBAR_URL__DISABLE'))
admin_menu.add_break(TOOLBAR_DISABLE_BREAK)
# Disable toolbar
self._admin_menu.add_link_item(_('Disable toolbar'), url='?%s' % get_cms_setting('CMS_TOOLBAR_URL__DISABLE'))
self._admin_menu.add_break(TOOLBAR_DISABLE_BREAK)

# logout
self.add_logout_button(admin_menu)
# logout
self.add_logout_button(self._admin_menu)

def add_users_button(self, parent):
User = get_user_model()
Expand Down Expand Up @@ -178,15 +180,15 @@ def add_logout_button(self, parent):
parent.add_ajax_item(logout_menu_text, action=admin_reverse('logout'), active=True, on_success=on_success)

def add_language_menu(self):
if settings.USE_I18N:
language_menu = self.toolbar.get_or_create_menu(LANGUAGE_MENU_IDENTIFIER, _('Language'))
if settings.USE_I18N and not self._language_menu:
self._language_menu = self.toolbar.get_or_create_menu(LANGUAGE_MENU_IDENTIFIER, _('Language'))
language_changer = getattr(self.request, '_language_changer', DefaultLanguageChanger(self.request))
for code, name in get_language_tuple(self.current_site.pk):
try:
url = language_changer(code)
except NoReverseMatch:
url = DefaultLanguageChanger(self.request)(code)
language_menu.add_link_item(name, url=url, active=self.current_lang == code)
self._language_menu.add_link_item(name, url=url, active=self.current_lang == code)

def get_username(self, user=None, default=''):
user = user or self.request.user
Expand Down
19 changes: 19 additions & 0 deletions cms/tests/toolbar.py
Expand Up @@ -31,6 +31,7 @@
URL_CMS_PAGE_ADD, URL_CMS_PAGE_CHANGE)
from cms.test_utils.util.context_managers import UserLoginContext
from cms.utils.conf import get_cms_setting
from cms.utils.i18n import get_language_tuple
from cms.utils.urlutils import admin_reverse
from cms.views import details

Expand Down Expand Up @@ -412,6 +413,24 @@ def test_button_consistency_staff(self):
# Logo + templates + page-menu + admin-menu + logout
self.assertEqual(len(de_toolbar.get_left_items() + de_toolbar.get_right_items()), 5)

def test_double_menus(self):
"""
Tests that even called multiple times, admin and language buttons are not duplicated
"""
user = self.get_staff()
en_request = self.get_page_request(None, user, edit=True, path='/')
toolbar = CMSToolbar(en_request)
toolbar.populated = False
toolbar.populate()
toolbar.populated = False
toolbar.populate()
toolbar.populated = False
toolbar.post_template_populate()
admin = toolbar.get_left_items()[0]
lang = toolbar.get_left_items()[1]
self.assertEqual(len(admin.get_items()), 9)
self.assertEqual(len(lang.get_items()), len(get_language_tuple(1)))

@override_settings(CMS_PLACEHOLDER_CONF={'col_left': {'name': 'PPPP'}})
def test_placeholder_name(self):
superuser = self.get_superuser()
Expand Down

0 comments on commit bf7a45e

Please sign in to comment.