From f64028cdab783ea1b2e2deb0f32e03519fbff477 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 16 Jul 2015 17:17:03 +0100 Subject: [PATCH] Added backward compatibility with Metadata and Data recipe steps and added more granular control over ordering. --- .../Providers/ExportActions/BuildRecipeAction.cs | 2 +- .../Providers/ImportActions/UploadRecipeAction.cs | 1 - .../Recipes/Builders/CustomStepsStep.cs | 3 ++- .../Services/ImportExportService.cs | 1 + .../Modules/Orchard.Modules/Orchard.Modules.csproj | 2 +- .../Orchard.Modules/Recipes/Builders/FeatureStep.cs | 5 +++-- .../{ExportSteps => BuilderSteps}/Feature.cshtml | 0 .../Modules/Orchard.Recipes/Orchard.Recipes.csproj | 2 +- .../Providers/Builders/ContentStep.cs | 3 ++- .../Providers/Builders/RecipeMetadataStep.cs | 1 + .../Providers/Builders/SettingsStep.cs | 3 ++- ...ContentSchemaStep.cs => ContentDefinitionStep.cs} | 12 +++++++++--- .../Providers/Executors/ContentStep.cs | 10 ++++++---- .../RecipeHandlers/RecipeExecutionStepHandler.cs | 2 +- src/Orchard/Recipes/Services/IRecipeBuilderStep.cs | 10 ++++++++++ src/Orchard/Recipes/Services/IRecipeExecutionStep.cs | 4 +++- src/Orchard/Recipes/Services/RecipeBuilder.cs | 3 ++- src/Orchard/Recipes/Services/RecipeBuilderStep.cs | 1 + src/Orchard/Recipes/Services/RecipeExecutionStep.cs | 5 +++++ 19 files changed, 51 insertions(+), 19 deletions(-) rename src/Orchard.Web/Modules/Orchard.Modules/Views/EditorTemplates/{ExportSteps => BuilderSteps}/Feature.cshtml (100%) rename src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/{ContentSchemaStep.cs => ContentDefinitionStep.cs} (92%) diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Providers/ExportActions/BuildRecipeAction.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Providers/ExportActions/BuildRecipeAction.cs index 0975eaba7..c96d1c74a 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Providers/ExportActions/BuildRecipeAction.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Providers/ExportActions/BuildRecipeAction.cs @@ -33,7 +33,7 @@ namespace Orchard.ImportExport.Providers.ExportActions { } public override dynamic UpdateEditor(dynamic shapeFactory, IUpdateModel updater) { - var builderSteps = _recipeBuilderSteps.OrderByDescending(x => x.Priority).Select(x => new ExportStepViewModel { + var builderSteps = _recipeBuilderSteps.OrderBy(x => x.Position).Select(x => new ExportStepViewModel { Name = x.Name, DisplayName = x.DisplayName, Description = x.Description, diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Providers/ImportActions/UploadRecipeAction.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Providers/ImportActions/UploadRecipeAction.cs index 8f24eb71a..677625885 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Providers/ImportActions/UploadRecipeAction.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Providers/ImportActions/UploadRecipeAction.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Web; using System.Web.Mvc; using System.Web.Routing; using System.Xml.Linq; diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Recipes/Builders/CustomStepsStep.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Recipes/Builders/CustomStepsStep.cs index 954f2cf35..58178ffa8 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Recipes/Builders/CustomStepsStep.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Recipes/Builders/CustomStepsStep.cs @@ -30,7 +30,8 @@ namespace Orchard.ImportExport.Recipes.Builders { get { return T("Exports additional items."); } } - public override int Priority { get { return 60; } } + public override int Priority { get { return -50; } } + public override int Position { get { return 500; } } public IList CustomSteps { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs index 28cece3a9..bb90a29be 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Xml.Linq; using Orchard.FileSystems.AppData; using Orchard.Localization; diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj index 1f0276db9..a06307b60 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj +++ b/src/Orchard.Web/Modules/Orchard.Modules/Orchard.Modules.csproj @@ -143,7 +143,7 @@ - + 10.0 diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Recipes/Builders/FeatureStep.cs b/src/Orchard.Web/Modules/Orchard.Modules/Recipes/Builders/FeatureStep.cs index b8a578e24..5c55a710b 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Recipes/Builders/FeatureStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/Recipes/Builders/FeatureStep.cs @@ -27,7 +27,8 @@ namespace Orchard.Modules.Recipes.Builders { get { return T("Exports enabled and disabled features."); } } - public override int Priority { get { return 0; } } + public override int Priority { get { return 500; } } + public override int Position { get { return 70; } } public bool ExportEnabledFeatures { get; set; } public bool ExportDisabledFeatures { get; set; } @@ -44,7 +45,7 @@ namespace Orchard.Modules.Recipes.Builders { ExportDisabledFeatures = viewModel.ExportDisabledFeatures; } - return shapeFactory.EditorTemplate(TemplateName: "ExportSteps/Feature", Model: viewModel, Prefix: Prefix); + return shapeFactory.EditorTemplate(TemplateName: "BuilderSteps/Feature", Model: viewModel, Prefix: Prefix); } public override void Build(BuildContext context) { diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Views/EditorTemplates/ExportSteps/Feature.cshtml b/src/Orchard.Web/Modules/Orchard.Modules/Views/EditorTemplates/BuilderSteps/Feature.cshtml similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Modules/Views/EditorTemplates/ExportSteps/Feature.cshtml rename to src/Orchard.Web/Modules/Orchard.Modules/Views/EditorTemplates/BuilderSteps/Feature.cshtml diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj b/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj index 44af641cf..d0b857700 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Orchard.Recipes.csproj @@ -88,7 +88,7 @@ - + diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/ContentStep.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/ContentStep.cs index 4a85eddd2..e394928db 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/ContentStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/ContentStep.cs @@ -38,6 +38,7 @@ namespace Orchard.Recipes.Providers.Builders { } public override int Priority { get { return 20; } } + public override int Position { get { return 20; } } public IList SchemaContentTypes { get; set; } public IList DataContentTypes { get; set; } @@ -103,7 +104,7 @@ namespace Orchard.Recipes.Providers.Builders { partsElement.Add(_contentDefinitionWriter.Export(part)); } - return new XElement("ContentSchema", typesElement, partsElement); + return new XElement("ContentDefinition", typesElement, partsElement); } private XElement ExportData(IEnumerable contentTypes, IEnumerable contentItems) { diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/RecipeMetadataStep.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/RecipeMetadataStep.cs index 403c8b364..d8dc9d221 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/RecipeMetadataStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/RecipeMetadataStep.cs @@ -23,6 +23,7 @@ namespace Orchard.Recipes.Providers.Builders { } public override int Priority { get { return 1000; } } + public override int Position { get { return -1000; } } public string RecipeName { get; set; } public string RecipeDescription { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/SettingsStep.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/SettingsStep.cs index df69dd996..b3ae5b8d1 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/SettingsStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Builders/SettingsStep.cs @@ -26,7 +26,8 @@ namespace Orchard.Recipes.Providers.Builders { get { return T("Exports settings."); } } - public override int Priority { get { return 10; } } + public override int Priority { get { return 30; } } + public override int Position { get { return 60; } } public override dynamic BuildEditor(dynamic shapeFactory) { return UpdateEditor(shapeFactory, null); diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/ContentSchemaStep.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/ContentDefinitionStep.cs similarity index 92% rename from src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/ContentSchemaStep.cs rename to src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/ContentDefinitionStep.cs index c02328ff2..a31617e81 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/ContentSchemaStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/ContentDefinitionStep.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Xml; using Orchard.ContentManagement.MetaData; using Orchard.ContentTypes.Events; @@ -7,14 +8,19 @@ using Orchard.Recipes.Models; using Orchard.Recipes.Services; namespace Orchard.Recipes.Providers.Executors { - public class ContentSchemaStep : RecipeExecutionStep { + public class ContentDefinitionStep : RecipeExecutionStep { private readonly IContentDefinitionManager _contentDefinitionManager; private readonly IContentDefinitionReader _contentDefinitionReader; private readonly IContentDefinitionEventHandler _contentDefinitonEventHandlers; - public override string Name { get { return "ContentSchema"; } } + public override string Name { get { return "ContentDefinition"; } } - public ContentSchemaStep( + public override IEnumerable Names + { + get { return new[] {Name, "Metadata"}; } + } + + public ContentDefinitionStep( IContentDefinitionManager contentDefinitionManager, IContentDefinitionReader contentDefinitionReader, IContentDefinitionEventHandler contentDefinitonEventHandlers) { diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/ContentStep.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/ContentStep.cs index 177529b6b..0e6d6733b 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/ContentStep.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/Executors/ContentStep.cs @@ -19,13 +19,15 @@ namespace Orchard.Recipes.Providers.Executors { _transactionManager = transactionManager; } - public override string Name - { + public override string Name { get { return "Content"; } } - public override LocalizedString DisplayName - { + public override IEnumerable Names { + get { return new[] { Name, "Data" }; } + } + + public override LocalizedString DisplayName { get { return T("Content"); } } diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/RecipeHandlers/RecipeExecutionStepHandler.cs b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/RecipeHandlers/RecipeExecutionStepHandler.cs index 822a5d3ef..7cb8bef34 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/Providers/RecipeHandlers/RecipeExecutionStepHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/Providers/RecipeHandlers/RecipeExecutionStepHandler.cs @@ -15,7 +15,7 @@ namespace Orchard.Recipes.Providers.RecipeHandlers { } public void ExecuteRecipeStep(RecipeContext recipeContext) { - var executionStep = _recipeExecutionSteps.FirstOrDefault(x => x.Name == recipeContext.RecipeStep.Name); + var executionStep = _recipeExecutionSteps.FirstOrDefault(x => x.Names.Contains(recipeContext.RecipeStep.Name)); var recipeExecutionContext = new RecipeExecutionContext {ExecutionId = recipeContext.ExecutionId, RecipeStep = recipeContext.RecipeStep}; if (executionStep != null) { diff --git a/src/Orchard/Recipes/Services/IRecipeBuilderStep.cs b/src/Orchard/Recipes/Services/IRecipeBuilderStep.cs index cf7b64edd..95b873463 100644 --- a/src/Orchard/Recipes/Services/IRecipeBuilderStep.cs +++ b/src/Orchard/Recipes/Services/IRecipeBuilderStep.cs @@ -6,7 +6,17 @@ namespace Orchard.Recipes.Services { string Name { get; } LocalizedString DisplayName { get; } LocalizedString Description { get; } + + /// + /// The order in which this builder should execute. + /// int Priority { get; } + + /// + /// The order in which this builder should be displayed. + /// + int Position { get; } + dynamic BuildEditor(dynamic shapeFactory); dynamic UpdateEditor(dynamic shapeFactory, IUpdateModel updater); void Build(BuildContext context); diff --git a/src/Orchard/Recipes/Services/IRecipeExecutionStep.cs b/src/Orchard/Recipes/Services/IRecipeExecutionStep.cs index 2530190a4..a97497f7b 100644 --- a/src/Orchard/Recipes/Services/IRecipeExecutionStep.cs +++ b/src/Orchard/Recipes/Services/IRecipeExecutionStep.cs @@ -1,10 +1,12 @@ -using Orchard.ContentManagement; +using System.Collections.Generic; +using Orchard.ContentManagement; using Orchard.Localization; using Orchard.Recipes.Models; namespace Orchard.Recipes.Services { public interface IRecipeExecutionStep : IDependency { string Name { get; } + IEnumerable Names { get; } LocalizedString DisplayName { get; } LocalizedString Description { get; } dynamic BuildEditor(dynamic shapeFactory); diff --git a/src/Orchard/Recipes/Services/RecipeBuilder.cs b/src/Orchard/Recipes/Services/RecipeBuilder.cs index 80900165f..333c236f7 100644 --- a/src/Orchard/Recipes/Services/RecipeBuilder.cs +++ b/src/Orchard/Recipes/Services/RecipeBuilder.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Xml.Linq; using Orchard.Services; @@ -15,7 +16,7 @@ namespace Orchard.Recipes.Services { RecipeDocument = CreateRecipeRoot() }; - foreach (var step in steps) { + foreach (var step in steps.OrderByDescending(x => x.Priority)) { step.Build(context); } diff --git a/src/Orchard/Recipes/Services/RecipeBuilderStep.cs b/src/Orchard/Recipes/Services/RecipeBuilderStep.cs index ca4f820df..f213b4990 100644 --- a/src/Orchard/Recipes/Services/RecipeBuilderStep.cs +++ b/src/Orchard/Recipes/Services/RecipeBuilderStep.cs @@ -7,6 +7,7 @@ namespace Orchard.Recipes.Services { public abstract LocalizedString DisplayName { get; } public abstract LocalizedString Description { get; } public virtual int Priority { get { return 0; } } + public virtual int Position { get { return 0; } } protected virtual string Prefix { get { return GetType().Name; } diff --git a/src/Orchard/Recipes/Services/RecipeExecutionStep.cs b/src/Orchard/Recipes/Services/RecipeExecutionStep.cs index d35d145fa..fbac2541a 100644 --- a/src/Orchard/Recipes/Services/RecipeExecutionStep.cs +++ b/src/Orchard/Recipes/Services/RecipeExecutionStep.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Orchard.ContentManagement; using Orchard.Localization; using Orchard.Recipes.Models; @@ -6,6 +7,10 @@ namespace Orchard.Recipes.Services { public abstract class RecipeExecutionStep : Component, IRecipeExecutionStep { public abstract string Name { get; } + public virtual IEnumerable Names { + get { yield return Name; } + } + public virtual LocalizedString DisplayName { get { return T(Name); } }