From fdfdd541e3389de9d58211d8da55603ea2f6d1c6 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 5 Jul 2018 17:14:11 +0200 Subject: [PATCH] Content Url and Audit (in progress) --- .../Services/Implement/ContentService.cs | 46 ++-- .../Services/UnpublishResultType.cs | 2 +- .../content/umb-content-node-info.html | 57 ++--- .../components/media/umb-media-node-info.html | 10 +- src/Umbraco.Web.UI/Umbraco/config/lang/en.xml | 2 + .../Umbraco/config/lang/en_us.xml | 2 + src/Umbraco.Web/Editors/ContentController.cs | 5 +- .../ContentEditing/ContentItemDisplay.cs | 3 +- .../Models/Mapping/ContentUrlResolver.cs | 6 +- src/Umbraco.Web/Routing/UrlInfo.cs | 50 ++++ .../Routing/UrlProviderExtensions.cs | 226 ++++++++++-------- src/Umbraco.Web/Umbraco.Web.csproj | 1 + 12 files changed, 250 insertions(+), 160 deletions(-) create mode 100644 src/Umbraco.Web/Routing/UrlInfo.cs diff --git a/src/Umbraco.Core/Services/Implement/ContentService.cs b/src/Umbraco.Core/Services/Implement/ContentService.cs index 731f29ed4e..e953a6073e 100644 --- a/src/Umbraco.Core/Services/Implement/ContentService.cs +++ b/src/Umbraco.Core/Services/Implement/ContentService.cs @@ -891,7 +891,7 @@ namespace Umbraco.Core.Services.Implement } var changeType = TreeChangeTypes.RefreshNode; scope.Events.Dispatch(TreeChanged, this, new TreeChange(content, changeType).ToEventArgs()); - Audit(AuditType.Save, "Save Content performed by user", userId, content.Id); + Audit(AuditType.Save, "Saved by user", userId, content.Id); scope.Complete(); } @@ -931,7 +931,7 @@ namespace Umbraco.Core.Services.Implement scope.Events.Dispatch(Saved, this, saveEventArgs, "Saved"); } scope.Events.Dispatch(TreeChanged, this, treeChanges.ToEventArgs()); - Audit(AuditType.Save, "Bulk Save content performed by user", userId == -1 ? 0 : userId, Constants.System.Root); + Audit(AuditType.Save, "Bulk-saved by user", userId == -1 ? 0 : userId, Constants.System.Root); scope.Complete(); } @@ -988,6 +988,8 @@ namespace Umbraco.Core.Services.Implement { var evtMsgs = EventMessagesFactory.Get(); + culture = culture.NullOrWhiteSpaceAsNull(); + var publishedState = content.PublishedState; if (publishedState != PublishedState.Published && publishedState != PublishedState.Unpublished) throw new InvalidOperationException($"Cannot save-and-publish (un)publishing content, use the dedicated {nameof(SavePublishing)} method."); @@ -996,12 +998,12 @@ namespace Umbraco.Core.Services.Implement // cannot accept a specific culture for invariant content type (but '*' is ok) if (content.ContentType.VariesByCulture()) { - if (culture.IsNullOrWhiteSpace()) + if (culture == null) throw new NotSupportedException("Invariant culture is not supported by variant content types."); } else { - if (!culture.IsNullOrWhiteSpace() && culture != "*") + if (culture != null && culture != "*") throw new NotSupportedException($"Culture \"{culture}\" is not supported by invariant content types."); } @@ -1010,7 +1012,7 @@ namespace Umbraco.Core.Services.Implement return new UnpublishResult(UnpublishResultType.SuccessAlready, evtMsgs, content); // all cultures = unpublish whole - if (culture == "*") + if (culture == "*" || (!content.ContentType.VariesByCulture() && culture == null)) { ((Content) content).PublishedState = PublishedState.Unpublishing; } @@ -1031,9 +1033,21 @@ namespace Umbraco.Core.Services.Implement var saved = SavePublishing(content, userId); if (saved.Success) { - Audit(AuditType.UnPublish, $"Unpublish variation culture: \"{culture ?? string.Empty}\" performed by user", userId, content.Id); + UnpublishResultType result; + if (culture == "*" || culture == null) + { + Audit(AuditType.UnPublish, "Unpublished by user", userId, content.Id); + result = UnpublishResultType.Success; + } + else + { + Audit(AuditType.UnPublish, $"Culture \"{culture}\" unpublished by user", userId, content.Id); + if (!content.Published) + Audit(AuditType.UnPublish, $"Unpublished (culture \"{culture}\" is mandatory) by user", userId, content.Id); + result = content.Published ? UnpublishResultType.SuccessCulture : UnpublishResultType.SuccessMandatoryCulture; + } scope.Complete(); - return new UnpublishResult(UnpublishResultType.SuccessVariant, evtMsgs, content); + return new UnpublishResult(result, evtMsgs, content); } // failed - map result @@ -1156,7 +1170,7 @@ namespace Umbraco.Core.Services.Implement // events and audit scope.Events.Dispatch(UnPublished, this, new PublishEventArgs(content, false, false), "UnPublished"); scope.Events.Dispatch(TreeChanged, this, new TreeChange(content, TreeChangeTypes.RefreshBranch).ToEventArgs()); - Audit(AuditType.UnPublish, "UnPublish performed by user", userId, content.Id); + Audit(AuditType.UnPublish, "Unpublished by user", userId, content.Id); scope.Complete(); return new PublishResult(PublishResultType.Success, evtMsgs, content); } @@ -1187,7 +1201,7 @@ namespace Umbraco.Core.Services.Implement scope.Events.Dispatch(Published, this, new PublishEventArgs(descendants, false, false), "Published"); } - Audit(AuditType.Publish, "Save and Publish performed by user", userId, content.Id); + Audit(AuditType.Publish, "Published by user", userId, content.Id); scope.Complete(); return publishResult; } @@ -1321,7 +1335,7 @@ namespace Umbraco.Core.Services.Implement scope.Events.Dispatch(TreeChanged, this, new TreeChange(document, TreeChangeTypes.RefreshBranch).ToEventArgs()); scope.Events.Dispatch(Published, this, new PublishEventArgs(publishedDocuments, false, false), "Published"); - Audit(AuditType.Publish, "SaveAndPublishBranch performed by user", userId, document.Id); + Audit(AuditType.Publish, "Branch published by user", userId, document.Id); scope.Complete(); } @@ -1390,7 +1404,7 @@ namespace Umbraco.Core.Services.Implement DeleteLocked(scope, content); scope.Events.Dispatch(TreeChanged, this, new TreeChange(content, TreeChangeTypes.Remove).ToEventArgs()); - Audit(AuditType.Delete, "Delete Content performed by user", userId, content.Id); + Audit(AuditType.Delete, "Deleted by user", userId, content.Id); scope.Complete(); } @@ -1458,7 +1472,7 @@ namespace Umbraco.Core.Services.Implement deleteRevisionsEventArgs.CanCancel = false; scope.Events.Dispatch(DeletedVersions, this, deleteRevisionsEventArgs); - Audit(AuditType.Delete, "Delete Content by version date performed by user", userId, Constants.System.Root); + Audit(AuditType.Delete, "Delete (by version date) by user", userId, Constants.System.Root); scope.Complete(); } @@ -1495,7 +1509,7 @@ namespace Umbraco.Core.Services.Implement _documentRepository.DeleteVersion(versionId); scope.Events.Dispatch(DeletedVersions, this, new DeleteRevisionsEventArgs(id, false,/* specificVersion:*/ versionId)); - Audit(AuditType.Delete, "Delete Content by version performed by user", userId, Constants.System.Root); + Audit(AuditType.Delete, "Delete (by version) by user", userId, Constants.System.Root); scope.Complete(); } @@ -1540,7 +1554,7 @@ namespace Umbraco.Core.Services.Implement moveEventArgs.CanCancel = false; moveEventArgs.MoveInfoCollection = moveInfo; scope.Events.Dispatch(Trashed, this, moveEventArgs, nameof(Trashed)); - Audit(AuditType.Move, "Move Content to Recycle Bin performed by user", userId, content.Id); + Audit(AuditType.Move, "Moved to Recycle Bin by user", userId, content.Id); scope.Complete(); } @@ -1612,7 +1626,7 @@ namespace Umbraco.Core.Services.Implement moveEventArgs.MoveInfoCollection = moveInfo; moveEventArgs.CanCancel = false; scope.Events.Dispatch(Moved, this, moveEventArgs, nameof(Moved)); - Audit(AuditType.Move, "Move Content performed by user", userId, content.Id); + Audit(AuditType.Move, "Moved by user", userId, content.Id); scope.Complete(); } @@ -1709,7 +1723,7 @@ namespace Umbraco.Core.Services.Implement recycleBinEventArgs.RecycleBinEmptiedSuccessfully = true; // oh my?! scope.Events.Dispatch(EmptiedRecycleBin, this, recycleBinEventArgs); scope.Events.Dispatch(TreeChanged, this, deleted.Select(x => new TreeChange(x, TreeChangeTypes.Remove)).ToEventArgs()); - Audit(AuditType.Delete, "Empty Content Recycle Bin performed by user", 0, Constants.System.RecycleBinContent); + Audit(AuditType.Delete, "Recycle Bin emptied by user", 0, Constants.System.RecycleBinContent); scope.Complete(); } diff --git a/src/Umbraco.Core/Services/UnpublishResultType.cs b/src/Umbraco.Core/Services/UnpublishResultType.cs index 010c37d7a5..e61e786a05 100644 --- a/src/Umbraco.Core/Services/UnpublishResultType.cs +++ b/src/Umbraco.Core/Services/UnpublishResultType.cs @@ -18,7 +18,7 @@ /// /// The specified variant was unpublished, the content item itself remains published. /// - SuccessVariant = 2, + SuccessCulture = 2, /// /// The specified variant was a mandatory culture therefore it was unpublished and the content item itself is unpublished diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html index b33e27d048..c9e4af4062 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html @@ -1,19 +1,22 @@
- +
- + @@ -23,12 +26,12 @@ - +
- +
-
- +
+
- +
{{item.timestampFormatted}}
- +
{{ item.comment }}
- +
@@ -84,8 +87,8 @@
- - + +
@@ -96,15 +99,15 @@
- + - +
- +
@@ -115,12 +118,12 @@
{{node.releaseDateDay}} {{node.releaseDateTime}}
- Set date - + Set date +
- + Clear date @@ -140,7 +143,7 @@
- +
{{node.removeDateMonth}} {{node.removeDateYear}}
{{node.removeDateDayNumber}}
@@ -159,7 +162,7 @@
- + @@ -200,7 +203,7 @@ {{ node.key }} - +
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/media/umb-media-node-info.html b/src/Umbraco.Web.UI.Client/src/views/components/media/umb-media-node-info.html index 9f4043db39..9d060090ec 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/media/umb-media-node-info.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/media/umb-media-node-info.html @@ -5,16 +5,16 @@ -