From 6d2832ef0831f253d5b55192b518d4151724c95d Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 13 Jul 2015 17:56:20 +0100 Subject: [PATCH] Added the ability to generate a Setup recipe using the export feature. --- .../Controllers/AdminController.cs | 6 ++ .../Models/ExportOptions.cs | 5 ++ .../Services/ImportExportService.cs | 21 ++++--- .../ViewModels/ExportViewModel.cs | 5 ++ .../Views/Admin/Export.cshtml | 56 ++++++++++++++----- 5 files changed, 71 insertions(+), 22 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Controllers/AdminController.cs index 3340591a7..460b1be0c 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Controllers/AdminController.cs @@ -74,6 +74,7 @@ namespace Orchard.ImportExport.Controllers { _customExportStep.Register(customSteps); var viewModel = new ExportViewModel { + RecipeVersion = "1.0", ContentTypes = new List(), CustomSteps = customSteps.Select(x => new CustomStepEntry { CustomStep = x }).ToList() }; @@ -102,6 +103,11 @@ namespace Orchard.ImportExport.Controllers { var exportOptions = new ExportOptions { ExportMetadata = viewModel.Metadata, ExportSiteSettings = viewModel.SiteSettings, + SetupRecipe = viewModel.SetupRecipe, + RecipeDescription = viewModel.RecipeDescription, + RecipeWebsite = viewModel.RecipeWebsite, + RecipeTags = viewModel.RecipeTags, + RecipeVersion = viewModel.RecipeVersion, CustomSteps = customSteps }; diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Models/ExportOptions.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Models/ExportOptions.cs index 4de00335c..f4be1d138 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Models/ExportOptions.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Models/ExportOptions.cs @@ -8,6 +8,11 @@ namespace Orchard.ImportExport.Models { public VersionHistoryOptions VersionHistoryOptions { get; set; } public bool ExportSiteSettings { get; set; } public IEnumerable CustomSteps { get; set; } + public bool SetupRecipe { get; set; } + public string RecipeDescription { get; set; } + public string RecipeWebsite { get; set; } + public string RecipeTags { get; set; } + public string RecipeVersion { get; set; } } public enum VersionHistoryOptions { diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs index b92633089..047ecff6c 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Services/ImportExportService.cs @@ -72,7 +72,7 @@ namespace Orchard.ImportExport.Services { } public string Export(IEnumerable contentTypes, IEnumerable contentItems, ExportOptions exportOptions) { - var exportDocument = CreateExportRoot(); + var exportDocument = CreateExportRoot(exportOptions); var context = new ExportContext { Document = exportDocument, @@ -99,18 +99,23 @@ namespace Orchard.ImportExport.Services { return WriteExportFile(exportDocument.ToString()); } - private XDocument CreateExportRoot() { + private XDocument CreateExportRoot(ExportOptions exportOptions) { var exportRoot = new XDocument( new XDeclaration("1.0", "", "yes"), new XComment("Exported from Orchard"), new XElement("Orchard", - new XElement("Recipe", - new XElement("Name", "Generated by Orchard.ImportExport"), - new XElement("Author", _orchardServices.WorkContext.CurrentUser.UserName), - new XElement("ExportUtc", XmlConvert.ToString(_clock.UtcNow, XmlDateTimeSerializationMode.Utc)) - ) + new XElement("Recipe", + new XElement("Name", "Generated by Orchard.ImportExport"), + new XElement("Description", exportOptions.RecipeDescription), + new XElement("Author", _orchardServices.WorkContext.CurrentUser.UserName), + new XElement("WebSite", exportOptions.RecipeWebsite), + new XElement("Tags", exportOptions.RecipeTags), + new XElement("Version", exportOptions.RecipeVersion), + new XElement("IsSetupRecipe", exportOptions.SetupRecipe), + new XElement("ExportUtc", XmlConvert.ToString(_clock.UtcNow, XmlDateTimeSerializationMode.Utc)) ) - ); + ) + ); return exportRoot; } diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/ViewModels/ExportViewModel.cs b/src/Orchard.Web/Modules/Orchard.ImportExport/ViewModels/ExportViewModel.cs index 447222f40..293631753 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/ViewModels/ExportViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/ViewModels/ExportViewModel.cs @@ -9,6 +9,11 @@ namespace Orchard.ImportExport.ViewModels { public int? ImportBatchSize { get; set; } public string DataImportChoice { get; set; } public bool SiteSettings { get; set; } + public bool SetupRecipe { get; set; } + public string RecipeDescription { get; set; } + public string RecipeWebsite { get; set; } + public string RecipeTags { get; set; } + public string RecipeVersion { get; set; } } public class ContentTypeEntry { diff --git a/src/Orchard.Web/Modules/Orchard.ImportExport/Views/Admin/Export.cshtml b/src/Orchard.Web/Modules/Orchard.ImportExport/Views/Admin/Export.cshtml index 170d9c216..830a8353c 100644 --- a/src/Orchard.Web/Modules/Orchard.ImportExport/Views/Admin/Export.cshtml +++ b/src/Orchard.Web/Modules/Orchard.ImportExport/Views/Admin/Export.cshtml @@ -20,47 +20,75 @@
@T("Choose what to save for these types:")
- @Html.EditorFor(m => m.Metadata) - + @Html.EditorFor(m => m.Metadata) + @Html.LabelFor(m => m.Metadata, T("Batch Size").ToString(), new { @class = "forcheckbox" }) @Html.Hint(T("Metadata is the definition of your content types: what parts and fields they have, with what settings."))
@Html.EditorFor(m => m.Data) - + @Html.LabelFor(m => m.Data, T("Data").ToString(), new { @class = "forcheckbox" }) @Html.Hint(T("Data is the actual content of your site."))
@Html.LabelFor(m => m.ImportBatchSize, T("Batch Size")) - @Html.TextBoxFor(m => m.ImportBatchSize, new { @class = "text small" }) + @Html.TextBoxFor(m => m.ImportBatchSize, new {@class = "text small"}) @Html.Hint(T("The batch size to use when importing the data. Leave empty to disable batched imports."))

@T("Version History")

- @Html.RadioButtonFor(m => m.DataImportChoice, "Published", new { id = "Published", Checked = "Checked" }) - -
- @Html.RadioButtonFor(m => m.DataImportChoice, "Draft", new { id = "Draft" }) - + @Html.RadioButtonFor(m => m.DataImportChoice, "Published", new {id = "Published", Checked = "Checked"}) + +
+ @Html.RadioButtonFor(m => m.DataImportChoice, "Draft", new {id = "Draft"}) +
@Html.EditorFor(m => m.SiteSettings) -
+
@Html.Hint(T("Please verify that you are not exporting confidential information, such as passwords or application keys.")) -
+ +
+
+ @T("Setup") +
+ @Html.CheckBoxFor(m => m.SetupRecipe) + @Html.LabelFor(m => m.SetupRecipe, T("Setup Recipe").ToString(), new {@class = "forcheckbox"}) + @Html.Hint(T("Check this option if you want to use the generated recipe as a setup recipe.")) +
+
+
+ @Html.LabelFor(m => m.RecipeDescription, T("Description")) + @Html.TextBoxFor(m => m.RecipeDescription, new {@class = "text large"}) + @Html.Hint(T("Optionally provide a description for the setup recipe.")) +
+
+ @Html.LabelFor(m => m.RecipeWebsite, T("Website")) + @Html.TextBoxFor(m => m.RecipeWebsite, new {@class = "text large"}) + @Html.Hint(T("Optionally provide a website URL for the setup recipe.")) +
+
+ @Html.LabelFor(m => m.RecipeTags, T("Tags")) + @Html.TextBoxFor(m => m.RecipeTags, new {@class = "text large"}) + @Html.Hint(T("Optionally provide tags for the setup recipe.")) +
+
+ @Html.LabelFor(m => m.RecipeVersion, T("Version")) + @Html.TextBoxFor(m => m.RecipeVersion, new { @class = "text small" }) + @Html.Hint(T("Optionally provide a version for the setup recipe.")) +
+
if (Model.CustomSteps.Any()) {
@T("Choose the custom steps to execute in the export file:")
    - @{ var customStepIndex = 0; } - @foreach (var customStepEntry in Model.CustomSteps) { + @for (var customStepIndex = 0; customStepIndex < Model.CustomSteps.Count; customStepIndex++) {
  1. - customStepIndex = customStepIndex + 1; }