def test_with_user_no_permission(self): homepage = Page.objects.get(url_path='/home/') # event editor does not have permissions on homepage event_editor = get_user_model().objects.get(username='******') permission_proxy = UserPagePermissionsProxy(event_editor) result = can_choose_page(homepage, permission_proxy, self.desired_classes, user_perm='copy_to') self.assertFalse(result)
def test_with_can_choose_root(self): root = Page.objects.get(url_path='/') result = can_choose_page(root, self.permission_proxy, self.desired_classes, can_choose_root=True) self.assertTrue(result)
def test_with_can_not_choose_root(self): root = Page.objects.get(url_path="/") result = can_choose_page(root, self.permission_proxy, self.desired_classes, can_choose_root=False) self.assertFalse(result)
def test_with_user_no_permission(self): homepage = Page.objects.get(url_path="/home/") # event editor does not have permissions on homepage event_editor = get_user_model().objects.get( email="*****@*****.**") permission_proxy = UserPagePermissionsProxy(event_editor) result = can_choose_page(homepage, permission_proxy, self.desired_classes, user_perm="copy_to") self.assertFalse(result)
def test_can_choose_page(self): homepage = Page.objects.get(url_path='/home/') result = can_choose_page(homepage, self.permission_proxy, self.desired_classes) self.assertTrue(result)
def test_with_can_not_choose_root(self): root = Page.objects.get(url_path='/') result = can_choose_page(root, self.permission_proxy, self.desired_classes, can_choose_root=False) self.assertFalse(result)
def titled_browse(request, parent_page_id=None): # A missing or empty page_type parameter indicates 'all page types' # (i.e. descendants of wagtailcore.page) page_type_string = request.GET.get('page_type') or 'wagtailcore.page' user_perm = request.GET.get('user_perms', False) link_title = request.GET.get('link_title', '') try: desired_classes = page_models_from_string(page_type_string) except (ValueError, LookupError): raise Http404 # Find parent page if parent_page_id: parent_page = get_object_or_404(Page, id=parent_page_id) elif desired_classes == (Page,): # Just use the root page parent_page = Page.get_first_root_node() else: # Find the highest common ancestor for the specific classes passed in # In many cases, such as selecting an EventPage under an EventIndex, # this will help the administrator find their page quicker. all_desired_pages = filter_page_type(Page.objects.all(), desired_classes) parent_page = all_desired_pages.first_common_ancestor() parent_page = parent_page.specific # Get children of parent page pages = parent_page.get_children().specific() # allow hooks to modify the queryset for hook in hooks.get_hooks('construct_page_chooser_queryset'): pages = hook(pages, request) # Filter them by page type if desired_classes != (Page,): # restrict the page listing to just those pages that: # - are of the given content type (taking into account class inheritance) # - or can be navigated into (i.e. have children) choosable_pages = filter_page_type(pages, desired_classes) descendable_pages = pages.filter(numchild__gt=0) pages = choosable_pages | descendable_pages can_choose_root = request.GET.get('can_choose_root', False) # Do permission lookups for this user now, instead of for every page. permission_proxy = UserPagePermissionsProxy(request.user) # Parent page can be chosen if it is a instance of desired_classes parent_page.can_choose = can_choose_page( parent_page, permission_proxy, desired_classes, can_choose_root, user_perm) # Pagination # We apply pagination first so we don't need to walk the entire list # in the block below paginator = Paginator(pages, per_page=25) pages = paginator.get_page(request.GET.get('p')) # Annotate each page with can_choose/can_decend flags for page in pages: page.can_choose = can_choose_page(page, permission_proxy, desired_classes, can_choose_root, user_perm) page.can_descend = page.get_children_count() # Render context = shared_context(request, { 'parent_page': parent_page, 'parent_page_id': parent_page.pk, 'pages': pages, 'search_form': SearchForm(), 'title_form': TitleChooserForm(initial={'link_title': link_title}), 'page_type_string': page_type_string, 'page_type_names': [desired_class.get_verbose_name() for desired_class in desired_classes], 'page_types_restricted': (page_type_string != 'wagtailcore.page'), }) return render_modal_workflow( request, 'wagtailadmin/chooser/titled_browse.html', None, context, json_data={'step': 'browse', 'parent_page_id': context['parent_page_id']}, )