diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/ContentAuditTrailEventShapes.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/ContentAuditTrailEventShapes.cs index 00e56bb67..ce2d9659a 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/ContentAuditTrailEventShapes.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/ContentAuditTrailEventShapes.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Xml.Linq; using Orchard.AuditTrail.Helpers; using Orchard.AuditTrail.Models; using Orchard.ContentManagement; @@ -26,13 +28,12 @@ namespace Orchard.AuditTrail.Providers.Content { var eventData = (IDictionary)context.Shape.EventData; var contentItemId = eventData.Get("ContentId"); var previousContentItemVersionId = eventData.Get("PreviousVersionId"); + var previousVersionXml = GetXml(eventData, "PreviousVersionXml"); + var diffGram = GetXml(eventData, "DiffGram"); var contentItem = _contentManager.Value.Get(contentItemId, VersionOptions.Latest); var previousVersion = previousContentItemVersionId > 0 ? _contentManager.Value.Get(contentItemId, VersionOptions.VersionRecord(previousContentItemVersionId)) : default(ContentItem); - if (previousVersion != null) { - var previousVersionXml = _contentManager.Value.Export(previousVersion); - var currentVersionXml = _contentManager.Value.Export(contentItem); - var diffGram = _analyzer.GenerateDiffGram(previousVersionXml, currentVersionXml); + if (diffGram != null) { var diffNodes = _analyzer.Analyze(previousVersionXml, diffGram).ToArray(); context.Shape.DiffNodes = diffNodes; } @@ -41,5 +42,19 @@ namespace Orchard.AuditTrail.Providers.Content { context.Shape.PreviousVersion = previousVersion; }); } + + private static XElement GetXml(IDictionary eventData, string key) { + var data = eventData.Get(key); + + if (String.IsNullOrWhiteSpace(data)) + return null; + + try { + return XElement.Parse(data); + } + catch (Exception) { + return null; + } + } } } \ 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 bac779ea0..41873a57d 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/GlobalContentHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/GlobalContentHandler.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Xml.Linq; using Orchard.AuditTrail.Services; using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; @@ -11,19 +12,31 @@ namespace Orchard.AuditTrail.Providers.Content { private readonly IAuditTrailManager _auditTrailManager; private readonly IWorkContextAccessor _wca; private readonly IContentManager _contentManager; + private XElement _previousVersionXml; + private readonly IDiffGramAnalyzer _analyzer; - public GlobalContentHandler(IAuditTrailManager auditTrailManager, IWorkContextAccessor wca, IContentManager contentManager) { + public GlobalContentHandler(IAuditTrailManager auditTrailManager, IWorkContextAccessor wca, IContentManager contentManager, IDiffGramAnalyzer analyzer) { _auditTrailManager = auditTrailManager; _wca = wca; _contentManager = contentManager; + _analyzer = analyzer; } protected override void Created(CreateContentContext context) { RecordAuditTrailEvent(ContentAuditTrailEventProvider.Created, context.ContentItem); } + protected override void Updating(UpdateContentContext context) { + var contentItem = context.ContentItem; + _previousVersionXml = _contentManager.Export(contentItem); + } + protected override void Updated(UpdateContentContext context) { - RecordAuditTrailEvent(ContentAuditTrailEventProvider.Saved, context.ContentItem); + var contentItem = context.ContentItem; + var newVersionXml = _contentManager.Export(contentItem); + var diffGram = _analyzer.GenerateDiffGram(_previousVersionXml, newVersionXml); + + RecordAuditTrailEvent(ContentAuditTrailEventProvider.Saved, context.ContentItem, diffGram: diffGram, previousVersionXml: _previousVersionXml); } protected override void Published(PublishContentContext context) { @@ -39,7 +52,7 @@ namespace Orchard.AuditTrail.Providers.Content { RecordAuditTrailEvent(ContentAuditTrailEventProvider.Removed, context.ContentItem); } - private void RecordAuditTrailEvent(string eventName, IContent content, ContentItemVersionRecord previousContentItemVersion = null) { + private void RecordAuditTrailEvent(string eventName, IContent content, ContentItemVersionRecord previousContentItemVersion = null, XElement diffGram = null, XElement previousVersionXml = null) { var blackList = new[] {"Site"}; if (blackList.Contains(content.ContentItem.ContentType)) @@ -56,6 +69,7 @@ namespace Orchard.AuditTrail.Providers.Content { {"ContentIdentity", _contentManager.GetItemMetadata(content).Identity.ToString()}, {"VersionId", content.ContentItem.VersionRecord.Id}, {"VersionNumber", content.ContentItem.VersionRecord.Number}, + {"Published", content.ContentItem.VersionRecord.Published}, {"Title", title} }; @@ -64,6 +78,11 @@ namespace Orchard.AuditTrail.Providers.Content { eventData["PreviousVersionNumber"] = previousContentItemVersion.Number; } + if (diffGram != null && previousVersionXml != null) { + eventData["PreviousVersionXml"] = previousVersionXml.ToString(SaveOptions.DisableFormatting); + eventData["DiffGram"] = diffGram.ToString(SaveOptions.DisableFormatting); + } + _auditTrailManager.CreateRecord( eventName, _wca.GetContext().CurrentUser, diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.SummaryAdmin.cshtml index a3427afb5..99112ae7a 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.SummaryAdmin.cshtml @@ -1,13 +1,13 @@ @using Orchard.AuditTrail.Helpers @{ var eventData = (IDictionary) Model.EventData; - var title = eventData.Get("Title"); var contentItemId = eventData.Get("ContentId"); var contentItemVersionNumber = eventData.Get("VersionNumber"); + var isPublished = eventData.Get("Published"); }
@T("Version {0}", contentItemVersionNumber) @T(" - ") - @T("View") + @T("View")
\ 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.cshtml index 54a1ac76f..3fd290cf2 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.cshtml @@ -4,10 +4,13 @@ @{ var record = (AuditTrailEventRecord)Model.Record; var contentItem = (ContentItem)Model.ContentItem; - var previousVersion = (ContentItem)Model.PreviousVersion; - var diffNodes = (IEnumerable)Model.DiffNodes; + var diffNodes = (IList)Model.DiffNodes; +} +@functions { + string FriendlyEmptyString(string value) { + return String.IsNullOrWhiteSpace(value) ? T("").Text : value; + } } -
- @if (previousVersion != null) { + @if (diffNodes != null) { @@ -41,8 +44,8 @@ - - + + } }
@T(node.Type.ToString()) @node.Context@node.Previous@node.Current@FriendlyEmptyString(node.Previous)@FriendlyEmptyString(node.Current)