Exemple #1
0
def add_subpage(request, parent_page_id):
    """Override wagtail view to prevent creation of limited pages"""

    parent_page = get_object_or_404(Page, id=parent_page_id).specific
    if not parent_page.permissions_for_user(request.user).can_add_subpage():
        raise PermissionDenied

    page_types = [
        (model.get_verbose_name(), model._meta.app_label,
         model._meta.model_name)
        for model in type(parent_page).creatable_subpage_models()
        if model.can_create_at(parent_page) and can_create(request, model)
    ]
    # sort by lower-cased version of verbose name
    page_types.sort(key=lambda page_type: page_type[0].lower())

    if len(page_types) == 1:
        # Only one page type is available - redirect straight to the create form rather than
        # making the user choose
        verbose_name, app_label, model_name = page_types[0]
        return redirect('wagtailadmin_pages:add', app_label, model_name,
                        parent_page.id)

    return render(
        request, 'wagtailadmin/pages/add_subpage.html', {
            'parent_page': parent_page,
            'page_types': page_types,
            'next': get_valid_next_url_from_request(request),
        })
Exemple #2
0
def unpublish(request, page_id):
    page = get_object_or_404(Page, id=page_id).specific

    user_perms = UserPagePermissionsProxy(request.user)
    if not user_perms.for_page(page).can_unpublish():
        raise PermissionDenied

    next_url = get_valid_next_url_from_request(request)

    include_descendants = request.POST.get('include_descendants', False)

    page.unpublish()

    if include_descendants:
        live_descendant_pages = page.get_descendants().live().specific()
        for live_descendant_page in live_descendant_pages:
            if user_perms.for_page(live_descendant_page).can_unpublish():
                live_descendant_page.unpublish()

    messages.success(request,
                     _('Page \'{0}\' unpublished.').format(
                         page.get_admin_display_title()),
                     buttons=[
                         messages.button(
                             reverse('wagtailadmin_pages:edit',
                                     args=(page.id, )), _('Edit'))
                     ])

    page.release_id = request.POST.get('release', None)
    page.save_revision(request.user)

    if next_url:
        return redirect(next_url)
    return redirect('wagtailadmin_explore', page.get_parent().id)
Exemple #3
0
def publish(request, page_id):
    page = get_object_or_404(Page, id=page_id).specific

    user_perms = UserPagePermissionsProxy(request.user)
    if not user_perms.for_page(page).can_publish():
        raise PermissionDenied

    next_url = pages.get_valid_next_url_from_request(request)

    if request.method == 'POST':

        page.get_latest_revision().publish()

        messages.success(request, _("Page '{0}' published.").format(page.get_admin_display_title()), buttons=[
            messages.button(reverse('wagtailadmin_pages:edit', args=(page.id,)), _('Edit'))
        ])

        if next_url:
            return redirect(next_url)
        return redirect('wagtailadmin_explore', page.get_parent().id)

    return render(request, 'wagtailadmin/pages/confirm_publish.html', {
        'page': page,
        'next': next_url,
    })
def copy(request, app_label, model_name, id):
    # Validate snippet has been registered and title_field is set.
    meta = snippet_copy_registry.get(app_label, model_name)
    if meta is None:
        raise Exception("This snippet isn't registered as copyable")

    try:
        model = apps.get_model(app_label, model_name)
    except LookupError:
        raise Http404

    permission = get_permission_name('change', model)
    if not request.user.has_perm(permission):
        return permission_denied(request)

    snippet = get_object_or_404(model, id=id)

    # Create the form
    form = meta['copy_form_class'](request.POST or None, snippet=snippet, title_field_name=meta['title_field_name'])

    next_url = get_valid_next_url_from_request(request)

    for fn in hooks.get_hooks('before_copy_snippet'):
        result = fn(request, snippet)
        if hasattr(result, 'status_code'):
            return result

    # Check if user is submitting
    if request.method == 'POST':

        if form.is_valid():

            # Copy the snippet
            new_snippet = form.copy()

            # Give a success message back to the user
            messages.success(request, _(f"{snippet.get_snippet_verbose_name()} '{snippet}' has been copied.").format(snippet))

            for fn in hooks.get_hooks('after_copy_snippet'):
                result = fn(request, snippet, new_snippet)
                if hasattr(result, 'status_code'):
                    return result

            if next_url:
                return redirect(next_url)

            if 'wagtail.contrib.modeladmin' in settings.INSTALLED_APPS:
                url_helper = AdminURLHelper(new_snippet)
                return redirect(url_helper.get_action_url('edit', quote(new_snippet.pk)))

            return redirect('wagtailsnippets:edit', app_label, model_name, new_snippet.id)

    return render(request, 'wagtailsnippetscopy/copy.html', {
        'snippet': snippet,
        'app_label': app_label,
        'model_name': model_name,
        'form': form,
        'next': next_url,
    })
def delete_related_variants(request, page):
    if not isinstance(page, models.PersonalisablePageMixin) \
            or not page.personalisation_metadata.is_canonical:
        return
    # Get a list of related personalisation metadata for all the related
    # variants.
    variants_metadata = (page.personalisation_metadata.variants_metadata.
                         select_related('variant'))
    next_url = get_valid_next_url_from_request(request)

    if request.method == 'POST':
        parent_id = page.get_parent().id
        with transaction.atomic():
            # To ensure variants are deleted for all descendants, start with
            # the deepest ones, and explicitly delete variants and metadata
            # for all of them, including the page itself. Otherwise protected
            # foreign key constraints are violated. Only consider canonical
            # pages.
            for metadata in PersonalisablePageMetadata.objects.filter(
                    canonical_page__in=page.get_descendants(inclusive=True),
                    variant=F("canonical_page"),
            ).order_by('-canonical_page__depth'):
                for variant_metadata in metadata.variants_metadata.select_related(
                        'variant'):
                    # Call delete() on objects to trigger any signals or hooks.
                    variant_metadata.variant.delete()
                metadata.delete()
                metadata.canonical_page.delete()

        msg = _("Page '{0}' and its variants deleted.")
        messages.success(request, msg.format(page.get_admin_display_title()))

        for fn in hooks.get_hooks('after_delete_page'):
            result = fn(request, page)
            if hasattr(result, 'status_code'):
                return result

        if next_url:
            return redirect(next_url)
        return redirect('wagtailadmin_explore', parent_id)

    return render(
        request,
        'wagtailadmin/pages/wagtail_personalisation/confirm_delete.html', {
            'page':
            page,
            'descendant_count':
            page.get_descendant_count(),
            'next':
            next_url,
            'variants':
            Page.objects.filter(
                pk__in=variants_metadata.values_list('variant_id'))
        })
def delete_related_variants(request, page):
    if not isinstance(page, models.PersonalisablePageMixin) \
            or not page.personalisation_metadata.is_canonical:
        return
    # Get a list of related personalisation metadata for all the related
    # variants.
    variants_metadata = (
        page.personalisation_metadata.variants_metadata
                                     .select_related('variant')
    )
    next_url = get_valid_next_url_from_request(request)

    if request.method == 'POST':
        parent_id = page.get_parent().id
        variants_metadata = variants_metadata.select_related('variant')
        with transaction.atomic():
            for metadata in variants_metadata.iterator():
                # Call delete() on objects to trigger any signals or hooks.
                metadata.variant.delete()
            # Delete the page's main variant and the page itself.
            page.personalisation_metadata.delete()
            page.delete()
        msg = _("Page '{0}' and its variants deleted.")
        messages.success(
            request,
            msg.format(page.get_admin_display_title())
        )

        for fn in hooks.get_hooks('after_delete_page'):
            result = fn(request, page)
            if hasattr(result, 'status_code'):
                return result

        if next_url:
            return redirect(next_url)
        return redirect('wagtailadmin_explore', parent_id)

    return render(
        request,
        'wagtailadmin/pages/wagtail_personalisation/confirm_delete.html', {
            'page': page,
            'descendant_count': page.get_descendant_count(),
            'next': next_url,
            'variants': Page.objects.filter(
                pk__in=variants_metadata.values_list('variant_id')
            )
        }
    )
def update_page_from_import(request, page, parsed_doc):
    """
    Renders an edit page with the content of the page replaced with the content in the given document
    """
    page.update_from_import(parsed_doc, request.user)

    edit_handler = page.get_edit_handler()
    edit_handler = edit_handler.bind_to(request=request, instance=page)
    form_class = edit_handler.get_form_class()

    next_url = get_valid_next_url_from_request(request)

    form = form_class(instance=page)
    has_unsaved_changes = True

    edit_handler = edit_handler.bind_to(form=form)

    return render(
        request,
        "wagtailadmin/pages/edit.html",
        {
            "page":
            page,
            "page_for_status":
            page,
            "content_type":
            page.content_type,
            "edit_handler":
            edit_handler,
            "action_menu":
            PageActionMenu(
                request, view="edit", page=page,
                parent_page=page.get_parent()),
            "preview_modes":
            page.preview_modes,
            "form":
            form,
            "next":
            next_url,
            "has_unsaved_changes":
            has_unsaved_changes,
        },
    )
def create_page_from_import(request, parent_page, page_class, parsed_doc):
    """
    Renders a pre-populated create page based on a parsed document for a Page model with ContentImportMixin
    """

    page = page_class.create_from_import(parsed_doc, request.user)

    edit_handler = page_class.get_edit_handler()
    edit_handler = edit_handler.bind_to(request=request, instance=page)
    form_class = edit_handler.get_form_class()

    next_url = get_valid_next_url_from_request(request)

    form = form_class(instance=page, parent_page=parent_page)
    has_unsaved_changes = False

    edit_handler = edit_handler.bind_to(form=form)

    return render(
        request,
        "wagtailadmin/pages/create.html",
        {
            "content_type":
            page.content_type,
            "page_class":
            page_class,
            "parent_page":
            parent_page,
            "edit_handler":
            edit_handler,
            "action_menu":
            PageActionMenu(request, view="create", parent_page=parent_page),
            "preview_modes":
            page.preview_modes,
            "form":
            form,
            "next":
            next_url,
            "has_unsaved_changes":
            has_unsaved_changes,
        },
    )
Exemple #9
0
def copy(request, page_id):
    page = Page.objects.get(id=page_id)
    page = page.specific
    newest_revision = page.get_latest_revision()

    # Parent page defaults to parent of source page
    parent_page = page.get_parent()

    # Check if the user has permission to publish subpages on the parent
    can_publish = parent_page.permissions_for_user(
        request.user).can_publish_subpage()

    # Create the form
    form = CopyForm(request.POST or None,
                    user=request.user,
                    page=page,
                    can_publish=can_publish)

    next_url = get_valid_next_url_from_request(request)

    for fn in hooks.get_hooks('before_copy_page'):
        result = fn(request, page)
        if hasattr(result, 'status_code'):
            return result

    # Check if user is submitting
    if request.method == 'POST':
        # Prefill parent_page in case the form is invalid (as prepopulated value for the form field,
        # because ModelChoiceField seems to not fall back to the user given value)
        parent_page = Page.objects.get(id=request.POST['new_parent_page'])

        if form.is_valid():
            # Receive the parent page (this should never be empty)
            if form.cleaned_data['new_parent_page']:
                parent_page = form.cleaned_data['new_parent_page']

            if not page.permissions_for_user(request.user).can_copy_to(
                    parent_page, form.cleaned_data.get('copy_subpages')):
                raise PermissionDenied

            # Re-check if the user has permission to publish subpages on the new parent
            can_publish = parent_page.permissions_for_user(
                request.user).can_publish_subpage()

            new_page = newest_revision.as_page_object().copy(
                recursive=form.cleaned_data.get('copy_subpages'),
                to=parent_page,
                update_attrs={
                    'title': form.cleaned_data['new_title'],
                    'slug': form.cleaned_data['new_slug'],
                },
                keep_live=(can_publish
                           and form.cleaned_data.get('publish_copies')),
                user=request.user,
            )

            # Give a success message back to the user
            if form.cleaned_data.get('copy_subpages'):
                messages.success(
                    request,
                    _('Page \'{0}\' and {1} subpages copied.').format(
                        page.get_admin_display_title(),
                        new_page.get_descendants().count()))
            else:
                messages.success(
                    request,
                    _('Page \'{0}\' copied.').format(
                        page.get_admin_display_title()))

            for fn in hooks.get_hooks('after_copy_page'):
                result = fn(request, page, new_page)
                if hasattr(result, 'status_code'):
                    return result

            # Redirect to explore of parent page
            if next_url:
                return redirect(next_url)
            return redirect('wagtailadmin_explore', parent_page.id)

    return render(request, 'wagtailadmin/pages/copy.html', {
        'page': page,
        'form': form,
        'next': next_url,
    })
Exemple #10
0
def edit(request, page_id):
    from PIL import ImageFile
    ImageFile.LOAD_TRUNCATED_IMAGES = True

    real_page_record = get_object_or_404(Page, id=page_id)
    latest_revision = real_page_record.get_latest_revision()
    page = real_page_record.get_latest_revision_as_page()
    parent = page.get_parent()

    content_type = ContentType.objects.get_for_model(page)
    page_class = content_type.model_class()

    page_perms = page.permissions_for_user(request.user)
    if not page_perms.can_edit():
        raise PermissionDenied

    for fn in hooks.get_hooks('before_edit_page'):
        result = fn(request, page)
        if hasattr(result, 'status_code'):
            return result

    edit_handler = page_class.get_edit_handler()
    form_class = edit_handler.get_form_class()

    next_url = get_valid_next_url_from_request(request)

    errors_debug = None

    if request.method == 'POST':
        form = form_class(request.POST,
                          request.FILES,
                          instance=page,
                          parent_page=parent)

        if form.is_valid() and not page.locked:
            page = form.save(commit=False)

            is_publishing = bool(request.POST.get(
                'action-publish')) and page_perms.can_publish()
            is_unpublishing = bool(request.POST.get(
                'action-unpublish')) and page_perms.can_unpublish()
            is_submitting = bool(request.POST.get('action-submit'))
            is_reverting = bool(request.POST.get('revision'))

            # If a revision ID was passed in the form, get that revision so its
            # date can be referenced in notification messages
            if is_reverting:
                previous_revision = get_object_or_404(
                    page.revisions, id=request.POST.get('revision'))

            # Save revision
            revision = page.save_revision(
                user=request.user,
                submitted_for_moderation=is_submitting,
            )
            # store submitted go_live_at for messaging below
            go_live_at = page.go_live_at

            # Publish
            if is_publishing:
                revision.publish()
                # Need to reload the page because the URL may have changed, and we
                # need the up-to-date URL for the "View Live" button.
                page = page.specific_class.objects.get(pk=page.pk)

                # Page is being published now

                if is_reverting:
                    message = _(
                        'Revision from {0} of page \'{1}\' has been published.'
                    ).format(
                        previous_revision.created_at.strftime(
                            '%d %b %Y %H:%M'), page.get_admin_display_title())
                else:
                    message = _('Page \'{0}\' has been published.').format(
                        page.get_admin_display_title())

                buttons = []
                if page.url is not None:
                    buttons.append(
                        messages.button(page.url,
                                        _('View live'),
                                        new_window=True))
                buttons.append(
                    messages.button(
                        reverse('wagtailadmin_pages:edit', args=(page_id, )),
                        _('Edit')))
                messages.success(request, message, buttons=buttons)

            # Unpublish
            if is_unpublishing:
                release_for_unpublish = request.POST.get('release')
                release = Release.objects.get(id=release_for_unpublish)
                release.remove_page(page_id)

                messages.success(request,
                                 _('Page \'{0}\' unpublished.').format(
                                     page.get_admin_display_title()),
                                 buttons=[
                                     messages.button(
                                         reverse('wagtailadmin_pages:edit',
                                                 args=(page.id, )), _('Edit'))
                                 ])

            elif is_submitting:

                message = _(
                    'Page \'{0}\' has been submitted for moderation.').format(
                        page.get_admin_display_title())

                messages.success(request,
                                 message,
                                 buttons=[
                                     messages.button(reverse(
                                         'wagtailadmin_pages:view_draft',
                                         args=(page_id, )),
                                                     _('View draft'),
                                                     new_window=True),
                                     messages.button(
                                         reverse('wagtailadmin_pages:edit',
                                                 args=(page_id, )), _('Edit'))
                                 ])

                if not send_notification(page.get_latest_revision().id,
                                         'submitted', request.user.pk):
                    messages.error(
                        request,
                        _('Failed to send notifications to moderators'))

            else:  # Saving

                if is_reverting:
                    message = _(
                        'Page \'{0}\' has been replaced with revision from {1}.'
                    ).format(
                        page.get_admin_display_title(),
                        previous_revision.created_at.strftime(
                            '%d %b %Y %H:%M'))
                else:
                    message = _('Page \'{0}\' has been updated.').format(
                        page.get_admin_display_title())

                messages.success(request, message)

            for fn in hooks.get_hooks('after_edit_page'):
                result = fn(request, page)
                if hasattr(result, 'status_code'):
                    return result

            if is_publishing or is_submitting:
                # we're done here - redirect back to the explorer
                if next_url:
                    # redirect back to 'next' url if present
                    return redirect(next_url)
                # redirect back to the explorer
                return redirect('wagtailadmin_explore', page.get_parent().id)
            else:
                # Just saving - remain on edit page for further edits
                target_url = reverse('wagtailadmin_pages:edit', args=[page.id])
                if next_url:
                    # Ensure the 'next' url is passed through again if present
                    target_url += '?next=%s' % urlquote(next_url)
                return redirect(target_url)
        else:
            if page.locked:
                messages.error(
                    request, _('The page could not be saved as it is locked'))
            else:
                messages.validation_error(
                    request,
                    _('The page could not be saved due to validation errors'),
                    form)

            edit_handler = edit_handler.bind_to_instance(instance=page,
                                                         form=form,
                                                         request=request)
            errors_debug = (repr(edit_handler.form.errors) + repr(
                [(name, formset.errors)
                 for (name, formset) in edit_handler.form.formsets.items()
                 if formset.errors]))
            has_unsaved_changes = True
    else:
        edit_handler = page_class.get_edit_handler()
        form_class = edit_handler.get_form_class()

        class CustomPageForm(form_class):
            def __init__(self, *args, **kwargs):
                super(CustomPageForm, self).__init__(*args, **kwargs)
                self.fields['release'].queryset = self.fields[
                    'release'].queryset.filter(site=self.instance.get_site())

        form = CustomPageForm(instance=page, parent_page=parent)
        edit_handler = edit_handler.bind_to_instance(instance=page,
                                                     form=form,
                                                     request=request)
        has_unsaved_changes = False

    # Check for revisions still undergoing moderation and warn
    if latest_revision and latest_revision.submitted_for_moderation:
        buttons = []

        if page.live:
            buttons.append(
                messages.button(
                    reverse('wagtailadmin_pages:revisions_compare',
                            args=(page.id, 'live', latest_revision.id)),
                    _('Compare with live version')))

        messages.warning(request,
                         _('This page is currently awaiting moderation'),
                         buttons=buttons)

    if page.live and page.has_unpublished_changes:
        # Page status needs to present the version of the page containing the correct live URL
        page_for_status = real_page_record.specific
    else:
        page_for_status = page

    rendition = None
    try:
        rendition = SiteSettings.objects.get(site=page.get_site()).rendition
    except SiteSettings.DoesNotExist:
        pass

    return render(
        request, 'wagtailadmin/pages/edit.html', {
            'page': page,
            'page_for_status': page_for_status,
            'content_type': content_type,
            'edit_handler': edit_handler,
            'errors_debug': errors_debug,
            'preview_modes': page.preview_modes,
            'form': form,
            'next': next_url,
            'has_unsaved_changes': has_unsaved_changes,
            'rendition': rendition,
        })
def copy(request, page_id):
    page = Page.objects.get(id=page_id)

    # Parent page defaults to parent of source page
    parent_page = page.get_parent()

    # Check if the user has permission to publish subpages on the parent
    can_publish = parent_page.permissions_for_user(request.user).can_publish_subpage()

    # Create the form
    form = CopyForm(request.POST or None, user=request.user, page=page, can_publish=can_publish)

    next_url = get_valid_next_url_from_request(request)

    for fn in hooks.get_hooks('before_copy_page'):
        result = fn(request, page)
        if hasattr(result, 'status_code'):
            return result

    # Check if user is submitting
    if request.method == 'POST':
        # Prefill parent_page in case the form is invalid (as prepopulated value for the form field,
        # because ModelChoiceField seems to not fall back to the user given value)
        parent_page = Page.objects.get(id=request.POST['new_parent_page'])

        if form.is_valid():
            # Receive the parent page (this should never be empty)
            if form.cleaned_data['new_parent_page']:
                parent_page = form.cleaned_data['new_parent_page']

            if not page.permissions_for_user(request.user).can_copy_to(
                    parent_page,
                    form.cleaned_data.get('copy_subpages')):
                raise PermissionDenied

            # Re-check if the user has permission to publish subpages on the new parent
            can_publish = parent_page.permissions_for_user(request.user).can_publish_subpage()

            # build translated attrs
            translated_attrs = {}
            for lang in mt_settings.AVAILABLE_LANGUAGES:
                new_title_field = build_localized_fieldname("new_title", lang)
                if form.cleaned_data.get(new_title_field):
                    title_field = build_localized_fieldname("title", lang)
                    new_slug_field = build_localized_fieldname("new_slug", lang)
                    slug_field = build_localized_fieldname("slug", lang)
                    translated_attrs.update({
                        '{}'.format(title_field): form.cleaned_data[new_title_field],
                        '{}'.format(slug_field): form.cleaned_data[new_slug_field],
                    })

            # Copy the page
            new_page = page.copy(
                recursive=form.cleaned_data.get('copy_subpages'),
                to=parent_page,
                update_attrs=translated_attrs,
                keep_live=(can_publish and form.cleaned_data.get('publish_copies')),
                user=request.user,
            )

            # Give a success message back to the user
            if form.cleaned_data.get('copy_subpages'):
                messages.success(
                    request,
                    _("Page '{0}' and {1} subpages copied.").format(
                        page.get_admin_display_title(),
                        new_page.get_descendants().count())
                )
            else:
                messages.success(request, _("Page '{0}' copied.").format(
                    page.get_admin_display_title()))

            for fn in hooks.get_hooks('after_copy_page'):
                result = fn(request, page, new_page)
                if hasattr(result, 'status_code'):
                    return result

            # Redirect to explore of parent page
            if next_url:
                return redirect(next_url)
            return redirect('wagtailadmin_explore', parent_page.id)

    return render(request, 'wagtailadmin/pages/copy.html', {
        'page': page,
        'form': form,
        'next': next_url,
    })
Exemple #12
0
def before_copy_page(request, page):
    parent_page = page.get_parent()
    can_publish = parent_page.permissions_for_user(request.user).can_publish_subpage()
    form = PatchedCopyForm(request.POST or None, user=request.user, page=page, can_publish=can_publish)
    next_url = get_valid_next_url_from_request(request)

    if request.method == 'POST':
        # Prefill parent_page in case the form is invalid (as prepopulated value for the form field,
        # because ModelChoiceField seems to not fall back to the user given value)
        parent_page = Page.objects.get(id=request.POST['new_parent_page'])

        if form.is_valid():
            # Receive the parent page (this should never be empty)
            if form.cleaned_data['new_parent_page']:
                parent_page = form.cleaned_data['new_parent_page']

            if not page.permissions_for_user(request.user).can_copy_to(parent_page,
                                                                       form.cleaned_data.get('copy_subpages')):
                raise PermissionDenied

            # Re-check if the user has permission to publish subpages on the new parent
            can_publish = parent_page.permissions_for_user(request.user).can_publish_subpage()

            update_attrs = {}
            for code, name in settings.LANGUAGES:
                if wmt_settings.TRANSLATE_SLUGS:
                    slug = build_localized_fieldname('slug', code)
                else:
                    slug = 'slug'
                title = build_localized_fieldname('title', code)
                update_attrs[slug] = form.cleaned_data["new_{}".format(slug)]
                update_attrs[title] = form.cleaned_data["new_{}".format(title)]

            # Copy the page
            new_page = page.copy(
                recursive=form.cleaned_data.get('copy_subpages'),
                to=parent_page,
                update_attrs=update_attrs,
                keep_live=(can_publish and form.cleaned_data.get('publish_copies')),
                user=request.user,
            )

            # Give a success message back to the user
            if form.cleaned_data.get('copy_subpages'):
                messages.success(
                    request,
                    _("Page '{0}' and {1} subpages copied.").format(
                        page.get_admin_display_title(), new_page.get_descendants().count())
                )
            else:
                messages.success(request, _("Page '{0}' copied.").format(page.get_admin_display_title()))

            for fn in hooks.get_hooks('after_copy_page'):
                result = fn(request, page, new_page)
                if hasattr(result, 'status_code'):
                    return result

            # Redirect to explore of parent page
            if next_url:
                return redirect(next_url)
            return redirect('wagtailadmin_explore', parent_page.id)

    return render(request, 'modeltranslation_copy.html', {
        'page': page,
        'form': form,
        'next': next_url
    })
Exemple #13
0
def create(request, content_type_app_name, content_type_model_name,
           parent_page_id):
    parent_page = get_object_or_404(Page, id=parent_page_id).specific
    parent_page_perms = parent_page.permissions_for_user(request.user)
    if not parent_page_perms.can_add_subpage():
        raise PermissionDenied

    try:
        content_type = ContentType.objects.get_by_natural_key(
            content_type_app_name, content_type_model_name)
    except ContentType.DoesNotExist:
        raise Http404

    # Get class
    page_class = content_type.model_class()

    # Make sure the class is a descendant of Page
    if not issubclass(page_class, Page):
        raise Http404

    # page must be in the list of allowed subpage types for this parent ID
    if page_class not in parent_page.creatable_subpage_models():
        raise PermissionDenied

    if not page_class.can_create_at(parent_page):
        raise PermissionDenied

    for fn in hooks.get_hooks('before_create_page'):
        result = fn(request, parent_page, page_class)
        if hasattr(result, 'status_code'):
            return result

    page = page_class(owner=request.user)
    edit_handler = page_class.get_edit_handler()
    form_class = edit_handler.get_form_class()

    next_url = get_valid_next_url_from_request(request)

    if request.method == 'POST':
        form = form_class(request.POST,
                          request.FILES,
                          instance=page,
                          parent_page=parent_page)

        if form.is_valid():
            page = form.save(commit=False)

            # Save page
            parent_page.add_child(instance=page)

            # Save revision
            page.save_revision(
                user=request.user,
                submitted_for_moderation=False,
            )

            messages.success(
                request,
                _('Page \'{0}\' created.').format(
                    page.get_admin_display_title()))

            for fn in hooks.get_hooks('after_create_page'):
                result = fn(request, page)
                if hasattr(result, 'status_code'):
                    return result

            # Just saving - remain on edit page for further edits
            target_url = reverse('experiments_oneyouvariant_edit',
                                 args=[page.id])
            if next_url:
                # Ensure the 'next' url is passed through again if present
                target_url += '?next=%s' % urlquote(next_url)
            return redirect(target_url)

        else:
            messages.validation_error(
                request,
                _('The page could not be created due to validation errors'),
                form)
            edit_handler = edit_handler.bind_to_instance(instance=page,
                                                         form=form,
                                                         request=request)
            has_unsaved_changes = True
    else:
        parent_page_json = parent_page.to_json()
        page = page_class.from_json(parent_page_json)
        slug = hashlib.sha224(
            base64.b64encode(str(time.time()).encode('utf-8'))).hexdigest()
        page.slug = '%s-v%s' % (page.slug, slug[:6])
        page.title = '%s (describe the variant)' % page.title

        signals.init_new_page.send(sender=create,
                                   page=page,
                                   parent=parent_page)
        form = form_class(instance=page, parent_page=parent_page)
        edit_handler = edit_handler.bind_to_instance(instance=page,
                                                     form=form,
                                                     request=request)
        has_unsaved_changes = False

    return render(
        request, 'wagtailadmin/custom_add_footer.html', {
            'content_type': content_type,
            'page_class': page_class,
            'parent_page': parent_page,
            'edit_handler': edit_handler,
            'preview_modes': page.preview_modes,
            'form': form,
            'next': next_url,
            'has_unsaved_changes': has_unsaved_changes,
        })
Exemple #14
0
def publish(request, page_id):

    page = get_object_or_404(Page, id=page_id).specific

    user_perms = UserPagePermissionsProxy(request.user)
    if not user_perms.for_page(page).can_publish():
        raise PermissionDenied

    next_url = pages.get_valid_next_url_from_request(request)

    if request.method == 'POST':

        page.get_latest_revision().publish()

        # TODO: clean up copypasta when coa-publisher phases out previously AWS publish pipeline
        # Show success message if there is a publish_janis_branch set (for netlify builds)
        # Or default to show success message on Staging and Production (follow existing AWS implementation pattern)
        try:
            publish_janis_branch = getattr(JanisBranchSettings.objects.first(),
                                           'publish_janis_branch')
        except:
            publish_janis_branch = None
        if settings.ISSTAGING or settings.ISPRODUCTION:
            messages.success(request,
                             _("Page '{0}' published.").format(
                                 page.get_admin_display_title()),
                             buttons=[
                                 messages.button(
                                     reverse('wagtailadmin_pages:edit',
                                             args=(page.id, )), _('Edit'))
                             ])
        elif settings.ISLOCAL:
            messages.warning(
                request,
                _("Page '{0}' not published. You're running on a local environment."
                  ).format(page.get_admin_display_title()),
                buttons=[
                    messages.button(
                        reverse('wagtailadmin_pages:edit', args=(page.id, )),
                        _('Edit'))
                ])
        elif publish_janis_branch:
            messages.success(request,
                             _("Page '{0}' published.").format(
                                 page.get_admin_display_title()),
                             buttons=[
                                 messages.button(
                                     reverse('wagtailadmin_pages:edit',
                                             args=(page.id, )), _('Edit'))
                             ])
        else:
            messages.warning(
                request,
                _("Page '{0}' not published. No `publish_janis_branch` was set."
                  ).format(page.get_admin_display_title()),
                buttons=[
                    messages.button(
                        reverse('wagtailadmin_pages:edit', args=(page.id, )),
                        _('Edit'))
                ])

        if next_url:
            return redirect(next_url)
        # return redirect('wagtailadmin_explore', page.get_parent().id)
        return redirect('/admin/pages/search/')

    return render(request, 'wagtailadmin/pages/confirm_publish.html', {
        'page': page,
        'next': next_url,
    })
Exemple #15
0
def custom_admin_round_copy_view(request, page):
    # Custom view to handle copied Round pages.
    # https://github.com/wagtail/wagtail/blob/124827911463f0cb959edbb9d8d5685578540bd3/wagtail/admin/views/pages.py#L824

    # Parent page defaults to parent of source page
    parent_page = page.get_parent()

    # Check if the user has permission to publish subpages on the parent
    can_publish = parent_page.permissions_for_user(
        request.user).can_publish_subpage()

    form = CopyForm(request.POST or None,
                    user=request.user,
                    page=page,
                    can_publish=can_publish)

    next_url = get_valid_next_url_from_request(request)

    # Prefill parent_page in case the form is invalid (as prepopulated value for the form field,
    # because ModelChoiceField seems to not fall back to the user given value)
    parent_page = Page.objects.get(id=request.POST['new_parent_page'])

    if form.is_valid():
        # Receive the parent page (this should never be empty)
        if form.cleaned_data['new_parent_page']:
            parent_page = form.cleaned_data['new_parent_page']

        if not page.permissions_for_user(request.user).can_copy_to(
                parent_page, form.cleaned_data.get('copy_subpages')):
            raise PermissionDenied

        # Re-check if the user has permission to publish subpages on the new parent
        can_publish = parent_page.permissions_for_user(
            request.user).can_publish_subpage()

        # Copy the page
        new_page = page.copy(
            recursive=form.cleaned_data.get('copy_subpages'),
            to=parent_page,
            update_attrs={
                'title': form.cleaned_data['new_title'],
                'slug': form.cleaned_data['new_slug'],
                'start_date': None,
                'end_date': None,
            },
            keep_live=(can_publish
                       and form.cleaned_data.get('publish_copies')),
            user=request.user,
        )

        messages.info(
            request,
            _(("Please select the date in the copied page. "
               "Newly copied pages have NONE value for the start and end date"
               )))

        # Give a success message back to the user
        if form.cleaned_data.get('copy_subpages'):
            messages.success(
                request,
                _("Page '{0}' and {1} subpages copied.").format(
                    page.get_admin_display_title(),
                    new_page.get_descendants().count()))
        else:
            messages.success(
                request,
                _("Page '{0}' copied.").format(page.get_admin_display_title()))

        for fn in hooks.get_hooks('after_copy_page'):
            result = fn(request, page, new_page)
            if hasattr(result, 'status_code'):
                return result

        # Redirect to explore of parent page
        if next_url:
            return redirect(next_url)
        return redirect('wagtailadmin_explore', parent_page.id)