diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Controllers/AdminController.cs index ef06f48f5..dd2ee5cd4 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Controllers/AdminController.cs @@ -52,8 +52,7 @@ namespace Orchard.AuditTrail.Controllers { var eventDescriptors = eventDescriptorsQuery.ToDictionary(x => x.Event); var recordViewModelsQuery = from record in pageOfData - let descriptor = eventDescriptors.ContainsKey(record.FullEventName) ? eventDescriptors[record.FullEventName] : default(AuditTrailEventDescriptor) - where descriptor != null + let descriptor = eventDescriptors.ContainsKey(record.FullEventName) ? eventDescriptors[record.FullEventName] : AuditTrailEventDescriptor.Basic(record) select new AuditTrailEventSummaryViewModel { Record = record, EventDescriptor = descriptor, @@ -76,7 +75,7 @@ namespace Orchard.AuditTrail.Controllers { return new HttpUnauthorizedResult(); var record = _auditTrailManager.GetRecord(id); - var descriptor = _auditTrailManager.DescribeEvent(record.FullEventName); + var descriptor = _auditTrailManager.DescribeEvent(record); var detailsShape = _displayBuilder.BuildDisplay(record, "Detail"); var viewModel = new AuditTrailDetailsViewModel { Record = record, diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentPartSettingsUpdatedEventShape.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentPartSettingsUpdatedEventShape.cs index 6c147b6ad..2d9a85201 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentPartSettingsUpdatedEventShape.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentPartSettingsUpdatedEventShape.cs @@ -3,8 +3,10 @@ using Orchard.AuditTrail.Helpers; using Orchard.AuditTrail.Shapes; using Orchard.ContentManagement.MetaData.Services; using Orchard.DisplayManagement.Implementation; +using Orchard.Environment.Extensions; namespace Orchard.AuditTrail.Providers.ContentDefinition.Shapes { + [OrchardFeature("Orchard.AuditTrail.ContentDefinition")] public class ContentPartSettingsUpdatedEventShape : AuditTrailEventShapeAlteration { private readonly ISettingsFormatter _settingsFormatter; public ContentPartSettingsUpdatedEventShape(ISettingsFormatter settingsFormatter) { diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeFieldSettingsUpdatedEventShape.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeFieldSettingsUpdatedEventShape.cs index db7a7a9e9..6d2b64dda 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeFieldSettingsUpdatedEventShape.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeFieldSettingsUpdatedEventShape.cs @@ -4,8 +4,10 @@ using Orchard.AuditTrail.Shapes; using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.MetaData.Services; using Orchard.DisplayManagement.Implementation; +using Orchard.Environment.Extensions; namespace Orchard.AuditTrail.Providers.ContentDefinition.Shapes { + [OrchardFeature("Orchard.AuditTrail.ContentDefinition")] public class ContentTypeFieldSettingsUpdatedEventShape : AuditTrailEventShapeAlteration { private readonly ISettingsFormatter _settingsFormatter; public ContentTypeFieldSettingsUpdatedEventShape(ISettingsFormatter settingsFormatter) { diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypePartSettingsUpdatedEventShape.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypePartSettingsUpdatedEventShape.cs index 7240b21a5..abf4e0911 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypePartSettingsUpdatedEventShape.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypePartSettingsUpdatedEventShape.cs @@ -3,8 +3,10 @@ using Orchard.AuditTrail.Helpers; using Orchard.AuditTrail.Shapes; using Orchard.ContentManagement.MetaData.Services; using Orchard.DisplayManagement.Implementation; +using Orchard.Environment.Extensions; namespace Orchard.AuditTrail.Providers.ContentDefinition.Shapes { + [OrchardFeature("Orchard.AuditTrail.ContentDefinition")] public class ContentTypePartSettingsUpdatedEventShape : AuditTrailEventShapeAlteration { private readonly ISettingsFormatter _settingsFormatter; public ContentTypePartSettingsUpdatedEventShape(ISettingsFormatter settingsFormatter) { diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeSettingsUpdatedEventShape.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeSettingsUpdatedEventShape.cs index 5929e6d8d..07511abad 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeSettingsUpdatedEventShape.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeSettingsUpdatedEventShape.cs @@ -3,8 +3,10 @@ using Orchard.AuditTrail.Helpers; using Orchard.AuditTrail.Shapes; using Orchard.ContentManagement.MetaData.Services; using Orchard.DisplayManagement.Implementation; +using Orchard.Environment.Extensions; namespace Orchard.AuditTrail.Providers.ContentDefinition.Shapes { + [OrchardFeature("Orchard.AuditTrail.ContentDefinition")] public class ContentTypeSettingsUpdatedEventShape : AuditTrailEventShapeAlteration { private readonly ISettingsFormatter _settingsFormatter; public ContentTypeSettingsUpdatedEventShape(ISettingsFormatter settingsFormatter) { diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailEventDisplayBuilder.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailEventDisplayBuilder.cs index 1f71abe3b..6a25cabff 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailEventDisplayBuilder.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailEventDisplayBuilder.cs @@ -18,7 +18,7 @@ namespace Orchard.AuditTrail.Services { public dynamic BuildDisplay(AuditTrailEventRecord record, string displayType) { var eventData = _serializer.Deserialize(record.EventData); - var descriptor = _auditTrailManager.DescribeEvent(record.FullEventName); + var descriptor = _auditTrailManager.DescribeEvent(record); var auditTrailEventShape = New.AuditTrailEvent(Record: record, EventData: eventData, Descriptor: descriptor); var metaData = (ShapeMetadata)auditTrailEventShape.Metadata; metaData.DisplayType = displayType; diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailManager.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailManager.cs index 1c60e7c75..048d50363 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailManager.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailManager.cs @@ -184,6 +184,10 @@ namespace Orchard.AuditTrail.Services { return context; } + public AuditTrailEventDescriptor DescribeEvent(AuditTrailEventRecord record) { + return DescribeEvent(record.FullEventName) ?? AuditTrailEventDescriptor.Basic(record); + } + public AuditTrailEventDescriptor DescribeEvent(string eventName) where T : IAuditTrailEventProvider { var fullyQualifiedEventName = EventNameExtensions.GetFullyQualifiedEventName(eventName); return DescribeEvent(fullyQualifiedEventName); @@ -198,11 +202,7 @@ namespace Orchard.AuditTrail.Services { select e; var eventDescriptors = eventDescriptorQuery.ToArray(); - if (!eventDescriptors.Any()) { - throw new ArgumentException(String.Format("No event named '{0}' exists.", fullyQualifiedEventName), "fullyQualifiedEventName"); - } - - return eventDescriptors.First(); + return eventDescriptors.FirstOrDefault(); } public IEnumerable Trim(TimeSpan retentionPeriod) { diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IAuditTrailManager.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IAuditTrailManager.cs index 47fc2876f..9e06e2da8 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IAuditTrailManager.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IAuditTrailManager.cs @@ -55,6 +55,13 @@ namespace Orchard.AuditTrail.Services { /// DescribeContext DescribeProviders(); + /// + /// Describes a single audit trail event. + /// + /// The audit trail event record for which to find its descriptor. + /// A single audit trail event descriptor. + AuditTrailEventDescriptor DescribeEvent(AuditTrailEventRecord record); + /// /// Describes a single audit trail event. /// diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/AuditTrailEventDescriptor.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/AuditTrailEventDescriptor.cs index 66d8ad697..cdd9115c7 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/AuditTrailEventDescriptor.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/AuditTrailEventDescriptor.cs @@ -1,3 +1,5 @@ +using System.Linq; +using Orchard.AuditTrail.Models; using Orchard.Localization; namespace Orchard.AuditTrail.Services.Models { @@ -8,5 +10,21 @@ namespace Orchard.AuditTrail.Services.Models { public LocalizedString Description { get; set; } public bool IsEnabledByDefault { get; set; } public bool IsMandatory { get; set; } + + /// + /// Returns a basic descriptor based on an event record. + /// This is useful in cases where event records were previously stored by providers that are no longer enabled. + /// + public static AuditTrailEventDescriptor Basic(AuditTrailEventRecord record) { + return new AuditTrailEventDescriptor { + CategoryDescriptor = new AuditTrailCategoryDescriptor { + Category = record.Category, + Events = Enumerable.Empty(), + Name = new LocalizedString(record.Category) + }, + Event = record.EventName, + Name = new LocalizedString(record.EventName) + }; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-FieldSettingsUpdated.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-FieldSettingsUpdated.SummaryAdmin.cshtml index c4d82b0f8..a9d9eaa8b 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-FieldSettingsUpdated.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-FieldSettingsUpdated.SummaryAdmin.cshtml @@ -9,7 +9,7 @@ var contentFieldName = eventData.Get("ContentFieldName"); var oldDisplayName = (string)Model.OldDisplayName; var newDisplayName = (string)Model.NewDisplayName; - var diff = (DiffDictionary)Model.Diff; + var diff = (DiffDictionary)Model.Diff ?? new DiffDictionary(); }
@T("Settings for the field {0} attached to the {1} content part were updated:", contentFieldName, Html.ContentPartEditLink(contentPartName)) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-FieldSettingsUpdated.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-FieldSettingsUpdated.cshtml index 1fc630501..21096ce83 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-FieldSettingsUpdated.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-FieldSettingsUpdated.cshtml @@ -9,7 +9,7 @@ var contentFieldName = eventData.Get("ContentFieldName"); var oldDisplayName = (string)Model.OldDisplayName; var newDisplayName = (string)Model.NewDisplayName; - var diff = (DiffDictionary)Model.Diff; + var diff = (DiffDictionary)Model.Diff ?? new DiffDictionary(); }
@T("Settings for the field {0} attached to the {1} content part were updated:", contentFieldName, Html.ContentPartEditLink(contentPartName)) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.SummaryAdmin.cshtml index 3860fdefe..d8dbc4483 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.SummaryAdmin.cshtml @@ -6,7 +6,7 @@ @{ var eventData = (IDictionary)Model.EventData; var contentPartName = eventData.Get("ContentPartName"); - var diff = (DiffDictionary)Model.Diff; + var diff = (DiffDictionary)Model.Diff ?? new DiffDictionary(); }
@T("Settings for the content part {0} were changed:", Html.ContentPartEditLink(contentPartName)) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml index a3cceb3eb..fd078d743 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml @@ -6,7 +6,7 @@ @{ var eventData = (IDictionary)Model.EventData; var contentPartName = eventData.Get("ContentPartName"); - var diff = (DiffDictionary)Model.Diff; + var diff = (DiffDictionary)Model.Diff ?? new DiffDictionary(); }
@T("Settings for the content part {0} were changed:", Html.ContentPartEditLink(contentPartName)) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml index 59e4a9f17..f9093230e 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml @@ -7,7 +7,7 @@ var eventData = (IDictionary) Model.EventData; var contentTypeName = eventData.Get("ContentTypeName"); var contentPartName = eventData.Get("ContentPartName"); - var diff = (DiffDictionary)Model.Diff; + var diff = (DiffDictionary)Model.Diff ?? new DiffDictionary(); }
@T("Settings for the content part {0} attached to the content type {1} were changed:", Html.ContentPartEditLink(contentPartName), Html.ContentTypeEditLink(contentTypeName)) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.SummaryAdmin.cshtml index 4ec9f7610..d82183750 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.SummaryAdmin.cshtml @@ -6,7 +6,7 @@ @{ var eventData = (IDictionary) Model.EventData; var contentTypeName = eventData.Get("ContentTypeName"); - var diff = (DiffDictionary) Model.Diff; + var diff = (DiffDictionary) Model.Diff ?? new DiffDictionary(); }
@T("Settings for the content type {0} were changed:", Html.ContentTypeEditLink(contentTypeName)) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml index 603249d2d..6664880b4 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml @@ -6,7 +6,7 @@ @{ var eventData = (IDictionary) Model.EventData; var contentTypeName = eventData.Get("ContentTypeName"); - var diff = (DiffDictionary) Model.Diff; + var diff = (DiffDictionary) Model.Diff ?? new DiffDictionary(); }
@T("Settings for the content type {0} were changed:", Html.ContentTypeEditLink(contentTypeName))