Beispiel #1
0
 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)
Beispiel #2
0
 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)
Beispiel #3
0
 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)
Beispiel #4
0
 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)
Beispiel #5
0
 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)
Beispiel #6
0
 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)
Beispiel #7
0
 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)
Beispiel #8
0
 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)
Beispiel #9
0
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']},
    )