From 8555f1ae4096ce7a5339400af3910c80240f92b0 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 7 Aug 2014 02:47:26 -0700 Subject: [PATCH] Implementing "Imported" audit trail event for content items and types. --- .../Helpers/EventDataExtensions.cs | 15 ++++ .../Helpers/SettingsDictionaryExtensions.cs | 16 +++- .../Orchard.AuditTrail.csproj | 14 ++- .../Content/ContentAuditTrailEventProvider.cs | 6 +- .../Content/ContentAuditTrailEventShapes.cs | 23 +---- .../Providers/Content/GlobalContentHandler.cs | 15 ++++ .../ContentDefinitionEventHandler.cs | 90 +++++++++++++++++-- .../ContentPartAuditTrailEventProvider.cs | 2 + .../ContentTypeAuditTrailEventProvider.cs | 2 + .../GlobalContentDefinitionEditorEvents.cs | 10 +-- .../Shapes/ContentPartImportedEventShape.cs | 36 ++++++++ .../Shapes/ContentTypeImportedEventShape.cs | 36 ++++++++ .../Content => Services}/DiffGramAnalyzer.cs | 6 +- .../Content => Services}/IDiffGramAnalyzer.cs | 3 +- .../Content => Services/Models}/DiffNode.cs | 2 +- .../Content => Services/Models}/DiffType.cs | 2 +- .../audittrail-contentdefinition-event.css | 12 ++- .../Views/AuditTrailEvent-Content.cshtml | 1 + ...t-ContentPart-Imported.SummaryAdmin.cshtml | 10 +++ ...uditTrailEvent-ContentPart-Imported.cshtml | 53 +++++++++++ ...t-ContentType-Imported.SummaryAdmin.cshtml | 10 +++ ...uditTrailEvent-ContentType-Imported.cshtml | 53 +++++++++++ .../Modules/Orchard.AuditTrail/Web.config | 69 +++++++------- .../Events/ContentPartImportedContext.cs | 3 + .../Events/ContentPartImportingContext.cs | 5 ++ .../Events/ContentTypeImportedContext.cs | 3 + .../Events/ContentTypeImportingContext.cs | 5 ++ .../Events/IContentDefinitionEventHandler.cs | 4 + .../Orchard.ContentTypes.csproj | 4 + .../Handlers/ContainerPartHandler.cs | 2 +- .../Orchard.Recipes/Orchard.Recipes.csproj | 4 + .../RecipeHandlers/MetaDataRecipeHandler.cs | 15 +++- 32 files changed, 451 insertions(+), 80 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentPartImportedEventShape.cs create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeImportedEventShape.cs rename src/Orchard.Web/Modules/Orchard.AuditTrail/{Providers/Content => Services}/DiffGramAnalyzer.cs (97%) rename src/Orchard.Web/Modules/Orchard.AuditTrail/{Providers/Content => Services}/IDiffGramAnalyzer.cs (89%) rename src/Orchard.Web/Modules/Orchard.AuditTrail/{Providers/Content => Services/Models}/DiffNode.cs (81%) rename src/Orchard.Web/Modules/Orchard.AuditTrail/{Providers/Content => Services/Models}/DiffType.cs (56%) create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-Imported.SummaryAdmin.cshtml create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-Imported.cshtml create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-Imported.SummaryAdmin.cshtml create mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-Imported.cshtml create mode 100644 src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentPartImportedContext.cs create mode 100644 src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentPartImportingContext.cs create mode 100644 src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentTypeImportedContext.cs create mode 100644 src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentTypeImportingContext.cs diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataExtensions.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataExtensions.cs index 27c66302b..ad9f722c5 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataExtensions.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Xml.Linq; namespace Orchard.AuditTrail.Helpers { public static class EventDataExtensions { @@ -11,5 +12,19 @@ namespace Orchard.AuditTrail.Helpers { return (T) Convert.ChangeType(value, typeof (T)); } + + public static XElement GetXml(this 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/Helpers/SettingsDictionaryExtensions.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/SettingsDictionaryExtensions.cs index def7a168f..098c068e8 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/SettingsDictionaryExtensions.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/SettingsDictionaryExtensions.cs @@ -1,5 +1,8 @@ -using Orchard.AuditTrail.Services.Models; +using System; +using System.Xml.Linq; +using Orchard.AuditTrail.Services.Models; using Orchard.ContentManagement.MetaData.Models; +using Orchard.ContentManagement.MetaData.Services; namespace Orchard.AuditTrail.Helpers { public static class SettingsDictionaryExtensions { @@ -17,6 +20,17 @@ namespace Orchard.AuditTrail.Helpers { return dictionary; } + public static bool IsEqualTo(this SettingsDictionary a, SettingsDictionary b, ISettingsFormatter settingsFormatter) { + var xml1 = ToXml(a, settingsFormatter); + var xml2 = ToXml(b, settingsFormatter); + + return String.Equals(xml1, xml2, StringComparison.OrdinalIgnoreCase); + } + + public static string ToXml(this SettingsDictionary settings, ISettingsFormatter settingsFormatter) { + return settingsFormatter.Map(settings).ToString(SaveOptions.DisableFormatting); + } + private static void BuildDiff(DiffDictionary dictionary, SettingsDictionary settingsA, SettingsDictionary settingsB) { foreach (var settingA in settingsA) { diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj index 0d8dd7d4b..7a84b16c0 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj @@ -142,6 +142,10 @@ + + + + @@ -193,6 +197,8 @@ + + @@ -200,11 +206,11 @@ - - - + + + - + diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/ContentAuditTrailEventProvider.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/ContentAuditTrailEventProvider.cs index a199d3390..8da739190 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/ContentAuditTrailEventProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/ContentAuditTrailEventProvider.cs @@ -17,6 +17,8 @@ namespace Orchard.AuditTrail.Providers.Content { public const string Published = "Published"; public const string Unpublished = "Unpublished"; public const string Removed = "Removed"; + public const string Imported = "Imported"; + public const string Exported = "Exported"; public static Filters CreateFilters(int contentId, IUpdateModel updateModel) { return new Filters(updateModel) { @@ -30,7 +32,9 @@ namespace Orchard.AuditTrail.Providers.Content { .Event(this, Saved, T("Saved"), T("A content item was saved."), enableByDefault: true) .Event(this, Published, T("Published"), T("A content item was published."), enableByDefault: true) .Event(this, Unpublished, T("Unpublished"), T("A content item was unpublished."), enableByDefault: true) - .Event(this, Removed, T("Removed"), T("A content item was deleted."), enableByDefault: true); + .Event(this, Removed, T("Removed"), T("A content item was deleted."), enableByDefault: true) + .Event(this, Imported, T("Imported"), T("A content item was imported."), enableByDefault: true) + .Event(this, Exported, T("Exported"), T("A content item was exported."), enableByDefault: false); context.QueryFilter(QueryFilter); context.DisplayFilter(DisplayFilter); 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 dd745b4ba..da7123478 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/ContentAuditTrailEventShapes.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/ContentAuditTrailEventShapes.cs @@ -1,9 +1,8 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Xml.Linq; using Orchard.AuditTrail.Helpers; using Orchard.AuditTrail.Models; +using Orchard.AuditTrail.Services; using Orchard.ContentManagement; using Orchard.DisplayManagement.Descriptors; using Orchard.Environment; @@ -28,8 +27,8 @@ 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 previousVersionXml = eventData.GetXml("PreviousVersionXml"); + var diffGram = eventData.GetXml("DiffGram"); var contentItem = _contentManager.Value.Get(contentItemId, VersionOptions.AllVersions); var previousVersion = previousContentItemVersionId > 0 ? _contentManager.Value.Get(contentItemId, VersionOptions.VersionRecord(previousContentItemVersionId)) : default(ContentItem); @@ -43,19 +42,5 @@ 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 8ecf9345d..0c1ab71e6 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/GlobalContentHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/GlobalContentHandler.cs @@ -15,6 +15,7 @@ namespace Orchard.AuditTrail.Providers.Content { private XElement _previousVersionXml; private readonly IDiffGramAnalyzer _analyzer; private bool _contentItemCreated = false; + private ContentItem _ignoreExportHandlerFor; public GlobalContentHandler(IAuditTrailManager auditTrailManager, IWorkContextAccessor wca, IContentManager contentManager, IDiffGramAnalyzer analyzer) { _auditTrailManager = auditTrailManager; @@ -44,7 +45,10 @@ namespace Orchard.AuditTrail.Providers.Content { RecordAuditTrailEvent(ContentAuditTrailEventProvider.Created, context.ContentItem); } else { + _ignoreExportHandlerFor = contentItem; var newVersionXml = _contentManager.Export(contentItem); + _ignoreExportHandlerFor = null; + var diffGram = _analyzer.GenerateDiffGram(_previousVersionXml, newVersionXml); RecordAuditTrailEvent(ContentAuditTrailEventProvider.Saved, context.ContentItem, diffGram: diffGram, previousVersionXml: _previousVersionXml); } @@ -63,6 +67,17 @@ namespace Orchard.AuditTrail.Providers.Content { RecordAuditTrailEvent(ContentAuditTrailEventProvider.Removed, context.ContentItem); } + protected override void Imported(ImportContentContext context) { + RecordAuditTrailEvent(ContentAuditTrailEventProvider.Imported, context.ContentItem); + } + + protected override void Exported(ExportContentContext context) { + if (context.ContentItem == _ignoreExportHandlerFor) + return; + + RecordAuditTrailEvent(ContentAuditTrailEventProvider.Exported, context.ContentItem); + } + private void RecordAuditTrailEvent(string eventName, IContent content, ContentItemVersionRecord previousContentItemVersion = null, XElement diffGram = null, XElement previousVersionXml = null) { var blackList = new[] {"Site"}; diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentDefinitionEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentDefinitionEventHandler.cs index 69bb809a4..fbc24249c 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentDefinitionEventHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentDefinitionEventHandler.cs @@ -1,18 +1,34 @@ using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; using Orchard.AuditTrail.Services; +using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentTypes.Events; using Orchard.Environment.Extensions; +using Orchard.ImportExport.Services; namespace Orchard.AuditTrail.Providers.ContentDefinition { [OrchardFeature("Orchard.AuditTrail.ContentDefinition")] public class ContentDefinitionEventHandler : IContentDefinitionEventHandler { private readonly IAuditTrailManager _auditTrailManager; private readonly IWorkContextAccessor _wca; + private readonly IImportExportService _importExportService; + private readonly IContentDefinitionWriter _contentDefinitionWriter; + private XElement _previousContentTypeXml; + private XElement _previousContentPartXml; + private readonly IDiffGramAnalyzer _analyzer; + + public ContentDefinitionEventHandler( + IAuditTrailManager auditTrailManager, + IWorkContextAccessor wca, + IContentDefinitionWriter contentDefinitionWriter, + IDiffGramAnalyzer analyzer) { - public ContentDefinitionEventHandler(IAuditTrailManager auditTrailManager, IWorkContextAccessor wca) { _auditTrailManager = auditTrailManager; _wca = wca; + _contentDefinitionWriter = contentDefinitionWriter; + _analyzer = analyzer; } public void ContentTypeCreated(ContentTypeCreatedContext context) { @@ -23,6 +39,15 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { RecordContentTypeAuditTrailEvent(ContentTypeAuditTrailEventProvider.Removed, context.ContentTypeDefinition); } + public void ContentTypeImporting(ContentTypeImportingContext context) { + _previousContentTypeXml = context.ContentTypeDefinition != null ? _contentDefinitionWriter.Export(context.ContentTypeDefinition) : default(XElement); + } + + public void ContentTypeImported(ContentTypeImportedContext context) { + var newContentTypeXml = _contentDefinitionWriter.Export(context.ContentTypeDefinition); + RecordContentTypeAuditTrailEvent(ContentTypeAuditTrailEventProvider.Imported, context.ContentTypeDefinition, _previousContentTypeXml, newContentTypeXml); + } + public void ContentPartCreated(ContentPartCreatedContext context) { RecordContentPartAuditTrailEvent(ContentPartAuditTrailEventProvider.Created, context.ContentPartDefinition); } @@ -39,6 +64,15 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { RecordContentTypePartAuditTrailEvent(ContentTypeAuditTrailEventProvider.PartRemoved, context.ContentTypeName, context.ContentPartName); } + public void ContentPartImporting(ContentPartImportingContext context) { + _previousContentPartXml = context.ContentPartDefinition != null ? _contentDefinitionWriter.Export(context.ContentPartDefinition) : default(XElement); + } + + public void ContentPartImported(ContentPartImportedContext context) { + var newContentPartXml = _contentDefinitionWriter.Export(context.ContentPartDefinition); + RecordContentPartAuditTrailEvent(ContentPartAuditTrailEventProvider.Imported, context.ContentPartDefinition, _previousContentPartXml, newContentPartXml); + } + public void ContentFieldAttached(ContentFieldAttachedContext context) { var eventData = new Dictionary { {"ContentPartName", context.ContentPartName}, @@ -57,19 +91,65 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { _auditTrailManager.CreateRecord(ContentPartAuditTrailEventProvider.FieldRemoved, _wca.GetContext().CurrentUser, properties: null, eventData: eventData, eventFilterKey: "contentpart", eventFilterData: context.ContentPartName); } - private void RecordContentTypeAuditTrailEvent(string eventName, ContentTypeDefinition contentTypeDefinition) { + private void RecordContentTypeAuditTrailEvent(string eventName, ContentTypeDefinition contentTypeDefinition, XElement previousContentTypeXml = null, XElement newContentTypeXml = null) { + var record = true; var eventData = new Dictionary { {"ContentTypeName", contentTypeDefinition.Name}, {"ContentTypeDisplayName", contentTypeDefinition.DisplayName}, }; - _auditTrailManager.CreateRecord(eventName, _wca.GetContext().CurrentUser, properties: null, eventData: eventData, eventFilterKey: "contenttype", eventFilterData: contentTypeDefinition.Name); + + if (previousContentTypeXml != null || newContentTypeXml != null) { + var previousXml = previousContentTypeXml != null ? previousContentTypeXml.ToString(SaveOptions.DisableFormatting) : default(string); + var newXml = newContentTypeXml != null ? newContentTypeXml.ToString(SaveOptions.DisableFormatting) : default(string); + + if (previousXml != null) { + if (previousXml != newXml) { + var diffGram = _analyzer.GenerateDiffGram(previousContentTypeXml, newContentTypeXml); + eventData["PreviousDefinition"] = previousXml; + eventData["NewDefinition"] = newXml; + eventData["DiffGram"] = diffGram.ToString(SaveOptions.DisableFormatting); + } + else { + record = false; + } + } + else { + eventData["NewDefinition"] = newXml; + } + } + + if (record) + _auditTrailManager.CreateRecord(eventName, _wca.GetContext().CurrentUser, properties: null, eventData: eventData, eventFilterKey: "contenttype", eventFilterData: contentTypeDefinition.Name); } - private void RecordContentPartAuditTrailEvent(string eventName, ContentPartDefinition contentPartDefinition) { + private void RecordContentPartAuditTrailEvent(string eventName, ContentPartDefinition contentPartDefinition, XElement previousContentPartXml = null, XElement newContentPartXml = null) { + var record = true; var eventData = new Dictionary { {"ContentPartName", contentPartDefinition.Name} }; - _auditTrailManager.CreateRecord(eventName, _wca.GetContext().CurrentUser, properties: null, eventData: eventData, eventFilterKey: "contentpart", eventFilterData: contentPartDefinition.Name); + + if (previousContentPartXml != null || newContentPartXml != null) { + var previousXml = previousContentPartXml != null ?previousContentPartXml.ToString(SaveOptions.DisableFormatting) : default(string); + var newXml = newContentPartXml != null ? newContentPartXml.ToString(SaveOptions.DisableFormatting) : default(string); + + if (previousXml != null) { + if (previousXml != newXml) { + var diffGram = _analyzer.GenerateDiffGram(previousContentPartXml, newContentPartXml); + eventData["PreviousDefinition"] = previousXml; + eventData["NewDefinition"] = newXml; + eventData["DiffGram"] = diffGram.ToString(SaveOptions.DisableFormatting); + } + else { + record = false; + } + } + else { + eventData["NewDefinition"] = newXml; + } + } + + if (record) + _auditTrailManager.CreateRecord(eventName, _wca.GetContext().CurrentUser, properties: null, eventData: eventData, eventFilterKey: "contentpart", eventFilterData: contentPartDefinition.Name); } private void RecordContentTypePartAuditTrailEvent(string eventName, string contentTypeName, string contentPartName) { diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentPartAuditTrailEventProvider.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentPartAuditTrailEventProvider.cs index de375450d..3d101bca5 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentPartAuditTrailEventProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentPartAuditTrailEventProvider.cs @@ -7,6 +7,7 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { public class ContentPartAuditTrailEventProvider : AuditTrailEventProviderBase { public const string Created = "Created"; public const string Removed = "Removed"; + public const string Imported = "Imported"; public const string DescriptionChanged = "DescriptionChanged"; public const string FieldAdded = "FieldAdded"; public const string FieldRemoved = "FieldRemoved"; @@ -17,6 +18,7 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { context.For("ContentPart", T("Content Parts")) .Event(this, Created, T("Created"), T("A content part was created."), enableByDefault: true) .Event(this, Removed, T("Removed"), T("A content part was removed."), enableByDefault: true) + .Event(this, Imported, T("Imported"), T("A content part was imported."), enableByDefault: true) .Event(this, DescriptionChanged, T("Description changed"), T("A content part description was changed."), enableByDefault: true) .Event(this, FieldAdded, T("Field added"), T("A field was added to a content part."), enableByDefault: true) .Event(this, FieldRemoved, T("Field removed"), T("A field was removed from a content part."), enableByDefault: true) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentTypeAuditTrailEventProvider.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentTypeAuditTrailEventProvider.cs index 14f47b509..263587495 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentTypeAuditTrailEventProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentTypeAuditTrailEventProvider.cs @@ -17,6 +17,7 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { public const string Created = "Created"; public const string Removed = "Removed"; + public const string Imported = "Imported"; public const string PartAdded = "PartAdded"; public const string PartRemoved = "PartRemoved"; public const string TypeDisplayNameUpdated = "TypeDisplayNameUpdated"; @@ -28,6 +29,7 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { context.For("ContentType", T("Content Type")) .Event(this, Created, T("Created"), T("A content type was created."), enableByDefault: true) .Event(this, Removed, T("Removed"), T("A content type was removed."), enableByDefault: true) + .Event(this, Imported, T("Imported"), T("A content type was imported."), enableByDefault: true) .Event(this, PartAdded, T("Part added"), T("A content part was added to a content type."), enableByDefault: true) .Event(this, PartRemoved, T("Part removed"), T("A content part was removed from a content type."), enableByDefault: true) .Event(this, TypeDisplayNameUpdated, T("Type display name updated"), T("The display name of a content type was updated."), enableByDefault: true) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/GlobalContentDefinitionEditorEvents.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/GlobalContentDefinitionEditorEvents.cs index cacd0e0bc..52fe62751 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/GlobalContentDefinitionEditorEvents.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/GlobalContentDefinitionEditorEvents.cs @@ -9,7 +9,6 @@ using Orchard.ContentManagement.MetaData.Builders; using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.MetaData.Services; using Orchard.ContentTypes.Services; -using Orchard.ContentTypes.ViewModels; using Orchard.Environment.Extensions; namespace Orchard.AuditTrail.Providers.ContentDefinition { @@ -21,7 +20,6 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { private readonly IContentDefinitionService _contentDefinitionService; private readonly ISettingsFormatter _settingsFormatter; private string _oldContentTypeDisplayName; - private EditTypeViewModel _currentContentType; private SettingsDictionary _oldContentTypeSettings; private SettingsDictionary _oldContentTypePartSettings; private SettingsDictionary _oldContentPartFieldSettings; @@ -41,7 +39,6 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { public override void TypeEditorUpdating(ContentTypeDefinitionBuilder definition) { var contentType = _contentDefinitionService.GetType(definition.Name); - _currentContentType = contentType; _oldContentTypeDisplayName = contentType.DisplayName; _oldContentTypeSettings = new SettingsDictionary(contentType.Settings); } @@ -157,14 +154,11 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { } private string ToXml(SettingsDictionary settings) { - return _settingsFormatter.Map(settings).ToString(SaveOptions.DisableFormatting); + return settings.ToXml(_settingsFormatter); } private bool AreEqual(SettingsDictionary a, SettingsDictionary b) { - var xml1 = ToXml(a); - var xml2 = ToXml(b); - - return String.Equals(xml1, xml2, StringComparison.OrdinalIgnoreCase); + return a.IsEqualTo(b, _settingsFormatter); } } } diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentPartImportedEventShape.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentPartImportedEventShape.cs new file mode 100644 index 000000000..f38faaede --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentPartImportedEventShape.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using System.Linq; +using Orchard.AuditTrail.Helpers; +using Orchard.AuditTrail.Services; +using Orchard.AuditTrail.Shapes; +using Orchard.DisplayManagement.Implementation; +using Orchard.Environment.Extensions; + +namespace Orchard.AuditTrail.Providers.ContentDefinition.Shapes { + [OrchardFeature("Orchard.AuditTrail.ContentDefinition")] + public class ContentPartImportedEventShape : AuditTrailEventShapeAlteration { + private readonly IDiffGramAnalyzer _analyzer; + + public ContentPartImportedEventShape(IDiffGramAnalyzer analyzer) { + _analyzer = analyzer; + } + + protected override string EventName { + get { return ContentPartAuditTrailEventProvider.Imported; } + } + + protected override void OnAlterShape(ShapeDisplayingContext context) { + var eventData = (IDictionary)context.Shape.EventData; + var previousDefinitionXml = eventData.GetXml("PreviousDefinition"); + var newDefinitionXml = eventData.GetXml("NewDefinition"); + var diffGram = eventData.GetXml("DiffGram"); + + context.Shape.NewDefinitionXml = newDefinitionXml; + + if (diffGram != null) { + var diffNodes = _analyzer.Analyze(previousDefinitionXml, diffGram).ToArray(); + context.Shape.DiffNodes = diffNodes; + } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeImportedEventShape.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeImportedEventShape.cs new file mode 100644 index 000000000..ff52fbde7 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/Shapes/ContentTypeImportedEventShape.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using System.Linq; +using Orchard.AuditTrail.Helpers; +using Orchard.AuditTrail.Services; +using Orchard.AuditTrail.Shapes; +using Orchard.DisplayManagement.Implementation; +using Orchard.Environment.Extensions; + +namespace Orchard.AuditTrail.Providers.ContentDefinition.Shapes { + [OrchardFeature("Orchard.AuditTrail.ContentDefinition")] + public class ContentTypeImportedEventShape : AuditTrailEventShapeAlteration { + private readonly IDiffGramAnalyzer _analyzer; + + public ContentTypeImportedEventShape(IDiffGramAnalyzer analyzer) { + _analyzer = analyzer; + } + + protected override string EventName { + get { return ContentTypeAuditTrailEventProvider.Imported; } + } + + protected override void OnAlterShape(ShapeDisplayingContext context) { + var eventData = (IDictionary)context.Shape.EventData; + var previousDefinitionXml = eventData.GetXml("PreviousDefinition"); + var newDefinitionXml = eventData.GetXml("NewDefinition"); + var diffGram = eventData.GetXml("DiffGram"); + + context.Shape.NewDefinitionXml = newDefinitionXml; + + if (diffGram != null) { + var diffNodes = _analyzer.Analyze(previousDefinitionXml, diffGram).ToArray(); + context.Shape.DiffNodes = diffNodes; + } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffGramAnalyzer.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/DiffGramAnalyzer.cs similarity index 97% rename from src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffGramAnalyzer.cs rename to src/Orchard.Web/Modules/Orchard.AuditTrail/Services/DiffGramAnalyzer.cs index 570362a2b..42c51c62e 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffGramAnalyzer.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/DiffGramAnalyzer.cs @@ -4,8 +4,9 @@ using System.Linq; using System.Xml; using System.Xml.Linq; using Microsoft.XmlDiffPatch; +using Orchard.AuditTrail.Services.Models; -namespace Orchard.AuditTrail.Providers.Content { +namespace Orchard.AuditTrail.Services { public class DiffGramAnalyzer : IDiffGramAnalyzer { public XElement GenerateDiffGram(XElement element1, XElement element2) { using (var node1Reader = element1.CreateReader()) @@ -95,7 +96,8 @@ namespace Orchard.AuditTrail.Providers.Content { } break; case XmlNodeType.EndElement: - stack.Pop(); + if(stack.Any()) + stack.Pop(); break; } if (readNext) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/IDiffGramAnalyzer.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IDiffGramAnalyzer.cs similarity index 89% rename from src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/IDiffGramAnalyzer.cs rename to src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IDiffGramAnalyzer.cs index 82631d36c..e720215d1 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/IDiffGramAnalyzer.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/IDiffGramAnalyzer.cs @@ -1,7 +1,8 @@ using System.Collections.Generic; using System.Xml.Linq; +using Orchard.AuditTrail.Services.Models; -namespace Orchard.AuditTrail.Providers.Content { +namespace Orchard.AuditTrail.Services { public interface IDiffGramAnalyzer : IDependency { /// /// Compares the specified XML elements and returns a DiffGram XML element. diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffNode.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/DiffNode.cs similarity index 81% rename from src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffNode.cs rename to src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/DiffNode.cs index 52369de66..039d81b04 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffNode.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/DiffNode.cs @@ -1,4 +1,4 @@ -namespace Orchard.AuditTrail.Providers.Content { +namespace Orchard.AuditTrail.Services.Models { public class DiffNode { public DiffType Type { get; set; } public string Context { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffType.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/DiffType.cs similarity index 56% rename from src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffType.cs rename to src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/DiffType.cs index 53eb53105..9631f7928 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffType.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/DiffType.cs @@ -1,4 +1,4 @@ -namespace Orchard.AuditTrail.Providers.Content { +namespace Orchard.AuditTrail.Services.Models { public enum DiffType { Change, Addition diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Styles/audittrail-contentdefinition-event.css b/src/Orchard.Web/Modules/Orchard.AuditTrail/Styles/audittrail-contentdefinition-event.css index cd0d719ff..aba1d3eae 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Styles/audittrail-contentdefinition-event.css +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Styles/audittrail-contentdefinition-event.css @@ -1,4 +1,14 @@ -section.audittrail-contenttype-eventsummary table.items, +section.audittrail-contenttype-eventsummary, +section.audittrail-contentpart-eventsummary { + margin-bottom: 1em; +} + +section.audittrail-contenttype-eventsummary p.code, +section.audittrail-contentpart-eventsummary p.code { + font-family: Consolas; +} + +section.audittrail-contenttype-eventsummary table.items, section.audittrail-contentpart-eventsummary table.items { width: auto; min-width: 600px; 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 ec195a703..522190362 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.cshtml @@ -1,6 +1,7 @@ @using Orchard.AuditTrail.Helpers @using Orchard.AuditTrail.Models @using Orchard.AuditTrail.Providers.Content +@using Orchard.AuditTrail.Services.Models @using Orchard.ContentManagement @{ Style.Include("audittrail-content-event.css"); diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-Imported.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-Imported.SummaryAdmin.cshtml new file mode 100644 index 000000000..46000a18f --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-Imported.SummaryAdmin.cshtml @@ -0,0 +1,10 @@ +@using Orchard.AuditTrail.Helpers +@using Orchard.AuditTrail.Services.Models +@{ + var eventData = (IDictionary) Model.EventData; + var contentPartName = eventData.Get("ContentPartName"); + var diffNodes = (IList)Model.DiffNodes; +} +
+ @T(diffNodes != null ? "The content part {0} was altered during an import." : "The content part {0} was added during an import.", Html.ContentPartEditLink(contentPartName)) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-Imported.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-Imported.cshtml new file mode 100644 index 000000000..5a0d7d565 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-Imported.cshtml @@ -0,0 +1,53 @@ +@using System.Xml.Linq +@using Orchard.AuditTrail.Helpers +@using Orchard.AuditTrail.Services.Models +@{ + Style.Include("audittrail-contentdefinition-event.css"); +} +@{ + var eventData = (IDictionary) Model.EventData; + var contentPartName = eventData.Get("ContentPartName"); + var diffNodes = (IList)Model.DiffNodes; + var newDefinitionXml = (XElement)Model.NewDefinitionXml; +} +
+ @T(diffNodes != null ? "The content part {0} was altered during an import." : "The content part {0} was added during an import.", Html.ContentPartEditLink(contentPartName)) +
+ +@if (diffNodes != null) { +
+ + + + + + + + + + + + @if (!diffNodes.Any()) { + + + + } + else { + foreach (var node in diffNodes) { + + + + + + + } + } + +
@T("Action")@T("Context")@T("Before")@T("After")
@T("")
@T(node.Type.ToString())@node.Context@node.Previous.OrIfEmpty(T("[Empty]"))@node.Current.OrIfEmpty(T("[Empty]"))
+
+} +else { +

+ @Html.Raw(Html.Encode(newDefinitionXml.ToString(SaveOptions.None)).Replace("\r\n", "
")) +

+} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-Imported.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-Imported.SummaryAdmin.cshtml new file mode 100644 index 000000000..9a93dc822 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-Imported.SummaryAdmin.cshtml @@ -0,0 +1,10 @@ +@using Orchard.AuditTrail.Helpers +@using Orchard.AuditTrail.Services.Models +@{ + var eventData = (IDictionary) Model.EventData; + var contentTypeName = eventData.Get("ContentTypeName"); + var diffNodes = (IList)Model.DiffNodes; +} +
+ @T(diffNodes != null ? "The content type {0} was altered during an import." : "The content type {0} was added during an import.", Html.ContentTypeEditLink(contentTypeName)) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-Imported.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-Imported.cshtml new file mode 100644 index 000000000..06c191b3d --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-Imported.cshtml @@ -0,0 +1,53 @@ +@using System.Xml.Linq +@using Orchard.AuditTrail.Helpers +@using Orchard.AuditTrail.Services.Models +@{ + Style.Include("audittrail-contentdefinition-event.css"); +} +@{ + var eventData = (IDictionary) Model.EventData; + var contentTypeName = eventData.Get("ContentTypeName"); + var diffNodes = (IList)Model.DiffNodes; + var newDefinitionXml = (XElement) Model.NewDefinitionXml; +} +
+ @T(diffNodes != null ? "The content type {0} was altered during an import." : "The content type {0} was added during an import.", Html.ContentTypeEditLink(contentTypeName)) +
+ +@if (diffNodes != null) { +
+ + + + + + + + + + + + @if (!diffNodes.Any()) { + + + + } + else { + foreach (var node in diffNodes) { + + + + + + + } + } + +
@T("Action")@T("Context")@T("Before")@T("After")
@T("")
@T(node.Type.ToString())@node.Context@node.Previous.OrIfEmpty(T("[Empty]"))@node.Current.OrIfEmpty(T("[Empty]"))
+
+} +else { +

+ @Html.Raw(Html.Encode(newDefinitionXml.ToString(SaveOptions.None)).Replace("\r\n", "
")) +

+} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Web.config b/src/Orchard.Web/Modules/Orchard.AuditTrail/Web.config index 19b511cda..3e6819a42 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Web.config +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Web.config @@ -1,41 +1,42 @@ - - - - -
-
- - + + + + +
+
+ + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentPartImportedContext.cs b/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentPartImportedContext.cs new file mode 100644 index 000000000..e92d90db5 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentPartImportedContext.cs @@ -0,0 +1,3 @@ +namespace Orchard.ContentTypes.Events { + public class ContentPartImportedContext : ContentPartContext { } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentPartImportingContext.cs b/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentPartImportingContext.cs new file mode 100644 index 000000000..6abd11384 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentPartImportingContext.cs @@ -0,0 +1,5 @@ +namespace Orchard.ContentTypes.Events { + public class ContentPartImportingContext : ContentPartContext { + public string ContentPartName { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentTypeImportedContext.cs b/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentTypeImportedContext.cs new file mode 100644 index 000000000..1b6d3238b --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentTypeImportedContext.cs @@ -0,0 +1,3 @@ +namespace Orchard.ContentTypes.Events { + public class ContentTypeImportedContext : ContentTypeContext { } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentTypeImportingContext.cs b/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentTypeImportingContext.cs new file mode 100644 index 000000000..1f968cfc9 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/ContentTypeImportingContext.cs @@ -0,0 +1,5 @@ +namespace Orchard.ContentTypes.Events { + public class ContentTypeImportingContext : ContentTypeContext { + public string ContentTypeName { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/IContentDefinitionEventHandler.cs b/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/IContentDefinitionEventHandler.cs index a528a48ad..020d4326f 100644 --- a/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/IContentDefinitionEventHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Events/IContentDefinitionEventHandler.cs @@ -4,10 +4,14 @@ namespace Orchard.ContentTypes.Events { public interface IContentDefinitionEventHandler : IEventHandler { void ContentTypeCreated(ContentTypeCreatedContext context); void ContentTypeRemoved(ContentTypeRemovedContext context); + void ContentTypeImporting(ContentTypeImportingContext context); + void ContentTypeImported(ContentTypeImportedContext context); void ContentPartCreated(ContentPartCreatedContext context); void ContentPartRemoved(ContentPartRemovedContext context); void ContentPartAttached(ContentPartAttachedContext context); void ContentPartDetached(ContentPartDetachedContext context); + void ContentPartImporting(ContentPartImportingContext context); + void ContentPartImported(ContentPartImportedContext context); void ContentFieldAttached(ContentFieldAttachedContext context); void ContentFieldDetached(ContentFieldDetachedContext context); } diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Orchard.ContentTypes.csproj b/src/Orchard.Web/Modules/Orchard.ContentTypes/Orchard.ContentTypes.csproj index bd2fd29fe..fd247f883 100644 --- a/src/Orchard.Web/Modules/Orchard.ContentTypes/Orchard.ContentTypes.csproj +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Orchard.ContentTypes.csproj @@ -72,9 +72,13 @@ + + + + diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Handlers/ContainerPartHandler.cs b/src/Orchard.Web/Modules/Orchard.Lists/Handlers/ContainerPartHandler.cs index 432d642a8..517843968 100644 --- a/src/Orchard.Web/Modules/Orchard.Lists/Handlers/ContainerPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Lists/Handlers/ContainerPartHandler.cs @@ -11,7 +11,7 @@ namespace Orchard.Lists.Handlers { if (container == null) return; - // containers link to their contents in admin screens + // Containers link to their contents in admin screens. context.Metadata.AdminRouteValues = new RouteValueDictionary { {"Area", "Orchard.Lists"}, {"Controller", "Admin"}, diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj b/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj index 93fb6492e..dde9777da 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj @@ -94,6 +94,10 @@ {2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6} Orchard.Framework + + {0e7646e8-fe8f-43c1-8799-d97860925ec4} + Orchard.ContentTypes + {DFD137A2-DDB5-4D22-BE0D-FA9AD4C8B059} Orchard.Packaging diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/MetaDataRecipeHandler.cs b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/MetaDataRecipeHandler.cs index b40fadb57..a6fe02382 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/MetaDataRecipeHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/MetaDataRecipeHandler.cs @@ -1,6 +1,7 @@ using System; using System.Xml; using Orchard.ContentManagement.MetaData; +using Orchard.ContentTypes.Events; using Orchard.Localization; using Orchard.Logging; using Orchard.Recipes.Models; @@ -10,10 +11,16 @@ namespace Orchard.Recipes.RecipeHandlers { public class MetadataRecipeHandler : IRecipeHandler { private readonly IContentDefinitionManager _contentDefinitionManager; private readonly IContentDefinitionReader _contentDefinitionReader; + private readonly IContentDefinitionEventHandler _contentDefinitonEventHandlers; + + public MetadataRecipeHandler( + IContentDefinitionManager contentDefinitionManager, + IContentDefinitionReader contentDefinitionReader, + IContentDefinitionEventHandler contentDefinitonEventHandlers) { - public MetadataRecipeHandler(IContentDefinitionManager contentDefinitionManager, IContentDefinitionReader contentDefinitionReader) { _contentDefinitionManager = contentDefinitionManager; _contentDefinitionReader = contentDefinitionReader; + _contentDefinitonEventHandlers = contentDefinitonEventHandlers; Logger = NullLogger.Instance; T = NullLocalizer.Instance; } @@ -45,7 +52,10 @@ namespace Orchard.Recipes.RecipeHandlers { foreach (var element in metadataElement.Elements()) { var typeElement = element; var typeName = XmlConvert.DecodeName(element.Name.LocalName); + + _contentDefinitonEventHandlers.ContentTypeImporting(new ContentTypeImportingContext { ContentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(typeName), ContentTypeName = typeName }); _contentDefinitionManager.AlterTypeDefinition(typeName, alteration => _contentDefinitionReader.Merge(typeElement, alteration)); + _contentDefinitonEventHandlers.ContentTypeImported(new ContentTypeImportedContext { ContentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(typeName) }); } break; case "Parts": @@ -53,7 +63,10 @@ namespace Orchard.Recipes.RecipeHandlers { foreach (var element in metadataElement.Elements()) { var partElement = element; var partName = XmlConvert.DecodeName(element.Name.LocalName); + + _contentDefinitonEventHandlers.ContentPartImporting(new ContentPartImportingContext { ContentPartDefinition = _contentDefinitionManager.GetPartDefinition(partName), ContentPartName = partName }); _contentDefinitionManager.AlterPartDefinition(partName, alteration => _contentDefinitionReader.Merge(partElement, alteration)); + _contentDefinitonEventHandlers.ContentPartImported(new ContentPartImportedContext { ContentPartDefinition = _contentDefinitionManager.GetPartDefinition(partName)}); } break; default: