Merge from dev.

This commit is contained in:
Daniel Stolt
2015-07-11 20:59:35 +01:00
16 changed files with 143 additions and 45 deletions

View File

@@ -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"

View File

@@ -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 ? "<strong>" + title + "</strong>" : 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("<strong>" + title + "</strong>") : Html.ItemEditLink(title, contentItemId), eventPastTense)
}
else if (isRemoved) {
@T("The {0} <strong>{1}</strong> was {2}.", contentType.ToLower(), title, eventPastTense)

View File

@@ -3,22 +3,22 @@
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<remove name="host" />
<remove name="pages" />
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<remove name="host"/>
<remove name="pages"/>
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false"/>
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false"/>
</sectionGroup>
</configSections>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<pages pageBaseType="Orchard.Mvc.ViewEngines.Razor.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
<add namespace="System.Web.Mvc"/>
<add namespace="System.Web.Mvc.Ajax"/>
<add namespace="System.Web.Mvc.Html"/>
<add namespace="System.Web.Routing"/>
<add namespace="System.Web.WebPages"/>
<add namespace="System.Linq"/>
<add namespace="System.Collections.Generic"/>
<add namespace="Orchard.Mvc.Html"/>
@@ -32,7 +32,7 @@
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Mvc, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Web.Mvc, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="Orchard.Framework"/>
<add assembly="Orchard.Core"/>
@@ -41,4 +41,20 @@
</compilation>
</system.web>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="NHibernate" publicKeyToken="AA95F207798DFDB4" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.4000" newVersion="4.0.0.4000"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Iesi.Collections" publicKeyToken="AA95F207798DFDB4" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Autofac" publicKeyToken="17863AF14B0044DA" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -82,7 +82,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 {

View File

@@ -109,9 +109,7 @@
<ItemGroup>
<Content Include="Views\Admin\Export.cshtml" />
</ItemGroup>
<ItemGroup>
<Folder Include="RecipeHandlers\" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
@@ -137,11 +135,11 @@
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -4,17 +4,15 @@ using System.Linq;
using System.Xml;
using System.Xml.Linq;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.MetaData;
using Orchard.ContentManagement.MetaData.Models;
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 {
@@ -39,6 +37,7 @@ namespace Orchard.ImportExport.Services {
IShellDescriptorManager shellDescriptorManager,
IClock clock,
IEnumerable<IExportEventHandler> exportEventHandlers) {
_orchardServices = orchardServices;
_contentDefinitionManager = contentDefinitionManager;
_contentDefinitionWriter = contentDefinitionWriter;
@@ -66,7 +65,7 @@ namespace Orchard.ImportExport.Services {
//items need to be retrieved
IEnumerable<ContentItem> 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);
@@ -121,19 +120,22 @@ namespace Orchard.ImportExport.Services {
var typesToExport = _contentDefinitionManager.ListTypeDefinitions()
.Where(typeDefinition => contentTypes.Contains(typeDefinition.Name))
.ToList();
var partsToExport = new List<string>();
var partsToExport = new Dictionary<string, ContentPartDefinition>();
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);
}
@@ -141,7 +143,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
@@ -149,6 +151,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()) {
@@ -161,11 +164,12 @@ namespace Orchard.ImportExport.Services {
}
}
exportedElements = exportedElements.OrderBy(x => x.Name.LocalName).ToList();
return new XElement("Settings", exportedElements);
}
private IEnumerable<XAttribute> 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).
@@ -188,9 +192,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 = _orchardServices.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)

View File

@@ -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;

View File

@@ -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<IEnumerable<MediaPart>> _contentItems;
public int[] Ids {
@@ -17,7 +17,7 @@ namespace Orchard.MediaLibrary.Fields {
public IEnumerable<MediaPart> MediaParts {
get {
return _contentItems.Value;
return _contentItems != null ? _contentItems.Value : Enumerable.Empty<MediaPart>();
}
}

View File

@@ -0,0 +1,39 @@
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<string>)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).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) {
}
}
}

View File

@@ -0,0 +1,14 @@
using System.Collections.Generic;
using Orchard.Events;
namespace Orchard.Modules.ImportExport {
public interface ICustomExportStep : IEventHandler {
void Register(IList<string> steps);
}
public class FeaturesStep : ICustomExportStep {
public void Register(IList<string> steps) {
steps.Add("Features");
}
}
}

View File

@@ -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

View File

@@ -25,6 +25,7 @@
<IISExpressAnonymousAuthentication />
<IISExpressWindowsAuthentication />
<IISExpressUseClassicPipelineMode />
<UseGlobalApplicationHostFile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -64,12 +65,15 @@
<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="Data\Migration\DataMigrationNotificationProvider.cs" />
<Compile Include="Events\IExtensionDisplayEventHandler.cs" />
<Compile Include="ImportExport\FeaturesStep.cs" />
<Compile Include="ImportExport\FeaturesExportHandler.cs" />
<Compile Include="ResourceManifest.cs" />
<Compile Include="Commands\FeatureCommands.cs" />
<Compile Include="Controllers\AdminController.cs" />

View File

@@ -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)))));

View File

@@ -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),

View File

@@ -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

View File

@@ -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);