From 89c5b2f7de9b35004f03a0d7110ee2f5edfdc869 Mon Sep 17 00:00:00 2001 From: Lombiq Date: Mon, 6 Jul 2015 01:15:12 +0200 Subject: [PATCH 01/11] Fixing that Audit Trail summary item edit link was double-encoded --- .../Views/AuditTrailEvent-Content.SummaryAdmin.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.SummaryAdmin.cshtml index 68bdc436c..0acfc563a 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Content.SummaryAdmin.cshtml @@ -18,7 +18,7 @@ var isLatest = contentItem.VersionRecord.Number == eventVersionNumber; var isRemoved = !contentItem.VersionRecord.Latest && !contentItem.VersionRecord.Published; if (isPublishedEvent || isLatest) { - @T("{0} of the {1} {2} was {3}.", Html.ActionLink(T("Version {0}", eventVersionNumber).Text, "Detail", "Content", new { area = "Orchard.AuditTrail", id = contentItemId, version = eventVersionNumber }, null), contentType.ToLower(), isRemoved ? "" + title + "" : Html.ItemEditLink(title, contentItemId).ToString(), eventPastTense) + @T("{0} of the {1} {2} was {3}.", Html.ActionLink(T("Version {0}", eventVersionNumber).Text, "Detail", "Content", new { area = "Orchard.AuditTrail", id = contentItemId, version = eventVersionNumber }, null), contentType.ToLower(), isRemoved ? Html.Raw("" + title + "") : Html.ItemEditLink(title, contentItemId), eventPastTense) } else if (isRemoved) { @T("The {0} {1} was {2}.", contentType.ToLower(), title, eventPastTense) From 9a2eaf7ac9a4cc96e55fcd73eef2a9f26e49ca43 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Wed, 8 Jul 2015 22:45:52 +0100 Subject: [PATCH 02/11] #5489: Handling potential null value for MediaLibraryPickerField.MediaParts. This happens when a content type has both a MediaLibraryPickerField and the LayoutPart attached. The layout editor renders the field, whose shape template accesses the MediaParts property, which is not initialized for new content items. Fixes #5489 --- .../Orchard.MediaLibrary/Fields/MediaLibraryPickerField.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Fields/MediaLibraryPickerField.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Fields/MediaLibraryPickerField.cs index d2ef6c94f..a745a5536 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Fields/MediaLibraryPickerField.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Fields/MediaLibraryPickerField.cs @@ -7,7 +7,7 @@ using Orchard.MediaLibrary.Models; namespace Orchard.MediaLibrary.Fields { public class MediaLibraryPickerField : ContentField { - private static readonly char[] separator = new [] {'{', '}', ','}; + private static readonly char[] separator = {'{', '}', ','}; internal Lazy> _contentItems; public int[] Ids { @@ -17,7 +17,7 @@ namespace Orchard.MediaLibrary.Fields { public IEnumerable MediaParts { get { - return _contentItems.Value; + return _contentItems != null ? _contentItems.Value : Enumerable.Empty(); } } From 41b245560c895290722b2268710a6c72aaf26a64 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 9 Jul 2015 11:59:25 +0100 Subject: [PATCH 03/11] Removed unused namespaces and empty folder. --- .../Modules/Orchard.ImportExport/Orchard.ImportExport.csproj | 5 ++--- .../Orchard.ImportExport/Services/ImportExportService.cs | 3 --- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Orchard.ImportExport.csproj b/src/Orchard.Web/Modules/Orchard.ImportExport/Orchard.ImportExport.csproj index 27d2255e0..9bc33d63a 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Orchard.ImportExport.csproj +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Orchard.ImportExport.csproj @@ -25,6 +25,7 @@ + true @@ -108,9 +109,7 @@ - - - + diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs index c621c2f9b..407d066f4 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs @@ -4,17 +4,14 @@ using System.Linq; using System.Xml; using System.Xml.Linq; using Orchard.ContentManagement; -using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.MetaData; using Orchard.Environment.Descriptor; using Orchard.FileSystems.AppData; using Orchard.ImportExport.Models; using Orchard.Localization; using Orchard.Logging; -using Orchard.Recipes.Models; using Orchard.Recipes.Services; using Orchard.Services; -using VersionOptions = Orchard.ContentManagement.VersionOptions; namespace Orchard.ImportExport.Services { public class ImportExportService : IImportExportService { From 76132f26916077bb3312d40b4e39a6f0efbcb43f Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 9 Jul 2015 12:29:05 +0100 Subject: [PATCH 04/11] #5056: Added Export Features recipe step. Fixes #5056 --- .../ImportExport/FeaturesExportHandler.cs | 36 +++++++++++++++++++ .../ImportExport/FeaturesStep.cs | 14 ++++++++ .../Modules/Orchard.Modules/Module.txt | 10 ++++++ .../Orchard.Modules/Orchard.Modules.csproj | 4 +++ 4 files changed, 64 insertions(+) create mode 100644 src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesStep.cs diff --git a/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs b/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs new file mode 100644 index 000000000..d3bf9c5c1 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; +using Orchard.Environment.Features; +using Orchard.Events; + +namespace Orchard.Modules.ImportExport { + public interface IExportEventHandler : IEventHandler { + void Exporting(dynamic context); + void Exported(dynamic context); + } + + public class FeaturesExportHandler : IExportEventHandler { + private readonly IFeatureManager _featureManager; + + public FeaturesExportHandler(IFeatureManager featureManager) { + _featureManager = featureManager; + } + + public void Exporting(dynamic context) { + if (!((IEnumerable)context.ExportOptions.CustomSteps).Contains("Features")) { + return; + } + + var enabledFeatures = _featureManager.GetEnabledFeatures(); + + var root = new XElement("Feature", new XAttribute("enable", String.Join(", ", enabledFeatures.Select(x => x.Id)))); + context.Document.Element("Orchard").Add(root); + } + + public void Exported(dynamic context) { + } + } +} + diff --git a/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesStep.cs b/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesStep.cs new file mode 100644 index 000000000..09ed03ae0 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesStep.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Orchard.Events; + +namespace Orchard.Modules.ImportExport { + public interface ICustomExportStep : IEventHandler { + void Register(IList steps); + } + + public class FeaturesStep : ICustomExportStep { + public void Register(IList steps) { + steps.Add("Features"); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Module.txt b/src/Orchard.Web/Modules/Orchard.Modules/Module.txt index 230cb0004..fef422ee6 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Module.txt +++ b/src/Orchard.Web/Modules/Orchard.Modules/Module.txt @@ -7,3 +7,13 @@ OrchardVersion: 1.9 Description: The Modules module enables the administrator of the site to manage the installed modules as well as activate and de-activate features. FeatureDescription: Standard module and feature management. Category: Core +Features: + Orchard.Modules: + Description: Standard module and feature management. + Dependencies: Orchard.jQuery + Category: Core + Orchard.Modules.ExportFeatures: + Name: Export Features + Description: Provides feature export capability. + Category: Deployment + Dependencies: Orchard.ImportExport diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj index 873103541..48c3a1a63 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj +++ b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj @@ -25,6 +25,7 @@ + true @@ -64,12 +65,15 @@ False ..\..\..\..\lib\aspnetmvc\System.Web.Mvc.dll + + + From ed214246d813ec37cbef1fa7de8d8b38027d1fda Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 9 Jul 2015 12:29:23 +0100 Subject: [PATCH 05/11] Removed mixed tabs and spaces. --- src/Orchard.Web/Modules/Orchard.Workflows/Module.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Module.txt b/src/Orchard.Web/Modules/Orchard.Workflows/Module.txt index 245e7fbe2..83a7e0640 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Module.txt +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Module.txt @@ -11,7 +11,7 @@ Features: Description: Provides tools to create custom workflows. Dependencies: Orchard.Tokens, Orchard.Forms, Orchard.jQuery Orchard.Workflows.Timer: - Name: Workflows Timer + Name: Workflows Timer Description: Provides a Timer activity. Category: Workflows Dependencies: Orchard.Workflows From 784e1c0961ba1cf7ba37f6bdd0a561cf354c6f36 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 9 Jul 2015 13:44:02 +0100 Subject: [PATCH 06/11] Added web.config with redirect bindings. --- .../Modules/Orchard.Dashboards/Web.config | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/Orchard.Web/Modules/Orchard.Dashboards/Web.config diff --git a/src/Orchard.Web/Modules/Orchard.Dashboards/Web.config b/src/Orchard.Web/Modules/Orchard.Dashboards/Web.config new file mode 100644 index 000000000..020c2b855 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Dashboards/Web.config @@ -0,0 +1,60 @@ + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 85b06375a062476ee2e64eb4c2f5ce2c82caed6b Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 9 Jul 2015 14:09:40 +0100 Subject: [PATCH 07/11] Added assembly binding redirects. --- .../Modules/Orchard.Dashboards/Web.config | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Dashboards/Web.config b/src/Orchard.Web/Modules/Orchard.Dashboards/Web.config index 0e1f9723e..020c2b855 100644 --- a/src/Orchard.Web/Modules/Orchard.Dashboards/Web.config +++ b/src/Orchard.Web/Modules/Orchard.Dashboards/Web.config @@ -3,22 +3,22 @@ - - -
-
+ + +
+
- + - - - - - + + + + + @@ -32,7 +32,7 @@ - + @@ -41,4 +41,20 @@ + + + + + + + + + + + + + + + + From 537adf9cbac3973a34227b3fe9dab8b0349476ea Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 9 Jul 2015 14:11:34 +0100 Subject: [PATCH 08/11] #5375: Exporting various items in a predictable order. Fixes 5375 --- .../Controllers/AdminController.cs | 2 +- .../Services/ImportExportService.cs | 40 ++++++++++++++----- .../ImportExport/ElementsExportHandler.cs | 2 +- .../ImportExport/FeaturesExportHandler.cs | 2 +- .../ImportExport/RolesExportEventHandler.cs | 2 +- .../WorkflowsExportEventHandler.cs | 2 +- .../Services/ContentDefinitionWriter.cs | 7 ++-- 7 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Controllers/AdminController.cs index c6fbc6bdc..aea0e79e4 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Controllers/AdminController.cs @@ -93,7 +93,7 @@ namespace Orchard.ImportExport.Controllers { }; UpdateModel(viewModel); - var contentTypesToExport = viewModel.ContentTypes.Where(c => c.IsChecked).Select(c => c.ContentTypeName); + var contentTypesToExport = viewModel.ContentTypes.Where(c => c.IsChecked).Select(c => c.ContentTypeName).ToList(); var customSteps = viewModel.CustomSteps.Where(c => c.IsChecked).Select(c => c.CustomStep); var exportOptions = new ExportOptions { diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs index 407d066f4..6778bd31a 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs @@ -5,6 +5,7 @@ using System.Xml; using System.Xml.Linq; using Orchard.ContentManagement; using Orchard.ContentManagement.MetaData; +using Orchard.ContentManagement.MetaData.Models; using Orchard.Environment.Descriptor; using Orchard.FileSystems.AppData; using Orchard.ImportExport.Models; @@ -24,6 +25,7 @@ namespace Orchard.ImportExport.Services { private readonly IShellDescriptorManager _shellDescriptorManager; private readonly IClock _clock; private readonly IEnumerable _exportEventHandlers; + private readonly IContentManager _contentManager; private const string ExportsDirectory = "Exports"; public ImportExportService( @@ -35,7 +37,9 @@ namespace Orchard.ImportExport.Services { IRecipeManager recipeManager, IShellDescriptorManager shellDescriptorManager, IClock clock, - IEnumerable exportEventHandlers) { + IEnumerable exportEventHandlers, + IContentManager contentManager) { + _orchardServices = orchardServices; _contentDefinitionManager = contentDefinitionManager; _contentDefinitionWriter = contentDefinitionWriter; @@ -45,6 +49,7 @@ namespace Orchard.ImportExport.Services { _shellDescriptorManager = shellDescriptorManager; _clock = clock; _exportEventHandlers = exportEventHandlers; + _contentManager = contentManager; Logger = NullLogger.Instance; T = NullLocalizer.Instance; } @@ -63,7 +68,7 @@ namespace Orchard.ImportExport.Services { //items need to be retrieved IEnumerable contentItems = null; if (exportOptions.ExportData) { - contentItems = _orchardServices.ContentManager.Query(GetContentExportVersionOptions(exportOptions.VersionHistoryOptions), contentTypes.ToArray()).List(); + contentItems = _orchardServices.ContentManager.Query(GetContentExportVersionOptions(exportOptions.VersionHistoryOptions), contentTypes.ToArray()).List().ToArray(); } return Export(contentTypes, contentItems, exportOptions); @@ -118,19 +123,22 @@ namespace Orchard.ImportExport.Services { var typesToExport = _contentDefinitionManager.ListTypeDefinitions() .Where(typeDefinition => contentTypes.Contains(typeDefinition.Name)) .ToList(); - var partsToExport = new List(); + var partsToExport = new Dictionary(); - foreach (var contentTypeDefinition in typesToExport) { + foreach (var contentTypeDefinition in typesToExport.OrderBy(x => x.Name)) { foreach (var contentPartDefinition in contentTypeDefinition.Parts) { - if (partsToExport.Contains(contentPartDefinition.PartDefinition.Name)) { + if (partsToExport.ContainsKey(contentPartDefinition.PartDefinition.Name)) { continue; } - partsToExport.Add(contentPartDefinition.PartDefinition.Name); - partsElement.Add(_contentDefinitionWriter.Export(contentPartDefinition.PartDefinition)); + partsToExport.Add(contentPartDefinition.PartDefinition.Name, contentPartDefinition.PartDefinition); } typesElement.Add(_contentDefinitionWriter.Export(contentTypeDefinition)); } + foreach (var part in partsToExport.Values.OrderBy(x => x.Name)) { + partsElement.Add(_contentDefinitionWriter.Export(part)); + } + return new XElement("Metadata", typesElement, partsElement); } @@ -138,7 +146,7 @@ namespace Orchard.ImportExport.Services { var siteContentItem = _orchardServices.WorkContext.CurrentSite.ContentItem; var exportedElements = ExportContentItem(siteContentItem).Elements().ToList(); - foreach (var contentPart in siteContentItem.Parts) { + foreach (var contentPart in siteContentItem.Parts.OrderBy(x => x.PartDefinition.Name)) { var exportedElement = exportedElements.FirstOrDefault(element => element.Name == contentPart.PartDefinition.Name); //Get all simple attributes if exported element is null @@ -146,6 +154,7 @@ namespace Orchard.ImportExport.Services { var simpleAttributes = ExportSettingsPartAttributes(contentPart) .Where(attribute => exportedElement == null || exportedElement.Attributes().All(xAttribute => xAttribute.Name != attribute.Name)) + .OrderBy(x => x.Name.LocalName) .ToList(); if (simpleAttributes.Any()) { @@ -158,11 +167,12 @@ namespace Orchard.ImportExport.Services { } } + exportedElements = exportedElements.OrderBy(x => x.Name.LocalName).ToList(); return new XElement("Settings", exportedElements); } private IEnumerable ExportSettingsPartAttributes(ContentPart sitePart) { - foreach (var property in sitePart.GetType().GetProperties()) { + foreach (var property in sitePart.GetType().GetProperties().OrderBy(x => x.Name)) { var propertyType = property.PropertyType; // Supported types (we also know they are not indexed properties). @@ -185,9 +195,17 @@ namespace Orchard.ImportExport.Services { if (batchSize.HasValue && batchSize.Value > 0) data.SetAttributeValue("BatchSize", batchSize); - foreach (var contentType in contentTypes) { + var orderedContentItemsQuery = + from contentItem in contentItems + let identity = _contentManager.GetItemMetadata(contentItem).Identity.ToString() + orderby identity + select contentItem; + + var orderedContentItems = orderedContentItemsQuery.ToList(); + + foreach (var contentType in contentTypes.OrderBy(x => x)) { var type = contentType; - var items = contentItems.Where(i => i.ContentType == type); + var items = orderedContentItems.Where(i => i.ContentType == type); foreach (var contentItem in items) { var contentItemElement = ExportContentItem(contentItem); if (contentItemElement != null) diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/ImportExport/ElementsExportHandler.cs b/src/Orchard.Web/Modules/Orchard.Layouts/ImportExport/ElementsExportHandler.cs index e85960e42..c122f8745 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/ImportExport/ElementsExportHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/ImportExport/ElementsExportHandler.cs @@ -27,7 +27,7 @@ namespace Orchard.Layouts.ImportExport { return; } - var elements = _repository.Table.ToList(); + var elements = _repository.Table.OrderBy(x => x.ElementTypeName).ToList(); if (!elements.Any()) { return; diff --git a/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs b/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs index d3bf9c5c1..a6eb194ee 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs @@ -25,7 +25,7 @@ namespace Orchard.Modules.ImportExport { var enabledFeatures = _featureManager.GetEnabledFeatures(); - var root = new XElement("Feature", new XAttribute("enable", String.Join(", ", enabledFeatures.Select(x => x.Id)))); + var root = new XElement("Feature", new XAttribute("enable", String.Join(", ", enabledFeatures.Select(x => x.Id).OrderBy(x => x)))); context.Document.Element("Orchard").Add(root); } diff --git a/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs b/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs index d0b67e04d..d4b528f37 100644 --- a/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Roles/ImportExport/RolesExportEventHandler.cs @@ -35,7 +35,7 @@ namespace Orchard.Roles.ImportExport { var root = new XElement("Roles"); context.Document.Element("Orchard").Add(root); - foreach (var role in roles) { + foreach (var role in roles.OrderBy(x => x)) { root.Add(new XElement("Role", new XAttribute("Name", role.Name), new XAttribute("Permissions", string.Join(",", role.RolesPermissions.Select(rolePermission => rolePermission.Permission.Name))))); diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/ImportExport/WorkflowsExportEventHandler.cs b/src/Orchard.Web/Modules/Orchard.Workflows/ImportExport/WorkflowsExportEventHandler.cs index 9943b1b82..f8acefcee 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/ImportExport/WorkflowsExportEventHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Workflows/ImportExport/WorkflowsExportEventHandler.cs @@ -36,7 +36,7 @@ namespace Orchard.Workflows.ImportExport { var root = new XElement("Workflows"); context.Document.Element("Orchard").Add(root); - foreach (var workflowDefinition in workflowDefinitions) { + foreach (var workflowDefinition in workflowDefinitions.OrderBy(x => x.Name)) { root.Add(new XElement("Workflow", new XAttribute("Name", workflowDefinition.Name), new XAttribute("Enabled", workflowDefinition.Enabled), diff --git a/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs index 9c300f255..d72412db2 100644 --- a/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs +++ b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs @@ -1,4 +1,5 @@ -using System.Xml; +using System.Linq; +using System.Xml; using System.Xml.Linq; using Orchard.ContentManagement.MetaData.Models; using Orchard.Validation; @@ -36,7 +37,7 @@ namespace Orchard.ContentManagement.MetaData.Services { typeElement.Add(new XAttribute("DisplayName", contentTypeDefinition.DisplayName)); } - foreach (var typePart in contentTypeDefinition.Parts) { + foreach (var typePart in contentTypeDefinition.Parts.OrderBy(x => x.PartDefinition.Name)) { typeElement.Add(NewElement(typePart.PartDefinition.Name, typePart.Settings)); } @@ -52,7 +53,7 @@ namespace Orchard.ContentManagement.MetaData.Services { Argument.ThrowIfNull(contentPartDefinition, "contentPartDefinition"); var partElement = NewElement(contentPartDefinition.Name, contentPartDefinition.Settings); - foreach (var partField in contentPartDefinition.Fields) { + foreach (var partField in contentPartDefinition.Fields.OrderBy(x => x.Name)) { var attributeName = string.Format("{0}.{1}", partField.Name, partField.FieldDefinition.Name); var partFieldElement = NewElement(attributeName, partField.Settings); partElement.Add(partFieldElement); From 645c36a2ddd5e1ceaba7b7a174387e0964913f97 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 10 Jul 2015 11:55:35 +0100 Subject: [PATCH 09/11] Added support for VS2015 to ClickToBuild.cmd. --- ClickToBuild.cmd | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ClickToBuild.cmd b/ClickToBuild.cmd index 38d5db736..f48774d4d 100644 --- a/ClickToBuild.cmd +++ b/ClickToBuild.cmd @@ -1,4 +1,8 @@ -FOR %%b in ( +FOR %%b in ( + "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" + "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" + "%ProgramFiles%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" + "%VS120COMNTOOLS%..\..\VC\vcvarsall.bat" "%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" "%ProgramFiles%\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" From a2d3e41dad8d527dfb908100989019eea3ecf97f Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 10 Jul 2015 14:54:15 +0100 Subject: [PATCH 10/11] Removed unnecessary injection of IContentManager. --- .../Orchard.ImportExport/Services/ImportExportService.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs index 6778bd31a..b92633089 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs @@ -25,7 +25,6 @@ namespace Orchard.ImportExport.Services { private readonly IShellDescriptorManager _shellDescriptorManager; private readonly IClock _clock; private readonly IEnumerable _exportEventHandlers; - private readonly IContentManager _contentManager; private const string ExportsDirectory = "Exports"; public ImportExportService( @@ -37,8 +36,7 @@ namespace Orchard.ImportExport.Services { IRecipeManager recipeManager, IShellDescriptorManager shellDescriptorManager, IClock clock, - IEnumerable exportEventHandlers, - IContentManager contentManager) { + IEnumerable exportEventHandlers) { _orchardServices = orchardServices; _contentDefinitionManager = contentDefinitionManager; @@ -49,7 +47,6 @@ namespace Orchard.ImportExport.Services { _shellDescriptorManager = shellDescriptorManager; _clock = clock; _exportEventHandlers = exportEventHandlers; - _contentManager = contentManager; Logger = NullLogger.Instance; T = NullLocalizer.Instance; } @@ -197,7 +194,7 @@ namespace Orchard.ImportExport.Services { var orderedContentItemsQuery = from contentItem in contentItems - let identity = _contentManager.GetItemMetadata(contentItem).Identity.ToString() + let identity = _orchardServices.ContentManager.GetItemMetadata(contentItem).Identity.ToString() orderby identity select contentItem; From fd1b06f72d102c63ef77d98b4accf8a73c0eef42 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 10 Jul 2015 15:31:35 +0100 Subject: [PATCH 11/11] Updated Features recipe step to include Migrations step. This will cause migrations to execute after features have been enabled. --- .../Orchard.Modules/ImportExport/FeaturesExportHandler.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs b/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs index a6eb194ee..ad140d13e 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/ImportExport/FeaturesExportHandler.cs @@ -27,6 +27,9 @@ namespace Orchard.Modules.ImportExport { var root = new XElement("Feature", new XAttribute("enable", String.Join(", ", enabledFeatures.Select(x => x.Id).OrderBy(x => x)))); context.Document.Element("Orchard").Add(root); + + // Add the Migration element to force migrations run immediately after the features have been synced. + context.Document.Element("Orchard").Add(new XElement("Migration", new XAttribute("features", "*"))); } public void Exported(dynamic context) {