diff --git a/src/Umbraco.Core/Models/PublishedContent/IPublishedContentTypeFactory.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedContentTypeFactory.cs
index 816bfdbb01..89009ac7b8 100644
--- a/src/Umbraco.Core/Models/PublishedContent/IPublishedContentTypeFactory.cs
+++ b/src/Umbraco.Core/Models/PublishedContent/IPublishedContentTypeFactory.cs
@@ -30,6 +30,16 @@
/// Is used by constructor to create special property types.
IPublishedPropertyType CreatePropertyType(IPublishedContentType contentType, string propertyTypeAlias, int dataTypeId, ContentVariation variations);
+ ///
+ /// Creates a core (non-user) published property type.
+ ///
+ /// The published content type owning the property.
+ /// The property type alias.
+ /// The datatype identifier.
+ /// The variations.
+ /// Is used by constructor to create special property types.
+ IPublishedPropertyType CreateCorePropertyType(IPublishedContentType contentType, string propertyTypeAlias, int dataTypeId, ContentVariation variations);
+
///
/// Gets a published datatype.
///
diff --git a/src/Umbraco.Core/Models/PublishedContent/PublishedContentType.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedContentType.cs
index 3b03cfc9ea..b11e991118 100644
--- a/src/Umbraco.Core/Models/PublishedContent/PublishedContentType.cs
+++ b/src/Umbraco.Core/Models/PublishedContent/PublishedContentType.cs
@@ -92,26 +92,26 @@ namespace Umbraco.Core.Models.PublishedContent
{
var aliases = new HashSet(propertyTypes.Select(x => x.Alias), StringComparer.OrdinalIgnoreCase);
- foreach ((var alias, (var dataTypeId, var editorAlias)) in BuiltinMemberProperties)
+ foreach (var (alias, dataTypeId) in BuiltinMemberProperties)
{
if (aliases.Contains(alias)) continue;
- propertyTypes.Add(factory.CreatePropertyType(this, alias, dataTypeId, ContentVariation.Nothing));
+ propertyTypes.Add(factory.CreateCorePropertyType(this, alias, dataTypeId, ContentVariation.Nothing));
}
}
// TODO: this list somehow also exists in constants, see memberTypeRepository => remove duplicate!
- private static readonly Dictionary BuiltinMemberProperties = new Dictionary
+ private static readonly Dictionary BuiltinMemberProperties = new Dictionary
{
- { "Email", (Constants.DataTypes.Textbox, Constants.PropertyEditors.Aliases.TextBox) },
- { "Username", (Constants.DataTypes.Textbox, Constants.PropertyEditors.Aliases.TextBox) },
- { "PasswordQuestion", (Constants.DataTypes.Textbox, Constants.PropertyEditors.Aliases.TextBox) },
- { "Comments", (Constants.DataTypes.Textbox, Constants.PropertyEditors.Aliases.TextBox) },
- { "IsApproved", (Constants.DataTypes.Boolean, Constants.PropertyEditors.Aliases.Boolean) },
- { "IsLockedOut", (Constants.DataTypes.Boolean, Constants.PropertyEditors.Aliases.Boolean) },
- { "LastLockoutDate", (Constants.DataTypes.DateTime, Constants.PropertyEditors.Aliases.DateTime) },
- { "CreateDate", (Constants.DataTypes.DateTime, Constants.PropertyEditors.Aliases.DateTime) },
- { "LastLoginDate", (Constants.DataTypes.DateTime, Constants.PropertyEditors.Aliases.DateTime) },
- { "LastPasswordChangeDate", (Constants.DataTypes.DateTime, Constants.PropertyEditors.Aliases.DateTime) },
+ { "Email", Constants.DataTypes.Textbox },
+ { "Username", Constants.DataTypes.Textbox },
+ { "PasswordQuestion", Constants.DataTypes.Textbox },
+ { "Comments", Constants.DataTypes.Textbox },
+ { "IsApproved", Constants.DataTypes.Boolean },
+ { "IsLockedOut", Constants.DataTypes.Boolean },
+ { "LastLockoutDate", Constants.DataTypes.DateTime },
+ { "CreateDate", Constants.DataTypes.DateTime },
+ { "LastLoginDate", Constants.DataTypes.DateTime },
+ { "LastPasswordChangeDate", Constants.DataTypes.DateTime },
};
#region Content type
diff --git a/src/Umbraco.Core/Models/PublishedContent/PublishedContentTypeFactory.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedContentTypeFactory.cs
index 17a15a2536..34094508c3 100644
--- a/src/Umbraco.Core/Models/PublishedContent/PublishedContentTypeFactory.cs
+++ b/src/Umbraco.Core/Models/PublishedContent/PublishedContentTypeFactory.cs
@@ -61,6 +61,12 @@ namespace Umbraco.Core.Models.PublishedContent
return new PublishedPropertyType(contentType, propertyTypeAlias, dataTypeId, true, variations, _propertyValueConverters, _publishedModelFactory, this);
}
+ ///
+ public IPublishedPropertyType CreateCorePropertyType(IPublishedContentType contentType, string propertyTypeAlias, int dataTypeId, ContentVariation variations = ContentVariation.Nothing)
+ {
+ return new PublishedPropertyType(contentType, propertyTypeAlias, dataTypeId, false, variations, _propertyValueConverters, _publishedModelFactory, this);
+ }
+
///
/// This method is for tests and is not intended to be used directly from application code.
///
diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs
index cb55a891a7..340ada2519 100644
--- a/src/Umbraco.Tests/Services/MemberServiceTests.cs
+++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs
@@ -11,15 +11,20 @@ using Umbraco.Core.Events;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Entities;
using Umbraco.Core.Models.Membership;
+using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
using Umbraco.Core.Persistence.Dtos;
using Umbraco.Core.Persistence.Querying;
+using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
using Umbraco.Core.Services.Implement;
using Umbraco.Tests.LegacyXmlPublishedCache;
using Umbraco.Tests.TestHelpers.Entities;
using Umbraco.Tests.Testing;
+using Umbraco.Tests.Testing.Objects.Accessors;
+using Umbraco.Web;
+using Umbraco.Web.PublishedCache.NuCache;
using Umbraco.Web.Security.Providers;
namespace Umbraco.Tests.Services
@@ -43,6 +48,61 @@ namespace Umbraco.Tests.Services
((MemberService)ServiceContext.MemberService).MembershipProvider = provider;
}
+ [Test]
+ public void Can_Create_Member_With_Properties()
+ {
+ var memberType = ServiceContext.MemberTypeService.Get("member");
+ IMember member = new Member("xname", "xemail", "xusername", "xrawpassword", memberType, true);
+ ServiceContext.MemberService.Save(member);
+
+ member = ServiceContext.MemberService.GetById(member.Id);
+ Assert.AreEqual("xemail", member.Email);
+
+ var dataTypeService = ServiceContext.DataTypeService;
+ var contentTypeFactory = new PublishedContentTypeFactory(new NoopPublishedModelFactory(), new PropertyValueConverterCollection(Enumerable.Empty()), dataTypeService);
+ var pmemberType = new PublishedContentType(memberType, contentTypeFactory);
+
+ var publishedSnapshotAccessor = new TestPublishedSnapshotAccessor();
+ var variationContextAccessor = new TestVariationContextAccessor();
+ var pmember = PublishedMember.Create(member, pmemberType, false, publishedSnapshotAccessor, variationContextAccessor);
+
+ // contains the umbracoMember... properties created when installing, on the member type
+ // contains the other properties, that PublishedContentType adds (BuiltinMemberProperties)
+ //
+ // TODO: see TODO in PublishedContentType, this list contains duplicates
+
+ var aliases = new[]
+ {
+ "umbracoMemberPasswordRetrievalQuestion",
+ "umbracoMemberPasswordRetrievalAnswer",
+ "umbracoMemberComments",
+ "umbracoMemberFailedPasswordAttempts",
+ "umbracoMemberApproved",
+ "umbracoMemberLockedOut",
+ "umbracoMemberLastLockoutDate",
+ "umbracoMemberLastLogin",
+ "umbracoMemberLastPasswordChangeDate",
+ "Email",
+ "Username",
+ "PasswordQuestion",
+ "Comments",
+ "IsApproved",
+ "IsLockedOut",
+ "LastLockoutDate",
+ "CreateDate",
+ "LastLoginDate",
+ "LastPasswordChangeDate"
+ };
+
+ var properties = pmember.Properties.ToList();
+
+ for (var i = 0; i < aliases.Length; i++)
+ Assert.AreEqual(properties[i].Alias, aliases[i]);
+
+ var email = properties[aliases.IndexOf("Email")];
+ Assert.AreEqual("xemail", email.GetSourceValue());
+ }
+
[Test]
public void Can_Set_Password_On_New_Member()
{