From 1ca5fa54831ea49ecb0186cd29e6c571d4c8dc50 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 27 Mar 2014 06:52:05 -0700 Subject: [PATCH] Fixing shifted content versionning --- .../Modules/Orchard.Users/Models/UserPart.cs | 4 +- src/Orchard/ContentManagement/ContentPart.cs | 7 ++ .../ContentManagement/InfosetHelper.cs | 79 +++++++++++-------- 3 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Users/Models/UserPart.cs b/src/Orchard.Web/Modules/Orchard.Users/Models/UserPart.cs index f3ab94fb4..5abc97dce 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Models/UserPart.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Models/UserPart.cs @@ -49,12 +49,12 @@ namespace Orchard.Users.Models { } public UserStatus RegistrationStatus { - get { return Retrieve(x => x.RegistrationStatus); } + get { return Retrieve(x => x.RegistrationStatus, UserStatus.Approved); } set { Store(x => x.RegistrationStatus, value); } } public UserStatus EmailStatus { - get { return Retrieve(x => x.EmailStatus); } + get { return Retrieve(x => x.EmailStatus, UserStatus.Approved); } set { Store(x => x.EmailStatus, value); } } } diff --git a/src/Orchard/ContentManagement/ContentPart.cs b/src/Orchard/ContentManagement/ContentPart.cs index 05ac134a7..241edfa55 100644 --- a/src/Orchard/ContentManagement/ContentPart.cs +++ b/src/Orchard/ContentManagement/ContentPart.cs @@ -116,6 +116,13 @@ namespace Orchard.ContentManagement { return InfosetHelper.Retrieve(this, targetExpression, defaultExpression); } + protected TProperty Retrieve( + Expression> targetExpression, + TProperty defaultValue) { + + return InfosetHelper.Retrieve(this, targetExpression, (Func)(x => defaultValue)); + } + protected ContentPart Store( Expression> targetExpression, TProperty value) { diff --git a/src/Orchard/ContentManagement/InfosetHelper.cs b/src/Orchard/ContentManagement/InfosetHelper.cs index de977a3d6..379c2a665 100644 --- a/src/Orchard/ContentManagement/InfosetHelper.cs +++ b/src/Orchard/ContentManagement/InfosetHelper.cs @@ -2,6 +2,7 @@ using System.Linq.Expressions; using System.Xml.Linq; using Orchard.ContentManagement.FieldStorage.InfosetStorage; +using Orchard.ContentManagement.Records; using Orchard.Utility; namespace Orchard.ContentManagement { @@ -34,6 +35,50 @@ namespace Orchard.ContentManagement { return el == null ? default(TProperty) : el.Attr(name); } + public static TProperty Retrieve(this TPart contentPart, + Expression> targetExpression) + where TPart : ContentPart { + + var getter = ReflectionHelper.GetGetter(targetExpression); + return contentPart.Retrieve(targetExpression, getter); + } + + public static TProperty Retrieve(this TPart contentPart, + Expression> targetExpression, + Delegate defaultExpression) + where TPart : ContentPart { + + var propertyInfo = ReflectionHelper.GetPropertyInfo(targetExpression); + var name = propertyInfo.Name; + + var infosetPart = contentPart.As(); + var versioned = typeof(ContentPartVersionRecord).IsAssignableFrom(typeof(TRecord)); + + if (infosetPart == null) { + // Property has never been stored. Get it from the default expression and store that. + var defaultValue = defaultExpression == null + ? default(TProperty) + : (TProperty)defaultExpression.DynamicInvoke(contentPart.Record); + contentPart.Store(name, defaultValue, versioned); + return defaultValue; + } + else { + var infoset = versioned ? infosetPart.VersionInfoset.Element : infosetPart.Infoset.Element; + var el = infoset.Element(contentPart.GetType().Name); + + if (el == null || el.Attribute(name) == null) { + var defaultValue = defaultExpression == null + ? default(TProperty) + : (TProperty)defaultExpression.DynamicInvoke(contentPart.Record); + + contentPart.Store(name, defaultValue, versioned); + return defaultValue; + } + + return el.Attr(name); + } + } + public static void Store(this TPart contentPart, Expression> targetExpression, TProperty value, bool versioned = false) where TPart : ContentPart { @@ -66,37 +111,6 @@ namespace Orchard.ContentManagement { partElement.Attr(name, value); } - public static TProperty Retrieve(this TPart contentPart, - Expression> targetExpression) - where TPart : ContentPart { - - var getter = ReflectionHelper.GetGetter(targetExpression); - return contentPart.Retrieve(targetExpression, getter); - } - - public static TProperty Retrieve(this TPart contentPart, - Expression> targetExpression, - Delegate defaultExpression) - where TPart : ContentPart { - - var propertyInfo = ReflectionHelper.GetPropertyInfo(targetExpression); - var name = propertyInfo.Name; - - var infosetPart = contentPart.As(); - var el = infosetPart == null - ? null - : infosetPart.Infoset.Element.Element(contentPart.GetType().Name); - if (el == null || el.Attribute(name) == null) { - // Property has never been stored. Get it from the default expression and store that. - var defaultValue = defaultExpression == null - ? default(TProperty) - : (TProperty)defaultExpression.DynamicInvoke(contentPart.Record); - contentPart.Store(name, defaultValue); - return defaultValue; - } - return el.Attr(name); - } - public static void Store(this TPart contentPart, Expression> targetExpression, TProperty value) @@ -104,8 +118,9 @@ namespace Orchard.ContentManagement { var propertyInfo = ReflectionHelper.GetPropertyInfo(targetExpression); var name = propertyInfo.Name; + var versioned = typeof(ContentPartVersionRecord).IsAssignableFrom(typeof(TRecord)); propertyInfo.SetValue(contentPart.Record, value, null); - contentPart.Store(name, value); + contentPart.Store(name, value, versioned); } } }