def edit(request, group_id): group = get_object_or_404(Group, id=group_id) if request.method == 'POST': form = GroupForm(request.POST, instance=group) permission_panels = [ cls(request.POST, instance=group) for cls in get_permission_panel_classes() ] if form.is_valid() and all(panel.is_valid() for panel in permission_panels): form.save() for panel in permission_panels: panel.save() messages.success(request, _("Group '{0}' updated.").format(group), buttons=[ messages.button(reverse('wagtailusers_groups:edit', args=(group.id,)), _('Edit')) ]) return redirect('wagtailusers_groups:index') else: messages.error(request, _("The group could not be saved due to errors.")) else: form = GroupForm(instance=group) permission_panels = [ cls(instance=group) for cls in get_permission_panel_classes() ] return render(request, 'wagtailusers/groups/edit.html', { 'group': group, 'form': form, 'permission_panels': permission_panels, })
def delete(request, content_type_app_name, content_type_model_name, id): content_type = get_content_type_from_url_params(content_type_app_name, content_type_model_name) if not user_can_edit_snippet_type(request.user, content_type): raise PermissionDenied model = content_type.model_class() snippet_type_name = get_snippet_type_name(content_type)[0] instance = get_object_or_404(model, id=id) if request.POST: instance.delete() messages.success( request, _("{snippet_type} '{instance}' deleted.").format( snippet_type=capfirst(snippet_type_name), instance=instance ) ) return redirect('wagtailsnippets_list', content_type.app_label, content_type.model) return render(request, 'wagtailsnippets/snippets/confirm_delete.html', { 'content_type': content_type, 'snippet_type_name': snippet_type_name, 'instance': instance, })
def post(self, request, *args, **kwargs): if request.POST: try: self.delete_instance() messages.success( request, _("{model} '{instance}' deleted.").format( model=self.model_name, instance=self.instance)) return redirect(self.get_index_url) except models.ProtectedError: messages.error( request, _( "{model} '{instance}' could not be deleted." ).format(model=self.model_name, instance=self.instance)) linked_objects = [] for rel in self.model._meta.get_all_related_objects(): if rel.on_delete == models.PROTECT: qs = getattr(self.instance, rel.get_accessor_name()) for obj in qs.all(): linked_objects.append(obj) context = { 'view': self, 'instance': self.instance, 'error_protected': True, 'linked_objects': linked_objects, } return self.render_to_response(context)
def index(request): form = SearchForm(placeholder=_("Search something")) example_form = ExampleForm() messages.success(request, _("Success message"), buttons=[ messages.button('', _('View live')), messages.button('', _('Edit')) ]) messages.warning(request, _("Warning message"), buttons=[ messages.button('', _('View live')), messages.button('', _('Edit')) ]) messages.error(request, _("Error message"), buttons=[ messages.button('', _('View live')), messages.button('', _('Edit')) ]) fake_pagination = { 'number': 1, 'previous_page_number': 1, 'next_page_number': 2, 'has_previous': True, 'has_next': True, 'paginator': { 'num_pages': 10, }, } return render(request, 'wagtailstyleguide/base.html', { 'search_form': form, 'example_form': example_form, 'fake_pagination': fake_pagination, })
def form_valid(self, form): """ Processes a valid form submittal. :param form: the form instance. :rtype: django.http.HttpResponse. """ #noinspection PyAttributeOutsideInit self.object = form.save() meta = getattr(self.object, '_meta') # Index the object. for backend in get_search_backends(): backend.add(object) #noinspection PyUnresolvedReferences messages.success( self.request, _(u'{0} "{1}" saved.').format( meta.verbose_name, str(self.object) ), buttons=[messages.button( reverse( '{0}:edit'.format(self.url_namespace), args=(self.object.id,) ), _(u'Edit') )] ) return redirect(self.get_success_url())
def delete(request, content_type_app_name, content_type_model_name, id): content_type = get_content_type_from_url_params(content_type_app_name, content_type_model_name) model = content_type.model_class() permission = get_permission_name("delete", model) if not request.user.has_perm(permission): return permission_denied(request) snippet_type_name = get_snippet_type_name(content_type)[0] instance = get_object_or_404(model, id=id) if request.POST: instance.delete() messages.success( request, _("{snippet_type} '{instance}' deleted.").format( snippet_type=capfirst(snippet_type_name), instance=instance ), ) return redirect("wagtailsnippets:list", content_type.app_label, content_type.model) return render( request, "wagtailsnippets/snippets/confirm_delete.html", {"content_type": content_type, "snippet_type_name": snippet_type_name, "instance": instance}, )
def create(request): GroupPagePermissionFormSet = inlineformset_factory( Group, GroupPagePermission, formset=BaseGroupPagePermissionFormSet, extra=0 ) if request.POST: form = GroupForm(request.POST) formset = GroupPagePermissionFormSet(request.POST) if form.is_valid() and formset.is_valid(): group = form.save() formset.instance = group formset.save() messages.success(request, _("Group '{0}' created.").format(group), buttons = [ messages.button(reverse('wagtailusers_groups_edit', args=(group.id,)), _('Edit')) ]) return redirect('wagtailusers_groups_index') else: messages.error(request, _("The group could not be created due to errors.")) else: form = GroupForm() formset = GroupPagePermissionFormSet() return render(request, 'wagtailusers/groups/create.html', { 'form': form, 'formset': formset, })
def index(request): form = SearchForm(placeholder=_("Search something")) example_form = ExampleForm() messages.success( request, _("Success message"), buttons=[messages.button("", _("View live")), messages.button("", _("Edit"))] ) messages.warning( request, _("Warning message"), buttons=[messages.button("", _("View live")), messages.button("", _("Edit"))] ) messages.error( request, _("Error message"), buttons=[messages.button("", _("View live")), messages.button("", _("Edit"))] ) fake_pagination = { "number": 1, "previous_page_number": 1, "next_page_number": 2, "has_previous": True, "has_next": True, "paginator": {"num_pages": 10}, } return render( request, "wagtailstyleguide/base.html", {"search_form": form, "example_form": example_form, "fake_pagination": fake_pagination}, )
def edit(request, image_id): Image = get_image_model() ImageForm = get_image_form(Image) image = get_object_or_404(Image, id=image_id) if not image.is_editable_by_user(request.user): raise PermissionDenied if request.POST: original_file = image.file form = ImageForm(request.POST, request.FILES, instance=image) if form.is_valid(): if 'file' in form.changed_data: # if providing a new image file, delete the old one and all renditions. # NB Doing this via original_file.delete() clears the file field, # which definitely isn't what we want... original_file.storage.delete(original_file.name) image.renditions.all().delete() # Set new image file size image.file_size = image.file.size form.save() # Reindex the image to make sure all tags are indexed for backend in get_search_backends(): backend.add(image) messages.success(request, _("Image '{0}' updated.").format(image.title), buttons=[ messages.button(reverse('wagtailimages:edit', args=(image.id,)), _('Edit again')) ]) return redirect('wagtailimages:index') else: messages.error(request, _("The image could not be saved due to errors.")) else: form = ImageForm(instance=image) # Check if we should enable the frontend url generator try: reverse('wagtailimages_serve', args=('foo', '1', 'bar')) url_generator_enabled = True except NoReverseMatch: url_generator_enabled = False if image.is_stored_locally(): # Give error if image file doesn't exist if not os.path.isfile(image.file.path): messages.error(request, _( "The source image file could not be found. Please change the source or delete the image." ).format(image.title), buttons=[ messages.button(reverse('wagtailimages:delete', args=(image.id,)), _('Delete')) ]) return render(request, "wagtailimages/images/edit.html", { 'image': image, 'form': form, 'url_generator_enabled': url_generator_enabled, 'filesize': image.get_file_size(), })
def edit(request, group_id): group = get_object_or_404(Group, id=group_id) GroupPagePermissionFormSet = inlineformset_factory( Group, GroupPagePermission, formset=BaseGroupPagePermissionFormSet, extra=0 ) if request.POST: form = GroupForm(request.POST, instance=group) formset = GroupPagePermissionFormSet(request.POST, instance=group) if form.is_valid() and formset.is_valid(): group = form.save() formset.save() messages.success(request, _("Group '{0}' updated.").format(group), buttons = [ messages.button(reverse('wagtailusers_groups_edit', args=(group.id,)), _('Edit')) ]) return redirect('wagtailusers_groups_index') else: messages.error(request, _("The group could not be saved due to errors.")) else: form = GroupForm(instance=group) formset = GroupPagePermissionFormSet(instance=group) return render(request, 'wagtailusers/groups/edit.html', { 'group': group, 'form': form, 'formset': formset, })
def add(request): EmbedVideoModel = get_embed_video_model() EmbedVideoForm = get_embed_video_form(EmbedVideoModel) if request.method == 'POST': embed_video = EmbedVideoModel(uploaded_by_user=request.user) form = EmbedVideoForm(request.POST, request.FILES, instance=embed_video, user=request.user) if form.is_valid(): form.save() # Reindex the embed video to make sure all tags are indexed search_index.insert_or_update_object(embed_video) messages.success( request, _("Video '{0}' added.").format(embed_video.title), buttons=[ messages.button( reverse( 'wagtail_embed_videos:edit', args=(embed_video.id,) ), _('Edit') ) ] ) return redirect('wagtail_embed_videos:index') else: messages.error(request, _("The video could not be created due to errors.")) else: form = EmbedVideoForm(user=request.user) return render(request, "wagtail_embed_videos/embed_videos/add.html", { 'form': form, })
def edit(request, redirect_id): theredirect = get_object_or_404(models.Redirect, id=redirect_id) if not permission_policy.user_has_permission_for_instance( request.user, 'change', theredirect ): return permission_denied(request) if request.method == 'POST': form = RedirectForm(request.POST, request.FILES, instance=theredirect) if form.is_valid(): form.save() messages.success(request, _("Redirect '{0}' updated.").format(theredirect.title), buttons=[ messages.button(reverse('wagtailredirects:edit', args=(theredirect.id,)), _('Edit')) ]) return redirect('wagtailredirects:index') else: messages.error(request, _("The redirect could not be saved due to errors.")) else: form = RedirectForm(instance=theredirect) return render(request, "wagtailredirects/edit.html", { 'redirect': theredirect, 'form': form, 'user_can_delete': permission_policy.user_has_permission(request.user, 'delete'), })
def add(request): ImageModel = get_image_model() ImageForm = get_image_form(ImageModel) if request.method == "POST": image = ImageModel(uploaded_by_user=request.user) form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): # Set image file size image.file_size = image.file.size form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) messages.success( request, _("Image '{0}' added.").format(image.title), buttons=[messages.button(reverse("wagtailimages:edit", args=(image.id,)), _("Edit"))], ) return redirect("wagtailimages:index") else: messages.error(request, _("The image could not be created due to errors.")) else: form = ImageForm(user=request.user) return render(request, "wagtailimages/images/add.html", {"form": form})
def add(request): ImageModel = get_image_model() ImageForm = get_image_form(ImageModel) if request.POST: image = ImageModel(uploaded_by_user=request.user) form = ImageForm(request.POST, request.FILES, instance=image) if form.is_valid(): # Set image file size image.file_size = image.file.size form.save() # Reindex the image to make sure all tags are indexed for backend in get_search_backends(): backend.add(image) messages.success(request, _("Image '{0}' added.").format(image.title), buttons=[ messages.button(reverse('wagtailimages:edit', args=(image.id,)), _('Edit')) ]) return redirect('wagtailimages:index') else: messages.error(request, _("The image could not be created due to errors.")) else: form = ImageForm() return render(request, "wagtailimages/images/add.html", { 'form': form, })
def delete(request, page_id): page = get_object_or_404(Page, id=page_id) if not page.permissions_for_user(request.user).can_delete(): raise PermissionDenied for fn in hooks.get_hooks("before_delete_page"): result = fn(request, page) if hasattr(result, "status_code"): return result next_url = get_valid_next_url_from_request(request) if request.method == "POST": parent_id = page.get_parent().id page.delete() messages.success(request, _("Page '{0}' deleted.").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/confirm_delete.html", {"page": page, "descendant_count": page.get_descendant_count(), "next": next_url}, )
def form_valid(self, form): instance = form.save() messages.success( self.request, self.get_success_message(instance), buttons=self.get_success_message_buttons(instance) ) return redirect(self.get_success_url())
def add(request): Document = get_document_model() DocumentForm = get_document_form(Document) if request.POST: doc = Document(uploaded_by_user=request.user) form = DocumentForm(request.POST, request.FILES, instance=doc, user=request.user) if form.is_valid(): form.save() # Reindex the document to make sure all tags are indexed for backend in get_search_backends(): backend.add(doc) messages.success(request, _("Document '{0}' added.").format(doc.title), buttons=[ messages.button(reverse('wagtaildocs:edit', args=(doc.id,)), _('Edit')) ]) return redirect('wagtaildocs:index') else: messages.error(request, _("The document could not be saved due to errors.")) else: form = DocumentForm(user=request.user) return render(request, "wagtaildocs/documents/add.html", { 'form': form, })
def approve_moderation(request, revision_id): revision = get_object_or_404(PageRevision, id=revision_id) if not revision.page.permissions_for_user(request.user).can_publish(): raise PermissionDenied if not revision.submitted_for_moderation: messages.error( request, _("The page '{0}' is not currently awaiting moderation.").format(revision.page.get_admin_display_title()), ) return redirect("wagtailadmin_home") if request.method == "POST": revision.approve_moderation() messages.success( request, _("Page '{0}' published.").format(revision.page.get_admin_display_title()), buttons=[ messages.button(revision.page.url, _("View live")), messages.button(reverse("wagtailadmin_pages:edit", args=(revision.page.id,)), _("Edit")), ], ) if not send_notification(revision.id, "approved", request.user.pk): messages.error(request, _("Failed to send approval notifications")) return redirect("wagtailadmin_home")
def edit(request, embed_video_id): EmbedVideo = get_embed_video_model() EmbedVideoForm = get_embed_video_form(EmbedVideo) embed_video = get_object_or_404(EmbedVideo, id=embed_video_id) if not embed_video.is_editable_by_user(request.user): raise PermissionDenied if request.POST: form = EmbedVideoForm(request.POST, request.FILES, instance=embed_video) if form.is_valid(): form.save() # Reindex the embed_video to make sure all tags are indexed for backend in get_search_backends(): backend.add(embed_video) messages.success(request, _("Embed video '{0}' updated.").format(embed_video.title), buttons=[ messages.button(reverse('wagtail_embed_videos_edit_embed_video', args=(embed_video.id,)), _('Edit again')) ]) return redirect('wagtail_embed_videos_index') else: messages.error(request, _("The embed video could not be saved due to errors.")) else: form = EmbedVideoForm(instance=embed_video) return render(request, "wagtail_embed_videos/embed_videos/edit.html", { 'embed_video': embed_video, 'form': form, })
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) if request.method == "POST": 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"))], ) if next_url: return redirect(next_url) return redirect("wagtailadmin_explore", page.get_parent().id) return render( request, "wagtailadmin/pages/confirm_unpublish.html", {"page": page, "next": next_url, "live_descendant_count": page.get_descendants().live().count()}, )
def edit(request, query_id): query = get_object_or_404(Query, id=query_id) if request.POST: # Get query query_form = search_forms.QueryForm(request.POST) # and the recommendations searchpicks_formset = forms.SearchPromotionsFormSet(request.POST, instance=query) if query_form.is_valid(): new_query = Query.get(query_form['query_string'].value()) # Save search picks if save_searchpicks(query, new_query, searchpicks_formset): messages.success(request, _("Editor's picks for '{0}' updated.").format(new_query), buttons=[ messages.button(reverse('wagtailsearchpromotions:edit', args=(query.id,)), _('Edit')) ]) return redirect('wagtailsearchpromotions:index') else: if len(searchpicks_formset.non_form_errors()): messages.error(request, " ".join(error for error in searchpicks_formset.non_form_errors())) # formset level error (e.g. no forms submitted) else: messages.error(request, _("Recommendations have not been saved due to errors")) # specific errors will be displayed within form fields else: query_form = search_forms.QueryForm(initial=dict(query_string=query.query_string)) searchpicks_formset = forms.SearchPromotionsFormSet(instance=query) return render(request, 'wagtailsearchpromotions/edit.html', { 'query_form': query_form, 'searchpicks_formset': searchpicks_formset, 'query': query, })
def add(request): theredirect = models.Redirect() form_class = REDIRECT_EDIT_HANDLER.get_form_class(models.Redirect) if request.POST: form = form_class(request.POST, request.FILES) if form.is_valid(): theredirect = form.save(commit=False) theredirect.site = request.site theredirect.save() messages.success(request, _("Redirect '{0}' added.").format(theredirect.title), buttons=[ messages.button(reverse('wagtailredirects_edit_redirect', args=(theredirect.id,)), _('Edit')) ]) return redirect('wagtailredirects_index') else: messages.error(request, _("The redirect could not be created due to errors.")) edit_handler = REDIRECT_EDIT_HANDLER(instance=theredirect, form=form) else: form = form_class() edit_handler = REDIRECT_EDIT_HANDLER(instance=theredirect, form=form) return render(request, "wagtailredirects/add.html", { 'edit_handler': edit_handler, })
def delete_submissions(request, page_id): if not get_forms_for_user(request.user).filter(id=page_id).exists(): raise PermissionDenied page = get_object_or_404(Page, id=page_id).specific # Get submissions submission_ids = request.GET.getlist('selected-submissions') submissions = page.get_submission_class()._default_manager.filter(id__in=submission_ids) if request.method == 'POST': count = submissions.count() submissions.delete() messages.success( request, ungettext( "One submission has been deleted.", "%(count)d submissions have been deleted.", count ) % { 'count': count, } ) return redirect('wagtailforms:list_submissions', page_id) return render(request, 'wagtailforms/confirm_delete.html', { 'page': page, 'submissions': submissions, })
def delete(request, page_id): page = get_object_or_404(Page, id=page_id) if not page.permissions_for_user(request.user).can_delete(): raise PermissionDenied next_url = get_valid_next_url_from_request(request) if request.method == 'POST': parent_id = page.get_parent().id page.delete() messages.success(request, _("Page '{0}' deleted.").format(page.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/confirm_delete.html', { 'page': page, 'descendant_count': page.get_descendant_count(), 'next': next_url, })
def edit(request, redirect_id): theredirect = get_object_or_404(models.Redirect, id=redirect_id) if not permission_policy.user_has_permission_for_instance(request.user, "change", theredirect): return permission_denied(request) if request.POST: form = RedirectForm(request.POST, request.FILES, instance=theredirect) if form.is_valid(): form.save() messages.success( request, _("Redirect '{0}' updated.").format(theredirect.title), buttons=[messages.button(reverse("wagtailredirects:edit", args=(theredirect.id,)), _("Edit"))], ) return redirect("wagtailredirects:index") else: messages.error(request, _("The redirect could not be saved due to errors.")) else: form = RedirectForm(instance=theredirect) return render( request, "wagtailredirects/edit.html", { "redirect": theredirect, "form": form, "user_can_delete": permission_policy.user_has_permission(request.user, "delete"), }, )
def index(request): form = SearchForm(placeholder=_("Search something")) example_form = ExampleForm() messages.success(request, _("Success message"), buttons=[ messages.button('', _('View live')), messages.button('', _('Edit')) ]) messages.warning(request, _("Warning message"), buttons=[ messages.button('', _('View live')), messages.button('', _('Edit')) ]) messages.error(request, _("Error message"), buttons=[ messages.button('', _('View live')), messages.button('', _('Edit')) ]) paginator = Paginator(list(range(100)), 10) page = paginator.page(2) return render(request, 'wagtailstyleguide/base.html', { 'search_form': form, 'example_form': example_form, 'example_page': page, })
def create(request): group = Group() if request.POST: form = GroupForm(request.POST, instance=group) permission_panels = [ cls(request.POST, instance=group) for cls in get_permission_panel_classes() ] if form.is_valid() and all(panel.is_valid() for panel in permission_panels): form.save() for panel in permission_panels: panel.save() messages.success(request, _("Group '{0}' created.").format(group), buttons=[ messages.button(reverse('wagtailusers_groups:edit', args=(group.id,)), _('Edit')) ]) return redirect('wagtailusers_groups:index') else: messages.error(request, _("The group could not be created due to errors.")) else: form = GroupForm(instance=group) permission_panels = [ cls(instance=group) for cls in get_permission_panel_classes() ] return render(request, 'wagtailusers/groups/create.html', { 'form': form, 'permission_panels': permission_panels, })
def post(self, request, *args, **kwargs): try: msg = _("{model} '{instance}' deleted.").format( model=self.verbose_name, instance=self.instance) self.delete_instance() messages.success(request, msg) return redirect(self.index_url) except models.ProtectedError: linked_objects = [] fields = self.model._meta.fields_map.values() fields = (obj for obj in fields if not isinstance( obj.field, ManyToManyField)) for rel in fields: if rel.on_delete == models.PROTECT: qs = getattr(self.instance, rel.get_accessor_name()) for obj in qs.all(): linked_objects.append(obj) context = { 'view': self, 'instance': self.instance, 'protected_error': True, 'linked_objects': linked_objects, } return self.render_to_response(context)
def add(request): if request.POST: # Get query query_form = search_forms.QueryForm(request.POST) if query_form.is_valid(): query = Query.get(query_form['query_string'].value()) # Save search picks searchpicks_formset = forms.SearchPromotionsFormSet(request.POST, instance=query) if save_searchpicks(query, query, searchpicks_formset): messages.success(request, _("Editor's picks for '{0}' created.").format(query), buttons=[ messages.button(reverse('wagtailsearchpromotions:edit', args=(query.id,)), _('Edit')) ]) return redirect('wagtailsearchpromotions:index') else: if len(searchpicks_formset.non_form_errors()): # formset level error (e.g. no forms submitted) messages.error(request, " ".join(error for error in searchpicks_formset.non_form_errors())) else: # specific errors will be displayed within form fields messages.error(request, _("Recommendations have not been created due to errors")) else: searchpicks_formset = forms.SearchPromotionsFormSet() else: query_form = search_forms.QueryForm() searchpicks_formset = forms.SearchPromotionsFormSet() return render(request, 'wagtailsearchpromotions/add.html', { 'query_form': query_form, 'searchpicks_formset': searchpicks_formset, })
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) if request.method == 'POST': 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.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_unpublish.html', { 'page': page, 'next': next_url, 'live_descendant_count': page.get_descendants().live().count(), })
def delete(request, app_label, model_name, id): model = get_snippet_model_from_url_params(app_label, model_name) permission = get_permission_name('delete', model) if not request.user.has_perm(permission): return permission_denied(request) instance = get_object_or_404(model, id=id) if request.method == 'POST': instance.delete() messages.success( request, _("{snippet_type} '{instance}' deleted.").format( snippet_type=capfirst(model._meta.verbose_name_plural), instance=instance ) ) return redirect('wagtailsnippets:list', app_label, model_name) return render(request, 'wagtailsnippets/snippets/confirm_delete.html', { 'model_opts': model._meta, 'instance': instance, })
def edit(request, user_id): user = get_object_or_404(User, pk=user_id) if request.method == 'POST': form = get_user_edit_form()(request.POST, instance=user) if form.is_valid(): user = form.save() messages.success(request, _("User '{0}' updated.").format(user), buttons=[ messages.button( reverse('wagtailusers_users:edit', args=(user.pk, )), _('Edit')) ]) return redirect('wagtailusers_users:index') else: messages.error(request, _("The user could not be saved due to errors.")) else: form = get_user_edit_form()(instance=user) return render(request, 'wagtailusers/users/edit.html', { 'user': user, 'form': form, })
def create(request): group = Group() if request.method == 'POST': form = GroupForm(request.POST, instance=group) permission_panels = [ cls(request.POST, instance=group) for cls in get_permission_panel_classes() ] if form.is_valid() and all(panel.is_valid() for panel in permission_panels): form.save() for panel in permission_panels: panel.save() messages.success(request, _("Group '{0}' created.").format(group), buttons=[ messages.button( reverse('wagtailusers_groups:edit', args=(group.id, )), _('Edit')) ]) return redirect('wagtailusers_groups:index') else: messages.error(request, _("The group could not be created due to errors.")) else: form = GroupForm(instance=group) permission_panels = [ cls(instance=group) for cls in get_permission_panel_classes() ] return render(request, 'wagtailusers/groups/create.html', { 'form': form, 'permission_panels': permission_panels, })
def add(request): ImageModel = get_image_model() ImageForm = get_image_form(ImageModel) if request.method == 'POST': image = ImageModel(uploaded_by_user=request.user) form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): # Set image file size image.file_size = image.file.size form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) messages.success(request, _("Image '{0}' added.").format(image.title), buttons=[ messages.button( reverse('wagtailimages:edit', args=(image.id, )), _('Edit')) ]) return redirect('wagtailimages:index') else: messages.error(request, _("The image could not be created due to errors.")) else: form = ImageForm(user=request.user) return render(request, "wagtailimages/images/add.html", { 'form': form, })
def add(request): if request.method == 'POST': form = RedirectForm(request.POST, request.FILES) if form.is_valid(): theredirect = form.save() messages.success( request, _("Redirect '{0}' added.").format(theredirect.title), buttons=[ messages.button( reverse('wagtailredirects:edit', args=(theredirect.id, )), _('Edit')) ]) return redirect('wagtailredirects:index') else: messages.error( request, _("The redirect could not be created due to errors.")) else: form = RedirectForm() return render(request, "wagtailredirects/add.html", { 'form': form, })
def unlock(request, page_id): # Get the page page = get_object_or_404(Page, id=page_id).specific # Check permissions if not page.permissions_for_user(request.user).can_lock(): raise PermissionDenied # Unlock the page if page.locked: page.locked = False page.save() messages.success( request, _("Page '{0}' is now unlocked.").format( page.get_admin_display_title())) # Redirect redirect_to = request.POST.get('next', None) if redirect_to and is_safe_url(url=redirect_to, host=request.get_host()): return redirect(redirect_to) else: return redirect('wagtailadmin_explore', page.get_parent().id)
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, })
def delete(self, request, *args, **kwargs): response = super(DeleteView, self).delete(request, *args, **kwargs) messages.success(request, self.success_message.format(self.object)) return response
def edit(request, media_id): media_model = get_media_model() media_form = get_media_form(media_model) media = get_object_or_404(media_model, id=media_id) if not permission_policy.user_has_permission_for_instance( request.user, 'change', media): return permission_denied(request) if request.POST: original_file = media.file form = media_form(request.POST, request.FILES, instance=media, user=request.user) if form.is_valid(): if 'file' in form.changed_data: # if providing a new media file, delete the old one. # NB Doing this via original_file.delete() clears the file field, # which definitely isn't what we want... original_file.storage.delete(original_file.name) media = form.save() # Reindex the media entry to make sure all tags are indexed for backend in get_search_backends(): backend.add(media) messages.success(request, _("Media file '{0}' updated").format(media.title), buttons=[ messages.button( reverse('wagtailmedia:edit', args=(media.id, )), _('Edit')) ]) return redirect('wagtailmedia:index') else: messages.error(request, _("The media could not be saved due to errors.")) else: form = media_form(instance=media, user=request.user) filesize = None # Get file size when there is a file associated with the Media object if media.file: try: filesize = media.file.size except OSError: # File doesn't exist pass if not filesize: messages.error( request, _("The file could not be found. Please change the source or delete the media file" ), buttons=[ messages.button( reverse('wagtailmedia:delete', args=(media.id, )), _('Delete')) ]) return render( request, "wagtailmedia/media/edit.html", { 'media': media, 'filesize': filesize, 'form': form, 'user_can_delete': permission_policy.user_has_permission_for_instance( request.user, 'delete', media), })
def edit(request, page_id): latest_revision = get_object_or_404(Page, id=page_id).get_latest_revision() page = get_object_or_404(Page, id=page_id).get_latest_revision_as_page() parent = page.get_parent() content_type = ContentType.objects.get_for_model(page) page_perms = page.permissions_for_user(request.user) if not page_perms.can_edit(): raise PermissionDenied edit_handler_class = get_page_edit_handler(page.__class__) form_class = edit_handler_class.get_form_class(page.__class__) errors_debug = None if request.POST: form = form_class(request.POST, request.FILES, instance=page) # Stick an extra validator into the form to make sure that the slug is not already in use def clean_slug(slug): # Make sure the slug isn't already in use if parent.get_children().filter(slug=slug).exclude( id=page_id).count() > 0: raise ValidationError(_("This slug is already in use")) return slug form.fields['slug'].clean = clean_slug # Stick another validator into the form to check that the scheduled publishing settings are set correctly def clean(): cleaned_data = form_class.clean(form) # Go live must be before expire go_live_at = cleaned_data.get('go_live_at') expire_at = cleaned_data.get('expire_at') if go_live_at and expire_at: if go_live_at > expire_at: msg = _( 'Go live date/time must be before expiry date/time') form._errors['go_live_at'] = form.error_class([msg]) form._errors['expire_at'] = form.error_class([msg]) del cleaned_data['go_live_at'] del cleaned_data['expire_at'] # Expire must be in the future expire_at = cleaned_data.get('expire_at') if expire_at and expire_at < timezone.now(): form._errors['expire_at'] = form.error_class( [_('Expiry date/time must be in the future')]) del cleaned_data['expire_at'] return cleaned_data form.clean = clean 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_submitting = bool(request.POST.get('action-submit')) is_translating_from_serbian = bool( request.POST.get('action-translate-serbian')) is_translating_from_bosnian = bool( request.POST.get('action-translate-bosnian')) is_translating_from_croatian = bool( request.POST.get('action-translate-croatian')) import os google_api_key = os.environ.get('GOOGLE_KEY_ID') import HTMLParser html_parser = HTMLParser.HTMLParser() if is_translating_from_serbian: from apiclient.discovery import build # Build a service object for interacting with the API. Visit # the Google APIs Console <http://code.google.com/apis/console> # to get an API key for your own application. service = build('translate', 'v2', developerKey=google_api_key) translation = service.translations().list( source='sr', target='en', q=[ request.POST.get('source_title'), request.POST.get('source_intro'), request.POST.get('source_body') ]).execute() page.title = html_parser.unescape( translation['translations'][0]['translatedText']) page.intro = html_parser.unescape( translation['translations'][1]['translatedText']) page.body = html_parser.unescape( translation['translations'][2]['translatedText']) page.save() if is_translating_from_bosnian: from apiclient.discovery import build # Build a service object for interacting with the API. Visit # the Google APIs Console <http://code.google.com/apis/console> # to get an API key for your own application. service = build('translate', 'v2', developerKey=google_api_key) translation = service.translations().list( source='bs', target='en', q=[ request.POST.get('source_title'), request.POST.get('source_intro'), request.POST.get('source_body') ]).execute() page.title = html_parser.unescape( translation['translations'][0]['translatedText']) page.intro = html_parser.unescape( translation['translations'][1]['translatedText']) page.body = html_parser.unescape( translation['translations'][2]['translatedText']) page.save() if is_translating_from_croatian: from apiclient.discovery import build # Build a service object for interacting with the API. Visit # the Google APIs Console <http://code.google.com/apis/console> # to get an API key for your own application. service = build('translate', 'v2', developerKey=google_api_key) translation = service.translations().list( source='hr', target='en', q=[ request.POST.get('source_title'), request.POST.get('source_intro'), request.POST.get('source_body') ]).execute() page.title = html_parser.unescape( translation['translations'][0]['translatedText']) page.intro = html_parser.unescape( translation['translations'][1]['translatedText']) page.body = html_parser.unescape( translation['translations'][2]['translatedText']) page.save() # Save revision revision = page.save_revision( user=request.user, submitted_for_moderation=is_submitting, ) # Publish if is_publishing: revision.publish() else: # Set has_unpublished_changes flag if page.live: # To avoid overwriting the live version, we only save the page # to the revisions table Page.objects.filter(id=page.id).update( has_unpublished_changes=True) else: page.has_unpublished_changes = True page.save() # Notifications if is_publishing: messages.success(request, _("Page '{0}' published.").format(page.title), buttons=[ messages.button(page.url, _('View live')), messages.button( reverse('wagtailadmin_pages_edit', args=(page_id, )), _('Edit')) ]) elif is_submitting: messages.success( request, _("Page '{0}' submitted for moderation.").format( page.title), buttons=[ messages.button( reverse('wagtailadmin_pages_view_draft', args=(page_id, )), _('View draft')), messages.button( reverse('wagtailadmin_pages_edit', args=(page_id, )), _('Edit')) ]) tasks.send_notification.delay(page.get_latest_revision().id, 'submitted', request.user.id) else: messages.success(request, _("Page '{0}' updated.").format(page.title)) 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 return redirect('wagtailadmin_explore', page.get_parent().id) else: # Just saving - remain on edit page for further edits return redirect('wagtailadmin_pages_edit', page.id) else: if page.locked: messages.error( request, _("The page could not be saved as it is locked")) else: messages.error( request, _("The page could not be saved due to validation errors")) edit_handler = edit_handler_class(instance=page, form=form) errors_debug = (repr(edit_handler.form.errors) + repr( [(name, formset.errors) for (name, formset) in edit_handler.form.formsets.items() if formset.errors])) else: form = form_class(instance=page) edit_handler = edit_handler_class(instance=page, form=form) # Check for revisions still undergoing moderation and warn if latest_revision and latest_revision.submitted_for_moderation: messages.warning(request, _("This page is currently awaiting moderation")) return render( request, 'wagtailadmin/pages/edit.html', { 'page': page, 'content_type': content_type, 'edit_handler': edit_handler, 'errors_debug': errors_debug, 'preview_modes': page.preview_modes, 'form': form, # Used in unit tests })
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_class = page_class.get_edit_handler() form_class = edit_handler_class.get_form_class(page_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) is_publishing = bool(request.POST.get( 'action-publish')) and parent_page_perms.can_publish_subpage() is_submitting = bool(request.POST.get('action-submit')) if not is_publishing: page.live = False # Save page parent_page.add_child(instance=page) # Save revision revision = page.save_revision( user=request.user, submitted_for_moderation=is_submitting, ) # Publish if is_publishing: revision.publish() # Notifications if is_publishing: if page.go_live_at and page.go_live_at > timezone.now(): messages.success( request, _("Page '{0}' created and scheduled for publishing." ).format(page.get_admin_display_title()), buttons=[ messages.button( reverse('wagtailadmin_pages:edit', args=(page.id, )), _('Edit')) ]) else: messages.success( request, _("Page '{0}' created and published.").format( page.get_admin_display_title()), buttons=[ messages.button(page.url, _('View live'), new_window=True), messages.button( reverse('wagtailadmin_pages:edit', args=(page.id, )), _('Edit')) ]) elif is_submitting: messages.success( request, _("Page '{0}' created and submitted for moderation." ).format(page.get_admin_display_title()), 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: 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 if is_publishing or is_submitting: # we're done here 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: messages.validation_error( request, _("The page could not be created due to validation errors"), form) edit_handler = edit_handler_class(instance=page, form=form) has_unsaved_changes = True else: signals.init_new_page.send(sender=create, page=page, parent=parent_page) form = form_class(instance=page) edit_handler = edit_handler_class(instance=page, form=form) has_unsaved_changes = False return render( request, 'wagtailadmin/pages/create.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, })
def edit(request, page_id): latest_revision = get_object_or_404(Page, id=page_id).get_latest_revision() page = get_object_or_404(Page, id=page_id).get_latest_revision_as_page() parent = page.get_parent() content_type = ContentType.objects.get_for_model(page) page_perms = page.permissions_for_user(request.user) if not page_perms.can_edit(): raise PermissionDenied edit_handler_class = get_page_edit_handler(page.__class__) form_class = edit_handler_class.get_form_class(page.__class__) errors_debug = None if request.POST: form = form_class(request.POST, request.FILES, instance=page) # Stick an extra validator into the form to make sure that the slug is not already in use def clean_slug(slug): # Make sure the slug isn't already in use if parent.get_children().filter(slug=slug).exclude( id=page_id).count() > 0: raise ValidationError(_("This slug is already in use")) return slug form.fields['slug'].clean = clean_slug # Stick another validator into the form to check that the scheduled publishing settings are set correctly def clean(): cleaned_data = form_class.clean(form) # Go live must be before expire go_live_at = cleaned_data.get('go_live_at') expire_at = cleaned_data.get('expire_at') if go_live_at and expire_at: if go_live_at > expire_at: msg = _( 'Go live date/time must be before expiry date/time') form._errors['go_live_at'] = form.error_class([msg]) form._errors['expire_at'] = form.error_class([msg]) del cleaned_data['go_live_at'] del cleaned_data['expire_at'] # Expire must be in the future expire_at = cleaned_data.get('expire_at') if expire_at and expire_at < timezone.now(): form._errors['expire_at'] = form.error_class( [_('Expiry date/time must be in the future')]) del cleaned_data['expire_at'] return cleaned_data form.clean = clean 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_submitting = bool(request.POST.get('action-submit')) # Save revision revision = page.save_revision( user=request.user, submitted_for_moderation=is_submitting, ) # Publish if is_publishing: revision.publish() else: # Set has_unpublished_changes flag if page.live: # To avoid overwriting the live version, we only save the page # to the revisions table Page.objects.filter(id=page.id).update( has_unpublished_changes=True) else: page.has_unpublished_changes = True page.save() # Notifications if is_publishing: messages.success(request, _("Page '{0}' published.").format(page.title), buttons=[ messages.button(page.url, _('View live')), messages.button( reverse('wagtailadmin_pages_edit', args=(page_id, )), _('Edit')) ]) elif is_submitting: messages.success( request, _("Page '{0}' submitted for moderation.").format( page.title), buttons=[ messages.button( reverse('wagtailadmin_pages_view_draft', args=(page_id, )), _('View draft')), messages.button( reverse('wagtailadmin_pages_edit', args=(page_id, )), _('Edit')) ]) tasks.send_notification.delay(page.get_latest_revision().id, 'submitted', request.user.id) else: messages.success(request, _("Page '{0}' updated.").format(page.title)) 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 return redirect('wagtailadmin_explore', page.get_parent().id) else: # Just saving - remain on edit page for further edits return redirect('wagtailadmin_pages_edit', page.id) else: if page.locked: messages.error( request, _("The page could not be saved as it is locked")) else: messages.error( request, _("The page could not be saved due to validation errors")) edit_handler = edit_handler_class(instance=page, form=form) errors_debug = (repr(edit_handler.form.errors) + repr( [(name, formset.errors) for (name, formset) in edit_handler.form.formsets.items() if formset.errors])) else: form = form_class(instance=page) edit_handler = edit_handler_class(instance=page, form=form) # Check for revisions still undergoing moderation and warn if latest_revision and latest_revision.submitted_for_moderation: messages.warning(request, _("This page is currently awaiting moderation")) return render( request, 'wagtailadmin/pages/edit.html', { 'page': page, 'content_type': content_type, 'edit_handler': edit_handler, 'errors_debug': errors_debug, 'preview_modes': page.preview_modes, 'form': form, # Used in unit tests })
def create(request, pk): newsindex = get_object_or_404(Page.objects.specific().type(NewsIndexMixin), pk=pk) NewsItem = newsindex.get_newsitem_model() if not request.user.has_perms(format_perms(NewsItem, ['add', 'change'])): raise PermissionDenied() newsitem = NewsItem(newsindex=newsindex) EditHandler = get_newsitem_edit_handler(NewsItem) EditForm = EditHandler.get_form_class(NewsItem) if request.method == 'POST': form = EditForm(request.POST, request.FILES, instance=newsitem) action = SaveActionSet.from_post_data(request.POST) if form.is_valid(): newsitem = form.save(commit=False) newsitem.live = action is SaveActionSet.publish newsitem.save() newsitem.save_revision(user=request.user) if action is SaveActionSet.publish: messages.success( request, _('The news post "{0!s}" has been published').format( newsitem)) signals.newsitem_published.send(sender=NewsItem, instance=newsitem, created=True) return redirect('wagtailnews:index', pk=newsindex.pk) elif action is SaveActionSet.draft: messages.success( request, _('A draft news post "{0!s}" has been created').format( newsitem)) signals.newsitem_draft_saved.send(sender=NewsItem, instance=newsitem, created=True) return redirect('wagtailnews:edit', pk=newsindex.pk, newsitem_pk=newsitem.pk) elif action is SaveActionSet.preview: edit_url = reverse('wagtailnews:edit', kwargs={ 'pk': newsindex.pk, 'newsitem_pk': newsitem.pk }) return redirect("{url}?{param}=1".format( url=edit_url, param=OPEN_PREVIEW_PARAM)) else: messages.error( request, _('The news post could not be created due to validation errors' )) edit_handler = EditHandler(instance=newsitem, form=form) else: form = EditForm(instance=newsitem) edit_handler = EditHandler(instance=newsitem, form=form) return render( request, 'wagtailnews/create.html', { 'newsindex': newsindex, 'form': form, 'edit_handler': edit_handler, 'newsitem_opts': NewsItem._meta, 'newsitem_perms': perms_for_template(request, NewsItem), })
def edit(request, page_id): latest_revision = get_object_or_404(Page, id=page_id).get_latest_revision() page = get_object_or_404(Page, id=page_id).get_latest_revision_as_page() parent = page.get_parent() content_type = ContentType.objects.get_for_model(page) page_perms = page.permissions_for_user(request.user) if not page_perms.can_edit(): raise PermissionDenied edit_handler_class = get_page_edit_handler(page.__class__) form_class = edit_handler_class.get_form_class(page.__class__) errors_debug = None if request.POST: form = form_class(request.POST, request.FILES, instance=page) validate_page_form(form, parent, page) 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_submitting = bool(request.POST.get('action-submit')) # Save revision revision = page.save_revision( user=request.user, submitted_for_moderation=is_submitting, ) # Publish if is_publishing: revision.publish() # Notifications if is_publishing: messages.success(request, _("Page '{0}' published.").format(page.title), buttons=[ messages.button(page.url, _('View live')), messages.button( reverse('wagtailadmin_pages:edit', args=(page_id, )), _('Edit')) ]) elif is_submitting: messages.success( request, _("Page '{0}' submitted for moderation.").format( page.title), buttons=[ messages.button( reverse('wagtailadmin_pages:view_draft', args=(page_id, )), _('View draft')), messages.button( reverse('wagtailadmin_pages:edit', args=(page_id, )), _('Edit')) ]) send_notification(page.get_latest_revision().id, 'submitted', request.user.id) else: messages.success(request, _("Page '{0}' updated.").format(page.title)) 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 return redirect('wagtailadmin_explore', page.get_parent().id) else: # Just saving - remain on edit page for further edits return redirect('wagtailadmin_pages:edit', page.id) else: if page.locked: messages.error( request, _("The page could not be saved as it is locked")) else: messages.error( request, _("The page could not be saved due to validation errors")) edit_handler = edit_handler_class(instance=page, form=form) errors_debug = (repr(edit_handler.form.errors) + repr( [(name, formset.errors) for (name, formset) in edit_handler.form.formsets.items() if formset.errors])) else: form = form_class(instance=page) edit_handler = edit_handler_class(instance=page, form=form) # Check for revisions still undergoing moderation and warn if latest_revision and latest_revision.submitted_for_moderation: messages.warning(request, _("This page is currently awaiting moderation")) return render( request, 'wagtailadmin/pages/edit.html', { 'page': page, 'content_type': content_type, 'edit_handler': edit_handler, 'errors_debug': errors_debug, 'preview_modes': page.preview_modes, 'form': form, # Used in unit tests })
def form_valid(self, form): form.save() messages.success(self.request, _("Main menu updated successfully.")) return redirect(self.edit_url)
def form_valid(self, form): form.save() messages.success( self.request, _("%s updated.") % capfirst(self.model_name) ) return redirect(self.edit_url)
def post(self, request, instance_id): self.instance = get_object_or_404(self.model, id=instance_id) self.instance.delete() messages.success(request, self.success_message.format(self.instance)) return redirect(self.index_url_name)
def create(request, newsindex, user, NewsItem, policy): if not user.has_perms(format_perms(NewsItem, ['add', 'change'])): raise PermissionDenied() newsitem = NewsItem(newsindex=newsindex) EditHandler = get_newsitem_edit_handler(NewsItem) EditForm = EditHandler.get_form_class(NewsItem) if request.method == 'POST': form = EditForm(request.POST, request.FILES, instance=newsitem) action = SaveActionSet.from_post_data(request.POST) if form.is_valid(): newsitem = form.save(commit=False) newsitem.live = action is SaveActionSet.publish # We still need to validate that the user can add to the collection if newsitem.collection not in policy.collections_user_has_permission_for( user, 'add'): raise PermissionDenied() newsitem.save() newsitem.save_revision(user=user) if action is SaveActionSet.publish: messages.success( request, _('The news post "{0!s}" has been published').format( newsitem)) if user_can_edit_newsitem(user, NewsItem): return redirect('wagtailnews:index', pk=newsindex.pk) else: return redirect('wagtailadmin_home') elif action is SaveActionSet.draft: messages.success( request, _('A draft news post "{0!s}" has been created').format( newsitem)) return redirect('wagtailnews:edit', pk=newsindex.pk, newsitem_pk=newsitem.pk) elif action is SaveActionSet.preview: edit_url = reverse('wagtailnews:edit', kwargs={ 'pk': newsindex.pk, 'newsitem_pk': newsitem.pk }) return redirect("{url}?{param}=1".format( url=edit_url, param=OPEN_PREVIEW_PARAM)) else: messages.error( request, _('The news post could not be created due to validation errors' )) edit_handler = EditHandler(instance=newsitem, form=form) else: form = EditForm(instance=newsitem) edit_handler = EditHandler(instance=newsitem, form=form) return render( request, 'wagtailnews/create.html', { 'newsindex': newsindex, 'form': form, 'edit_handler': edit_handler, 'newsitem_opts': NewsItem._meta, 'newsitem_perms': perms_for_template(request, NewsItem), })
def edit(request, page_id): latest_revision = get_object_or_404(Page, id=page_id).get_latest_revision() page = get_object_or_404(Page, id=page_id).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_class = page_class.get_edit_handler() form_class = edit_handler_class.get_form_class(page_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_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, ) # 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) # Notifications if is_publishing: if page.go_live_at and page.go_live_at > timezone.now(): # Page has been scheduled for publishing in the future if is_reverting: message = _( "Revision from {0} of page '{1}' has been scheduled for publishing." ).format( previous_revision.created_at.strftime( "%d %b %Y %H:%M"), page.get_admin_display_title()) else: message = _( "Page '{0}' has been scheduled for publishing." ).format(page.get_admin_display_title()) messages.success(request, message, buttons=[ messages.button( reverse('wagtailadmin_pages:edit', args=(page.id, )), _('Edit')) ]) else: # 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()) messages.success(request, message, buttons=[ messages.button(page.url, _('View live'), new_window=True), 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_class(instance=page, form=form) 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: form = form_class(instance=page) edit_handler = edit_handler_class(instance=page, form=form) 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) return render( request, 'wagtailadmin/pages/edit.html', { 'page': page, '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, })
def edit(request, image_id): Image = get_image_model() ImageForm = get_image_form(Image) image = get_object_or_404(Image, id=image_id) if not permission_policy.user_has_permission_for_instance( request.user, 'change', image): return permission_denied(request) if request.method == 'POST': original_file = image.file form = ImageForm(request.POST, request.FILES, instance=image, user=request.user) if form.is_valid(): if 'file' in form.changed_data: # if providing a new image file, delete the old one and all renditions. # NB Doing this via original_file.delete() clears the file field, # which definitely isn't what we want... original_file.storage.delete(original_file.name) image.renditions.all().delete() # Set new image file size image.file_size = image.file.size form.save() # Reindex the image to make sure all tags are indexed search_index.insert_or_update_object(image) messages.success(request, _("Image '{0}' updated.").format(image.title), buttons=[ messages.button( reverse('wagtailimages:edit', args=(image.id, )), _('Edit again')) ]) return redirect('wagtailimages:index') else: messages.error(request, _("The image could not be saved due to errors.")) else: form = ImageForm(instance=image, user=request.user) # Check if we should enable the frontend url generator try: reverse('wagtailimages_serve', args=('foo', '1', 'bar')) url_generator_enabled = True except NoReverseMatch: url_generator_enabled = False if image.is_stored_locally(): # Give error if image file doesn't exist if not os.path.isfile(image.file.path): messages.error( request, _("The source image file could not be found. Please change the source or delete the image." ).format(image.title), buttons=[ messages.button( reverse('wagtailimages:delete', args=(image.id, )), _('Delete')) ]) return render( request, "wagtailimages/images/edit.html", { 'image': image, 'form': form, 'url_generator_enabled': url_generator_enabled, 'filesize': image.get_file_size(), 'user_can_delete': permission_policy.user_has_permission_for_instance( request.user, 'delete', image), })
def edit(request, pk, newsitem_pk): newsindex = get_object_or_404(Page.objects.specific().type(NewsIndexMixin), pk=pk) NewsItem = newsindex.get_newsitem_model() if not request.user.has_perms(format_perms(NewsItem, ['change'])): raise PermissionDenied() newsitem = get_object_or_404(NewsItem, newsindex=newsindex, pk=newsitem_pk) newsitem = newsitem.get_latest_revision_as_newsitem() EditHandler = get_newsitem_edit_handler(NewsItem) EditForm = EditHandler.get_form_class(NewsItem) do_preview = False if request.method == 'POST': form = EditForm(request.POST, request.FILES, instance=newsitem) action = SaveActionSet.from_post_data(request.POST) if form.is_valid(): newsitem = form.save(commit=False) revision = newsitem.save_revision(user=request.user) if action is SaveActionSet.publish: revision.publish() messages.success( request, _('Your changes to "{0!s}" have been published').format( newsitem)) signals.newsitem_published.send(sender=NewsItem, instance=newsitem, created=False) return redirect('wagtailnews:index', pk=newsindex.pk) elif action is SaveActionSet.draft: messages.success( request, _('Your changes to "{0!s}" have been saved as a draft'). format(newsitem)) signals.newsitem_draft_saved.send(sender=NewsItem, instance=newsitem, created=False) return redirect('wagtailnews:edit', pk=newsindex.pk, newsitem_pk=newsitem.pk) elif action is SaveActionSet.preview: do_preview = True else: messages.error( request, _('The news post could not be updated due to validation errors' )) edit_handler = EditHandler(instance=newsitem, form=form) else: form = EditForm(instance=newsitem) edit_handler = EditHandler(instance=newsitem, form=form) # The create view can set this param to open a preview on redirect do_preview = bool(request.GET.get(OPEN_PREVIEW_PARAM)) return render( request, 'wagtailnews/edit.html', { 'newsindex': newsindex, 'newsitem': newsitem, 'form': form, 'edit_handler': edit_handler, 'do_preview': do_preview, 'newsitem_opts': NewsItem._meta, 'newsitem_perms': perms_for_template(request, NewsItem), })
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 content_type not in parent_page.allowed_subpage_types(): raise PermissionDenied page = page_class(owner=request.user) edit_handler_class = get_page_edit_handler(page_class) form_class = edit_handler_class.get_form_class(page_class) if request.POST: form = form_class(request.POST, request.FILES, instance=page) validate_page_form(form, parent_page) if form.is_valid(): page = form.save(commit=False) is_publishing = bool(request.POST.get( 'action-publish')) and parent_page_perms.can_publish_subpage() is_submitting = bool(request.POST.get('action-submit')) if not is_publishing: page.live = False # Save page parent_page.add_child(instance=page) # Save revision revision = page.save_revision( user=request.user, submitted_for_moderation=is_submitting, ) # Publish if is_publishing: revision.publish() # Notifications if is_publishing: messages.success(request, _("Page '{0}' created and published.").format( page.title), buttons=[ messages.button(page.url, _('View live')), messages.button( reverse('wagtailadmin_pages:edit', args=(page.id, )), _('Edit')) ]) elif is_submitting: messages.success( request, _("Page '{0}' created and submitted for moderation." ).format(page.title), buttons=[ messages.button( reverse('wagtailadmin_pages:view_draft', args=(page.id, )), _('View draft')), messages.button( reverse('wagtailadmin_pages:edit', args=(page.id, )), _('Edit')) ]) send_notification(page.get_latest_revision().id, 'submitted', request.user.id) else: messages.success(request, _("Page '{0}' created.").format(page.title)) for fn in hooks.get_hooks('after_create_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 return redirect('wagtailadmin_explore', page.get_parent().id) else: # Just saving - remain on edit page for further edits return redirect('wagtailadmin_pages:edit', page.id) else: messages.error( request, _("The page could not be created due to validation errors")) edit_handler = edit_handler_class(instance=page, form=form) else: signals.init_new_page.send(sender=create, page=page, parent=parent_page) form = form_class(instance=page) edit_handler = edit_handler_class(instance=page, form=form) return render( request, 'wagtailadmin/pages/create.html', { 'content_type': content_type, 'page_class': page_class, 'parent_page': parent_page, 'edit_handler': edit_handler, 'preview_modes': page.preview_modes, 'form': form, # Used in unit tests })
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 content_type not in parent_page.allowed_subpage_types(): raise PermissionDenied page = page_class(owner=request.user) edit_handler_class = get_page_edit_handler(page_class) form_class = edit_handler_class.get_form_class(page_class) if request.POST: form = form_class(request.POST, request.FILES, instance=page) # Stick an extra validator into the form to make sure that the slug is not already in use def clean_slug(slug): # Make sure the slug isn't already in use if parent_page.get_children().filter(slug=slug).count() > 0: raise ValidationError(_("This slug is already in use")) return slug form.fields['slug'].clean = clean_slug # Stick another validator into the form to check that the scheduled publishing settings are set correctly def clean(): cleaned_data = form_class.clean(form) # Go live must be before expire go_live_at = cleaned_data.get('go_live_at') expire_at = cleaned_data.get('expire_at') if go_live_at and expire_at: if go_live_at > expire_at: msg = _( 'Go live date/time must be before expiry date/time') form._errors['go_live_at'] = form.error_class([msg]) form._errors['expire_at'] = form.error_class([msg]) del cleaned_data['go_live_at'] del cleaned_data['expire_at'] # Expire must be in the future expire_at = cleaned_data.get('expire_at') if expire_at and expire_at < timezone.now(): form._errors['expire_at'] = form.error_class( [_('Expiry date/time must be in the future')]) del cleaned_data['expire_at'] return cleaned_data form.clean = clean if form.is_valid(): page = form.save(commit=False) is_publishing = bool(request.POST.get( 'action-publish')) and parent_page_perms.can_publish_subpage() is_submitting = bool(request.POST.get('action-submit')) # Set live to False and has_unpublished_changes to True if we are not publishing if not is_publishing: page.live = False page.has_unpublished_changes = True # Save page parent_page.add_child(instance=page) # Save revision revision = page.save_revision( user=request.user, submitted_for_moderation=is_submitting, ) # Publish if is_publishing: revision.publish() # Notifications if is_publishing: messages.success(request, _("Page '{0}' published.").format(page.title)) elif is_submitting: messages.success( request, _("Page '{0}' submitted for moderation.").format( page.title)) tasks.send_notification.delay(page.get_latest_revision().id, 'submitted', request.user.id) else: messages.success(request, _("Page '{0}' created.").format(page.title)) for fn in hooks.get_hooks('after_create_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 return redirect('wagtailadmin_explore', page.get_parent().id) else: # Just saving - remain on edit page for further edits return redirect('wagtailadmin_pages_edit', page.id) else: messages.error( request, _("The page could not be created due to validation errors")) edit_handler = edit_handler_class(instance=page, form=form) else: signals.init_new_page.send(sender=create, page=page, parent=parent_page) form = form_class(instance=page) edit_handler = edit_handler_class(instance=page, form=form) return render( request, 'wagtailadmin/pages/create.html', { 'content_type': content_type, 'page_class': page_class, 'parent_page': parent_page, 'edit_handler': edit_handler, 'preview_modes': page.preview_modes, 'form': form, # Used in unit tests })
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, page=page, can_publish=can_publish) # 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'] # Make sure this user has permission to add subpages on the parent if not parent_page.permissions_for_user( request.user).can_add_subpage(): 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'], }, 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.title, new_page.get_descendants().count())) else: messages.success(request, _("Page '{0}' copied.").format(page.title)) # Redirect to explore of parent page return redirect('wagtailadmin_explore', parent_page.id) return render(request, 'wagtailadmin/pages/copy.html', { 'page': page, 'form': form, })
def edit(request, document_id): Document = get_document_model() DocumentForm = get_document_form(Document) doc = get_object_or_404(Document, id=document_id) if not permission_policy.user_has_permission_for_instance( request.user, 'change', doc): return permission_denied(request) if request.POST: original_file = doc.file form = DocumentForm(request.POST, request.FILES, instance=doc) if form.is_valid(): if 'file' in form.changed_data: # if providing a new document file, delete the old one. # NB Doing this via original_file.delete() clears the file field, # which definitely isn't what we want... original_file.storage.delete(original_file.name) doc = form.save() # Reindex the document to make sure all tags are indexed for backend in get_search_backends(): backend.add(doc) messages.success(request, _("Document '{0}' updated").format(doc.title), buttons=[ messages.button( reverse('wagtaildocs:edit', args=(doc.id, )), _('Edit')) ]) return redirect('wagtaildocs:index') else: messages.error(request, _("The document could not be saved due to errors.")) else: form = DocumentForm(instance=doc) filesize = None # Get file size when there is a file associated with the Document object if doc.file: try: filesize = doc.file.size except OSError: # File doesn't exist pass if not filesize: messages.error( request, _("The file could not be found. Please change the source or delete the document" ), buttons=[ messages.button(reverse('wagtaildocs:delete', args=(doc.id, )), _('Delete')) ]) return render( request, "wagtaildocs/documents/edit.html", { 'document': doc, 'filesize': filesize, 'form': form, 'user_can_delete': permission_policy.user_has_permission_for_instance( request.user, 'delete', doc), })
def edit(request, image_id): Image = get_image_model() ImageForm = get_image_form(Image) image = get_object_or_404(Image, id=image_id) if not image.is_editable_by_user(request.user): raise PermissionDenied if request.POST: original_file = image.file form = ImageForm(request.POST, request.FILES, instance=image) if form.is_valid(): if 'file' in form.changed_data: # if providing a new image file, delete the old one and all renditions. # NB Doing this via original_file.delete() clears the file field, # which definitely isn't what we want... original_file.storage.delete(original_file.name) image.renditions.all().delete() form.save() # Reindex the image to make sure all tags are indexed for backend in get_search_backends(): backend.add(image) messages.success(request, _("Image '{0}' updated.").format(image.title), buttons=[ messages.button( reverse('wagtailimages_edit_image', args=(image.id, )), _('Edit again')) ]) return redirect('wagtailimages_index') else: messages.error(request, _("The image could not be saved due to errors.")) else: form = ImageForm(instance=image) # Check if we should enable the frontend url generator try: reverse('wagtailimages_serve', args=('foo', '1', 'bar')) url_generator_enabled = True except NoReverseMatch: url_generator_enabled = False # Get file size try: filesize = image.file.size except OSError: # File doesn't exist filesize = None return render( request, "wagtailimages/images/edit.html", { 'image': image, 'form': form, 'url_generator_enabled': url_generator_enabled, 'filesize': filesize, })
def delete(self, request, *args, **kwargs): response = super(DeleteView, self).delete(request, *args, **kwargs) messages.success(request, self.get_success_message()) return response
def form_valid(self, form): instance = form.save() messages.success(self.request, self.get_success_message(instance), buttons=self.get_success_message_buttons(instance)) return redirect(self.get_success_url())
def edit(request, newsindex, user, NewsItem, newsitem, policy): EditHandler = get_newsitem_edit_handler(NewsItem) EditForm = EditHandler.get_form_class(NewsItem) do_preview = False if request.method == 'POST': form = EditForm(request.POST, request.FILES, instance=newsitem) action = SaveActionSet.from_post_data(request.POST) if form.is_valid(): newsitem = form.save(commit=False) if not policy.user_has_permission_for_instance( user, 'change', newsitem): raise PermissionDenied() revision = newsitem.save_revision(user=user) if action is SaveActionSet.publish: revision.publish() messages.success( request, _('Your changes to "{0!s}" have been published').format( newsitem)) if user_can_edit_newsitem(user, NewsItem): return redirect('wagtailnews:index', pk=newsindex.pk) else: return redirect('wagtailadmin_home') elif action is SaveActionSet.draft: messages.success( request, _('Your changes to "{0!s}" have been saved as a draft'). format(newsitem)) return redirect('wagtailnews:edit', pk=newsindex.pk, newsitem_pk=newsitem.pk) elif action is SaveActionSet.preview: do_preview = True else: messages.error( request, _('The news post could not be updated due to validation errors' )) edit_handler = EditHandler(instance=newsitem, form=form) else: form = EditForm(instance=newsitem) edit_handler = EditHandler(instance=newsitem, form=form) # The create view can set this param to open a preview on redirect do_preview = bool(request.GET.get(OPEN_PREVIEW_PARAM)) return render( request, 'wagtailnews/edit.html', { 'newsindex': newsindex, 'newsitem': newsitem, 'form': form, 'edit_handler': edit_handler, 'do_preview': do_preview, 'newsitem_opts': NewsItem._meta, 'newsitem_perms': perms_for_template(request, NewsItem), })