mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Merge branch 'feature/audittrail' of https://git01.codeplex.com/orchard
This commit is contained in:
@@ -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<string, object>)context.Shape.EventData;
|
||||
var contentItemId = eventData.Get<int>("ContentId");
|
||||
var previousContentItemVersionId = eventData.Get<int>("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<string, object> eventData, string key) {
|
||||
var data = eventData.Get<string>(key);
|
||||
|
||||
if (String.IsNullOrWhiteSpace(data))
|
||||
return null;
|
||||
|
||||
try {
|
||||
return XElement.Parse(data);
|
||||
}
|
||||
catch (Exception) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<ContentAuditTrailEventProvider>(
|
||||
eventName,
|
||||
_wca.GetContext().CurrentUser,
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var title = eventData.Get<string>("Title");
|
||||
var contentItemId = eventData.Get<int>("ContentId");
|
||||
var contentItemVersionNumber = eventData.Get<int>("VersionNumber");
|
||||
var isPublished = eventData.Get<bool>("Published");
|
||||
}
|
||||
|
||||
<section class="audittrail-content-summary">
|
||||
@T("Version {0}", contentItemVersionNumber)
|
||||
@T(" - ")
|
||||
<a href="@Url.Action("Detail", "Content", new { area = "Orchard.AuditTrail", id = contentItemId, version = contentItemVersionNumber })">@T("View")</a>
|
||||
<a href="@Url.Action("Detail", "Content", new {area = "Orchard.AuditTrail", id = contentItemId, version = contentItemVersionNumber})">@T("View")</a>
|
||||
</section>
|
||||
@@ -4,10 +4,13 @@
|
||||
@{
|
||||
var record = (AuditTrailEventRecord)Model.Record;
|
||||
var contentItem = (ContentItem)Model.ContentItem;
|
||||
var previousVersion = (ContentItem)Model.PreviousVersion;
|
||||
var diffNodes = (IEnumerable<DiffNode>)Model.DiffNodes;
|
||||
var diffNodes = (IList<DiffNode>)Model.DiffNodes;
|
||||
}
|
||||
@functions {
|
||||
string FriendlyEmptyString(string value) {
|
||||
return String.IsNullOrWhiteSpace(value) ? T("<empty>").Text : value;
|
||||
}
|
||||
}
|
||||
|
||||
<section class="audittrail-event-metadata-section">
|
||||
@T("ID:") <strong>@contentItem.Id</strong><br />
|
||||
@contentItem.ContentType: <strong>@Html.ItemDisplayText(contentItem)</strong><br />
|
||||
@@ -20,7 +23,7 @@
|
||||
</section>
|
||||
|
||||
<section class="audittrail-event-changes-section">
|
||||
@if (previousVersion != null) {
|
||||
@if (diffNodes != null) {
|
||||
<table class="items">
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -41,8 +44,8 @@
|
||||
<tr>
|
||||
<td>@T(node.Type.ToString())</td>
|
||||
<td>@node.Context</td>
|
||||
<td>@node.Previous</td>
|
||||
<td>@node.Current</td>
|
||||
<td>@FriendlyEmptyString(node.Previous)</td>
|
||||
<td>@FriendlyEmptyString(node.Current)</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user