diff --git a/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs b/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs index c833995616a..c66b7bf048e 100644 --- a/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Reflection; using System.Web.Mvc; using System.Web.Routing; @@ -424,6 +425,33 @@ public ActionResult Remove(int id, string returnUrl) { return this.RedirectLocal(returnUrl, () => RedirectToAction("List")); } + [HttpPost] + public ActionResult DiscardDraft(int id, string returnUrl) { + var contentItem = _contentManager.Get(id, VersionOptions.Latest); + + if (contentItem == null) { + return HttpNotFound(); + } + + if (!contentItem.TypeDefinition.Settings.GetModel().Draftable + || !contentItem.HasPublished() + || contentItem.IsPublished()) { + return new HttpStatusCodeResult(HttpStatusCode.BadRequest); + } + + if (!Services.Authorizer.Authorize(Permissions.DeleteContent, contentItem, T("Couldn't remove draft"))) { + return new HttpUnauthorizedResult(); + } + + _contentManager.DiscardDraft(contentItem); + + Services.Notifier.Information(string.IsNullOrWhiteSpace(contentItem.TypeDefinition.DisplayName) + ? T("That draft has been removed.") + : T("That {0} draft has been removed.", contentItem.TypeDefinition.DisplayName)); + + return this.RedirectLocal(returnUrl, () => RedirectToAction("List")); + } + [HttpPost] public ActionResult Publish(int id, string returnUrl) { var contentItem = _contentManager.GetLatest(id); diff --git a/src/Orchard.Web/Core/Contents/Drivers/ContentsDriver.cs b/src/Orchard.Web/Core/Contents/Drivers/ContentsDriver.cs index cb49524f646..bc92e115f3b 100644 --- a/src/Orchard.Web/Core/Contents/Drivers/ContentsDriver.cs +++ b/src/Orchard.Web/Core/Contents/Drivers/ContentsDriver.cs @@ -12,9 +12,7 @@ protected override DriverResult Display(ContentPart part, string displayType, dy ContentShape("Parts_Contents_Publish_Summary", () => shapeHelper.Parts_Contents_Publish_Summary()), ContentShape("Parts_Contents_Publish_SummaryAdmin", - () => shapeHelper.Parts_Contents_Publish_SummaryAdmin()), - ContentShape("Parts_Contents_Clone_SummaryAdmin", - () => shapeHelper.Parts_Contents_Clone_SummaryAdmin()) + () => shapeHelper.Parts_Contents_Publish_SummaryAdmin()) ); } diff --git a/src/Orchard.Web/Core/Contents/Placement.info b/src/Orchard.Web/Core/Contents/Placement.info index cab2f6d7a77..1380b93f092 100644 --- a/src/Orchard.Web/Core/Contents/Placement.info +++ b/src/Orchard.Web/Core/Contents/Placement.info @@ -12,7 +12,6 @@ - + \ No newline at end of file diff --git a/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml b/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml index 6ee554571a0..a3b36b44371 100644 --- a/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml @@ -1,9 +1,8 @@ @using Orchard.ContentManagement; -@using Orchard.Core.Contents +@using Orchard.Core.Contents; @using Orchard.Utility.Extensions; @{ ContentItem contentItem = Model.ContentItem; - var returnUrl = ViewContext.RequestContext.HttpContext.Request.ToUrlString(); }
@@ -18,12 +17,6 @@
@if (Model.Content != null) {
@Display(Model.Content)
diff --git a/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Publish.SummaryAdmin.cshtml b/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Publish.SummaryAdmin.cshtml index 45d50d10483..0078857491b 100644 --- a/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Publish.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Publish.SummaryAdmin.cshtml @@ -4,38 +4,55 @@ @{ Script.Require("ShapesBase"); - ContentPart contentPart = Model.ContentPart; + ContentItem contentItem = Model.ContentItem; + var returnUrl = ViewContext.RequestContext.HttpContext.Request.ToUrlString(); + var hasPublished = contentItem.HasPublished(); + var hasDraft = contentItem.HasDraft(); + var isPublished = contentItem.IsPublished(); + var authorizedToEdit = Authorizer.Authorize(Permissions.EditContent, contentItem); + var authorizedToDelete = Authorizer.Authorize(Permissions.DeleteContent, contentItem); + var authorizedToPublish = Authorizer.Authorize(Permissions.PublishContent, contentItem); } -@if (contentPart.HasPublished()) { - @Html.ItemDisplayLink(T("View").Text, (ContentItem)Model.ContentPart.ContentItem) - @T(" | ") - if (contentPart.HasDraft()) { - if (Authorizer.Authorize(Permissions.PublishContent, contentPart)) { - @Html.Link(T("Publish Draft").Text, Url.Action("Publish", "Admin", new {area = "Contents", id = contentPart.ContentItem.Id, returnUrl = Request.ToUrlString()}), new {itemprop = "UnsafeUrl"}) + +@if ((!isPublished || hasDraft) && authorizedToEdit) { + } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 8526c49fc60..5ae0fc352bc 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -558,9 +558,6 @@ - - - diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/Parts.Contents.AuditTrail.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/Parts.Contents.AuditTrail.SummaryAdmin.cshtml index 0e7112d900b..fac40acc833 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/Parts.Contents.AuditTrail.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/Parts.Contents.AuditTrail.SummaryAdmin.cshtml @@ -1 +1 @@ -@T("Audit Trail")@T(" | ") \ No newline at end of file +@T("Audit Trail") \ No newline at end of file diff --git a/src/Orchard/ContentManagement/DefaultContentManager.cs b/src/Orchard/ContentManagement/DefaultContentManager.cs index f42ee47f1be..07975549ee8 100644 --- a/src/Orchard/ContentManagement/DefaultContentManager.cs +++ b/src/Orchard/ContentManagement/DefaultContentManager.cs @@ -445,6 +445,21 @@ public virtual void Remove(ContentItem contentItem) { Handlers.Invoke(handler => handler.Removed(context), Logger); } + public virtual void DiscardDraft(ContentItem contentItem) { + var session = _transactionManager.Value.GetSession(); + + // Delete the draft content item version record. + session + .CreateQuery("delete from Orchard.ContentManagement.Records.ContentItemVersionRecord civ where civ.ContentItemRecord.Id = (:id) and civ.Published = false and civ.Latest = true") + .SetParameter("id", contentItem.Id) + .ExecuteUpdate(); + + // After deleting the draft, get the published version. If for any reason there would be more than one, + // get the last one and set the Latest property to true. + var publishedVersionRecord = contentItem.Record.Versions.OrderBy(x => x.Number).ToArray().Last(); + publishedVersionRecord.Latest = true; + } + public virtual void Destroy(ContentItem contentItem) { var session = _transactionManager.Value.GetSession(); var context = new DestroyContentContext(contentItem); diff --git a/src/Orchard/ContentManagement/IContentManager.cs b/src/Orchard/ContentManagement/IContentManager.cs index cc05a13118f..6111f2f669b 100644 --- a/src/Orchard/ContentManagement/IContentManager.cs +++ b/src/Orchard/ContentManagement/IContentManager.cs @@ -85,6 +85,12 @@ public interface IContentManager : IDependency { void Unpublish(ContentItem contentItem); void Remove(ContentItem contentItem); + /// + /// Deletes the draft version of the content item permanently. + /// + /// The content item of which the draft version will be deleted. + void DiscardDraft(ContentItem contentItem); + /// /// Permanently deletes the specified content item, including all of its content part records. ///