PartDefinitions { get; set; }
+ public string ExportText { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.DevTools/Views/Home/Index.aspx b/src/Orchard.Web/Modules/Orchard.DevTools/Views/Home/Index.aspx
index 741c0cb7a..dab5ed155 100644
--- a/src/Orchard.Web/Modules/Orchard.DevTools/Views/Home/Index.aspx
+++ b/src/Orchard.Web/Modules/Orchard.DevTools/Views/Home/Index.aspx
@@ -2,4 +2,5 @@
<%@ Import Namespace="Orchard.Mvc.ViewModels"%>
<%=Html.TitleForPage(T("Dev Tools").ToString()) %>
<%=Html.ActionLink(T("Contents").ToString(), "Index", "Content") %>
+<%=Html.ActionLink(T("Metadata").ToString(), "Index", "Metadata") %>
<%=Html.ActionLink(T("Test Unauthorized Request").ToString(), "NotAuthorized", "Home")%>
diff --git a/src/Orchard.Web/Modules/Orchard.DevTools/Views/Metadata/Index.aspx b/src/Orchard.Web/Modules/Orchard.DevTools/Views/Metadata/Index.aspx
new file mode 100644
index 000000000..7c119bf89
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.DevTools/Views/Metadata/Index.aspx
@@ -0,0 +1,44 @@
+<%@ Page Language="C#" Inherits="Orchard.Mvc.ViewPage" %>
+
+<%@ Import Namespace="Orchard.DevTools.ViewModels" %>
+
+
+ Metadata
+
+ Content Type Definitions
+
+ <%foreach (var type in Model.TypeDefinitions) {%>
+ -
+ <%:type.Name %>
+
+ <%foreach (var part in type.Parts) {%>
+ -
+ <%:part.PartDefinition.Name %>
+ <%
+ }%>
+
+
+ <%
+ }%>
+
+
+ Content Part Definitions
+
+ <%foreach (var part in Model.PartDefinitions) {%>
+ -
+ <%:part.Name %>
+ <%
+ }%>
+
+
+Exported as xml
+<% using (Html.BeginFormAntiForgeryPost()) { %>
+<%:Html.TextAreaFor(m=>m.ExportText, new{style="width:100%;height:640px;"}) %>
+
+" />
+<%} %>
diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj
index 6ab56cf17..9e3facaa7 100644
--- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj
+++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Orchard.MultiTenancy.csproj
@@ -96,6 +96,7 @@
{2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6}
Orchard.Framework
+ False
diff --git a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AdminController.cs
index e85de7d77..5578531ab 100644
--- a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AdminController.cs
+++ b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AdminController.cs
@@ -10,6 +10,7 @@ using Orchard.Users.Services;
using Orchard.Users.ViewModels;
namespace Orchard.Users.Controllers {
+ [ValidateInput(false)]
public class AdminController : Controller, IUpdateModel {
private readonly IMembershipService _membershipService;
private readonly IUserService _userService;
diff --git a/src/Orchard/ContentManagement/MetaData/IContentDefinitionReader.cs b/src/Orchard/ContentManagement/MetaData/IContentDefinitionReader.cs
new file mode 100644
index 000000000..c24691de3
--- /dev/null
+++ b/src/Orchard/ContentManagement/MetaData/IContentDefinitionReader.cs
@@ -0,0 +1,17 @@
+using System.Xml.Linq;
+using Orchard.ContentManagement.MetaData.Builders;
+using Orchard.ContentManagement.MetaData.Models;
+
+namespace Orchard.ContentManagement.MetaData {
+ public interface IContentDefinitionReader : IDependency {
+ void Merge(XElement source, ContentTypeDefinitionBuilder builder);
+ }
+
+ public static class ContentDefinitionReaderExtensions {
+ public static ContentTypeDefinition Import(this IContentDefinitionReader reader, XElement source) {
+ var target = new ContentTypeDefinitionBuilder();
+ reader.Merge(source, target);
+ return target.Build();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard/ContentManagement/MetaData/IContentDefinitionWriter.cs b/src/Orchard/ContentManagement/MetaData/IContentDefinitionWriter.cs
new file mode 100644
index 000000000..bc2b6f908
--- /dev/null
+++ b/src/Orchard/ContentManagement/MetaData/IContentDefinitionWriter.cs
@@ -0,0 +1,9 @@
+using System.Xml.Linq;
+using Orchard.ContentManagement.MetaData.Models;
+
+namespace Orchard.ContentManagement.MetaData {
+ public interface IContentDefinitionWriter : IDependency{
+ XElement Export(ContentTypeDefinition typeDefinition);
+ XElement Export(ContentPartDefinition partDefinition);
+ }
+}
diff --git a/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs
new file mode 100644
index 000000000..ad1037632
--- /dev/null
+++ b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionReader.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Xml;
+using System.Xml.Linq;
+using Orchard.ContentManagement.MetaData.Builders;
+
+namespace Orchard.ContentManagement.MetaData.Services {
+ public class ContentDefinitionReader : IContentDefinitionReader {
+ private readonly IMapper> _settingsReader;
+
+ public ContentDefinitionReader(IMapper> settingsReader) {
+ _settingsReader = settingsReader;
+ }
+
+ public void Merge(XElement source, ContentTypeDefinitionBuilder builder) {
+ builder.Named(XmlConvert.DecodeName(source.Name.LocalName));
+ foreach (var setting in _settingsReader.Map(source)) {
+ builder.WithSetting(setting.Key, setting.Value);
+ }
+ foreach (var iter in source.Elements()) {
+ var partElement = iter;
+ builder.WithPart(
+ XmlConvert.DecodeName(partElement.Name.LocalName),
+ partBuilder => {
+ foreach (var setting in _settingsReader.Map(partElement)) {
+ partBuilder.WithSetting(setting.Key, setting.Value);
+ }
+ });
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs
new file mode 100644
index 000000000..fc61eb16e
--- /dev/null
+++ b/src/Orchard/ContentManagement/MetaData/Services/ContentDefinitionWriter.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Xml;
+using System.Xml.Linq;
+using Orchard.ContentManagement.MetaData.Models;
+
+namespace Orchard.ContentManagement.MetaData.Services {
+ public class ContentDefinitionWriter : IContentDefinitionWriter {
+ private readonly IMapper, XElement> _settingsWriter;
+
+ public ContentDefinitionWriter(IMapper, XElement> settingsWriter) {
+ _settingsWriter = settingsWriter;
+ }
+
+ public XElement Export(ContentTypeDefinition typeDefinition) {
+ var typeElement = NewElement(typeDefinition.Name, typeDefinition.Settings);
+
+ foreach(var typePart in typeDefinition.Parts) {
+ typeElement.Add(NewElement(typePart.PartDefinition.Name, typePart.Settings));
+ }
+ return typeElement;
+ }
+
+ public XElement Export(ContentPartDefinition partDefinition) {
+ var partElement = NewElement(partDefinition.Name, partDefinition.Settings);
+ foreach(var partField in partDefinition.Fields) {
+ var partFieldElement = NewElement(partField.Name, partField.Settings);
+ partFieldElement.SetAttributeValue("FieldType", partField.FieldDefinition.Name);
+ partElement.Add(partFieldElement);
+ }
+ return partElement;
+ }
+
+ private XElement NewElement(string name, IDictionary settings) {
+ var element = new XElement(XmlConvert.EncodeLocalName(name));
+ foreach(var settingAttribute in _settingsWriter.Map(settings).Attributes()) {
+ element.Add(settingAttribute);
+ }
+ return element;
+ }
+ }
+}
diff --git a/src/Orchard/ContentManagement/MetaData/Services/SettingsFormatter.cs b/src/Orchard/ContentManagement/MetaData/Services/SettingsFormatter.cs
index f7a32f8dc..293a10018 100644
--- a/src/Orchard/ContentManagement/MetaData/Services/SettingsFormatter.cs
+++ b/src/Orchard/ContentManagement/MetaData/Services/SettingsFormatter.cs
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Linq;
+using System.Xml;
using System.Xml.Linq;
namespace Orchard.ContentManagement.MetaData.Services {
@@ -11,14 +12,14 @@ namespace Orchard.ContentManagement.MetaData.Services {
if (source == null)
return new Dictionary();
- return source.Attributes().ToDictionary(attr => attr.Name.LocalName, attr => attr.Value);
+ return source.Attributes().ToDictionary(attr => XmlConvert.DecodeName(attr.Name.LocalName), attr => attr.Value);
}
public XElement Map(IDictionary source) {
if (source == null)
return new XElement("settings");
- return new XElement("settings", source.Select(kv => new XAttribute(kv.Key, kv.Value)));
+ return new XElement("settings", source.Select(kv => new XAttribute(XmlConvert.EncodeLocalName(kv.Key), kv.Value)));
}
}
}
diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj
index 80aea76e8..6195a1980 100644
--- a/src/Orchard/Orchard.Framework.csproj
+++ b/src/Orchard/Orchard.Framework.csproj
@@ -296,7 +296,10 @@
Code
+
+
+
Code
@@ -304,6 +307,7 @@
Code
+
Code