Added User audit trail provider.

This commit is contained in:
sfmskywalker
2014-05-26 02:00:29 +02:00
parent 780d1248d3
commit 0e06e3d6a0
8 changed files with 72 additions and 31 deletions

View File

@@ -73,6 +73,7 @@
<ItemGroup>
<None Include="Placement.info" />
<Content Include="Recipes\audit-trail.recipe.xml" />
<Content Include="Scripts\audit-trail-admin.js" />
<Content Include="Styles\admin.css" />
<Content Include="Styles\menu.audit-trail-admin.css" />
<Content Include="Styles\menu.audit-trail.png" />
@@ -100,9 +101,12 @@
<Compile Include="AdminMenu.cs" />
<Compile Include="Controllers\AdminController.cs" />
<Compile Include="Drivers\ContentsDriver.cs" />
<Compile Include="Handlers\AuditTrailEventHandler.cs" />
<Compile Include="Providers\Content\AuditTrailEventHandler.cs" />
<Compile Include="Helpers\EventDataHelper.cs" />
<Compile Include="Models\AuditTrailFilterParameters.cs" />
<Compile Include="Providers\User\UserAuditTrailEventProvider.cs" />
<Compile Include="Providers\User\IUserEventHandler.cs" />
<Compile Include="Providers\User\UserEventHandler.cs" />
<Compile Include="Settings\AuditTrailPartSettings.cs" />
<Compile Include="Settings\AuditTrailPartSettingsEvents.cs" />
<Compile Include="ViewModels\AuditTrailEventSummaryViewModel.cs" />
@@ -114,7 +118,7 @@
<Compile Include="Services\IAuditTrailEventDisplayBuilder.cs" />
<Compile Include="Services\IEventDataSerializer.cs" />
<Compile Include="ViewModels\AuditTrailDetailsViewModel.cs" />
<Compile Include="Handlers\GlobalContentHandler.cs" />
<Compile Include="Providers\Content\GlobalContentHandler.cs" />
<Compile Include="Models\AuditTrailEventDescriptor.cs" />
<Compile Include="Models\AuditTrailCategoryDescriptor.cs" />
<Compile Include="Models\DescribeContext.cs" />
@@ -122,7 +126,7 @@
<Compile Include="Models\AuditTrailContext.cs" />
<Compile Include="Models\AuditTrailCreateContext.cs" />
<Compile Include="Services\AuditTrailEventProviderBase.cs" />
<Compile Include="Providers\ContentAuditTrailEventProvider.cs" />
<Compile Include="Providers\Content\ContentAuditTrailEventProvider.cs" />
<Compile Include="Services\IAuditTrailEventHandler.cs" />
<Compile Include="Services\IAuditTrailEventProvider.cs" />
<Compile Include="ViewModels\AuditTrailFilterViewModel.cs" />
@@ -155,6 +159,7 @@
<ItemGroup>
<Content Include="Views\EditorTemplates\Parts.AuditTrail.Comment.cshtml" />
</ItemGroup>
<ItemGroup />
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

View File

@@ -2,7 +2,7 @@
using Orchard.AuditTrail.Services;
using Orchard.ContentManagement;
namespace Orchard.AuditTrail.Handlers {
namespace Orchard.AuditTrail.Providers.Content {
public class AuditTrailEventHandler : IAuditTrailEventHandler {
public void Create(AuditTrailCreateContext context) {
var content = (IContent)context.Properties["Content"];

View File

@@ -1,7 +1,7 @@
using Orchard.AuditTrail.Models;
using Orchard.AuditTrail.Services;
namespace Orchard.AuditTrail.Providers {
namespace Orchard.AuditTrail.Providers.Content {
public class ContentAuditTrailEventProvider : AuditTrailEventProviderBase {
public const string Created = "Created";
public const string Saved = "Saved";

View File

@@ -1,11 +1,11 @@
using System.Collections.Generic;
using Orchard.AuditTrail.Providers;
using System.Globalization;
using Orchard.AuditTrail.Services;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.Records;
namespace Orchard.AuditTrail.Handlers {
namespace Orchard.AuditTrail.Providers.Content {
public class GlobalContentHandler : ContentHandler {
private readonly IAuditTrailManager _auditTrailManager;
private readonly IWorkContextAccessor _wca;
@@ -56,7 +56,7 @@ namespace Orchard.AuditTrail.Handlers {
eventData["PreviousContentItemVersionId"] = previousContentItemVersion.Id;
}
_auditTrailManager.Record<ContentAuditTrailEventProvider>(eventName, _wca.GetContext().CurrentUser, properties, eventData, eventFilterKey: "content", eventFilterData: content.Id.ToString());
_auditTrailManager.Record<ContentAuditTrailEventProvider>(eventName, _wca.GetContext().CurrentUser, properties, eventData, eventFilterKey: "content", eventFilterData: content.Id.ToString(CultureInfo.InvariantCulture));
}
}
}

View File

@@ -0,0 +1,11 @@
using Orchard.Events;
using Orchard.Security;
namespace Orchard.AuditTrail.Providers.User {
public interface IUserEventHandler : IEventHandler {
/// <summary>
/// Called after a user has changed password
/// </summary>
void ChangedPassword(IUser user);
}
}

View File

@@ -0,0 +1,13 @@
using Orchard.AuditTrail.Models;
using Orchard.AuditTrail.Services;
namespace Orchard.AuditTrail.Providers.User {
public class UserAuditTrailEventProvider : AuditTrailEventProviderBase {
public const string PasswordChanged = "PasswordChanged";
public override void Describe(DescribeContext context) {
context.For("User", T("User"))
.Event(this, PasswordChanged, T("Password changed"), T("A user's password was changed."), enableByDefault: true);
}
}
}

View File

@@ -0,0 +1,34 @@
using System.Collections.Generic;
using System.Globalization;
using Orchard.AuditTrail.Services;
using Orchard.Security;
namespace Orchard.AuditTrail.Providers.User {
public class UserEventHandler : IUserEventHandler {
private readonly IAuditTrailManager _auditTrailManager;
private readonly IWorkContextAccessor _wca;
public UserEventHandler(IAuditTrailManager auditTrailManager, IWorkContextAccessor wca) {
_auditTrailManager = auditTrailManager;
_wca = wca;
}
public void ChangedPassword(IUser user) {
RecordAuditTrail(UserAuditTrailEventProvider.PasswordChanged, user);
}
private void RecordAuditTrail(string eventName, IUser user) {
var properties = new Dictionary<string, object> {
{"User", user}
};
var eventData = new Dictionary<string, object> {
{"UserId", user.Id},
{"UserName", user.UserName}
};
_auditTrailManager.Record<UserAuditTrailEventProvider>(eventName, _wca.GetContext().CurrentUser, properties, eventData, eventFilterKey: "user", eventFilterData: user.Id.ToString(CultureInfo.InvariantCulture));
}
}
}

View File

@@ -1,23 +1 @@
@using Orchard.AuditTrail.Models
@{
var record = (AuditTrailEventRecord)Model.Record;
var detailsUrl = Url.Action("Detail", "Admin", new {id = record.Id, area = "Orchard.AuditTrail"});
}
<div class="audit-trail-record">
<div class="event-header">
<div class="group">
<div class="event-name">
<a href="@detailsUrl">@record.Event</a> - <span>@record.Category</span>
</div>
<div class="event-actions">
<a href="@detailsUrl">@T("Details")</a>
</div>
</div>
</div>
<div class="event-details">
@Display.DateTime(DateTimeUtc: record.CreatedUtc, CustomFormat: T("g"))
@if (!String.IsNullOrWhiteSpace(record.UserName)) {
@T(" | ")@record.UserName
}
</div>
</div>