diff --git a/build/Build.proj b/build/Build.proj index 134bb668ed..a442c2bdd4 100644 --- a/build/Build.proj +++ b/build/Build.proj @@ -267,7 +267,7 @@ - + diff --git a/src/Umbraco.Core/Events/ExportEventArgs.cs b/src/Umbraco.Core/Events/ExportEventArgs.cs new file mode 100644 index 0000000000..161a073615 --- /dev/null +++ b/src/Umbraco.Core/Events/ExportEventArgs.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using System.Xml.Linq; + +namespace Umbraco.Core.Events +{ + public class ExportEventArgs : CancellableObjectEventArgs> + { + /// + /// Constructor accepting a single entity instance + /// + /// + /// + /// + public ExportEventArgs(TEntity eventObject, XElement xml, bool canCancel) + : base(new List { eventObject }, canCancel) + { + Xml = xml; + } + + /// + /// Constructor accepting a single entity instance + /// and cancellable by default + /// + /// + /// + public ExportEventArgs(TEntity eventObject, string elementName) : base(new List {eventObject}, true) + { + Xml = new XElement(elementName); + } + + protected ExportEventArgs(IEnumerable eventObject, bool canCancel) : base(eventObject, canCancel) + { + } + + protected ExportEventArgs(IEnumerable eventObject) : base(eventObject) + { + } + + /// + /// Returns all entities that were exported during the operation + /// + public IEnumerable ExportedEntities + { + get { return EventObject; } + } + + /// + /// Returns the xml relating to the export event + /// + public XElement Xml { get; private set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Events/ImportEventArgs.cs b/src/Umbraco.Core/Events/ImportEventArgs.cs new file mode 100644 index 0000000000..3bdd6d6fcf --- /dev/null +++ b/src/Umbraco.Core/Events/ImportEventArgs.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Xml.Linq; + +namespace Umbraco.Core.Events +{ + public class ImportEventArgs : CancellableObjectEventArgs> + { + /// + /// Constructor accepting an XElement with the xml being imported + /// + /// + public ImportEventArgs(XElement xml) : base(new List(), true) + { + Xml = xml; + } + + /// + /// Constructor accepting a list of entities and an XElement with the imported xml + /// + /// + /// + /// + public ImportEventArgs(IEnumerable eventObject, XElement xml, bool canCancel) + : base(eventObject, canCancel) + { + Xml = xml; + } + + protected ImportEventArgs(IEnumerable eventObject, bool canCancel) : base(eventObject, canCancel) + { + } + + protected ImportEventArgs(IEnumerable eventObject) : base(eventObject) + { + } + + /// + /// Returns all entities that were imported during the operation + /// + public IEnumerable ImportedEntities + { + get { return EventObject; } + } + + /// + /// Returns the xml relating to the import event + /// + public XElement Xml { get; private set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Services/IPackagingService.cs b/src/Umbraco.Core/Services/IPackagingService.cs index 478a90851b..c7e68e6eca 100644 --- a/src/Umbraco.Core/Services/IPackagingService.cs +++ b/src/Umbraco.Core/Services/IPackagingService.cs @@ -61,6 +61,15 @@ namespace Umbraco.Core.Services /// An enumerable list of generated languages IEnumerable ImportLanguages(XElement languageElementList, int userId = 0, bool raiseEvents = true); + /// + /// Imports and saves the 'Macros' part of a package xml as a list of + /// + /// Xml to import + /// Optional id of the User performing the operation + /// Optional parameter indicating whether or not to raise events + /// + IEnumerable ImportMacros(XElement element, int userId = 0, bool raiseEvents = true); + /// /// Imports and saves package xml as /// diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index d96d6665ba..851420fa61 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -71,15 +71,15 @@ namespace Umbraco.Core.Services /// containing the xml representation of the Content object public XElement Export(IContent content, bool deep = false, bool raiseEvents = true) { - if (raiseEvents) - { - if (ExportingContent.IsRaisedEventCancelled(new SaveEventArgs(content), this)) - return default(XElement); - } - //nodeName should match Casing.SafeAliasWithForcingCheck(content.ContentType.Alias); var nodeName = UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema ? "node" : content.ContentType.Alias.ToSafeAliasWithForcingCheck(); + if (raiseEvents) + { + if (ExportingContent.IsRaisedEventCancelled(new ExportEventArgs(content, nodeName), this)) + return new XElement(nodeName); + } + var xml = Export(content, nodeName); xml.Add(new XAttribute("nodeType", content.ContentType.Id)); xml.Add(new XAttribute("creatorName", content.GetCreatorProfile().Name)); @@ -96,7 +96,7 @@ namespace Umbraco.Core.Services } if(raiseEvents) - ExportedContent.RaiseEvent(new SaveEventArgs(xml, false), this); + ExportedContent.RaiseEvent(new ExportEventArgs(content, xml, false), this); return xml; } @@ -114,6 +114,7 @@ namespace Umbraco.Core.Services var xml = new XElement(nodeName, new XAttribute("id", contentBase.Id), + new XAttribute("key", contentBase.Key.ToString("D")), new XAttribute("parentID", contentBase.Level > 1 ? contentBase.ParentId : -1), new XAttribute("level", contentBase.Level), new XAttribute("creatorID", contentBase.CreatorId), @@ -167,7 +168,7 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ImportingContent.IsRaisedEventCancelled(new SaveEventArgs(element), this)) + if (ImportingContent.IsRaisedEventCancelled(new ImportEventArgs(element), this)) return Enumerable.Empty(); } @@ -184,7 +185,7 @@ namespace Umbraco.Core.Services _contentService.Save(contents, userId); if(raiseEvents) - ImportedContent.RaiseEvent(new SaveEventArgs(contents, false), this); + ImportedContent.RaiseEvent(new ImportEventArgs(contents, element, false), this); return contents; } @@ -198,7 +199,7 @@ namespace Umbraco.Core.Services _contentService.Save(contents, userId); if(raiseEvents) - ImportedContent.RaiseEvent(new SaveEventArgs(contents, false), this); + ImportedContent.RaiseEvent(new ImportEventArgs(contents, element, false), this); return contents; } @@ -335,8 +336,8 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ExportingContentType.IsRaisedEventCancelled(new SaveEventArgs(contentType), this)) - return default(XElement); + if (ExportingContentType.IsRaisedEventCancelled(new ExportEventArgs(contentType, "DocumentType"), this)) + return new XElement("DocumentType"); } var info = new XElement("Info", @@ -401,7 +402,7 @@ namespace Umbraco.Core.Services tabs); if (raiseEvents) - ExportedContentType.RaiseEvent(new SaveEventArgs(xml, false), this); + ExportedContentType.RaiseEvent(new ExportEventArgs(contentType, xml, false), this); return xml; } @@ -430,7 +431,7 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ImportingContentType.IsRaisedEventCancelled(new SaveEventArgs(element), this)) + if (ImportingContentType.IsRaisedEventCancelled(new ImportEventArgs(element), this)) return Enumerable.Empty(); } @@ -481,7 +482,7 @@ namespace Umbraco.Core.Services } if (raiseEvents) - ImportedContentType.RaiseEvent(new SaveEventArgs(list, false), this); + ImportedContentType.RaiseEvent(new ImportEventArgs(list, element, false), this); return list; } @@ -726,6 +727,11 @@ namespace Umbraco.Core.Services return contentType; } + /// + /// Used during Content import to ensure that the ContentType of a content item exists + /// + /// + /// private IContentType FindContentTypeByAlias(string contentTypeAlias) { using (var repository = _repositoryFactory.CreateContentTypeRepository(_uowProvider.GetUnitOfWork())) @@ -778,12 +784,11 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ExportingDataType.IsRaisedEventCancelled(new SaveEventArgs(dataTypeDefinition), this)) - return default(XElement); + if (ExportingDataType.IsRaisedEventCancelled(new ExportEventArgs(dataTypeDefinition, "DataType"), this)) + return new XElement("DataType"); } var prevalues = new XElement("PreValues"); - var prevalueList = _dataTypeService.GetPreValuesCollectionByDataTypeId(dataTypeDefinition.Id) .FormatAsDictionary(); @@ -807,7 +812,7 @@ namespace Umbraco.Core.Services xml.Add(new XAttribute("DatabaseType", dataTypeDefinition.DatabaseType.ToString())); if (raiseEvents) - ExportedDataType.RaiseEvent(new SaveEventArgs(xml, false), this); + ExportedDataType.RaiseEvent(new ExportEventArgs(dataTypeDefinition, xml, false), this); return xml; } @@ -823,7 +828,7 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ImportingDataType.IsRaisedEventCancelled(new SaveEventArgs(element), this)) + if (ImportingDataType.IsRaisedEventCancelled(new ImportEventArgs(element), this)) return Enumerable.Empty(); } @@ -891,7 +896,7 @@ namespace Umbraco.Core.Services } if (raiseEvents) - ImportedDataType.RaiseEvent(new SaveEventArgs(list, false), this); + ImportedDataType.RaiseEvent(new ImportEventArgs(list, element, false), this); return list; } @@ -954,8 +959,8 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ExportingDictionaryItem.IsRaisedEventCancelled(new SaveEventArgs(dictionaryItem), this)) - return default(XElement); + if (ExportingDictionaryItem.IsRaisedEventCancelled(new ExportEventArgs(dictionaryItem, "DictionaryItem"), this)) + return new XElement("DictionaryItem"); } var xml = new XElement("DictionaryItem", new XAttribute("Key", dictionaryItem.ItemKey)); @@ -977,7 +982,7 @@ namespace Umbraco.Core.Services } if (raiseEvents) - ExportedDictionaryItem.RaiseEvent(new SaveEventArgs(xml, false), this); + ExportedDictionaryItem.RaiseEvent(new ExportEventArgs(dictionaryItem, xml, false), this); return xml; } @@ -992,7 +997,7 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ImportingDictionaryItem.IsRaisedEventCancelled(new SaveEventArgs(dictionaryItemElementList), this)) + if (ImportingDictionaryItem.IsRaisedEventCancelled(new ImportEventArgs(dictionaryItemElementList), this)) return Enumerable.Empty(); } @@ -1007,7 +1012,7 @@ namespace Umbraco.Core.Services items.AddRange(ImportDictionaryItem(dictionaryItemElement, languages, raiseEvents)); if (raiseEvents) - ImportedDictionaryItem.RaiseEvent(new SaveEventArgs(items, false), this); + ImportedDictionaryItem.RaiseEvent(new ImportEventArgs(items, dictionaryItemElementList, false), this); return items; } @@ -1100,8 +1105,8 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ExportingLanguage.IsRaisedEventCancelled(new SaveEventArgs(language), this)) - return default(XElement); + if (ExportingLanguage.IsRaisedEventCancelled(new ExportEventArgs(language, "Language"), this)) + return new XElement("Language"); } var xml = new XElement("Language", @@ -1110,7 +1115,7 @@ namespace Umbraco.Core.Services new XAttribute("FriendlyName", language.CultureName)); if (raiseEvents) - ExportedLanguage.RaiseEvent(new SaveEventArgs(xml, false), this); + ExportedLanguage.RaiseEvent(new ExportEventArgs(language, xml, false), this); return xml; } @@ -1126,7 +1131,7 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ImportingLanguage.IsRaisedEventCancelled(new SaveEventArgs(languageElementList), this)) + if (ImportingLanguage.IsRaisedEventCancelled(new ImportEventArgs(languageElementList), this)) return Enumerable.Empty(); } @@ -1147,7 +1152,7 @@ namespace Umbraco.Core.Services } if (raiseEvents) - ImportedLanguage.RaiseEvent(new SaveEventArgs(list, false), this); + ImportedLanguage.RaiseEvent(new ImportEventArgs(list, languageElementList, false), this); return list; } @@ -1167,7 +1172,7 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ImportingMacro.IsRaisedEventCancelled(new SaveEventArgs(element), this)) + if (ImportingMacro.IsRaisedEventCancelled(new ImportEventArgs(element), this)) return Enumerable.Empty(); } @@ -1177,45 +1182,11 @@ namespace Umbraco.Core.Services throw new ArgumentException("The passed in XElement is not valid! It does not contain a root element called 'Macros' for multiple imports or 'macro' for a single import."); } - var macros = new List(); var macroElements = name.Equals("Macros") ? (from doc in element.Elements("macro") select doc).ToList() : new List { element }; - foreach (var macroElement in macroElements) - { - var macroName = macroElement.Element("name").Value; - var macroAlias = macroElement.Element("alias").Value; - var controlType = macroElement.Element("scriptType").Value; - var controlAssembly = macroElement.Element("scriptAssembly").Value; - var xsltPath = macroElement.Element("xslt").Value; - var scriptPath = macroElement.Element("scriptingFile").Value; - var useInEditor = macroElement.Element("useInEditor").Value; - var cacheDuration = macroElement.Element("refreshRate").Value; - - var macro = new Macro(macroAlias, macroName, controlType, controlAssembly, xsltPath, scriptPath); - - var properties = macroElement.Element("properties"); - if (properties != null) - { - int sortOrder = 0; - foreach (var property in properties.Elements()) - { - var propertyName = property.Attribute("name").Value; - var propertyAlias = property.Attribute("alias").Value; - var editorAlias = property.Attribute("propertyType").Value; - var sortOrderAttribute = property.Attribute("sortOrder"); - if (sortOrderAttribute != null) - { - sortOrder = int.Parse(sortOrderAttribute.Value); - } - - macro.Properties.Add(new MacroProperty(propertyAlias, propertyName, sortOrder, editorAlias)); - sortOrder++; - } - } - macros.Add(macro); - } + var macros = macroElements.Select(ParseMacroElement).ToList(); foreach (var macro in macros) { @@ -1223,11 +1194,77 @@ namespace Umbraco.Core.Services } if (raiseEvents) - ImportedMacro.RaiseEvent(new SaveEventArgs(macros, false), this); + ImportedMacro.RaiseEvent(new ImportEventArgs(macros, element, false), this); return macros; } + private IMacro ParseMacroElement(XElement macroElement) + { + var macroName = macroElement.Element("name").Value; + var macroAlias = macroElement.Element("alias").Value; + var controlType = macroElement.Element("scriptType").Value; + var controlAssembly = macroElement.Element("scriptAssembly").Value; + var xsltPath = macroElement.Element("xslt").Value; + var scriptPath = macroElement.Element("scriptingFile").Value; + + //Following xml elements are treated as nullable properties + var useInEditorElement = macroElement.Element("useInEditor"); + var useInEditor = false; + if (useInEditorElement != null && string.IsNullOrEmpty(useInEditorElement.Value) == false) + { + useInEditor = bool.Parse(useInEditorElement.Value); + } + var cacheDurationElement = macroElement.Element("refreshRate"); + var cacheDuration = 0; + if (cacheDurationElement != null && string.IsNullOrEmpty(cacheDurationElement.Value) == false) + { + cacheDuration = int.Parse(cacheDurationElement.Value); + } + var cacheByMemberElement = macroElement.Element("cacheByMember"); + var cacheByMember = false; + if (cacheByMemberElement != null && string.IsNullOrEmpty(cacheByMemberElement.Value) == false) + { + cacheByMember = bool.Parse(cacheByMemberElement.Value); + } + var cacheByPageElement = macroElement.Element("cacheByPage"); + var cacheByPage = false; + if (cacheByPageElement != null && string.IsNullOrEmpty(cacheByPageElement.Value) == false) + { + cacheByPage = bool.Parse(cacheByPageElement.Value); + } + var dontRenderElement = macroElement.Element("dontRender"); + var dontRender = true; + if (dontRenderElement != null && string.IsNullOrEmpty(dontRenderElement.Value) == false) + { + dontRender = bool.Parse(dontRenderElement.Value); + } + + var macro = new Macro(macroAlias, macroName, controlType, controlAssembly, xsltPath, scriptPath, + cacheByPage, cacheByMember, dontRender, useInEditor, cacheDuration); + + var properties = macroElement.Element("properties"); + if (properties != null) + { + int sortOrder = 0; + foreach (var property in properties.Elements()) + { + var propertyName = property.Attribute("name").Value; + var propertyAlias = property.Attribute("alias").Value; + var editorAlias = property.Attribute("propertyType").Value; + var sortOrderAttribute = property.Attribute("sortOrder"); + if (sortOrderAttribute != null) + { + sortOrder = int.Parse(sortOrderAttribute.Value); + } + + macro.Properties.Add(new MacroProperty(propertyAlias, propertyName, sortOrder, editorAlias)); + sortOrder++; + } + } + return macro; + } + /// /// Exports a list of items to xml as an /// @@ -1254,8 +1291,8 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ExportingMacro.IsRaisedEventCancelled(new SaveEventArgs(macro), this)) - return default(XElement); + if (ExportingMacro.IsRaisedEventCancelled(new ExportEventArgs(macro, "macro"), this)) + return new XElement("macro"); } var xml = new XElement("macro"); @@ -1263,10 +1300,13 @@ namespace Umbraco.Core.Services xml.Add(new XElement("alias", macro.Alias)); xml.Add(new XElement("scriptType", macro.ControlType)); xml.Add(new XElement("scriptAssembly", macro.ControlAssembly)); + xml.Add(new XElement("scriptingFile", macro.ScriptPath)); xml.Add(new XElement("xslt", macro.XsltPath)); xml.Add(new XElement("useInEditor", macro.UseInEditor.ToString())); + xml.Add(new XElement("dontRender", macro.DontRender.ToString())); xml.Add(new XElement("refreshRate", macro.CacheDuration.ToString(CultureInfo.InvariantCulture))); - xml.Add(new XElement("scriptingFile", macro.ScriptPath)); + xml.Add(new XElement("cacheByMember", macro.CacheByMember.ToString())); + xml.Add(new XElement("cacheByPage", macro.CacheByPage.ToString())); var properties = new XElement("properties"); foreach (var property in macro.Properties) @@ -1280,7 +1320,7 @@ namespace Umbraco.Core.Services xml.Add(properties); if (raiseEvents) - ExportedMacro.RaiseEvent(new SaveEventArgs(xml, false), this); + ExportedMacro.RaiseEvent(new ExportEventArgs(macro, xml, false), this); return xml; } @@ -1323,15 +1363,15 @@ namespace Umbraco.Core.Services /// containing the xml representation of the Media object public XElement Export(IMedia media, bool deep = false, bool raiseEvents = true) { - if (raiseEvents) - { - if (ExportingMedia.IsRaisedEventCancelled(new SaveEventArgs(media), this)) - return default(XElement); - } - //nodeName should match Casing.SafeAliasWithForcingCheck(content.ContentType.Alias); var nodeName = UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema ? "node" : media.ContentType.Alias.ToSafeAliasWithForcingCheck(); + if (raiseEvents) + { + if (ExportingMedia.IsRaisedEventCancelled(new ExportEventArgs(media, nodeName), this)) + return new XElement(nodeName); + } + var xml = Export(media, nodeName); xml.Add(new XAttribute("nodeType", media.ContentType.Id)); xml.Add(new XAttribute("writerName", media.GetCreatorProfile().Name)); @@ -1348,7 +1388,7 @@ namespace Umbraco.Core.Services } if(raiseEvents) - ExportedMedia.RaiseEvent(new SaveEventArgs(xml, false), this); + ExportedMedia.RaiseEvent(new ExportEventArgs(media, xml, false), this); return xml; } @@ -1456,7 +1496,7 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ImportingTemplate.IsRaisedEventCancelled(new SaveEventArgs(element), this)) + if (ImportingTemplate.IsRaisedEventCancelled(new ImportEventArgs(element), this)) return Enumerable.Empty(); } @@ -1529,7 +1569,7 @@ namespace Umbraco.Core.Services _fileService.SaveTemplate(templates, userId); if(raiseEvents) - ImportedTemplate.RaiseEvent(new SaveEventArgs(templates, false), this); + ImportedTemplate.RaiseEvent(new ImportEventArgs(templates, element, false), this); return templates; } @@ -1576,8 +1616,8 @@ namespace Umbraco.Core.Services { if (raiseEvents) { - if (ExportingTemplate.IsRaisedEventCancelled(new SaveEventArgs(template), this)) - return default(XElement); + if (ExportingTemplate.IsRaisedEventCancelled(new ExportEventArgs(template, "Template"), this)) + return new XElement("Template"); } var xml = new XElement("Template"); @@ -1597,7 +1637,7 @@ namespace Umbraco.Core.Services } if (raiseEvents) - ExportedTemplate.RaiseEvent(new SaveEventArgs(xml, false), this); + ExportedTemplate.RaiseEvent(new ExportEventArgs(template, xml, false), this); return xml; } @@ -1611,152 +1651,152 @@ namespace Umbraco.Core.Services /// /// Occurs before Importing Content /// - public static event TypedEventHandler> ImportingContent; + public static event TypedEventHandler> ImportingContent; /// /// Occurs after Content is Imported and Saved /// - public static event TypedEventHandler> ImportedContent; + public static event TypedEventHandler> ImportedContent; /// /// Occurs before Exporting Content /// - public static event TypedEventHandler> ExportingContent; + public static event TypedEventHandler> ExportingContent; /// /// Occurs after Content is Exported to Xml /// - public static event TypedEventHandler> ExportedContent; + public static event TypedEventHandler> ExportedContent; /// /// Occurs before Exporting Media /// - public static event TypedEventHandler> ExportingMedia; + public static event TypedEventHandler> ExportingMedia; /// /// Occurs after Media is Exported to Xml /// - public static event TypedEventHandler> ExportedMedia; + public static event TypedEventHandler> ExportedMedia; /// /// Occurs before Importing ContentType /// - public static event TypedEventHandler> ImportingContentType; + public static event TypedEventHandler> ImportingContentType; /// /// Occurs after ContentType is Imported and Saved /// - public static event TypedEventHandler> ImportedContentType; + public static event TypedEventHandler> ImportedContentType; /// /// Occurs before Exporting ContentType /// - public static event TypedEventHandler> ExportingContentType; + public static event TypedEventHandler> ExportingContentType; /// /// Occurs after ContentType is Exported to Xml /// - public static event TypedEventHandler> ExportedContentType; + public static event TypedEventHandler> ExportedContentType; /// /// Occurs before Importing DataType /// - public static event TypedEventHandler> ImportingDataType; + public static event TypedEventHandler> ImportingDataType; /// /// Occurs after DataType is Imported and Saved /// - public static event TypedEventHandler> ImportedDataType; + public static event TypedEventHandler> ImportedDataType; /// /// Occurs before Exporting DataType /// - public static event TypedEventHandler> ExportingDataType; + public static event TypedEventHandler> ExportingDataType; /// /// Occurs after DataType is Exported to Xml /// - public static event TypedEventHandler> ExportedDataType; + public static event TypedEventHandler> ExportedDataType; /// /// Occurs before Importing DictionaryItem /// - public static event TypedEventHandler> ImportingDictionaryItem; + public static event TypedEventHandler> ImportingDictionaryItem; /// /// Occurs after DictionaryItem is Imported and Saved /// - public static event TypedEventHandler> ImportedDictionaryItem; + public static event TypedEventHandler> ImportedDictionaryItem; /// /// Occurs before Exporting DictionaryItem /// - public static event TypedEventHandler> ExportingDictionaryItem; + public static event TypedEventHandler> ExportingDictionaryItem; /// /// Occurs after DictionaryItem is Exported to Xml /// - public static event TypedEventHandler> ExportedDictionaryItem; + public static event TypedEventHandler> ExportedDictionaryItem; /// /// Occurs before Importing Macro /// - public static event TypedEventHandler> ImportingMacro; + public static event TypedEventHandler> ImportingMacro; /// /// Occurs after Macro is Imported and Saved /// - public static event TypedEventHandler> ImportedMacro; + public static event TypedEventHandler> ImportedMacro; /// /// Occurs before Exporting Macro /// - public static event TypedEventHandler> ExportingMacro; + public static event TypedEventHandler> ExportingMacro; /// /// Occurs after Macro is Exported to Xml /// - public static event TypedEventHandler> ExportedMacro; + public static event TypedEventHandler> ExportedMacro; /// /// Occurs before Importing Language /// - public static event TypedEventHandler> ImportingLanguage; + public static event TypedEventHandler> ImportingLanguage; /// /// Occurs after Language is Imported and Saved /// - public static event TypedEventHandler> ImportedLanguage; + public static event TypedEventHandler> ImportedLanguage; /// /// Occurs before Exporting Language /// - public static event TypedEventHandler> ExportingLanguage; + public static event TypedEventHandler> ExportingLanguage; /// /// Occurs after Language is Exported to Xml /// - public static event TypedEventHandler> ExportedLanguage; + public static event TypedEventHandler> ExportedLanguage; /// /// Occurs before Importing Template /// - public static event TypedEventHandler> ImportingTemplate; + public static event TypedEventHandler> ImportingTemplate; /// /// Occurs after Template is Imported and Saved /// - public static event TypedEventHandler> ImportedTemplate; + public static event TypedEventHandler> ImportedTemplate; /// /// Occurs before Exporting Template /// - public static event TypedEventHandler> ExportingTemplate; + public static event TypedEventHandler> ExportingTemplate; /// /// Occurs after Template is Exported to Xml /// - public static event TypedEventHandler> ExportedTemplate; + public static event TypedEventHandler> ExportedTemplate; #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index bf6fcda1e3..18cd086cbe 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -287,6 +287,8 @@ + + diff --git a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs index a53edac3a4..17b092c16b 100644 --- a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs +++ b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs @@ -234,8 +234,7 @@ namespace Umbraco.Tests.Services.Importing Assert.That(contents.Any(), Is.True); Assert.That(contents.Count(), Is.EqualTo(numberOfDocs)); } - - + [Test] public void PackagingService_Can_Import_CheckboxList_Content_Package_Xml_With_Property_Editor_Aliases() { @@ -482,6 +481,51 @@ namespace Umbraco.Tests.Services.Importing } } + [Test] + public void PackagingService_Can_Import_Macros() + { + // Arrange + string strXml = ImportResources.uBlogsy_Package; + var xml = XElement.Parse(strXml); + var macrosElement = xml.Descendants("Macros").First(); + var packagingService = ServiceContext.PackagingService; + + // Act + var macros = packagingService.ImportMacros(macrosElement).ToList(); + + // Assert + Assert.That(macros.Any(), Is.True); + + var allMacros = ServiceContext.MacroService.GetAll().ToList(); + foreach (var macro in macros) + { + Assert.That(allMacros.Any(x => x.Alias == macro.Alias), Is.True); + } + } + + [Test] + public void PackagingService_Can_Import_Macros_With_Properties() + { + // Arrange + string strXml = ImportResources.XsltSearch_Package; + var xml = XElement.Parse(strXml); + var macrosElement = xml.Descendants("Macros").First(); + var packagingService = ServiceContext.PackagingService; + + // Act + var macros = packagingService.ImportMacros(macrosElement).ToList(); + + // Assert + Assert.That(macros.Any(), Is.True); + Assert.That(macros.First().Properties.Any(), Is.True); + + var allMacros = ServiceContext.MacroService.GetAll().ToList(); + foreach (var macro in macros) + { + Assert.That(allMacros.Any(x => x.Alias == macro.Alias), Is.True); + } + } + private void AddLanguages() { var norwegian = new Core.Models.Language("nb-NO"); diff --git a/src/Umbraco.Tests/Services/PackagingServiceTests.cs b/src/Umbraco.Tests/Services/PackagingServiceTests.cs index 0124b4ca1a..f1da377d4d 100644 --- a/src/Umbraco.Tests/Services/PackagingServiceTests.cs +++ b/src/Umbraco.Tests/Services/PackagingServiceTests.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Xml.Linq; using NUnit.Framework; @@ -22,6 +23,23 @@ namespace Umbraco.Tests.Services base.TearDown(); } + [Test] + public void PackagingService_Can_Export_Macro() + { + // Arrange + var macro = new Macro("test1", "Test", "~/usercontrol/blah.ascx", "MyAssembly", "test.xslt", "~/views/macropartials/test.cshtml"); + ServiceContext.MacroService.Save(macro); + + // Act + var element = ServiceContext.PackagingService.Export(macro); + + // Assert + Assert.That(element, Is.Not.Null); + Assert.That(element.Element("name").Value, Is.EqualTo("Test")); + Assert.That(element.Element("alias").Value, Is.EqualTo("test1")); + Console.Write(element.ToString()); + } + [Test] public void PackagingService_Can_Export_DictionaryItems() {