#20404: Exporting/Importing site settings through a driver, then simple types in standard fashion

Work Item: 20404
This commit is contained in:
Stanley Goldman
2014-03-17 08:22:23 -04:00
committed by Sebastien Ros
parent 458d06a74e
commit 115b8d79b7
20 changed files with 82 additions and 262 deletions

View File

@@ -214,7 +214,6 @@
<Compile Include="Scheduling\Services\ScheduledTaskExecutor.cs" />
<Compile Include="Scheduling\Models\Task.cs" />
<Compile Include="Settings\Commands\SiteSettingsCommands.cs" />
<Compile Include="Settings\Drivers\SiteSettings2PartDriver.cs" />
<Compile Include="Settings\Models\SiteSettings2Part.cs" />
<Compile Include="Settings\Models\SiteSettings2PartRecord.cs" />
<Compile Include="Settings\ResourceManifest.cs" />

View File

@@ -1,27 +0,0 @@
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Core.Settings.Models;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.Settings;
namespace Orchard.Core.Settings.Drivers
{
public class SiteSettings2PartDriver : ContentPartDriver<SiteSettings2Part> {
public SiteSettings2PartDriver() {
T = NullLocalizer.Instance;
Logger = NullLogger.Instance;
}
public Localizer T { get; set; }
public ILogger Logger { get; set; }
protected override void Exporting(SiteSettings2Part part, ExportContentContext context) {
DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
}
protected override void Importing(SiteSettings2Part part, ImportContentContext context) {
DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
}
}
}

View File

@@ -3,7 +3,6 @@ using System.Net;
using JetBrains.Annotations;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Core.Settings.Models;
using Orchard.Core.Settings.ViewModels;
using Orchard.Localization.Services;
@@ -102,13 +101,5 @@ namespace Orchard.Core.Settings.Drivers {
return ContentShape("Parts_Settings_SiteSettingsPart",
() => shapeHelper.EditorTemplate(TemplateName: "Parts.Settings.SiteSettingsPart", Model: model, Prefix: Prefix));
}
protected override void Exporting(SiteSettingsPart part, ExportContentContext context) {
DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
}
protected override void Importing(SiteSettingsPart part, ImportContentContext context) {
DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
}
}
}

View File

@@ -2,9 +2,7 @@
using Orchard.Comments.Models;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Localization;
using Orchard.Settings;
namespace Orchard.Comments.Drivers {
public class CommentSettingsPartDriver : ContentPartDriver<CommentSettingsPart> {
@@ -30,13 +28,5 @@ namespace Orchard.Comments.Drivers {
})
.OnGroup("comments");
}
protected override void Exporting(CommentSettingsPart part, ExportContentContext context) {
DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
}
protected override void Importing(CommentSettingsPart part, ImportContentContext context) {
DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
}
}
}

View File

@@ -1,10 +1,8 @@
using System;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Email.Models;
using Orchard.Localization;
using Orchard.Settings;
namespace Orchard.Email.Drivers {
@@ -41,13 +39,5 @@ namespace Orchard.Email.Drivers {
})
.OnGroup("email");
}
protected override void Exporting(SmtpSettingsPart part, ExportContentContext context) {
DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
}
protected override void Importing(SmtpSettingsPart part, ImportContentContext context) {
DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
}
}
}

View File

@@ -53,8 +53,6 @@
<HintPath>..\..\..\..\lib\aspnetmvc\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Compile Include="Activities\MailActivity.cs" />

View File

@@ -5,6 +5,7 @@ using System.Xml;
using System.Xml.Linq;
using JetBrains.Annotations;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.MetaData;
using Orchard.Environment.Descriptor;
using Orchard.FileSystems.AppData;
@@ -139,10 +140,50 @@ namespace Orchard.ImportExport.Services {
}
private XElement ExportSiteSettings() {
var exportContentItem = ExportContentItem(_orchardServices.WorkContext.CurrentSite.ContentItem);
return new XElement("Settings", exportContentItem.Elements());
var siteContentItem = _orchardServices.WorkContext.CurrentSite.ContentItem;
var exportedElements = ExportContentItem(siteContentItem).Elements().ToList();
foreach (var contentPart in siteContentItem.Parts) {
var exportedElement = exportedElements.FirstOrDefault(element => element.Name == contentPart.PartDefinition.Name);
//Get all simple attributes if exported element is null
//Get exclude the simple attributes that already exist if element is not null
var simpleAttributes =
ExportSettingsPartAttributes(contentPart)
.Where(attribute => exportedElement == null || exportedElement.Attributes().All(xAttribute => xAttribute.Name != attribute.Name))
.ToList();
if (simpleAttributes.Any()) {
if (exportedElement == null) {
exportedElement = new XElement(contentPart.PartDefinition.Name);
exportedElements.Add(exportedElement);
}
exportedElement.Add(simpleAttributes);
}
}
return new XElement("Settings", exportedElements);
}
private IEnumerable<XAttribute> ExportSettingsPartAttributes(ContentPart sitePart) {
foreach (var property in sitePart.GetType().GetProperties()) {
var propertyType = property.PropertyType;
// Supported types (we also know they are not indexed properties).
if (propertyType == typeof(string) || propertyType == typeof(bool) || propertyType == typeof(int)) {
// Exclude read-only properties.
if (property.GetSetMethod() != null) {
var value = property.GetValue(sitePart, null);
if (value == null)
continue;
yield return new XAttribute(property.Name, value);
}
}
}
}
private XElement ExportData(IEnumerable<string> contentTypes, IEnumerable<ContentItem> contentItems, int? batchSize) {
var data = new XElement("Data");

View File

@@ -1,28 +0,0 @@
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.MediaLibrary.Models;
using Orchard.Settings;
namespace Orchard.MediaLibrary.Drivers
{
public class WebSearchSettingsPartDriver : ContentPartDriver<WebSearchSettingsPart> {
public WebSearchSettingsPartDriver()
{
T = NullLocalizer.Instance;
Logger = NullLogger.Instance;
}
public Localizer T { get; set; }
public ILogger Logger { get; set; }
protected override void Exporting(WebSearchSettingsPart part, ExportContentContext context) {
DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
}
protected override void Importing(WebSearchSettingsPart part, ImportContentContext context) {
DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
}
}
}

View File

@@ -98,7 +98,6 @@
<Content Include="Views\Web.config" />
<Content Include="Scripts\Web.config" />
<Content Include="Styles\Web.config" />
<Compile Include="Drivers\WebSearchSettingsPartDriver.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Content Include="Module.txt" />
</ItemGroup>

View File

@@ -1,12 +1,10 @@
using JetBrains.Annotations;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Localization;
using Orchard.Messaging.Models;
using Orchard.Messaging.Services;
using Orchard.Messaging.ViewModels;
using Orchard.Settings;
namespace Orchard.Messaging.Drivers {
[UsedImplicitly]
@@ -45,13 +43,5 @@ namespace Orchard.Messaging.Drivers {
return ContentShape("Parts_MessageSettings_Edit", () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
}
protected override void Exporting(MessageSettingsPart part, ExportContentContext context) {
DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
}
protected override void Importing(MessageSettingsPart part, ImportContentContext context) {
DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
}
}
}

View File

@@ -1,28 +0,0 @@
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.OutputCache.Models;
using Orchard.Settings;
namespace Orchard.OutputCache.Drivers
{
public class CacheSettingsPartDriver : ContentPartDriver<CacheSettingsPart> {
public CacheSettingsPartDriver()
{
T = NullLocalizer.Instance;
Logger = NullLogger.Instance;
}
public Localizer T { get; set; }
public ILogger Logger { get; set; }
protected override void Exporting(CacheSettingsPart part, ExportContentContext context) {
DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
}
protected override void Importing(CacheSettingsPart part, ImportContentContext context) {
DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
}
}
}

View File

@@ -90,7 +90,6 @@
<Compile Include="AdminMenu.cs" />
<Compile Include="Controllers\AdminController.cs" />
<Compile Include="Controllers\StatisticsController.cs" />
<Compile Include="Drivers\CacheSettingsPartDriver.cs" />
<Compile Include="Filters\OutputCacheFilter.cs" />
<Compile Include="Handlers\CacheSettingsPartHandler.cs" />
<Compile Include="Handlers\DisplayedContentItemHandler.cs" />

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Security.Policy;
using System.Xml;
using System.Xml.Linq;
using Orchard.ContentManagement;
@@ -40,20 +41,53 @@ namespace Orchard.Recipes.RecipeHandlers {
return;
}
var site = _siteService.GetSiteSettings();
var siteContentItem = _siteService.GetSiteSettings().ContentItem;
var importContentSession = new ImportContentSession(_contentManager);
var context = new ImportContentContext(site.ContentItem, recipeContext.RecipeStep.Step, importContentSession);
var context = new ImportContentContext(siteContentItem, recipeContext.RecipeStep.Step, importContentSession);
foreach (var contentHandler in Handlers) {
contentHandler.Importing(context);
}
foreach (var contentPart in siteContentItem.Parts) {
var partElement = context.Data.Element(contentPart.PartDefinition.Name);
if (partElement == null) {
continue;
}
ImportSettingPart(contentPart, partElement);
}
foreach (var contentHandler in Handlers) {
contentHandler.Imported(context);
}
recipeContext.Executed = true;
}
private void ImportSettingPart(ContentPart sitePart, XElement element) {
foreach (var attribute in element.Attributes()) {
var attributeName = attribute.Name.LocalName;
var attributeValue = attribute.Value;
var property = sitePart.GetType().GetProperty(attributeName);
if (property == null) {
throw new InvalidOperationException(string.Format("Could set setting {0} for part {1} because it was not found.", attributeName, sitePart.PartDefinition.Name));
}
var propertyType = property.PropertyType;
if (propertyType == typeof(string)) {
property.SetValue(sitePart, attributeValue, null);
}
else if (propertyType == typeof(bool)) {
property.SetValue(sitePart, Boolean.Parse(attributeValue), null);
}
else if (propertyType == typeof(int)) {
property.SetValue(sitePart, Int32.Parse(attributeValue), null);
}
}
}
}
}

View File

@@ -65,7 +65,6 @@ namespace Orchard.Search.Drivers {
}
protected override void Exporting(SearchSettingsPart part, ExportContentContext context) {
DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
context.Element(part.PartDefinition.Name).Add(new XAttribute("SearchedFields", string.Join(",", part.SearchedFields)));
}
@@ -73,10 +72,10 @@ namespace Orchard.Search.Drivers {
var xElement = context.Data.Element(part.PartDefinition.Name);
if (xElement == null) return;
DefaultSettingsPartImportExport.ImportSettingPart(part, xElement);
var searchedFields = xElement.Attribute("SearchedFields");
part.SearchedFields = searchedFields.Value.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries);
searchedFields.Remove();
part.SearchedFields = searchedFields.Value.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
}
}
}

View File

@@ -1,28 +0,0 @@
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.Settings;
using Orchard.Themes.Models;
namespace Orchard.Themes.Drivers
{
public class ThemeSiteSettingsPartDriver : ContentPartDriver<ThemeSiteSettingsPart> {
public ThemeSiteSettingsPartDriver()
{
T = NullLocalizer.Instance;
Logger = NullLogger.Instance;
}
public Localizer T { get; set; }
public ILogger Logger { get; set; }
protected override void Exporting(ThemeSiteSettingsPart part, ExportContentContext context) {
DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
}
protected override void Importing(ThemeSiteSettingsPart part, ImportContentContext context) {
DefaultSettingsPartImportExport.ImportSettingPart(part, context.Data.Element(part.PartDefinition.Name));
}
}
}

View File

@@ -20,11 +20,6 @@
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<TargetFrameworkProfile />
<UseIISExpress>false</UseIISExpress>
<IISExpressSSLPort />
<IISExpressAnonymousAuthentication />
<IISExpressWindowsAuthentication />
<IISExpressUseClassicPipelineMode />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -53,13 +48,10 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\lib\aspnetmvc\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Compile Include="AdminMenu.cs" />
<Compile Include="Commands\ThemeCommands.cs" />
<Compile Include="Drivers\ThemeSiteSettingsPartDriver.cs" />
<Compile Include="Events\IExtensionDisplayEventHandler.cs" />
<Compile Include="Migrations.cs" />
<Compile Include="Models\ThemeEntry.cs" />

View File

@@ -1,24 +0,0 @@
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.Settings;
using Orchard.Users.Models;
namespace Orchard.Users.Drivers
{
public class RegistrationSettingsPartDriver : ContentPartDriver<RegistrationSettingsPart> {
public RegistrationSettingsPartDriver()
{
T = NullLocalizer.Instance;
Logger = NullLogger.Instance;
}
public Localizer T { get; set; }
public ILogger Logger { get; set; }
protected override void Exporting(RegistrationSettingsPart part, ExportContentContext context) {
DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
}
}
}

View File

@@ -64,7 +64,6 @@
<Compile Include="Commands\UserCommands.cs" />
<Compile Include="Controllers\AccountController.cs" />
<Compile Include="Controllers\AdminController.cs" />
<Compile Include="Drivers\RegistrationSettingsPartDriver.cs" />
<Compile Include="Drivers\UserPartDriver.cs" />
<Compile Include="Migrations.cs" />
<Compile Include="Events\UserContext.cs" />

View File

@@ -1,65 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using Orchard.ContentManagement.Handlers;
using Orchard.Recipes.Models;
using Orchard.Settings;
namespace Orchard.ContentManagement.Drivers
{
public class DefaultSettingsPartImportExport
{
public static void ExportSettingsPart(ContentPart sitePart, ExportContentContext context) {
var xAttributes = new List<object>();
foreach (var property in sitePart.GetType().GetProperties()) {
var propertyType = property.PropertyType;
// Supported types (we also know they are not indexed properties).
if (propertyType == typeof (string) || propertyType == typeof (bool) || propertyType == typeof (int)) {
// Exclude read-only properties.
if (property.GetSetMethod() != null) {
var value = property.GetValue(sitePart, null);
if (value == null)
continue;
xAttributes.Add(new XAttribute(property.Name, value));
}
}
}
if(xAttributes.Any()) {
context.Element(sitePart.PartDefinition.Name).Add(xAttributes.ToArray());
}
}
public static void ImportSettingPart(ContentPart sitePart, XElement element) {
if(element == null)
return;
foreach (var attribute in element.Attributes()) {
var attributeName = attribute.Name.LocalName;
var attributeValue = attribute.Value;
var property = sitePart.GetType().GetProperty(attributeName);
if (property == null) {
throw new InvalidOperationException(string.Format("Could set setting {0} for part {1} because it was not found.", attributeName, sitePart.PartDefinition.Name));
}
var propertyType = property.PropertyType;
if (propertyType == typeof(string)) {
property.SetValue(sitePart, attributeValue, null);
}
else if (propertyType == typeof(bool)) {
property.SetValue(sitePart, Boolean.Parse(attributeValue), null);
}
else if (propertyType == typeof(int)) {
property.SetValue(sitePart, Int32.Parse(attributeValue), null);
}
}
}
}
}

View File

@@ -302,7 +302,6 @@
<Compile Include="Services\DefaultJsonConverter.cs" />
<Compile Include="Services\IJsonConverter.cs" />
<Compile Include="Settings\CurrentSiteWorkContext.cs" />
<Compile Include="ContentManagement\Drivers\DefaultSettingsPartImportExport.cs" />
<Compile Include="Settings\ResourceDebugMode.cs" />
<Compile Include="Themes\CurrentThemeWorkContext.cs" />
<Compile Include="Themes\ThemeManager.cs" />