From 7a8765811beb880ec72bbe4c62ef516386ec40fa Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Tue, 1 Jul 2014 19:27:26 -0700 Subject: [PATCH] Added audit trail settings event provider. --- .../Handlers/AuditTrailSettingsPartHandler.cs | 27 ++++++++++++- .../AuditTrailTrimmingSettingsPartHandler.cs | 39 ++++++++++++++++--- .../Helpers/EventDataHelper.cs | 2 +- .../Orchard.AuditTrail.csproj | 7 +++- .../SettingsAuditTrailEventProvider.cs | 14 +++++++ ...TrimmingSettingsAuditTrailEventProvider.cs | 16 ++++++++ .../Providers/Content/GlobalContentHandler.cs | 8 +++- .../IAuditTrailSettingsEventHandler.cs | 8 ++++ .../Models/AuditTrailSettingsContext.cs | 3 ++ .../Views/Admin/Detail.cshtml | 4 +- ...ailSettings-TrimmingSettingsChanged.cshtml | 10 +++++ ... => AuditTrailEvent-Content - Copy.cshtml} | 0 12 files changed, 127 insertions(+), 11 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/AuditTrail/SettingsAuditTrailEventProvider.cs create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/AuditTrail/TrimmingSettingsAuditTrailEventProvider.cs create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IAuditTrailSettingsEventHandler.cs create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/AuditTrailSettingsContext.cs create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-AuditTrailSettings-TrimmingSettingsChanged.cshtml rename src/Orchard.Web/Modules/Orchard.AuditTrail/Views/{AuditTrailEvent-Content.cshtml => AuditTrailEvent-Content - Copy.cshtml} (100%) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Handlers/AuditTrailSettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Handlers/AuditTrailSettingsPartHandler.cs index 8a34f02d2..33306c224 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Handlers/AuditTrailSettingsPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Handlers/AuditTrailSettingsPartHandler.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Xml.Linq; using Orchard.AuditTrail.Models; +using Orchard.AuditTrail.Providers.AuditTrail; +using Orchard.AuditTrail.Services; using Orchard.Caching; using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; @@ -12,11 +14,18 @@ using Orchard.Logging; namespace Orchard.AuditTrail.Handlers { public class AuditTrailSettingsPartHandler : ContentHandler { private readonly ISignals _signals; + private string _oldEventSettings; + private readonly IAuditTrailManager _auditTrailManager; + private readonly IWorkContextAccessor _wca; - public AuditTrailSettingsPartHandler(ISignals signals) { + public AuditTrailSettingsPartHandler(ISignals signals, IAuditTrailManager auditTrailManager, IWorkContextAccessor wca) { _signals = signals; + _auditTrailManager = auditTrailManager; + _wca = wca; Filters.Add(new ActivatingFilter("Site")); OnActivated(SetupLazyFields); + OnUpdating(BeginUpdateEvent); + OnUpdated(EndUpdateEvent); OnGetContentItemMetadata(GetMetadata); T = NullLocalizer.Instance; } @@ -36,6 +45,22 @@ namespace Orchard.AuditTrail.Handlers { }); } + private void BeginUpdateEvent(UpdateContentContext context, AuditTrailSettingsPart part) { + _oldEventSettings = part.Retrieve("Events"); + } + + private void EndUpdateEvent(UpdateContentContext context, AuditTrailSettingsPart part) { + var newEventSettings = part.Retrieve("Events"); + + if (newEventSettings == _oldEventSettings) + return; + + _auditTrailManager.CreateRecord( + eventName: SettingsAuditTrailEventProvider.EventsChanged, + user: _wca.GetContext().CurrentUser); + } + + private IEnumerable DeserializeProviderConfiguration(string data) { if (String.IsNullOrWhiteSpace(data)) return Enumerable.Empty(); diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Handlers/AuditTrailTrimmingSettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Handlers/AuditTrailTrimmingSettingsPartHandler.cs index 7bee7cc4e..018943fdf 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Handlers/AuditTrailTrimmingSettingsPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Handlers/AuditTrailTrimmingSettingsPartHandler.cs @@ -1,4 +1,7 @@ -using Orchard.AuditTrail.Models; +using System.Collections.Generic; +using Orchard.AuditTrail.Models; +using Orchard.AuditTrail.Providers.AuditTrail; +using Orchard.AuditTrail.Services; using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; using Orchard.Environment.Extensions; @@ -7,17 +10,43 @@ using Orchard.Localization; namespace Orchard.AuditTrail.Handlers { [OrchardFeature("Orchard.AuditTrail.Trimming")] public class AuditTrailTrimmingSettingsPartHandler : ContentHandler { - - public AuditTrailTrimmingSettingsPartHandler() { + private int _oldThreshold; + private readonly IAuditTrailManager _auditTrailManager; + private readonly IWorkContextAccessor _wca; + + public AuditTrailTrimmingSettingsPartHandler(IAuditTrailManager auditTrailManager, IWorkContextAccessor wca) { + _auditTrailManager = auditTrailManager; + _wca = wca; Filters.Add(new ActivatingFilter("Site")); - OnGetContentItemMetadata(GetMetadata); + OnGetContentItemMetadata(GetMetadata); + OnUpdating(BeginUpdateEvent); + OnUpdated(EndUpdateEvent); T = NullLocalizer.Instance; } public Localizer T { get; set; } - private void GetMetadata(GetContentItemMetadataContext context, AuditTrailSettingsPart part) { + private void GetMetadata(GetContentItemMetadataContext context, AuditTrailTrimmingSettingsPart part) { context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Audit Trail"))); } + + private void BeginUpdateEvent(UpdateContentContext context, AuditTrailTrimmingSettingsPart part) { + _oldThreshold = part.Threshold; + } + + private void EndUpdateEvent(UpdateContentContext context, AuditTrailTrimmingSettingsPart part) { + var newThreshold = part.Threshold; + + if (newThreshold == _oldThreshold) + return; + + _auditTrailManager.CreateRecord( + eventName: TrimmingSettingsAuditTrailEventProvider.TrimmingSettingsChanged, + user: _wca.GetContext().CurrentUser, + eventData: new Dictionary { + {"OldThreshold", _oldThreshold}, + {"NewThreshold", newThreshold} + }); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataHelper.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataHelper.cs index 1b0e00807..664af226a 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataHelper.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataHelper.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace Orchard.AuditTrail.Helpers { public static class EventDataHelper { public static T Get(this IDictionary eventData, string key) { - if (!eventData.ContainsKey(key)) + if (eventData == null || !eventData.ContainsKey(key)) return default(T); var value = eventData[key]; diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj index 35e370313..757fe2f77 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj @@ -136,6 +136,7 @@ + @@ -166,8 +167,12 @@ + + + + @@ -247,7 +252,7 @@ - + diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/AuditTrail/SettingsAuditTrailEventProvider.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/AuditTrail/SettingsAuditTrailEventProvider.cs new file mode 100644 index 000000000..c77d6b6b3 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/AuditTrail/SettingsAuditTrailEventProvider.cs @@ -0,0 +1,14 @@ +using Orchard.AuditTrail.Services; +using Orchard.AuditTrail.Services.Models; + +namespace Orchard.AuditTrail.Providers.AuditTrail { + public class SettingsAuditTrailEventProvider : AuditTrailEventProviderBase { + + public const string EventsChanged = "EventsChanged"; + + public override void Describe(DescribeContext context) { + context.For("AuditTrailSettings", T("Audit Trail Settings")) + .Event(this, EventsChanged, T("Events Changed"), T("Audit Trail event settings were changed."), enableByDefault: true); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/AuditTrail/TrimmingSettingsAuditTrailEventProvider.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/AuditTrail/TrimmingSettingsAuditTrailEventProvider.cs new file mode 100644 index 000000000..6f2ce0884 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/AuditTrail/TrimmingSettingsAuditTrailEventProvider.cs @@ -0,0 +1,16 @@ +using Orchard.AuditTrail.Services; +using Orchard.AuditTrail.Services.Models; +using Orchard.Environment.Extensions; + +namespace Orchard.AuditTrail.Providers.AuditTrail { + [OrchardFeature("Orchard.AuditTrail.Trimming")] + public class TrimmingSettingsAuditTrailEventProvider : AuditTrailEventProviderBase { + + public const string TrimmingSettingsChanged = "TrimmingSettingsChanged"; + + public override void Describe(DescribeContext context) { + context.For("AuditTrailSettings", T("Audit Trail Settings")) + .Event(this, TrimmingSettingsChanged, T("Trimming Settings Changed"), T("Audit Trail trimming settings were changed."), enableByDefault: true); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/GlobalContentHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/GlobalContentHandler.cs index 99c94ee66..d49207b67 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/GlobalContentHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/GlobalContentHandler.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Globalization; +using System.Linq; using Orchard.AuditTrail.Services; using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; @@ -39,6 +40,11 @@ namespace Orchard.AuditTrail.Providers.Content { } private void RecordAuditTrailEvent(string eventName, IContent content, ContentItemVersionRecord previousContentItemVersion = null) { + var blackList = new[] {"Site"}; + + if (blackList.Contains(content.ContentItem.ContentType)) + return; + var title = _contentManager.GetItemMetadata(content).DisplayText; var properties = new Dictionary { @@ -58,7 +64,7 @@ namespace Orchard.AuditTrail.Providers.Content { _auditTrailManager.CreateRecord( eventName, - _wca.GetContext().CurrentUser, + _wca.GetContext().CurrentUser, properties, eventData, eventFilterKey: "content", diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IAuditTrailSettingsEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IAuditTrailSettingsEventHandler.cs new file mode 100644 index 000000000..d25cf19f2 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IAuditTrailSettingsEventHandler.cs @@ -0,0 +1,8 @@ +using Orchard.AuditTrail.Services.Models; +using Orchard.Events; + +namespace Orchard.AuditTrail.Services { + public interface IAuditTrailSettingsEventHandler : IEventHandler { + void Updated(AuditTrailSettingsContext context); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/AuditTrailSettingsContext.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/AuditTrailSettingsContext.cs new file mode 100644 index 000000000..c285b0275 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/AuditTrailSettingsContext.cs @@ -0,0 +1,3 @@ +namespace Orchard.AuditTrail.Services.Models { + public class AuditTrailSettingsContext {} +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/Admin/Detail.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/Admin/Detail.cshtml index e3d76fbc1..3b06415e9 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/Admin/Detail.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/Admin/Detail.cshtml @@ -10,9 +10,9 @@
@descriptor.Name - @descriptor.CategoryDescriptor.Name
- @Display.DateTime(DateTimeUtc: record.CreatedUtc, CustomFormat: T("g")) + @T("On: {0}", Display.DateTime(DateTimeUtc: record.CreatedUtc, CustomFormat: T("g"))) @if (!String.IsNullOrWhiteSpace(record.UserName)) { - @T(" | ")@record.UserName + @T(" | ")@T("By: {0}", record.UserName) }
diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-AuditTrailSettings-TrimmingSettingsChanged.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-AuditTrailSettings-TrimmingSettingsChanged.cshtml new file mode 100644 index 000000000..00249f063 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-AuditTrailSettings-TrimmingSettingsChanged.cshtml @@ -0,0 +1,10 @@ +@using Orchard.AuditTrail.Helpers +@{ + var eventData = (IDictionary)Model.EventData; + var oldThreshold = eventData.Get("OldThreshold"); + var newThreshold = eventData.Get("NewThreshold"); +} + +
+ @T("Trimming threshold changed from {0} to {1}", oldThreshold, newThreshold) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content - Copy.cshtml similarity index 100% rename from src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.cshtml rename to src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content - Copy.cshtml