Skip to content

Commit

Permalink
Merge pull request #4910 from czpython/fixes/pages-menu-missing-on-fr…
Browse files Browse the repository at this point in the history
…esh-install-3.1

Fixes/pages menu missing on fresh install 3.1
  • Loading branch information
czpython committed Jan 13, 2016
2 parents c59b8fc + 3941e42 commit 2df20b1
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 16 deletions.
22 changes: 18 additions & 4 deletions cms/cms_toolbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@
from cms.utils.i18n import get_language_tuple, force_language, get_language_dict
from cms.utils.compat.dj import is_installed
from cms.utils import get_cms_setting
from cms.utils.permissions import get_user_sites_queryset
from cms.utils.permissions import (
get_user_sites_queryset,
has_auth_page_permission,
)
from cms.utils.urlutils import add_url_parameters, admin_reverse
from menus.utils import DefaultLanguageChanger

Expand Down Expand Up @@ -216,6 +219,7 @@ def render_addons(self, context):

@toolbar_pool.register
class PageToolbar(CMSToolbar):
_changed_admin_menu = None
watch_models = [Page]

# Helpers
Expand Down Expand Up @@ -252,8 +256,16 @@ def has_publish_permission(self):

def has_page_change_permission(self):
if not hasattr(self, 'page_change_permission'):
self.page_change_permission = can_change_page(self.request)

if not self.page and not get_cms_setting('PERMISSION'):
# We can't check permissions for an individual page
# and can't check global cms permissions because
# user opted out of them.
# So just check django auth permissions.
user = self.request.user
can_change = has_auth_page_permission(user, action='change')
else:
can_change = can_change_page(self.request)
self.page_change_permission = can_change
return self.page_change_permission

def page_is_pending(self, page, language):
Expand Down Expand Up @@ -401,14 +413,16 @@ def change_language_menu(self):
question=question % name, on_success=self.toolbar.REFRESH_PAGE)

def change_admin_menu(self):
if self.has_page_change_permission():
if not self._changed_admin_menu and self.has_page_change_permission():
admin_menu = self.toolbar.get_or_create_menu(ADMIN_MENU_IDENTIFIER)
url = admin_reverse('cms_page_changelist') # cms page admin
params = {'language': self.toolbar.language}
if self.page:
params['page_id'] = self.page.pk
url = add_url_parameters(url, params)
admin_menu.add_sideframe_item(_('Pages'), url=url, position=0)
# Used to prevent duplicates
self._changed_admin_menu = True

def add_page_menu(self):
if self.page and self.has_page_change_permission():
Expand Down
13 changes: 8 additions & 5 deletions cms/models/pagemodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
from os.path import join

from django.conf import settings
from django.contrib.auth import get_permission_codename
from django.contrib.sites.models import Site
from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse
Expand Down Expand Up @@ -1048,21 +1047,25 @@ def has_view_permission(self, request, user=None):
return request.user.has_perm(codename)

def has_change_permission(self, request, user=None):
opts = self._meta
from cms.utils.permissions import has_auth_page_permission

if not user:
user = request.user

if user.is_superuser:
return True
return (user.has_perm(opts.app_label + '.' + get_permission_codename('change', opts))
return (has_auth_page_permission(user, action='change')
and self.has_generic_permission(request, "change"))

def has_delete_permission(self, request, user=None):
opts = self._meta
from cms.utils.permissions import has_auth_page_permission

if not user:
user = request.user

if user.is_superuser:
return True
return (user.has_perm(opts.app_label + '.' + get_permission_codename('delete', opts))
return (has_auth_page_permission(user, action='delete')
and self.has_generic_permission(request, "delete"))

def has_publish_permission(self, request, user=None):
Expand Down
6 changes: 3 additions & 3 deletions cms/tests/toolbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ def test_no_page_staff(self):
# Logo + admin-menu + logout
self.assertEqual(len(items), 2, items)
admin_items = toolbar.get_or_create_menu(ADMIN_MENU_IDENTIFIER, 'Test').get_items()
self.assertEqual(len(admin_items), 9, admin_items)
self.assertEqual(len(admin_items), 10, admin_items)

def test_no_page_superuser(self):
request = self.get_page_request(None, self.get_superuser(), '/')
Expand All @@ -152,7 +152,7 @@ def test_no_page_superuser(self):
# Logo + edit-mode + admin-menu + logout
self.assertEqual(len(items), 2)
admin_items = toolbar.get_or_create_menu(ADMIN_MENU_IDENTIFIER, 'Test').get_items()
self.assertEqual(len(admin_items), 10, admin_items)
self.assertEqual(len(admin_items), 11, admin_items)

def test_anon(self):
page = create_page('test', 'nav_playground.html', 'en')
Expand Down Expand Up @@ -461,7 +461,7 @@ def test_double_menus(self):
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(admin.get_items()), 10)
self.assertEqual(len(lang.get_items()), len(get_language_tuple(1)))

@override_settings(CMS_PLACEHOLDER_CONF={'col_left': {'name': 'PPPP'}})
Expand Down
24 changes: 20 additions & 4 deletions cms/utils/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,22 @@ def has_any_page_change_permissions(request):
).exists()


def get_model_permission_codename(model, action):
opts = model._meta
return opts.app_label + '.' + get_permission_codename(action, opts)


def has_auth_page_permission(user, action):
"""
Returns True if the user is a superuser or has
the cms.page {action} permission set via django's permission model.
"""
if not user.is_superuser:
permission = get_model_permission_codename(Page, action=action)
return user.has_perm(permission)
return True


def has_page_change_permission(request):
"""
Return true if the current user has permission to change this page.
Expand All @@ -113,12 +129,12 @@ def has_page_change_permission(request):
"""
from cms.utils.helpers import current_site

opts = Page._meta
user = request.user
site = current_site(request)
global_change_perm = GlobalPagePermission.objects.user_has_change_permission(
request.user, site).exists()
return request.user.is_superuser or (
request.user.has_perm(opts.app_label + '.' + get_permission_codename('change', opts))
user, site).exists()
return user.is_superuser or (
has_auth_page_permission(user, action='change')
and global_change_perm or has_any_page_change_permissions(request))


Expand Down

0 comments on commit 2df20b1

Please sign in to comment.