Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes/pages menu missing on fresh install 3.1 #4910

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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