diff --git a/src/Umbraco.Core/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs
index 7ecac29782..7425cdf640 100644
--- a/src/Umbraco.Core/Constants-Conventions.cs
+++ b/src/Umbraco.Core/Constants-Conventions.cs
@@ -166,6 +166,11 @@ namespace Umbraco.Core
public const string FailedPasswordAttemptsLabel = "Failed Password Attempts";
+ ///
+ /// Group name to put the membership properties on
+ ///
+ internal const string StandardPropertiesGroupName = "Membership";
+
internal static Dictionary GetStandardPropertyTypeStubs()
{
return new Dictionary
diff --git a/src/Umbraco.Core/Models/Member.cs b/src/Umbraco.Core/Models/Member.cs
index 48683071d6..f06a94c326 100644
--- a/src/Umbraco.Core/Models/Member.cs
+++ b/src/Umbraco.Core/Models/Member.cs
@@ -141,12 +141,22 @@ namespace Umbraco.Core.Models
{
get
{
+ if (Properties.Contains(Constants.Conventions.Member.PasswordQuestion) == false)
+ {
+ return default(string);
+ }
+
return Properties[Constants.Conventions.Member.PasswordQuestion].Value == null
? string.Empty
: Properties[Constants.Conventions.Member.PasswordQuestion].Value.ToString();
}
set
{
+ if (Properties.Contains(Constants.Conventions.Member.PasswordQuestion) == false)
+ {
+ return;
+ }
+
Properties[Constants.Conventions.Member.PasswordQuestion].Value = value;
}
}
@@ -163,12 +173,22 @@ namespace Umbraco.Core.Models
{
get
{
+ if (Properties.Contains(Constants.Conventions.Member.PasswordAnswer) == false)
+ {
+ return default(string);
+ }
+
return Properties[Constants.Conventions.Member.PasswordAnswer].Value == null
? string.Empty
: Properties[Constants.Conventions.Member.PasswordAnswer].Value.ToString();
}
set
{
+ if (Properties.Contains(Constants.Conventions.Member.PasswordAnswer) == false)
+ {
+ return;
+ }
+
Properties[Constants.Conventions.Member.PasswordAnswer].Value = value;
}
}
@@ -185,12 +205,22 @@ namespace Umbraco.Core.Models
{
get
{
+ if (Properties.Contains(Constants.Conventions.Member.Comments) == false)
+ {
+ return default(string);
+ }
+
return Properties[Constants.Conventions.Member.Comments].Value == null
? string.Empty
: Properties[Constants.Conventions.Member.Comments].Value.ToString();
}
set
{
+ if (Properties.Contains(Constants.Conventions.Member.Comments) == false)
+ {
+ return;
+ }
+
Properties[Constants.Conventions.Member.Comments].Value = value;
}
}
@@ -207,6 +237,12 @@ namespace Umbraco.Core.Models
{
get
{
+ if (Properties.Contains(Constants.Conventions.Member.IsApproved) == false)
+ {
+ //I guess we'll leave them approved by default!
+ return true;
+ }
+
var tryConvert = Properties[Constants.Conventions.Member.IsApproved].Value.TryConvertTo();
if (tryConvert.Success)
{
@@ -216,6 +252,11 @@ namespace Umbraco.Core.Models
}
set
{
+ if (Properties.Contains(Constants.Conventions.Member.IsApproved) == false)
+ {
+ return;
+ }
+
Properties[Constants.Conventions.Member.IsApproved].Value = value;
}
}
@@ -232,6 +273,12 @@ namespace Umbraco.Core.Models
{
get
{
+ if (Properties.Contains(Constants.Conventions.Member.IsLockedOut) == false)
+ {
+ //I guess we'll not lock them out by default!
+ return false;
+ }
+
var tryConvert = Properties[Constants.Conventions.Member.IsLockedOut].Value.TryConvertTo();
if (tryConvert.Success)
{
@@ -241,6 +288,11 @@ namespace Umbraco.Core.Models
}
set
{
+ if (Properties.Contains(Constants.Conventions.Member.IsLockedOut) == false)
+ {
+ return;
+ }
+
Properties[Constants.Conventions.Member.IsLockedOut].Value = value;
}
}
@@ -257,6 +309,11 @@ namespace Umbraco.Core.Models
{
get
{
+ if (Properties.Contains(Constants.Conventions.Member.LastLoginDate) == false)
+ {
+ return default(DateTime);
+ }
+
var tryConvert = Properties[Constants.Conventions.Member.LastLoginDate].Value.TryConvertTo();
if (tryConvert.Success)
{
@@ -266,6 +323,11 @@ namespace Umbraco.Core.Models
}
set
{
+ if (Properties.Contains(Constants.Conventions.Member.LastLoginDate) == false)
+ {
+ return;
+ }
+
Properties[Constants.Conventions.Member.LastLoginDate].Value = value;
}
}
@@ -282,6 +344,11 @@ namespace Umbraco.Core.Models
{
get
{
+ if (Properties.Contains(Constants.Conventions.Member.LastPasswordChangeDate) == false)
+ {
+ return default(DateTime);
+ }
+
var tryConvert = Properties[Constants.Conventions.Member.LastPasswordChangeDate].Value.TryConvertTo();
if (tryConvert.Success)
{
@@ -291,6 +358,11 @@ namespace Umbraco.Core.Models
}
set
{
+ if (Properties.Contains(Constants.Conventions.Member.LastPasswordChangeDate) == false)
+ {
+ return;
+ }
+
Properties[Constants.Conventions.Member.LastPasswordChangeDate].Value = value;
}
}
@@ -307,6 +379,11 @@ namespace Umbraco.Core.Models
{
get
{
+ if (Properties.Contains(Constants.Conventions.Member.LastLockoutDate) == false)
+ {
+ return default(DateTime);
+ }
+
var tryConvert = Properties[Constants.Conventions.Member.LastLockoutDate].Value.TryConvertTo();
if (tryConvert.Success)
{
@@ -316,6 +393,11 @@ namespace Umbraco.Core.Models
}
set
{
+ if (Properties.Contains(Constants.Conventions.Member.LastLockoutDate) == false)
+ {
+ return;
+ }
+
Properties[Constants.Conventions.Member.LastLockoutDate].Value = value;
}
}
@@ -333,6 +415,11 @@ namespace Umbraco.Core.Models
{
get
{
+ if (Properties.Contains(Constants.Conventions.Member.FailedPasswordAttempts) == false)
+ {
+ return 0;
+ }
+
var tryConvert = Properties[Constants.Conventions.Member.FailedPasswordAttempts].Value.TryConvertTo();
if (tryConvert.Success)
{
@@ -342,7 +429,12 @@ namespace Umbraco.Core.Models
}
set
{
- Properties[Constants.Conventions.Member.LastLockoutDate].Value = value;
+ if (Properties.Contains(Constants.Conventions.Member.FailedPasswordAttempts) == false)
+ {
+ return;
+ }
+
+ Properties[Constants.Conventions.Member.FailedPasswordAttempts].Value = value;
}
}
diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs
index 5b48bcb768..48e0178392 100644
--- a/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs
@@ -168,10 +168,11 @@ namespace Umbraco.Core.Persistence.Repositories
((MemberType)entity).AddingEntity();
//By Convention we add 9 stnd PropertyTypes to an Umbraco MemberType
+ entity.AddPropertyGroup(Constants.Conventions.Member.StandardPropertiesGroupName);
var standardPropertyTypes = Constants.Conventions.Member.GetStandardPropertyTypeStubs();
foreach (var standardPropertyType in standardPropertyTypes)
{
- entity.AddPropertyType(standardPropertyType.Value);
+ entity.AddPropertyType(standardPropertyType.Value, Constants.Conventions.Member.StandardPropertiesGroupName);
}
var factory = new MemberTypeFactory(NodeObjectTypeId);
diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs
index 3937dcb8c9..ecaaa4bab9 100644
--- a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs
+++ b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs
@@ -223,10 +223,17 @@ namespace Umbraco.Tests.Persistence.Repositories
var sut = repository.Get(member.Id);
- Assert.That(sut.ContentType.PropertyGroups.Count(), Is.EqualTo(1));
+ Assert.That(sut.ContentType.PropertyGroups.Count(), Is.EqualTo(2));
Assert.That(sut.ContentType.PropertyTypes.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count));
Assert.That(sut.Properties.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count));
Assert.That(sut.Properties.Any(x => x.HasIdentity == false || x.Id == 0), Is.False);
+ var grp = sut.PropertyGroups.FirstOrDefault(x => x.Name == Constants.Conventions.Member.StandardPropertiesGroupName);
+ Assert.IsNotNull(grp);
+ var aliases = Constants.Conventions.Member.GetStandardPropertyTypeStubs().Select(x => x.Key).ToArray();
+ foreach (var p in sut.PropertyTypes.Where(x => aliases.Contains(x.Alias)))
+ {
+ Assert.AreEqual(grp.Id, p.PropertyGroupId.Value);
+ }
}
}