mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Introducing Audit Trail Trimming feature and extracting trimming settings.
This commit is contained in:
@@ -7,29 +7,27 @@ using Orchard.ContentManagement.Drivers;
|
||||
using Orchard.Security;
|
||||
|
||||
namespace Orchard.AuditTrail.Drivers {
|
||||
public class AuditTrailSiteSettingsPartDriver : ContentPartDriver<AuditTrailSiteSettingsPart> {
|
||||
public class AuditTrailSettingsPartDriver : ContentPartDriver<AuditTrailSettingsPart> {
|
||||
private readonly IAuditTrailManager _auditTrailManager;
|
||||
private readonly IAuthorizer _authorizer;
|
||||
|
||||
public AuditTrailSiteSettingsPartDriver(IAuditTrailManager auditTrailManager, IAuthorizer authorizer) {
|
||||
public AuditTrailSettingsPartDriver(IAuditTrailManager auditTrailManager, IAuthorizer authorizer) {
|
||||
_auditTrailManager = auditTrailManager;
|
||||
_authorizer = authorizer;
|
||||
}
|
||||
|
||||
protected override DriverResult Editor(AuditTrailSiteSettingsPart part, dynamic shapeHelper) {
|
||||
protected override DriverResult Editor(AuditTrailSettingsPart part, dynamic shapeHelper) {
|
||||
return Editor(part, null, shapeHelper);
|
||||
}
|
||||
|
||||
protected override DriverResult Editor(AuditTrailSiteSettingsPart part, IUpdateModel updater, dynamic shapeHelper) {
|
||||
protected override DriverResult Editor(AuditTrailSettingsPart part, IUpdateModel updater, dynamic shapeHelper) {
|
||||
if (!_authorizer.Authorize(Permissions.ManageAuditTrailSettings))
|
||||
return null;
|
||||
|
||||
return ContentShape("Parts_AuditTrailSiteSettings_Edit", () => {
|
||||
return ContentShape("Parts_AuditTrailSettings_Edit", () => {
|
||||
var descriptors = _auditTrailManager.Describe();
|
||||
var eventSettings = part.EventSettings.ToList();
|
||||
var viewModel = new AuditTrailSiteSettingsViewModel {
|
||||
AutoTrim = part.AutoTrim,
|
||||
AutoTrimThreshold = part.AutoTrimThreshold,
|
||||
var viewModel = new AuditTrailSettingsViewModel {
|
||||
Categories = (from categoryDescriptor in descriptors
|
||||
select new AuditTrailCategorySettingsViewModel {
|
||||
Category = categoryDescriptor.Category,
|
||||
@@ -58,12 +56,10 @@ namespace Orchard.AuditTrail.Drivers {
|
||||
eventSetting.IsEnabled = eventSettingViewModel.IsEnabled;
|
||||
}
|
||||
part.EventSettings = eventSettings;
|
||||
part.AutoTrim = viewModel.AutoTrim;
|
||||
part.AutoTrimThreshold = viewModel.AutoTrimThreshold;
|
||||
}
|
||||
}
|
||||
|
||||
return shapeHelper.EditorTemplate(TemplateName: "Parts.AuditTrailSiteSettings", Model: viewModel, Prefix: Prefix);
|
||||
return shapeHelper.EditorTemplate(TemplateName: "Parts.AuditTrailSettings", Model: viewModel, Prefix: Prefix);
|
||||
}).OnGroup("Audit Trail");
|
||||
}
|
||||
}
|
@@ -0,0 +1,40 @@
|
||||
using Orchard.AuditTrail.Models;
|
||||
using Orchard.AuditTrail.ViewModels;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.ContentManagement.Drivers;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Security;
|
||||
|
||||
namespace Orchard.AuditTrail.Drivers {
|
||||
[OrchardFeature("Orchard.AuditTrail.Trimming")]
|
||||
public class AuditTrailTrimmingSettingsPartDriver : ContentPartDriver<AuditTrailTrimmingSettingsPart> {
|
||||
private readonly IAuthorizer _authorizer;
|
||||
|
||||
public AuditTrailTrimmingSettingsPartDriver(IAuthorizer authorizer) {
|
||||
_authorizer = authorizer;
|
||||
}
|
||||
|
||||
protected override DriverResult Editor(AuditTrailTrimmingSettingsPart part, dynamic shapeHelper) {
|
||||
return Editor(part, null, shapeHelper);
|
||||
}
|
||||
|
||||
protected override DriverResult Editor(AuditTrailTrimmingSettingsPart part, IUpdateModel updater, dynamic shapeHelper) {
|
||||
if (!_authorizer.Authorize(Permissions.ManageAuditTrailSettings))
|
||||
return null;
|
||||
|
||||
return ContentShape("Parts_AuditTrailTrimmingSettings_Edit", () => {
|
||||
var viewModel = new AuditTrailTrimmingSettingsViewModel {
|
||||
AutoTrimThreshold = part.AutoTrimThreshold,
|
||||
};
|
||||
|
||||
if (updater != null) {
|
||||
if (updater.TryUpdateModel(viewModel, Prefix, null, null)) {
|
||||
part.AutoTrimThreshold = viewModel.AutoTrimThreshold;
|
||||
}
|
||||
}
|
||||
|
||||
return shapeHelper.EditorTemplate(TemplateName: "Parts.AuditTrailTrimmingSettings", Model: viewModel, Prefix: Prefix);
|
||||
}).OnGroup("Audit Trail");
|
||||
}
|
||||
}
|
||||
}
|
@@ -10,23 +10,24 @@ using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
|
||||
namespace Orchard.AuditTrail.Handlers {
|
||||
public class AuditTrailSiteSettingsPartHandler : ContentHandler {
|
||||
public class AuditTrailSettingsPartHandler : ContentHandler {
|
||||
private readonly ISignals _signals;
|
||||
|
||||
public AuditTrailSiteSettingsPartHandler(ISignals signals) {
|
||||
public AuditTrailSettingsPartHandler(ISignals signals) {
|
||||
_signals = signals;
|
||||
OnActivated<AuditTrailSiteSettingsPart>(SetupLazyFields);
|
||||
OnGetContentItemMetadata<AuditTrailSiteSettingsPart>(GetMetadata);
|
||||
Filters.Add(new ActivatingFilter<AuditTrailSettingsPart>("Site"));
|
||||
OnActivated<AuditTrailSettingsPart>(SetupLazyFields);
|
||||
OnGetContentItemMetadata<AuditTrailSettingsPart>(GetMetadata);
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
|
||||
private void GetMetadata(GetContentItemMetadataContext context, AuditTrailSiteSettingsPart part) {
|
||||
private void GetMetadata(GetContentItemMetadataContext context, AuditTrailSettingsPart part) {
|
||||
context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Audit Trail")));
|
||||
}
|
||||
|
||||
private void SetupLazyFields(ActivatedContentContext context, AuditTrailSiteSettingsPart part) {
|
||||
private void SetupLazyFields(ActivatedContentContext context, AuditTrailSettingsPart part) {
|
||||
part._eventProviderSettingsField.Loader(() => DeserializeProviderConfiguration(part.Retrieve<string>("Events")));
|
||||
part._eventProviderSettingsField.Setter(value => {
|
||||
part.Store("Events", SerializeProviderConfiguration(value));
|
@@ -0,0 +1,23 @@
|
||||
using Orchard.AuditTrail.Models;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.ContentManagement.Handlers;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Localization;
|
||||
|
||||
namespace Orchard.AuditTrail.Handlers {
|
||||
[OrchardFeature("Orchard.AuditTrail.Trimming")]
|
||||
public class AuditTrailTrimmingSettingsPartHandler : ContentHandler {
|
||||
|
||||
public AuditTrailTrimmingSettingsPartHandler() {
|
||||
Filters.Add(new ActivatingFilter<AuditTrailTrimmingSettingsPart>("Site"));
|
||||
OnGetContentItemMetadata<AuditTrailSettingsPart>(GetMetadata);
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
|
||||
private void GetMetadata(GetContentItemMetadataContext context, AuditTrailSettingsPart part) {
|
||||
context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Audit Trail")));
|
||||
}
|
||||
}
|
||||
}
|
@@ -22,12 +22,6 @@ namespace Orchard.AuditTrail {
|
||||
.Attachable()
|
||||
.WithDescription("Enables the user to enter a comment about the change when saving a content item."));
|
||||
|
||||
ContentDefinitionManager.AlterPartDefinition("AuditTrailSiteSettingsPart", part => part
|
||||
.Attachable(false)
|
||||
.WithDescription("Stores the audit trail settings."));
|
||||
|
||||
ContentDefinitionManager.AlterTypeDefinition("Site", type => type.WithPart("AuditTrailSiteSettingsPart"));
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,14 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.Core.Common.Utilities;
|
||||
|
||||
namespace Orchard.AuditTrail.Models {
|
||||
public class AuditTrailSettingsPart : ContentPart {
|
||||
internal LazyField<IEnumerable<AuditTrailEventSetting>> _eventProviderSettingsField = new LazyField<IEnumerable<AuditTrailEventSetting>>();
|
||||
|
||||
public IEnumerable<AuditTrailEventSetting> EventSettings {
|
||||
get { return _eventProviderSettingsField.Value; }
|
||||
set { _eventProviderSettingsField.Value = value; }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,27 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.Core.Common.Utilities;
|
||||
|
||||
namespace Orchard.AuditTrail.Models {
|
||||
public class AuditTrailSiteSettingsPart : ContentPart {
|
||||
internal LazyField<IEnumerable<AuditTrailEventSetting>> _eventProviderSettingsField = new LazyField<IEnumerable<AuditTrailEventSetting>>();
|
||||
|
||||
public bool AutoTrim {
|
||||
get { return this.Retrieve(x => x.AutoTrim, defaultValue: false); }
|
||||
set { this.Store(x => x.AutoTrim, value); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Threshold in days.
|
||||
/// </summary>
|
||||
public int AutoTrimThreshold {
|
||||
get { return this.Retrieve(x => x.AutoTrimThreshold, defaultValue: 10); }
|
||||
set { this.Store(x => x.AutoTrimThreshold, value); }
|
||||
}
|
||||
|
||||
public IEnumerable<AuditTrailEventSetting> EventSettings {
|
||||
get { return _eventProviderSettingsField.Value; }
|
||||
set { _eventProviderSettingsField.Value = value; }
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,13 @@
|
||||
using Orchard.ContentManagement;
|
||||
|
||||
namespace Orchard.AuditTrail.Models {
|
||||
public class AuditTrailTrimmingSettingsPart : ContentPart {
|
||||
/// <summary>
|
||||
/// Threshold in days.
|
||||
/// </summary>
|
||||
public int AutoTrimThreshold {
|
||||
get { return this.Retrieve(x => x.AutoTrimThreshold, defaultValue: 10); }
|
||||
set { this.Store(x => x.AutoTrimThreshold, value); }
|
||||
}
|
||||
}
|
||||
}
|
@@ -10,4 +10,9 @@ Features:
|
||||
Name: AuditTrail
|
||||
Description: Provides the core audit trail framework.
|
||||
Category: Security
|
||||
Dependencies: Orchard.Users, Orchard.Roles, Orchard.ContentTypes
|
||||
Dependencies: Orchard.Users, Orchard.Roles, Orchard.ContentTypes
|
||||
Orchard.AuditTrail.Trimming:
|
||||
Name: AuditTrail Trimming
|
||||
Description: A background task that trims the audit trail.
|
||||
Category: Security
|
||||
Dependencies: Orchard.AuditTrail
|
@@ -108,7 +108,7 @@
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-FieldRemoved.SummaryAdmin.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentType-PartSettingsUpdated.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-FieldSettingsUpdated.SummaryAdmin.cshtml" />
|
||||
<Content Include="Views\EditorTemplates\Parts.AuditTrailSiteSettings.cshtml" />
|
||||
<Content Include="Views\EditorTemplates\Parts.AuditTrailTrimmingSettings.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-Created.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-FieldAdded.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-FieldRemoved.cshtml" />
|
||||
@@ -126,6 +126,7 @@
|
||||
<Content Include="Views\AuditTrailEvent-Role-RoleCreated.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-Role-RoleRenamed.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-User.cshtml" />
|
||||
<Content Include="Views\EditorTemplates\Parts.AuditTrailSettings.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\Orchard\Orchard.Framework.csproj">
|
||||
@@ -140,11 +141,14 @@
|
||||
<ItemGroup>
|
||||
<Compile Include="AdminMenu.cs" />
|
||||
<Compile Include="Controllers\AdminController.cs" />
|
||||
<Compile Include="Drivers\AuditTrailSiteSettingsPartDriver.cs" />
|
||||
<Compile Include="Drivers\AuditTrailTrimmingSettingsPartDriver.cs" />
|
||||
<Compile Include="Drivers\AuditTrailSettingsPartDriver.cs" />
|
||||
<Compile Include="Handlers\AuditTrailTrimmingSettingsPartHandler.cs" />
|
||||
<Compile Include="ImportExport\AuditTrailExportStep.cs" />
|
||||
<Compile Include="ImportExport\AuditTrailExportHandler.cs" />
|
||||
<Compile Include="ImportExport\AuditTrailImportHandler.cs" />
|
||||
<Compile Include="Models\AuditTrailEventRecordResult.cs" />
|
||||
<Compile Include="Models\AuditTrailTrimmingSettingsPart.cs" />
|
||||
<Compile Include="Providers\Content\ContentAuditTrailEventShapes.cs" />
|
||||
<Compile Include="Providers\Content\DiffGramAnalyzer.cs" />
|
||||
<Compile Include="Providers\Content\DiffNode.cs" />
|
||||
@@ -152,11 +156,12 @@
|
||||
<Compile Include="Providers\Content\IDiffGramAnalyzer.cs" />
|
||||
<Compile Include="ViewModels\AuditTrailCategorySettingsViewModel.cs" />
|
||||
<Compile Include="ViewModels\AuditTrailEventSettingsViewModel.cs" />
|
||||
<Compile Include="ViewModels\AuditTrailSiteSettingsViewModel.cs" />
|
||||
<Compile Include="ViewModels\AuditTrailTrimmingSettingsViewModel.cs" />
|
||||
<Compile Include="ViewModels\AuditTrailSettingsViewModel.cs" />
|
||||
<Compile Include="Drivers\ContentsDriver.cs" />
|
||||
<Compile Include="Handlers\AuditTrailSiteSettingsPartHandler.cs" />
|
||||
<Compile Include="Handlers\AuditTrailSettingsPartHandler.cs" />
|
||||
<Compile Include="Models\AuditTrailEventSetting.cs" />
|
||||
<Compile Include="Models\AuditTrailSiteSettingsPart.cs" />
|
||||
<Compile Include="Models\AuditTrailSettingsPart.cs" />
|
||||
<Compile Include="Providers\ContentDefinition\ContentDefinitionEventHandler.cs" />
|
||||
<Compile Include="Providers\ContentDefinition\GlobalContentDefinitionEditorEvents.cs" />
|
||||
<Compile Include="Providers\ContentDefinition\ContentPartAuditTrailEventProvider.cs" />
|
||||
|
@@ -2,7 +2,8 @@
|
||||
<Place Parts_AuditTrail_Comment="Content:after.1"
|
||||
Parts_AuditTrail_Link="Content:after.2"
|
||||
Parts_AuditTrail="Content:after.3"
|
||||
Parts_AuditTrailSiteSettings_Edit="Content:0"/>
|
||||
Parts_AuditTrailTrimmingSettings_Edit="Content:0"
|
||||
Parts_AuditTrailSettings_Edit="Content:1"/>
|
||||
|
||||
<Match DisplayType="SummaryAdmin">
|
||||
<Place Parts_Contents_AuditTrail_SummaryAdmin="Actions:7"/>
|
||||
|
@@ -121,7 +121,7 @@ namespace Orchard.AuditTrail.Services {
|
||||
private bool IsEnabled(AuditTrailEventDescriptor eventDescriptor) {
|
||||
var settingsDictionary = _cacheManager.Get("AuditTrail.EventSettings", context => {
|
||||
context.Monitor(_signals.When("AuditTrail.EventSettings"));
|
||||
return _siteService.GetSiteSettings().As<AuditTrailSiteSettingsPart>().EventSettings.ToDictionary(x => x.EventName);
|
||||
return _siteService.GetSiteSettings().As<AuditTrailSettingsPart>().EventSettings.ToDictionary(x => x.EventName);
|
||||
});
|
||||
var setting = settingsDictionary.ContainsKey(eventDescriptor.Event) ? settingsDictionary[eventDescriptor.Event] : default(AuditTrailEventSetting);
|
||||
return setting != null ? setting.IsEnabled : eventDescriptor.IsEnabledByDefault;
|
||||
|
@@ -0,0 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Orchard.AuditTrail.ViewModels {
|
||||
public class AuditTrailSettingsViewModel {
|
||||
public IList<AuditTrailCategorySettingsViewModel> Categories { get; set; }
|
||||
}
|
||||
}
|
@@ -1,10 +0,0 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Orchard.AuditTrail.ViewModels {
|
||||
public class AuditTrailSiteSettingsViewModel {
|
||||
public bool AutoTrim { get; set; }
|
||||
public int AutoTrimThreshold { get; set; }
|
||||
public IList<AuditTrailCategorySettingsViewModel> Categories { get; set; }
|
||||
}
|
||||
}
|
@@ -0,0 +1,5 @@
|
||||
namespace Orchard.AuditTrail.ViewModels {
|
||||
public class AuditTrailTrimmingSettingsViewModel {
|
||||
public int AutoTrimThreshold { get; set; }
|
||||
}
|
||||
}
|
@@ -1,21 +1,8 @@
|
||||
@model Orchard.AuditTrail.ViewModels.AuditTrailSiteSettingsViewModel
|
||||
@model Orchard.AuditTrail.ViewModels.AuditTrailSettingsViewModel
|
||||
@{
|
||||
Style.Include("admin.css");
|
||||
}
|
||||
<div class="audit-trail-site-settings">
|
||||
<fieldset>
|
||||
<legend>@T("Auto Trim Settings")</legend>
|
||||
<div>
|
||||
@Html.CheckBoxFor(m => m.AutoTrim)
|
||||
@Html.LabelFor(m => m.AutoTrim, T("Automatically trim the audit trail for this site").Text, new { @class = "forcheckbox" })
|
||||
<span class="hint">@T("Check this option to automatically trim the audit trail.")</span>
|
||||
</div>
|
||||
<div id="auditTrailAutoTrimthresholdSetting">
|
||||
@Html.LabelFor(m => m.AutoTrimThreshold, T("Auto-trim threshold"))
|
||||
@Html.TextBoxFor(m => m.AutoTrimThreshold, new { @class = "text small" })
|
||||
<span class="hint">@T("Specify the number of days of audit log data to retain.")</span>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>@T("Specify the events to audit")</legend>
|
||||
@{
|
@@ -0,0 +1,9 @@
|
||||
@model Orchard.AuditTrail.ViewModels.AuditTrailTrimmingSettingsViewModel
|
||||
<fieldset>
|
||||
<legend>@T("Auto Trim Settings")</legend>
|
||||
<div id="auditTrailAutoTrimthresholdSetting">
|
||||
@Html.LabelFor(m => m.AutoTrimThreshold, T("Auto-trim threshold"))
|
||||
@Html.TextBoxFor(m => m.AutoTrimThreshold, new { @class = "text small" })
|
||||
<span class="hint">@T("Specify the number of days of audit log data to retain.")</span>
|
||||
</div>
|
||||
</fieldset>
|
Reference in New Issue
Block a user