From 1ada5210ad720ffa282901fc04a40c31de1b92f6 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 21 Feb 2014 09:54:53 +1100 Subject: [PATCH 1/7] updated to latest examine --- src/Umbraco.Tests/App.config | 41 ++++++++++++++--- src/Umbraco.Tests/Umbraco.Tests.csproj | 2 +- .../UmbracoExamine/ExamineBaseTest.cs | 11 +++-- src/Umbraco.Tests/packages.config | 2 +- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 2 +- src/Umbraco.Web.UI/packages.config | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 3 +- src/Umbraco.Web/app.config | 19 ++++++++ src/Umbraco.Web/packages.config | 2 +- .../UmbracoExamine.Azure.csproj | 3 +- src/UmbracoExamine.Azure/app.config | 15 +++++++ src/UmbracoExamine.Azure/packages.config | 2 +- .../UmbracoExamine.PDF.Azure.csproj | 3 +- src/UmbracoExamine.PDF.Azure/app.config | 15 +++++++ src/UmbracoExamine.PDF.Azure/packages.config | 2 +- .../UmbracoExamine.PDF.csproj | 3 +- src/UmbracoExamine.PDF/app.config | 15 +++++++ src/UmbracoExamine.PDF/packages.config | 2 +- src/UmbracoExamine/UmbracoExamine.csproj | 3 +- src/UmbracoExamine/app.config | 15 +++++++ src/UmbracoExamine/packages.config | 2 +- src/umbraco.MacroEngines/App.Config | 45 ++++++++++++++++--- src/umbraco.MacroEngines/packages.config | 2 +- .../umbraco.MacroEngines.csproj | 2 +- src/umbraco.editorControls/app.config | 19 ++++++++ .../umbraco.editorControls.csproj | 3 +- 26 files changed, 202 insertions(+), 33 deletions(-) create mode 100644 src/Umbraco.Web/app.config create mode 100644 src/UmbracoExamine.Azure/app.config create mode 100644 src/UmbracoExamine.PDF.Azure/app.config create mode 100644 src/UmbracoExamine.PDF/app.config create mode 100644 src/UmbracoExamine/app.config create mode 100644 src/umbraco.editorControls/app.config diff --git a/src/Umbraco.Tests/App.config b/src/Umbraco.Tests/App.config index 0af67e158b..9e4b0ac66d 100644 --- a/src/Umbraco.Tests/App.config +++ b/src/Umbraco.Tests/App.config @@ -1,7 +1,7 @@ - + -
+
@@ -26,7 +26,7 @@ - + @@ -74,9 +74,9 @@ - + - + @@ -93,4 +93,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index a7e19aee06..dfea551434 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -50,7 +50,7 @@ False - ..\packages\Examine.0.1.53.2941\lib\Examine.dll + ..\packages\Examine.0.1.55.2941\lib\Examine.dll False diff --git a/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs b/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs index 7f5969d984..34dfd10857 100644 --- a/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs +++ b/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs @@ -1,17 +1,20 @@ -using Umbraco.Tests.PartialTrust; +using NUnit.Framework; +using Umbraco.Tests.PartialTrust; using UmbracoExamine; namespace Umbraco.Tests.UmbracoExamine { - public abstract class ExamineBaseTest : AbstractPartialTrustFixture where T : class, IPartialTrustFixture, new() + public abstract class ExamineBaseTest { - public override void TestSetup() + [SetUp] + public virtual void TestSetup() { UmbracoExamineSearcher.DisableInitializationCheck = true; BaseUmbracoIndexer.DisableInitializationCheck = true; } - public override void TestTearDown() + [TearDown] + public virtual void TestTearDown() { UmbracoExamineSearcher.DisableInitializationCheck = null; BaseUmbracoIndexer.DisableInitializationCheck = null; diff --git a/src/Umbraco.Tests/packages.config b/src/Umbraco.Tests/packages.config index 28500444ed..dd2c7f6d65 100644 --- a/src/Umbraco.Tests/packages.config +++ b/src/Umbraco.Tests/packages.config @@ -1,6 +1,6 @@  - + diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 9e0fa79b2f..75b1200072 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -111,7 +111,7 @@ False - ..\packages\Examine.0.1.53.2941\lib\Examine.dll + ..\packages\Examine.0.1.55.2941\lib\Examine.dll False diff --git a/src/Umbraco.Web.UI/packages.config b/src/Umbraco.Web.UI/packages.config index 2316496b38..afa64f266c 100644 --- a/src/Umbraco.Web.UI/packages.config +++ b/src/Umbraco.Web.UI/packages.config @@ -2,7 +2,7 @@ - + diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index fff9344b83..a3081cdb8d 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -103,7 +103,7 @@ False - ..\packages\Examine.0.1.53.2941\lib\Examine.dll + ..\packages\Examine.0.1.55.2941\lib\Examine.dll False @@ -1890,6 +1890,7 @@ ASPXCodeBehind + diff --git a/src/Umbraco.Web/app.config b/src/Umbraco.Web/app.config new file mode 100644 index 0000000000..568750da9c --- /dev/null +++ b/src/Umbraco.Web/app.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index 8d5d335b9b..bd0a9de374 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -2,7 +2,7 @@ - + diff --git a/src/UmbracoExamine.Azure/UmbracoExamine.Azure.csproj b/src/UmbracoExamine.Azure/UmbracoExamine.Azure.csproj index d334bcd566..b2fe3e2758 100644 --- a/src/UmbracoExamine.Azure/UmbracoExamine.Azure.csproj +++ b/src/UmbracoExamine.Azure/UmbracoExamine.Azure.csproj @@ -39,7 +39,7 @@ False - ..\packages\Examine.0.1.53.2941\lib\Examine.dll + ..\packages\Examine.0.1.55.2941\lib\Examine.dll False @@ -85,6 +85,7 @@ + diff --git a/src/UmbracoExamine.Azure/app.config b/src/UmbracoExamine.Azure/app.config new file mode 100644 index 0000000000..e72c720717 --- /dev/null +++ b/src/UmbracoExamine.Azure/app.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoExamine.Azure/packages.config b/src/UmbracoExamine.Azure/packages.config index f159081ad4..4dce0f43bc 100644 --- a/src/UmbracoExamine.Azure/packages.config +++ b/src/UmbracoExamine.Azure/packages.config @@ -2,7 +2,7 @@ - + diff --git a/src/UmbracoExamine.PDF.Azure/UmbracoExamine.PDF.Azure.csproj b/src/UmbracoExamine.PDF.Azure/UmbracoExamine.PDF.Azure.csproj index 7678890fee..94495d21d1 100644 --- a/src/UmbracoExamine.PDF.Azure/UmbracoExamine.PDF.Azure.csproj +++ b/src/UmbracoExamine.PDF.Azure/UmbracoExamine.PDF.Azure.csproj @@ -39,7 +39,7 @@ False - ..\packages\Examine.0.1.53.2941\lib\Examine.dll + ..\packages\Examine.0.1.55.2941\lib\Examine.dll False @@ -86,6 +86,7 @@ + diff --git a/src/UmbracoExamine.PDF.Azure/app.config b/src/UmbracoExamine.PDF.Azure/app.config new file mode 100644 index 0000000000..e72c720717 --- /dev/null +++ b/src/UmbracoExamine.PDF.Azure/app.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoExamine.PDF.Azure/packages.config b/src/UmbracoExamine.PDF.Azure/packages.config index f159081ad4..4dce0f43bc 100644 --- a/src/UmbracoExamine.PDF.Azure/packages.config +++ b/src/UmbracoExamine.PDF.Azure/packages.config @@ -2,7 +2,7 @@ - + diff --git a/src/UmbracoExamine.PDF/UmbracoExamine.PDF.csproj b/src/UmbracoExamine.PDF/UmbracoExamine.PDF.csproj index 5543ab3f49..a7e57efc14 100644 --- a/src/UmbracoExamine.PDF/UmbracoExamine.PDF.csproj +++ b/src/UmbracoExamine.PDF/UmbracoExamine.PDF.csproj @@ -46,7 +46,7 @@ False - ..\packages\Examine.0.1.53.2941\lib\Examine.dll + ..\packages\Examine.0.1.55.2941\lib\Examine.dll ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll @@ -76,6 +76,7 @@ + diff --git a/src/UmbracoExamine.PDF/app.config b/src/UmbracoExamine.PDF/app.config new file mode 100644 index 0000000000..e72c720717 --- /dev/null +++ b/src/UmbracoExamine.PDF/app.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoExamine.PDF/packages.config b/src/UmbracoExamine.PDF/packages.config index 0ea9c20ae7..1169a8ab9c 100644 --- a/src/UmbracoExamine.PDF/packages.config +++ b/src/UmbracoExamine.PDF/packages.config @@ -1,6 +1,6 @@  - + diff --git a/src/UmbracoExamine/UmbracoExamine.csproj b/src/UmbracoExamine/UmbracoExamine.csproj index b66daed73d..c9d8502076 100644 --- a/src/UmbracoExamine/UmbracoExamine.csproj +++ b/src/UmbracoExamine/UmbracoExamine.csproj @@ -82,7 +82,7 @@ False - ..\packages\Examine.0.1.53.2941\lib\Examine.dll + ..\packages\Examine.0.1.55.2941\lib\Examine.dll False @@ -171,6 +171,7 @@ + diff --git a/src/UmbracoExamine/app.config b/src/UmbracoExamine/app.config new file mode 100644 index 0000000000..e72c720717 --- /dev/null +++ b/src/UmbracoExamine/app.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoExamine/packages.config b/src/UmbracoExamine/packages.config index 1bb39ddebc..e923fba924 100644 --- a/src/UmbracoExamine/packages.config +++ b/src/UmbracoExamine/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/src/umbraco.MacroEngines/App.Config b/src/umbraco.MacroEngines/App.Config index 0e50bdd518..794c0925aa 100644 --- a/src/umbraco.MacroEngines/App.Config +++ b/src/umbraco.MacroEngines/App.Config @@ -1,4 +1,4 @@ - + @@ -10,12 +10,12 @@ - - + + - + @@ -26,11 +26,42 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/umbraco.MacroEngines/packages.config b/src/umbraco.MacroEngines/packages.config index 5d13bc89e8..7665569f18 100644 --- a/src/umbraco.MacroEngines/packages.config +++ b/src/umbraco.MacroEngines/packages.config @@ -1,6 +1,6 @@  - + diff --git a/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj b/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj index 335ca62c2d..22e7c846d8 100644 --- a/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj +++ b/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj @@ -44,7 +44,7 @@ False - ..\packages\Examine.0.1.53.2941\lib\Examine.dll + ..\packages\Examine.0.1.55.2941\lib\Examine.dll False diff --git a/src/umbraco.editorControls/app.config b/src/umbraco.editorControls/app.config new file mode 100644 index 0000000000..568750da9c --- /dev/null +++ b/src/umbraco.editorControls/app.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/umbraco.editorControls/umbraco.editorControls.csproj b/src/umbraco.editorControls/umbraco.editorControls.csproj index da428aeede..bcb9bbb6b0 100644 --- a/src/umbraco.editorControls/umbraco.editorControls.csproj +++ b/src/umbraco.editorControls/umbraco.editorControls.csproj @@ -1,4 +1,4 @@ - + Local @@ -486,6 +486,7 @@ + From 3e67b3034d97df4db887058252edfb45f4104a8c Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 21 Feb 2014 12:56:00 +1100 Subject: [PATCH 2/7] Added the ability to specify explicit db type's for a property type using an overloaded ctor argument. This allows us to specify explicit db types for properties without having them get overwritten during the repository saving logic which will always reset it to be the db type of the underlying property editor. In the case of our built-in membership properties we do not want this to happen. Fixes some unit tests. Removes built-in props from being included in the property types on the profile model on the front-end. --- src/Umbraco.Core/Constants-Conventions.cs | 18 ++-- src/Umbraco.Core/DateTimeExtensions.cs | 25 +++++ src/Umbraco.Core/Models/Property.cs | 11 ++- src/Umbraco.Core/Models/PropertyType.cs | 26 +++++- .../Factories/MemberTypeReadOnlyFactory.cs | 92 +++++++++++-------- .../Factories/PropertyGroupFactory.cs | 41 +++++---- .../Repositories/ContentTypeBaseRepository.cs | 43 +++++---- .../Repositories/MemberTypeRepository.cs | 57 ++++++++---- .../Repositories/PermissionRepository.cs | 4 +- .../Repositories/MemberTypeRepositoryTest.cs | 4 +- .../Routing/RenderRouteHandlerTests.cs | 3 +- .../Services/MemberServiceTests.cs | 37 ++++++++ src/Umbraco.Web/Security/MembershipHelper.cs | 5 +- 13 files changed, 250 insertions(+), 116 deletions(-) diff --git a/src/Umbraco.Core/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs index 8ef9f1ca8f..f88b29c149 100644 --- a/src/Umbraco.Core/Constants-Conventions.cs +++ b/src/Umbraco.Core/Constants-Conventions.cs @@ -177,7 +177,7 @@ namespace Umbraco.Core { { Comments, - new PropertyType(new Guid(PropertyEditors.TextboxMultiple), DataTypeDatabaseType.Ntext) + new PropertyType(new Guid(PropertyEditors.TextboxMultiple), DataTypeDatabaseType.Ntext, true) { Alias = Comments, Name = CommentsLabel @@ -185,7 +185,7 @@ namespace Umbraco.Core }, { FailedPasswordAttempts, - new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Integer) + new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Integer, true) { Alias = FailedPasswordAttempts, Name = FailedPasswordAttemptsLabel @@ -193,7 +193,7 @@ namespace Umbraco.Core }, { IsApproved, - new PropertyType(new Guid(PropertyEditors.TrueFalse), DataTypeDatabaseType.Integer) + new PropertyType(new Guid(PropertyEditors.TrueFalse), DataTypeDatabaseType.Integer, true) { Alias = IsApproved, Name = IsApprovedLabel @@ -201,7 +201,7 @@ namespace Umbraco.Core }, { IsLockedOut, - new PropertyType(new Guid(PropertyEditors.TrueFalse), DataTypeDatabaseType.Integer) + new PropertyType(new Guid(PropertyEditors.TrueFalse), DataTypeDatabaseType.Integer, true) { Alias = IsLockedOut, Name = IsLockedOutLabel @@ -209,7 +209,7 @@ namespace Umbraco.Core }, { LastLockoutDate, - new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Date) + new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Date, true) { Alias = LastLockoutDate, Name = LastLockoutDateLabel @@ -217,7 +217,7 @@ namespace Umbraco.Core }, { LastLoginDate, - new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Date) + new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Date, true) { Alias = LastLoginDate, Name = LastLoginDateLabel @@ -225,7 +225,7 @@ namespace Umbraco.Core }, { LastPasswordChangeDate, - new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Date) + new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Date, true) { Alias = LastPasswordChangeDate, Name = LastPasswordChangeDateLabel @@ -233,7 +233,7 @@ namespace Umbraco.Core }, { PasswordAnswer, - new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Nvarchar) + new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Nvarchar, true) { Alias = PasswordAnswer, Name = PasswordAnswerLabel @@ -241,7 +241,7 @@ namespace Umbraco.Core }, { PasswordQuestion, - new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Nvarchar) + new PropertyType(new Guid(PropertyEditors.NoEdit), DataTypeDatabaseType.Nvarchar, true) { Alias = PasswordQuestion, Name = PasswordQuestionLabel diff --git a/src/Umbraco.Core/DateTimeExtensions.cs b/src/Umbraco.Core/DateTimeExtensions.cs index 74460814b3..1ff996170f 100644 --- a/src/Umbraco.Core/DateTimeExtensions.cs +++ b/src/Umbraco.Core/DateTimeExtensions.cs @@ -18,5 +18,30 @@ namespace Umbraco.Core return dt.ToString("yyyy-MM-dd HH:mm:ss"); } + public static DateTime TruncateTo(this DateTime dt, DateTruncate truncateTo) + { + if (truncateTo == DateTruncate.Year) + return new DateTime(dt.Year, 0, 0); + if (truncateTo == DateTruncate.Month) + return new DateTime(dt.Year, dt.Month, 0); + if (truncateTo == DateTruncate.Day) + return new DateTime(dt.Year, dt.Month, dt.Day); + if (truncateTo == DateTruncate.Hour) + return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, 0, 0); + if (truncateTo == DateTruncate.Minute) + return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, 0); + return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second); + } + + public enum DateTruncate + { + Year, + Month, + Day, + Hour, + Minute, + Second + } + } } diff --git a/src/Umbraco.Core/Models/Property.cs b/src/Umbraco.Core/Models/Property.cs index d6298d9da2..782d5f4bf4 100644 --- a/src/Umbraco.Core/Models/Property.cs +++ b/src/Umbraco.Core/Models/Property.cs @@ -43,7 +43,7 @@ namespace Umbraco.Core.Models private static readonly PropertyInfo ValueSelector = ExpressionHelper.GetPropertyInfo(x => x.Value); private static readonly PropertyInfo VersionSelector = ExpressionHelper.GetPropertyInfo(x => x.Version); - + /// /// Returns the Alias of the PropertyType, which this Property is based on /// @@ -59,9 +59,14 @@ namespace Umbraco.Core.Models /// /// Returns the DatabaseType that the underlaying DataType is using to store its values /// - /// Only used internally when saving the property value + /// + /// Only used internally when saving the property value. + /// [IgnoreDataMember] - internal DataTypeDatabaseType DataTypeDatabaseType { get { return _propertyType.DataTypeDatabaseType; } } + internal DataTypeDatabaseType DataTypeDatabaseType + { + get { return _propertyType.DataTypeDatabaseType; } + } /// /// Returns the PropertyType, which this Property is based on diff --git a/src/Umbraco.Core/Models/PropertyType.cs b/src/Umbraco.Core/Models/PropertyType.cs index cfeb9e832d..b312cc98f5 100644 --- a/src/Umbraco.Core/Models/PropertyType.cs +++ b/src/Umbraco.Core/Models/PropertyType.cs @@ -14,6 +14,7 @@ namespace Umbraco.Core.Models [DataContract(IsReference = true)] public class PropertyType : Entity, IEquatable { + private readonly bool _isExplicitDbType; private string _name; private string _alias; private string _description; @@ -29,16 +30,28 @@ namespace Umbraco.Core.Models public PropertyType(IDataTypeDefinition dataTypeDefinition) { if(dataTypeDefinition.HasIdentity) - DataTypeDefinitionId = dataTypeDefinition.Id; + _dataTypeDefinitionId = dataTypeDefinition.Id; - DataTypeId = dataTypeDefinition.ControlId; - DataTypeDatabaseType = dataTypeDefinition.DatabaseType; + _dataTypeId = dataTypeDefinition.ControlId; + _dataTypeDatabaseType = dataTypeDefinition.DatabaseType; } internal PropertyType(Guid dataTypeControlId, DataTypeDatabaseType dataTypeDatabaseType) + : this(dataTypeControlId, dataTypeDatabaseType, false) { - DataTypeId = dataTypeControlId; - DataTypeDatabaseType = dataTypeDatabaseType; + } + + /// + /// Used internally to assign an explicity database type for this property type regardless of what the underlying data type/property editor is. + /// + /// + /// + /// + internal PropertyType(Guid dataTypeControlId, DataTypeDatabaseType dataTypeDatabaseType, bool isExplicitDbType) + { + _isExplicitDbType = isExplicitDbType; + _dataTypeId = dataTypeControlId; + _dataTypeDatabaseType = dataTypeDatabaseType; } private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); @@ -149,6 +162,9 @@ namespace Umbraco.Core.Models get { return _dataTypeDatabaseType; } set { + //don't allow setting this if an explicit declaration has been made in the ctor + if (_isExplicitDbType) return; + SetPropertyValueAndDetectChanges(o => { _dataTypeDatabaseType = value; diff --git a/src/Umbraco.Core/Persistence/Factories/MemberTypeReadOnlyFactory.cs b/src/Umbraco.Core/Persistence/Factories/MemberTypeReadOnlyFactory.cs index e291916e10..b6b3425425 100644 --- a/src/Umbraco.Core/Persistence/Factories/MemberTypeReadOnlyFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/MemberTypeReadOnlyFactory.cs @@ -11,6 +11,8 @@ namespace Umbraco.Core.Persistence.Factories { public IMemberType BuildEntity(MemberTypeReadOnlyDto dto) { + var standardPropertyTypes = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); + var memberType = new MemberType(dto.ParentId) { Alias = dto.Alias, @@ -32,13 +34,12 @@ namespace Umbraco.Core.Persistence.Factories AllowedContentTypes = Enumerable.Empty() }; - var propertyTypeGroupCollection = GetPropertyTypeGroupCollection(dto, memberType); + var propertyTypeGroupCollection = GetPropertyTypeGroupCollection(dto, memberType, standardPropertyTypes); memberType.PropertyGroups = propertyTypeGroupCollection; - var propertyTypes = GetPropertyTypes(dto, memberType); + var propertyTypes = GetPropertyTypes(dto, memberType, standardPropertyTypes); - //By Convention we add 9 stnd PropertyTypes - This is only here to support loading of types that didn't have these conventions before. - var standardPropertyTypes = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); + //By Convention we add 9 stnd PropertyTypes - This is only here to support loading of types that didn't have these conventions before. foreach (var standardPropertyType in standardPropertyTypes) { if(dto.PropertyTypes.Any(x => x.Alias.Equals(standardPropertyType.Key))) continue; @@ -55,10 +56,10 @@ namespace Umbraco.Core.Persistence.Factories return memberType; } - private PropertyGroupCollection GetPropertyTypeGroupCollection(MemberTypeReadOnlyDto dto, MemberType memberType) + private PropertyGroupCollection GetPropertyTypeGroupCollection(MemberTypeReadOnlyDto dto, MemberType memberType, Dictionary standardProps) { - var propertyGroups = new PropertyGroupCollection(); - var standardProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); + var propertyGroups = new PropertyGroupCollection(); + foreach (var groupDto in dto.PropertyTypeGroups.Where(x => x.Id.HasValue)) { var group = new PropertyGroup(); @@ -91,13 +92,19 @@ namespace Umbraco.Core.Persistence.Factories var tempGroupDto = groupDto; - var propertyType = new PropertyType(typeDto.ControlId, - //ensures that any built-in membership properties have their correct dbtype assigned no matter - //what the underlying data type is - MemberTypeRepository.GetDbTypeForBuiltInProperty( - typeDto.Alias, - typeDto.DbType.EnumParse(true), - standardProps).Result) + //ensures that any built-in membership properties have their correct dbtype assigned no matter + //what the underlying data type is + var propDbType = MemberTypeRepository.GetDbTypeForBuiltInProperty( + typeDto.Alias, + typeDto.DbType.EnumParse(true), + standardProps); + + var propertyType = new PropertyType( + typeDto.ControlId, + propDbType.Result, + //This flag tells the property type that it has an explicit dbtype and that it cannot be changed + // which is what we want for the built-in properties. + propDbType.Success) { Alias = typeDto.Alias, DataTypeDefinitionId = typeDto.DataTypeId, @@ -126,34 +133,47 @@ namespace Umbraco.Core.Persistence.Factories return propertyGroups; } - - private List GetPropertyTypes(MemberTypeReadOnlyDto dto, MemberType memberType) + + private List GetPropertyTypes(MemberTypeReadOnlyDto dto, MemberType memberType, Dictionary standardProps) { //Find PropertyTypes that does not belong to a PropertyTypeGroup var propertyTypes = new List(); - foreach (var propertyType in dto.PropertyTypes.Where(x => (x.PropertyTypeGroupId.HasValue == false || x.PropertyTypeGroupId.Value == 0) && x.Id.HasValue)) + foreach (var typeDto in dto.PropertyTypes.Where(x => (x.PropertyTypeGroupId.HasValue == false || x.PropertyTypeGroupId.Value == 0) && x.Id.HasValue)) { //Internal dictionary for adding "MemberCanEdit" and "VisibleOnProfile" properties to each PropertyType - memberType.MemberTypePropertyTypes.Add(propertyType.Alias, - new MemberTypePropertyProfileAccess(propertyType.ViewOnProfile, propertyType.CanEdit)); - //PropertyType Collection - propertyTypes.Add(new PropertyType(propertyType.ControlId, - propertyType.DbType.EnumParse(true)) - { - Alias = propertyType.Alias, - DataTypeDefinitionId = propertyType.DataTypeId, - Description = propertyType.Description, - HelpText = propertyType.HelpText, - Id = propertyType.Id.Value, - Mandatory = propertyType.Mandatory, - Name = propertyType.Name, - SortOrder = propertyType.SortOrder, - ValidationRegExp = propertyType.ValidationRegExp, - PropertyGroupId = new Lazy(() => default(int)), - CreateDate = dto.CreateDate, - UpdateDate = dto.CreateDate - }); + memberType.MemberTypePropertyTypes.Add(typeDto.Alias, + new MemberTypePropertyProfileAccess(typeDto.ViewOnProfile, typeDto.CanEdit)); + + //ensures that any built-in membership properties have their correct dbtype assigned no matter + //what the underlying data type is + var propDbType = MemberTypeRepository.GetDbTypeForBuiltInProperty( + typeDto.Alias, + typeDto.DbType.EnumParse(true), + standardProps); + + var propertyType = new PropertyType( + typeDto.ControlId, + propDbType.Result, + //This flag tells the property type that it has an explicit dbtype and that it cannot be changed + // which is what we want for the built-in properties. + propDbType.Success) + { + Alias = typeDto.Alias, + DataTypeDefinitionId = typeDto.DataTypeId, + Description = typeDto.Description, + HelpText = typeDto.HelpText, + Id = typeDto.Id.Value, + Mandatory = typeDto.Mandatory, + Name = typeDto.Name, + SortOrder = typeDto.SortOrder, + ValidationRegExp = typeDto.ValidationRegExp, + PropertyGroupId = new Lazy(() => default(int)), + CreateDate = dto.CreateDate, + UpdateDate = dto.CreateDate + }; + + propertyTypes.Add(propertyType); } return propertyTypes; } diff --git a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs b/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs index 57cc79bc32..b3382df1e3 100644 --- a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs @@ -11,17 +11,21 @@ namespace Umbraco.Core.Persistence.Factories private readonly int _id; private readonly DateTime _createDate; private readonly DateTime _updateDate; + //a callback to create a property type which can be injected via a contructor + private readonly Func _propertyTypeCtor; public PropertyGroupFactory(int id) { _id = id; + _propertyTypeCtor = (guid, dbType, alias) => new PropertyType(guid, dbType); } - - public PropertyGroupFactory(int id, DateTime createDate, DateTime updateDate) + + public PropertyGroupFactory(int id, DateTime createDate, DateTime updateDate, Func propertyTypeCtor) { _id = id; _createDate = createDate; _updateDate = updateDate; + _propertyTypeCtor = propertyTypeCtor; } #region Implementation of IEntityFactory,IEnumerable> @@ -55,22 +59,23 @@ namespace Umbraco.Core.Persistence.Factories foreach (var typeDto in typeDtos) { var tempGroupDto = groupDto; - var propertyType = new PropertyType(typeDto.DataTypeDto.ControlId, - typeDto.DataTypeDto.DbType.EnumParse(true)) - { - Alias = typeDto.Alias, - DataTypeDefinitionId = typeDto.DataTypeId, - Description = typeDto.Description, - Id = typeDto.Id, - Name = typeDto.Name, - HelpText = typeDto.HelpText, - Mandatory = typeDto.Mandatory, - SortOrder = typeDto.SortOrder, - ValidationRegExp = typeDto.ValidationRegExp, - PropertyGroupId = new Lazy(() => tempGroupDto.Id), - CreateDate = _createDate, - UpdateDate = _updateDate - }; + var propertyType = _propertyTypeCtor(typeDto.DataTypeDto.ControlId, + typeDto.DataTypeDto.DbType.EnumParse(true), + typeDto.Alias); + + propertyType.Alias = typeDto.Alias; + propertyType.DataTypeDefinitionId = typeDto.DataTypeId; + propertyType.Description = typeDto.Description; + propertyType.Id = typeDto.Id; + propertyType.Name = typeDto.Name; + propertyType.HelpText = typeDto.HelpText; + propertyType.Mandatory = typeDto.Mandatory; + propertyType.SortOrder = typeDto.SortOrder; + propertyType.ValidationRegExp = typeDto.ValidationRegExp; + propertyType.PropertyGroupId = new Lazy(() => tempGroupDto.Id); + propertyType.CreateDate = _createDate; + propertyType.UpdateDate = _updateDate; + //on initial construction we don't want to have dirty properties tracked // http://issues.umbraco.org/issue/U4-1946 propertyType.ResetDirtyProperties(false); diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs index 4d0e925461..5b761ad559 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs @@ -56,6 +56,11 @@ namespace Umbraco.Core.Persistence.Repositories } } + protected virtual PropertyType CreatePropertyType(Guid dataTypeId, DataTypeDatabaseType dbType, string propertyTypeAlias) + { + return new PropertyType(dataTypeId, dbType); + } + protected void PersistNewBaseContentType(ContentTypeDto dto, IContentTypeComposition entity) { //Logic for setting Path, Level and SortOrder @@ -344,7 +349,7 @@ namespace Umbraco.Core.Persistence.Repositories var dtos = Database.Fetch(new GroupPropertyTypeRelator().Map, sql); - var propertyGroupFactory = new PropertyGroupFactory(id, createDate, updateDate); + var propertyGroupFactory = new PropertyGroupFactory(id, createDate, updateDate, CreatePropertyType); var propertyGroups = propertyGroupFactory.BuildEntity(dtos); return new PropertyGroupCollection(propertyGroups); } @@ -361,25 +366,23 @@ namespace Umbraco.Core.Persistence.Repositories var dtos = Database.Fetch(sql); //TODO Move this to a PropertyTypeFactory - var list = (from dto in dtos - where (dto.PropertyTypeGroupId > 0) == false - select - new PropertyType(dto.DataTypeDto.ControlId, - dto.DataTypeDto.DbType.EnumParse(true)) - { - Alias = dto.Alias, - DataTypeDefinitionId = dto.DataTypeId, - Description = dto.Description, - Id = dto.Id, - Name = dto.Name, - HelpText = dto.HelpText, - Mandatory = dto.Mandatory, - SortOrder = dto.SortOrder, - ValidationRegExp = dto.ValidationRegExp, - CreateDate = createDate, - UpdateDate = updateDate - }).ToList(); - + var list = new List(); + foreach (var dto in dtos.Where(x => (x.PropertyTypeGroupId > 0) == false)) + { + var propType = CreatePropertyType(dto.DataTypeDto.ControlId, dto.DataTypeDto.DbType.EnumParse(true), dto.Alias); + propType.Alias = dto.Alias; + propType.DataTypeDefinitionId = dto.DataTypeId; + propType.Description = dto.Description; + propType.Id = dto.Id; + propType.Name = dto.Name; + propType.HelpText = dto.HelpText; + propType.Mandatory = dto.Mandatory; + propType.SortOrder = dto.SortOrder; + propType.ValidationRegExp = dto.ValidationRegExp; + propType.CreateDate = createDate; + propType.UpdateDate = updateDate; + list.Add(propType); + } //Reset dirty properties Parallel.ForEach(list, currentFile => currentFile.ResetDirtyProperties(false)); diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs index 0fa8811d26..9875943f33 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs @@ -18,17 +18,17 @@ namespace Umbraco.Core.Persistence.Repositories /// internal class MemberTypeRepository : ContentTypeBaseRepository, IMemberTypeRepository { - public MemberTypeRepository(IDatabaseUnitOfWork work) + public MemberTypeRepository(IDatabaseUnitOfWork work) : base(work) { } - public MemberTypeRepository(IDatabaseUnitOfWork work, IRepositoryCacheProvider cache) + public MemberTypeRepository(IDatabaseUnitOfWork work, IRepositoryCacheProvider cache) : base(work, cache) { } - #region Overrides of RepositoryBase + #region Overrides of RepositoryBase protected override IMemberType PerformGet(int id) { @@ -40,13 +40,13 @@ namespace Umbraco.Core.Persistence.Repositories Database.Fetch( new PropertyTypePropertyGroupRelator().Map, sql); - if (dtos == null || dtos.Any() == false) - return null; + if (dtos == null || dtos.Any() == false) + return null; - var factory = new MemberTypeReadOnlyFactory(); - var member = factory.BuildEntity(dtos.First()); + var factory = new MemberTypeReadOnlyFactory(); + var member = factory.BuildEntity(dtos.First()); - return member; + return member; } protected override IEnumerable PerformGetAll(params int[] ids) @@ -99,11 +99,11 @@ namespace Umbraco.Core.Persistence.Repositories return sql; } - sql.Select("umbracoNode.*", "cmsContentType.*", "cmsPropertyType.id AS PropertyTypeId", "cmsPropertyType.Alias", + sql.Select("umbracoNode.*", "cmsContentType.*", "cmsPropertyType.id AS PropertyTypeId", "cmsPropertyType.Alias", "cmsPropertyType.Name", "cmsPropertyType.Description", "cmsPropertyType.helpText", "cmsPropertyType.mandatory", "cmsPropertyType.validationRegExp", "cmsPropertyType.dataTypeId", "cmsPropertyType.sortOrder AS PropertyTypeSortOrder", "cmsPropertyType.propertyTypeGroupId AS PropertyTypesGroupId", "cmsMemberType.memberCanEdit", "cmsMemberType.viewOnProfile", - "cmsDataType.controlId", "cmsDataType.dbType", "cmsPropertyTypeGroup.id AS PropertyTypeGroupId", + "cmsDataType.controlId", "cmsDataType.dbType", "cmsPropertyTypeGroup.id AS PropertyTypeGroupId", "cmsPropertyTypeGroup.text AS PropertyGroupName", "cmsPropertyTypeGroup.parentGroupId", "cmsPropertyTypeGroup.sortorder AS PropertyGroupSortOrder", "cmsPropertyTypeGroup.contenttypeNodeId") .From() @@ -179,10 +179,10 @@ namespace Umbraco.Core.Persistence.Repositories var factory = new MemberTypeFactory(NodeObjectTypeId); var dto = factory.BuildDto(entity); - EnsureCorrectDbTypeForBuiltInProperties(entity); + EnsureExplicitDataTypeForBuiltInProperties(entity); PersistNewBaseContentType(dto, entity); - + //Handles the MemberTypeDto (cmsMemberType table) var memberTypeDtos = factory.BuildMemberTypeDtos(entity); foreach (var memberTypeDto in memberTypeDtos) @@ -216,12 +216,12 @@ namespace Umbraco.Core.Persistence.Repositories var factory = new MemberTypeFactory(NodeObjectTypeId); var dto = factory.BuildDto(entity); - EnsureCorrectDbTypeForBuiltInProperties(entity); + EnsureExplicitDataTypeForBuiltInProperties(entity); PersistUpdatedBaseContentType(dto, entity); //Remove existing entries before inserting new ones - Database.Delete("WHERE NodeId = @Id", new {Id = entity.Id}); + Database.Delete("WHERE NodeId = @Id", new { Id = entity.Id }); //Handles the MemberTypeDto (cmsMemberType table) var memberTypeDtos = factory.BuildMemberTypeDtos(entity); @@ -236,11 +236,29 @@ namespace Umbraco.Core.Persistence.Repositories #endregion /// - /// Ensure that all the built-in membership provider properties have their correct db types - /// and property editors assigned. + /// Override so we can specify explicit db type's on any property types that are built-in. + /// + /// + /// + /// + /// + protected override PropertyType CreatePropertyType(Guid dataTypeId, DataTypeDatabaseType dbType, string propertyTypeAlias) + { + //custom property type constructor logic to set explicit dbtype's for built in properties + var stdProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); + var propDbType = GetDbTypeForBuiltInProperty(propertyTypeAlias, dbType, stdProps); + return new PropertyType(dataTypeId, propDbType.Result, + //This flag tells the property type that it has an explicit dbtype and that it cannot be changed + // which is what we want for the built-in properties. + propDbType.Success); + } + + /// + /// Ensure that all the built-in membership provider properties have their correct data type + /// and property editors assigned. This occurs prior to saving so that the correct values are persisted. /// /// - private static void EnsureCorrectDbTypeForBuiltInProperties(IContentTypeBase memberType) + private static void EnsureExplicitDataTypeForBuiltInProperties(IContentTypeBase memberType) { var stdProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); foreach (var propertyType in memberType.PropertyTypes) @@ -248,7 +266,6 @@ namespace Umbraco.Core.Persistence.Repositories var dbTypeAttempt = GetDbTypeForBuiltInProperty(propertyType.Alias, propertyType.DataTypeDatabaseType, stdProps); if (dbTypeAttempt) { - propertyType.DataTypeDatabaseType = dbTypeAttempt.Result; //this reset's it's current data type reference which will be re-assigned based on the property editor assigned on the next line propertyType.DataTypeDefinitionId = 0; propertyType.DataTypeId = GetPropertyEditorForBuiltInProperty(propertyType.Alias, propertyType.DataTypeId, stdProps).Result; @@ -281,7 +298,7 @@ namespace Umbraco.Core.Persistence.Repositories /// Successful attempt if it was a built in property /// internal static Attempt GetDbTypeForBuiltInProperty( - string propAlias, + string propAlias, DataTypeDatabaseType dbType, Dictionary standardProps) { @@ -307,7 +324,7 @@ namespace Umbraco.Core.Persistence.Repositories /// Successful attempt if it was a built in property /// internal static Attempt GetPropertyEditorForBuiltInProperty( - string propAlias, + string propAlias, Guid propertyEditor, Dictionary standardProps) { diff --git a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs index fd96dc7a54..f0a8378fc9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs @@ -208,7 +208,9 @@ namespace Umbraco.Core.Persistence.Repositories UserId = p.Item1 }).ToArray(); - _unitOfWork.Database.BulkInsertRecords(actions); + _unitOfWork.Database.BulkInsertRecords(actions, trans); + + trans.Complete(); //Raise the event AssignedPermissions.RaiseEvent( diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs index 52dbbb600f..63e9956f11 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs @@ -61,7 +61,7 @@ namespace Umbraco.Tests.Persistence.Repositories var standardProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); Assert.That(sut, Is.Not.Null); - Assert.That(sut.PropertyGroups.Count(), Is.EqualTo(1)); + Assert.That(sut.PropertyGroups.Count(), Is.EqualTo(2)); Assert.That(sut.PropertyTypes.Count(), Is.EqualTo(3 + standardProps.Count)); Assert.That(sut.PropertyGroups.Any(x => x.HasIdentity == false || x.Id == 0), Is.False); @@ -149,7 +149,7 @@ namespace Umbraco.Tests.Persistence.Repositories memberType = repository.Get(memberType.Id); Assert.That(memberType.PropertyTypes.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count)); - Assert.That(memberType.PropertyGroups.Count(), Is.EqualTo(1)); + Assert.That(memberType.PropertyGroups.Count(), Is.EqualTo(2)); } } diff --git a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs index 4b13acf7ee..794c9b0401 100644 --- a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs +++ b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs @@ -79,7 +79,8 @@ namespace Umbraco.Tests.Routing var docRequest = new PublishedContentRequest(routingContext.UmbracoContext.CleanedUmbracoUrl, routingContext) { PublishedContent = routingContext.UmbracoContext.ContentCache.GetById(1174), - TemplateModel = template + TemplateModel = template, + RenderingEngine = RenderingEngine.Mvc }; var handler = new RenderRouteHandler(new TestControllerFactory(), routingContext.UmbracoContext); diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs index f67dd55abe..380f050224 100644 --- a/src/Umbraco.Tests/Services/MemberServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs @@ -5,6 +5,7 @@ using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers.Entities; @@ -924,5 +925,41 @@ namespace Umbraco.Tests.Services Assert.IsTrue(found.Comments.IsNullOrWhiteSpace()); } + /// + /// Because we are forcing some of the built-ins to be Labels which have an underlying db type as nvarchar but we need + /// to ensure that the dates/int get saved to the correct column anyways. + /// + [Test] + public void Setting_DateTime_Property_On_Built_In_Member_Property_Saves_To_Correct_Column() + { + IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); + ServiceContext.MemberTypeService.Save(memberType); + var member = MockedMember.CreateSimpleMember(memberType, "test", "test@test.com", "test", "test"); + var date = DateTime.Now; + member.LastLoginDate = DateTime.Now; + ServiceContext.MemberService.Save(member); + + var result = ServiceContext.MemberService.GetById(member.Id); + Assert.AreEqual( + date.TruncateTo(DateTimeExtensions.DateTruncate.Second), + result.LastLoginDate.TruncateTo(DateTimeExtensions.DateTruncate.Second)); + + //now ensure the col is correct + var sql = new Sql().Select("cmsPropertyData.*") + .From() + .InnerJoin() + .On(dto => dto.PropertyTypeId, dto => dto.Id) + .Where(dto => dto.NodeId == member.Id) + .Where(dto => dto.Alias == Constants.Conventions.Member.LastLoginDate); + + var colResult = DatabaseContext.Database.Fetch(sql); + + Assert.AreEqual(1, colResult.Count); + Assert.IsTrue(colResult.First().Date.HasValue); + Assert.IsFalse(colResult.First().Integer.HasValue); + Assert.IsNull(colResult.First().Text); + Assert.IsNull(colResult.First().VarChar); + } + } } \ No newline at end of file diff --git a/src/Umbraco.Web/Security/MembershipHelper.cs b/src/Umbraco.Web/Security/MembershipHelper.cs index 899661ead6..78f7ab09a8 100644 --- a/src/Umbraco.Web/Security/MembershipHelper.cs +++ b/src/Umbraco.Web/Security/MembershipHelper.cs @@ -227,7 +227,10 @@ namespace Umbraco.Web.Security var memberType = member.ContentType; - foreach (var prop in memberType.PropertyTypes.Where(x => memberType.MemberCanEditProperty(x.Alias))) + var builtIns = Constants.Conventions.Member.GetStandardPropertyTypeStubs().Select(x => x.Key).ToArray(); + + foreach (var prop in memberType.PropertyTypes + .Where(x => builtIns.Contains(x.Alias) == false && memberType.MemberCanEditProperty(x.Alias))) { var value = string.Empty; var propValue = member.Properties[prop.Alias]; From 3803d1d7dabece423052c3fa5333cf88db5578e7 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 21 Feb 2014 15:22:02 +1100 Subject: [PATCH 3/7] fixes reflected property on dynamicnode and unit test --- src/umbraco.MacroEngines/RazorDynamicNode/DynamicNode.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicNode.cs b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicNode.cs index 5ff63fec91..9a24e653a3 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicNode.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicNode.cs @@ -671,8 +671,8 @@ namespace umbraco.MacroEngines { //if we cannot get with the current alias, try changing it's case attempt = alias[0].IsUpperCase() - ? getMember(alias.ToCleanString(CleanStringType.Ascii | CleanStringType.Alias | CleanStringType.CamelCase)) - : getMember(alias.ToCleanString(CleanStringType.Ascii | CleanStringType.Alias | CleanStringType.PascalCase)); + ? getMember(alias.ToCleanString(CleanStringType.Ascii | CleanStringType.ConvertCase | CleanStringType.CamelCase)) + : getMember(alias.ToCleanString(CleanStringType.Ascii | CleanStringType.ConvertCase | CleanStringType.PascalCase)); } return attempt.Success ? attempt.Result : null; From dea804b4022246dd60c114c0cbb22bf11820faa1 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 21 Feb 2014 15:46:39 +1100 Subject: [PATCH 4/7] fixes some permission logic and a unit test --- .../Persistence/Repositories/ContentRepository.cs | 3 +++ .../Persistence/Repositories/PermissionRepository.cs | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 24048a0e76..718a62f95f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -536,6 +536,9 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// + /// + /// This does not replace permissions, just adds one if it doesn't exist + /// public void AssignEntityPermissions(IContent entity, char permission, IEnumerable userIds) { var repo = new PermissionRepository(UnitOfWork, _cacheHelper); diff --git a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs index f0a8378fc9..0b23385f40 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs @@ -119,6 +119,9 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// + /// + /// This will first clear the permissions for this user and entities and recreate them + /// public void AssignUserPermissions(int userId, IEnumerable permissions, params int[] entityIds) { var db = _unitOfWork.Database; @@ -158,14 +161,15 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// - /// This will first clear the permissions for this entity then re-create them + /// This does not replace permissions, just adds one if it doesn't exist /// public void AssignEntityPermissions(TEntity entity, char permission, IEnumerable userIds) { var db = _unitOfWork.Database; using (var trans = db.GetTransaction()) { - db.Execute("DELETE FROM umbracoUser2NodePermission WHERE nodeId=@nodeId", new {nodeId = entity.Id}); + db.Execute("DELETE FROM umbracoUser2NodePermission WHERE nodeId=@nodeId AND permission=@permission", + new { nodeId = entity.Id, permission = permission.ToString(CultureInfo.InvariantCulture) }); var actions = userIds.Select(id => new User2NodePermissionDto { From 750f7a6b33277b0146f43b9a8a45755297ed062d Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 21 Feb 2014 15:55:56 +1100 Subject: [PATCH 5/7] Updates some method names to be less confusing regarding permissions --- .../Repositories/ContentRepository.cs | 13 +++++-------- .../Interfaces/IContentRepository.cs | 2 +- .../Repositories/Interfaces/IUserRepository.cs | 7 +++---- .../Repositories/PermissionRepository.cs | 18 ++++++++++-------- .../Persistence/Repositories/UserRepository.cs | 6 +++--- src/Umbraco.Core/Services/ContentService.cs | 4 ++-- src/Umbraco.Core/Services/IContentService.cs | 2 +- src/Umbraco.Core/Services/IUserService.cs | 4 ++-- src/Umbraco.Core/Services/UserService.cs | 6 +++--- .../Repositories/ContentRepositoryTest.cs | 2 +- src/Umbraco.Tests/Services/UserServiceTests.cs | 12 ++++++------ .../umbraco/users/UserPermissions.cs | 4 ++-- src/umbraco.cms/businesslogic/Permission.cs | 2 +- 13 files changed, 40 insertions(+), 42 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 718a62f95f..d9dd6405fe 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -278,7 +278,7 @@ namespace Umbraco.Core.Persistence.Repositories from p in perm.AssignedPermissions select new Tuple(perm.UserId, p)).ToList(); - permissionsRepo.AssignEntityPermissions(entity, userPermissions); + permissionsRepo.ReplaceEntityPermissions(entity, userPermissions); //flag the entity's permissions changed flag so we can track those changes. //Currently only used for the cache refreshers to detect if we should refresh all user permissions cache. ((Content) entity).PermissionsChanged = true; @@ -531,18 +531,15 @@ namespace Umbraco.Core.Persistence.Repositories } /// - /// Assigns one permission to an entity for multiple users + /// Assigns a single permission to the current content item for the specified user ids /// /// /// - /// - /// - /// This does not replace permissions, just adds one if it doesn't exist - /// - public void AssignEntityPermissions(IContent entity, char permission, IEnumerable userIds) + /// + public void AssignEntityPermission(IContent entity, char permission, IEnumerable userIds) { var repo = new PermissionRepository(UnitOfWork, _cacheHelper); - repo.AssignEntityPermissions(entity, permission, userIds); + repo.AssignEntityPermission(entity, permission, userIds); } public IEnumerable GetPermissionsForEntity(int entityId) diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs index 16044a313d..3a343febae 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs @@ -29,7 +29,7 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// - void AssignEntityPermissions(IContent entity, char permission, IEnumerable userIds); + void AssignEntityPermission(IContent entity, char permission, IEnumerable userIds); /// /// Gets the list of permissions for the content item diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs index f966a4d26f..538548831a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs @@ -38,8 +38,7 @@ namespace Umbraco.Core.Persistence.Repositories /// /// IEnumerable GetPagedResultsByQuery(IQuery query, int pageIndex, int pageSize, out int totalRecords, Expression> orderBy); - - + /// /// Gets the user permissions for the specified entities /// @@ -49,11 +48,11 @@ namespace Umbraco.Core.Persistence.Repositories IEnumerable GetUserPermissionsForEntities(int userId, params int[] entityIds); /// - /// Assigns the same permission set for a single user to any number of entities + /// Replaces the same permission set for a single user to any number of entities /// /// /// /// - void AssignUserPermissions(int userId, IEnumerable permissions, params int[] entityIds); + void ReplaceUserPermissions(int userId, IEnumerable permissions, params int[] entityIds); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs index 0b23385f40..3081be7aff 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs @@ -122,7 +122,7 @@ namespace Umbraco.Core.Persistence.Repositories /// /// This will first clear the permissions for this user and entities and recreate them /// - public void AssignUserPermissions(int userId, IEnumerable permissions, params int[] entityIds) + public void ReplaceUserPermissions(int userId, IEnumerable permissions, params int[] entityIds) { var db = _unitOfWork.Database; using (var trans = db.GetTransaction()) @@ -160,16 +160,18 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// - /// - /// This does not replace permissions, just adds one if it doesn't exist - /// - public void AssignEntityPermissions(TEntity entity, char permission, IEnumerable userIds) + public void AssignEntityPermission(TEntity entity, char permission, IEnumerable userIds) { var db = _unitOfWork.Database; using (var trans = db.GetTransaction()) { - db.Execute("DELETE FROM umbracoUser2NodePermission WHERE nodeId=@nodeId AND permission=@permission", - new { nodeId = entity.Id, permission = permission.ToString(CultureInfo.InvariantCulture) }); + db.Execute("DELETE FROM umbracoUser2NodePermission WHERE nodeId=@nodeId AND permission=@permission AND userId in (@userIds)", + new + { + nodeId = entity.Id, + permission = permission.ToString(CultureInfo.InvariantCulture), + userIds = userIds + }); var actions = userIds.Select(id => new User2NodePermissionDto { @@ -198,7 +200,7 @@ namespace Umbraco.Core.Persistence.Repositories /// /// This will first clear the permissions for this entity then re-create them /// - public void AssignEntityPermissions(TEntity entity, IEnumerable> userPermissions) + public void ReplaceEntityPermissions(TEntity entity, IEnumerable> userPermissions) { var db = _unitOfWork.Database; using (var trans = db.GetTransaction()) diff --git a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs index 63a2d4917e..252756bdf4 100644 --- a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs @@ -325,15 +325,15 @@ namespace Umbraco.Core.Persistence.Repositories } /// - /// Assigns the same permission set for a single user to any number of entities + /// Replaces the same permission set for a single user to any number of entities /// /// /// /// - public void AssignUserPermissions(int userId, IEnumerable permissions, params int[] entityIds) + public void ReplaceUserPermissions(int userId, IEnumerable permissions, params int[] entityIds) { var repo = new PermissionRepository(UnitOfWork, _cacheHelper); - repo.AssignUserPermissions(userId, permissions, entityIds); + repo.ReplaceUserPermissions(userId, permissions, entityIds); } #endregion diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 607538decc..80c4ca362e 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -65,12 +65,12 @@ namespace Umbraco.Core.Services /// /// /// - public void AssignContentPermissions(IContent entity, char permission, IEnumerable userIds) + public void AssignContentPermission(IContent entity, char permission, IEnumerable userIds) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateContentRepository(uow)) { - repository.AssignEntityPermissions(entity, permission, userIds); + repository.AssignEntityPermission(entity, permission, userIds); } } diff --git a/src/Umbraco.Core/Services/IContentService.cs b/src/Umbraco.Core/Services/IContentService.cs index 672973a3ca..f26ec77b53 100644 --- a/src/Umbraco.Core/Services/IContentService.cs +++ b/src/Umbraco.Core/Services/IContentService.cs @@ -17,7 +17,7 @@ namespace Umbraco.Core.Services /// /// /// - void AssignContentPermissions(IContent entity, char permission, IEnumerable userIds); + void AssignContentPermission(IContent entity, char permission, IEnumerable userIds); /// /// Gets the list of permissions for the content item diff --git a/src/Umbraco.Core/Services/IUserService.cs b/src/Umbraco.Core/Services/IUserService.cs index 772d399dc9..ba401b0e10 100644 --- a/src/Umbraco.Core/Services/IUserService.cs +++ b/src/Umbraco.Core/Services/IUserService.cs @@ -54,12 +54,12 @@ namespace Umbraco.Core.Services IEnumerable GetPermissions(IUser user, params int[] nodeIds); /// - /// Assigns the same permission set for a single user to any number of entities + /// Replaces the same permission set for a single user to any number of entities /// /// /// /// - void AssignUserPermissions(int userId, IEnumerable permissions, params int[] entityIds); + void ReplaceUserPermissions(int userId, IEnumerable permissions, params int[] entityIds); #region User types diff --git a/src/Umbraco.Core/Services/UserService.cs b/src/Umbraco.Core/Services/UserService.cs index 98c6448f12..793b667c1d 100644 --- a/src/Umbraco.Core/Services/UserService.cs +++ b/src/Umbraco.Core/Services/UserService.cs @@ -399,17 +399,17 @@ namespace Umbraco.Core.Services } /// - /// Assigns the same permission set for a single user to any number of entities + /// Replaces the same permission set for a single user to any number of entities /// /// /// /// - public void AssignUserPermissions(int userId, IEnumerable permissions, params int[] entityIds) + public void ReplaceUserPermissions(int userId, IEnumerable permissions, params int[] entityIds) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateUserRepository(uow)) { - repository.AssignUserPermissions(userId, permissions, entityIds); + repository.ReplaceUserPermissions(userId, permissions, entityIds); } } diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 67b9a7c593..3cecf55a06 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -69,7 +69,7 @@ namespace Umbraco.Tests.Persistence.Repositories unitOfWork.Commit(); // Act - repository.AssignEntityPermissions(parentPage, 'A', new int[] { 0 }); + repository.AssignEntityPermission(parentPage, 'A', new int[] { 0 }); var childPage = MockedContent.CreateSimpleContent(contentType, "child", parentPage); repository.AddOrUpdate(childPage); unitOfWork.Commit(); diff --git a/src/Umbraco.Tests/Services/UserServiceTests.cs b/src/Umbraco.Tests/Services/UserServiceTests.cs index 047a1f99fd..ac2120edea 100644 --- a/src/Umbraco.Tests/Services/UserServiceTests.cs +++ b/src/Umbraco.Tests/Services/UserServiceTests.cs @@ -73,14 +73,14 @@ namespace Umbraco.Tests.Services MockedContent.CreateSimpleContent(contentType) }; ServiceContext.ContentService.Save(content); - ServiceContext.ContentService.AssignContentPermissions(content.ElementAt(0), ActionBrowse.Instance.Letter, new int[] { user.Id }); - ServiceContext.ContentService.AssignContentPermissions(content.ElementAt(0), ActionDelete.Instance.Letter, new int[] { user.Id }); - ServiceContext.ContentService.AssignContentPermissions(content.ElementAt(0), ActionMove.Instance.Letter, new int[] { user.Id }); + ServiceContext.ContentService.AssignContentPermission(content.ElementAt(0), ActionBrowse.Instance.Letter, new int[] { user.Id }); + ServiceContext.ContentService.AssignContentPermission(content.ElementAt(0), ActionDelete.Instance.Letter, new int[] { user.Id }); + ServiceContext.ContentService.AssignContentPermission(content.ElementAt(0), ActionMove.Instance.Letter, new int[] { user.Id }); - ServiceContext.ContentService.AssignContentPermissions(content.ElementAt(1), ActionBrowse.Instance.Letter, new int[] { user.Id }); - ServiceContext.ContentService.AssignContentPermissions(content.ElementAt(1), ActionDelete.Instance.Letter, new int[] { user.Id }); + ServiceContext.ContentService.AssignContentPermission(content.ElementAt(1), ActionBrowse.Instance.Letter, new int[] { user.Id }); + ServiceContext.ContentService.AssignContentPermission(content.ElementAt(1), ActionDelete.Instance.Letter, new int[] { user.Id }); - ServiceContext.ContentService.AssignContentPermissions(content.ElementAt(2), ActionBrowse.Instance.Letter, new int[] { user.Id }); + ServiceContext.ContentService.AssignContentPermission(content.ElementAt(2), ActionBrowse.Instance.Letter, new int[] { user.Id }); // Act var permissions = userService.GetPermissions(user, content.ElementAt(0).Id, content.ElementAt(1).Id, content.ElementAt(2).Id); diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/users/UserPermissions.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/users/UserPermissions.cs index 8a5308a24a..33818d43df 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/users/UserPermissions.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/users/UserPermissions.cs @@ -80,14 +80,14 @@ namespace umbraco.cms.presentation.user //if permissions are to be assigned, then assign them if (permissions.Count > 0) { - ApplicationContext.Current.Services.UserService.AssignUserPermissions( + ApplicationContext.Current.Services.UserService.ReplaceUserPermissions( _user.Id, permissions.Select(x => x.Letter), allNodes.ToArray()); } else { //If there are NO permissions for this node, we need to assign the ActionNull permission otherwise //the node will inherit from it's parent. - ApplicationContext.Current.Services.UserService.AssignUserPermissions( + ApplicationContext.Current.Services.UserService.ReplaceUserPermissions( _user.Id, new[] { ActionNull.Instance.Letter }, allNodes.ToArray()); } diff --git a/src/umbraco.cms/businesslogic/Permission.cs b/src/umbraco.cms/businesslogic/Permission.cs index 91fb96630e..ba0ad56b14 100644 --- a/src/umbraco.cms/businesslogic/Permission.cs +++ b/src/umbraco.cms/businesslogic/Permission.cs @@ -191,7 +191,7 @@ namespace umbraco.BusinessLogic [MethodImpl(MethodImplOptions.Synchronized)] public static void UpdateCruds(User user, CMSNode node, string permissions) { - ApplicationContext.Current.Services.UserService.AssignUserPermissions( + ApplicationContext.Current.Services.UserService.ReplaceUserPermissions( user.Id, permissions.ToCharArray(), node.Id); From c677f36f088e1b8923d2a622085ab0a62413f5a2 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 21 Feb 2014 16:03:32 +1100 Subject: [PATCH 6/7] Changes some of the naming conventions for the underlying membership provider services bits. --- .../UmbracoMembersMembershipProviderBase.cs | 2 +- .../Services/IMembershipMemberService.cs | 14 ++++---- src/Umbraco.Core/Services/MemberService.cs | 34 +++++++++---------- .../Services/NotificationService.cs | 2 +- src/Umbraco.Core/Services/UserService.cs | 26 +++++++------- .../UmbracoServiceMembershipProviderTests.cs | 6 ++-- .../Services/MemberServiceTests.cs | 26 +++++++------- .../Services/UserServiceTests.cs | 16 ++++----- .../Providers/MembersMembershipProvider.cs | 2 +- ...ovider.cs => UmbracoMembershipProvider.cs} | 26 +++++++------- .../Providers/UsersMembershipProvider.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 4 +-- .../umbraco/members/EditMember.aspx.cs | 2 +- src/umbraco.businesslogic/User.cs | 10 +++--- .../businesslogic/member/Member.cs | 8 ++--- .../members/UmbracoMembershipProvider.cs | 10 +++--- 16 files changed, 95 insertions(+), 95 deletions(-) rename src/Umbraco.Web/Security/Providers/{UmbracoServiceMembershipProvider.cs => UmbracoMembershipProvider.cs} (93%) diff --git a/src/Umbraco.Core/Security/UmbracoMembersMembershipProviderBase.cs b/src/Umbraco.Core/Security/UmbracoMembersMembershipProviderBase.cs index ce56c2708e..fc07abc896 100644 --- a/src/Umbraco.Core/Security/UmbracoMembersMembershipProviderBase.cs +++ b/src/Umbraco.Core/Security/UmbracoMembersMembershipProviderBase.cs @@ -6,7 +6,7 @@ namespace Umbraco.Core.Security /// An interface for exposing the content type properties for storing membership data in when /// a membership provider's data is backed by an Umbraco content type. /// - public interface IUmbracoContentTypeMembershipProvider + public interface IUmbracoMemberTypeMembershipProvider { string LockPropertyTypeAlias { get; } diff --git a/src/Umbraco.Core/Services/IMembershipMemberService.cs b/src/Umbraco.Core/Services/IMembershipMemberService.cs index 807b250ea7..35c996f51a 100644 --- a/src/Umbraco.Core/Services/IMembershipMemberService.cs +++ b/src/Umbraco.Core/Services/IMembershipMemberService.cs @@ -48,7 +48,7 @@ namespace Umbraco.Core.Services /// /// /// - T CreateMemberWithIdentity(string username, string email, string password, string memberTypeAlias, bool raiseEvents = true); + T CreateWithIdentity(string username, string email, string password, string memberTypeAlias, bool raiseEvents = true); /// /// Gets the member by the provider key @@ -68,19 +68,19 @@ namespace Umbraco.Core.Services void Delete(T membershipUser); - void Save(T membershipUser, bool raiseEvents = true); + void Save(T entity, bool raiseEvents = true); - void Save(IEnumerable members, bool raiseEvents = true); + void Save(IEnumerable entities, bool raiseEvents = true); - IEnumerable FindMembersByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith); + IEnumerable FindByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith); - IEnumerable FindMembersByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith); + IEnumerable FindByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith); /// /// Gets the total number of members based on the count type /// /// - int GetMemberCount(MemberCountType countType); + int GetCount(MemberCountType countType); /// /// Gets a list of paged member data @@ -89,6 +89,6 @@ namespace Umbraco.Core.Services /// /// /// - IEnumerable GetAllMembers(int pageIndex, int pageSize, out int totalRecords); + IEnumerable GetAll(int pageIndex, int pageSize, out int totalRecords); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs index f7cccd798e..e0c325e31c 100644 --- a/src/Umbraco.Core/Services/MemberService.cs +++ b/src/Umbraco.Core/Services/MemberService.cs @@ -252,7 +252,7 @@ namespace Umbraco.Core.Services /// /// /// - public IEnumerable FindMembersByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith) + public IEnumerable FindByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) @@ -284,7 +284,7 @@ namespace Umbraco.Core.Services } } - public IEnumerable FindMembersByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith) + public IEnumerable FindByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) @@ -525,7 +525,7 @@ namespace Umbraco.Core.Services /// that have their last active date within the Membership.UserIsOnlineTimeWindow (which is in minutes). It isn't exact science /// but that is how MS have made theirs so we'll follow that principal. /// - public int GetMemberCount(MemberCountType countType) + public int GetCount(MemberCountType countType) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { @@ -565,7 +565,7 @@ namespace Umbraco.Core.Services } - public IEnumerable GetAllMembers(int pageIndex, int pageSize, out int totalRecords) + public IEnumerable GetAll(int pageIndex, int pageSize, out int totalRecords) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) @@ -615,7 +615,7 @@ namespace Umbraco.Core.Services /// /// /// - public IMember CreateMemberWithIdentity(string username, string email, string password, string memberTypeAlias, bool raiseEvents = true) + public IMember CreateWithIdentity(string username, string email, string password, string memberTypeAlias, bool raiseEvents = true) { var uow = _uowProvider.GetUnitOfWork(); IMemberType memberType; @@ -712,13 +712,13 @@ namespace Umbraco.Core.Services /// /// Saves an updated Member /// - /// + /// /// - public void Save(IMember member, bool raiseEvents = true) + public void Save(IMember entity, bool raiseEvents = true) { if (raiseEvents) { - if (Saving.IsRaisedEventCancelled(new SaveEventArgs(member), this)) + if (Saving.IsRaisedEventCancelled(new SaveEventArgs(entity), this)) { return; } @@ -728,22 +728,22 @@ namespace Umbraco.Core.Services var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { - repository.AddOrUpdate(member); + repository.AddOrUpdate(entity); uow.Commit(); - var xml = member.ToXml(); - CreateAndSaveMemberXml(xml, member.Id, uow.Database); + var xml = entity.ToXml(); + CreateAndSaveMemberXml(xml, entity.Id, uow.Database); } if (raiseEvents) - Saved.RaiseEvent(new SaveEventArgs(member, false), this); + Saved.RaiseEvent(new SaveEventArgs(entity, false), this); } - public void Save(IEnumerable members, bool raiseEvents = true) + public void Save(IEnumerable entities, bool raiseEvents = true) { if (raiseEvents) { - if (Saving.IsRaisedEventCancelled(new SaveEventArgs(members), this)) + if (Saving.IsRaisedEventCancelled(new SaveEventArgs(entities), this)) return; } using (new WriteLock(Locker)) @@ -751,7 +751,7 @@ namespace Umbraco.Core.Services var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { - foreach (var member in members) + foreach (var member in entities) { repository.AddOrUpdate(member); } @@ -759,14 +759,14 @@ namespace Umbraco.Core.Services //commit the whole lot in one go uow.Commit(); - foreach (var member in members) + foreach (var member in entities) { CreateAndSaveMemberXml(member.ToXml(), member.Id, uow.Database); } } if (raiseEvents) - Saved.RaiseEvent(new SaveEventArgs(members, false), this); + Saved.RaiseEvent(new SaveEventArgs(entities, false), this); } } diff --git a/src/Umbraco.Core/Services/NotificationService.cs b/src/Umbraco.Core/Services/NotificationService.cs index aa345266be..ba42548bac 100644 --- a/src/Umbraco.Core/Services/NotificationService.cs +++ b/src/Umbraco.Core/Services/NotificationService.cs @@ -58,7 +58,7 @@ namespace Umbraco.Core.Services IContent[] allVersions = null; int totalUsers; - var allUsers = _userService.GetAllMembers(0, int.MaxValue, out totalUsers); + var allUsers = _userService.GetAll(0, int.MaxValue, out totalUsers); foreach (var u in allUsers) { if (u.IsApproved == false) continue; diff --git a/src/Umbraco.Core/Services/UserService.cs b/src/Umbraco.Core/Services/UserService.cs index 793b667c1d..db0d20ed50 100644 --- a/src/Umbraco.Core/Services/UserService.cs +++ b/src/Umbraco.Core/Services/UserService.cs @@ -119,7 +119,7 @@ namespace Umbraco.Core.Services } } - public IUser CreateMemberWithIdentity(string username, string email, string password, string memberTypeAlias, bool raiseEvents = true) + public IUser CreateWithIdentity(string username, string email, string password, string memberTypeAlias, bool raiseEvents = true) { var userType = GetUserTypeByAlias(memberTypeAlias); if (userType == null) @@ -218,37 +218,37 @@ namespace Umbraco.Core.Services } } - public void Save(IUser membershipUser, bool raiseEvents = true) + public void Save(IUser entity, bool raiseEvents = true) { if (raiseEvents) { - if (SavingUser.IsRaisedEventCancelled(new SaveEventArgs(membershipUser), this)) + if (SavingUser.IsRaisedEventCancelled(new SaveEventArgs(entity), this)) return; } var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateUserRepository(uow)) { - repository.AddOrUpdate(membershipUser); + repository.AddOrUpdate(entity); uow.Commit(); } if (raiseEvents) - SavedUser.RaiseEvent(new SaveEventArgs(membershipUser, false), this); + SavedUser.RaiseEvent(new SaveEventArgs(entity, false), this); } - public void Save(IEnumerable members, bool raiseEvents = true) + public void Save(IEnumerable entities, bool raiseEvents = true) { if (raiseEvents) { - if (SavingUser.IsRaisedEventCancelled(new SaveEventArgs(members), this)) + if (SavingUser.IsRaisedEventCancelled(new SaveEventArgs(entities), this)) return; } var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateUserRepository(uow)) { - foreach (var member in members) + foreach (var member in entities) { repository.AddOrUpdate(member); } @@ -257,10 +257,10 @@ namespace Umbraco.Core.Services } if (raiseEvents) - SavedUser.RaiseEvent(new SaveEventArgs(members, false), this); + SavedUser.RaiseEvent(new SaveEventArgs(entities, false), this); } - public IEnumerable FindMembersByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith) + public IEnumerable FindByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateUserRepository(uow)) @@ -292,7 +292,7 @@ namespace Umbraco.Core.Services } } - public IEnumerable FindMembersByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith) + public IEnumerable FindByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateUserRepository(uow)) @@ -324,7 +324,7 @@ namespace Umbraco.Core.Services } } - public int GetMemberCount(MemberCountType countType) + public int GetCount(MemberCountType countType) { using (var repository = _repositoryFactory.CreateUserRepository(_uowProvider.GetUnitOfWork())) { @@ -360,7 +360,7 @@ namespace Umbraco.Core.Services } } - public IEnumerable GetAllMembers(int pageIndex, int pageSize, out int totalRecords) + public IEnumerable GetAll(int pageIndex, int pageSize, out int totalRecords) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateUserRepository(uow)) diff --git a/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs b/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs index b39bdeeab2..0053dc758e 100644 --- a/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs +++ b/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs @@ -94,7 +94,7 @@ namespace Umbraco.Tests.Membership mServiceMock.Setup(service => service.GetByEmail("test@test.com")).Returns(() => null); mServiceMock.Setup(service => service.GetDefaultMemberType()).Returns("Member"); mServiceMock.Setup( - service => service.CreateMemberWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + service => service.CreateWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Callback((string u, string e, string p, string m, bool b) => { createdMember = new Member("test", e, u, p, memberType); @@ -125,7 +125,7 @@ namespace Umbraco.Tests.Membership mServiceMock.Setup(service => service.GetByEmail("test@test.com")).Returns(() => null); mServiceMock.Setup(service => service.GetDefaultMemberType()).Returns("Member"); mServiceMock.Setup( - service => service.CreateMemberWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + service => service.CreateWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Callback((string u, string e, string p, string m, bool b) => { createdMember = new Member("test", e, u, p, memberType); @@ -158,7 +158,7 @@ namespace Umbraco.Tests.Membership mServiceMock.Setup(service => service.GetByEmail("test@test.com")).Returns(() => null); mServiceMock.Setup(service => service.GetDefaultMemberType()).Returns("Member"); mServiceMock.Setup( - service => service.CreateMemberWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + service => service.CreateWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Callback((string u, string e, string p, string m, bool b) => { createdMember = new Member("test", e, u, p, memberType); diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs index 380f050224..527a7b9801 100644 --- a/src/Umbraco.Tests/Services/MemberServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs @@ -381,7 +381,7 @@ namespace Umbraco.Tests.Services ServiceContext.MemberService.Save(members); int totalRecs; - var found = ServiceContext.MemberService.GetAllMembers(0, 2, out totalRecs); + var found = ServiceContext.MemberService.GetAll(0, 2, out totalRecs); Assert.AreEqual(2, found.Count()); Assert.AreEqual(10, totalRecs); @@ -401,7 +401,7 @@ namespace Umbraco.Tests.Services ServiceContext.MemberService.Save(customMember); int totalRecs; - var found = ServiceContext.MemberService.FindMembersByEmail("tes", 0, 100, out totalRecs, StringPropertyMatchType.StartsWith); + var found = ServiceContext.MemberService.FindByEmail("tes", 0, 100, out totalRecs, StringPropertyMatchType.StartsWith); Assert.AreEqual(10, found.Count()); } @@ -418,7 +418,7 @@ namespace Umbraco.Tests.Services ServiceContext.MemberService.Save(customMember); int totalRecs; - var found = ServiceContext.MemberService.FindMembersByEmail("test.com", 0, 100, out totalRecs, StringPropertyMatchType.EndsWith); + var found = ServiceContext.MemberService.FindByEmail("test.com", 0, 100, out totalRecs, StringPropertyMatchType.EndsWith); Assert.AreEqual(11, found.Count()); } @@ -435,7 +435,7 @@ namespace Umbraco.Tests.Services ServiceContext.MemberService.Save(customMember); int totalRecs; - var found = ServiceContext.MemberService.FindMembersByEmail("test", 0, 100, out totalRecs, StringPropertyMatchType.Contains); + var found = ServiceContext.MemberService.FindByEmail("test", 0, 100, out totalRecs, StringPropertyMatchType.Contains); Assert.AreEqual(11, found.Count()); } @@ -452,7 +452,7 @@ namespace Umbraco.Tests.Services ServiceContext.MemberService.Save(customMember); int totalRecs; - var found = ServiceContext.MemberService.FindMembersByEmail("hello@test.com", 0, 100, out totalRecs, StringPropertyMatchType.Exact); + var found = ServiceContext.MemberService.FindByEmail("hello@test.com", 0, 100, out totalRecs, StringPropertyMatchType.Exact); Assert.AreEqual(1, found.Count()); } @@ -469,7 +469,7 @@ namespace Umbraco.Tests.Services ServiceContext.MemberService.Save(customMember); int totalRecs; - var found = ServiceContext.MemberService.FindMembersByUsername("tes", 0, 100, out totalRecs, StringPropertyMatchType.StartsWith); + var found = ServiceContext.MemberService.FindByUsername("tes", 0, 100, out totalRecs, StringPropertyMatchType.StartsWith); Assert.AreEqual(10, found.Count()); } @@ -486,7 +486,7 @@ namespace Umbraco.Tests.Services ServiceContext.MemberService.Save(customMember); int totalRecs; - var found = ServiceContext.MemberService.FindMembersByUsername("llo", 0, 100, out totalRecs, StringPropertyMatchType.EndsWith); + var found = ServiceContext.MemberService.FindByUsername("llo", 0, 100, out totalRecs, StringPropertyMatchType.EndsWith); Assert.AreEqual(1, found.Count()); } @@ -503,7 +503,7 @@ namespace Umbraco.Tests.Services ServiceContext.MemberService.Save(customMember); int totalRecs; - var found = ServiceContext.MemberService.FindMembersByUsername("test", 0, 100, out totalRecs, StringPropertyMatchType.Contains); + var found = ServiceContext.MemberService.FindByUsername("test", 0, 100, out totalRecs, StringPropertyMatchType.Contains); Assert.AreEqual(11, found.Count()); } @@ -520,7 +520,7 @@ namespace Umbraco.Tests.Services ServiceContext.MemberService.Save(customMember); int totalRecs; - var found = ServiceContext.MemberService.FindMembersByUsername("hello", 0, 100, out totalRecs, StringPropertyMatchType.Exact); + var found = ServiceContext.MemberService.FindByUsername("hello", 0, 100, out totalRecs, StringPropertyMatchType.Exact); Assert.AreEqual(1, found.Count()); } @@ -850,7 +850,7 @@ namespace Umbraco.Tests.Services var customMember = MockedMember.CreateSimpleMember(memberType, "hello", "hello@test.com", "hello", "hello"); ServiceContext.MemberService.Save(customMember); - var found = ServiceContext.MemberService.GetMemberCount(MemberCountType.All); + var found = ServiceContext.MemberService.GetCount(MemberCountType.All); Assert.AreEqual(11, found); } @@ -867,7 +867,7 @@ namespace Umbraco.Tests.Services customMember.SetValue(Constants.Conventions.Member.LastLoginDate, DateTime.Now); ServiceContext.MemberService.Save(customMember); - var found = ServiceContext.MemberService.GetMemberCount(MemberCountType.Online); + var found = ServiceContext.MemberService.GetCount(MemberCountType.Online); Assert.AreEqual(9, found); } @@ -884,7 +884,7 @@ namespace Umbraco.Tests.Services customMember.SetValue(Constants.Conventions.Member.IsLockedOut, true); ServiceContext.MemberService.Save(customMember); - var found = ServiceContext.MemberService.GetMemberCount(MemberCountType.LockedOut); + var found = ServiceContext.MemberService.GetCount(MemberCountType.LockedOut); Assert.AreEqual(6, found); } @@ -901,7 +901,7 @@ namespace Umbraco.Tests.Services customMember.SetValue(Constants.Conventions.Member.IsApproved, false); ServiceContext.MemberService.Save(customMember); - var found = ServiceContext.MemberService.GetMemberCount(MemberCountType.Approved); + var found = ServiceContext.MemberService.GetCount(MemberCountType.Approved); Assert.AreEqual(5, found); } diff --git a/src/Umbraco.Tests/Services/UserServiceTests.cs b/src/Umbraco.Tests/Services/UserServiceTests.cs index ac2120edea..224d3d335b 100644 --- a/src/Umbraco.Tests/Services/UserServiceTests.cs +++ b/src/Umbraco.Tests/Services/UserServiceTests.cs @@ -188,7 +188,7 @@ namespace Umbraco.Tests.Services ServiceContext.UserService.Save(customUser); int totalRecs; - var found = ServiceContext.UserService.FindMembersByEmail("tes", 0, 100, out totalRecs, StringPropertyMatchType.StartsWith); + var found = ServiceContext.UserService.FindByEmail("tes", 0, 100, out totalRecs, StringPropertyMatchType.StartsWith); Assert.AreEqual(10, found.Count()); } @@ -206,7 +206,7 @@ namespace Umbraco.Tests.Services ServiceContext.UserService.Save(customUser); int totalRecs; - var found = ServiceContext.UserService.FindMembersByEmail("test.com", 0, 100, out totalRecs, StringPropertyMatchType.EndsWith); + var found = ServiceContext.UserService.FindByEmail("test.com", 0, 100, out totalRecs, StringPropertyMatchType.EndsWith); Assert.AreEqual(11, found.Count()); } @@ -224,7 +224,7 @@ namespace Umbraco.Tests.Services ServiceContext.UserService.Save(customUser); int totalRecs; - var found = ServiceContext.UserService.FindMembersByEmail("test", 0, 100, out totalRecs, StringPropertyMatchType.Contains); + var found = ServiceContext.UserService.FindByEmail("test", 0, 100, out totalRecs, StringPropertyMatchType.Contains); Assert.AreEqual(11, found.Count()); } @@ -242,7 +242,7 @@ namespace Umbraco.Tests.Services ServiceContext.UserService.Save(customUser); int totalRecs; - var found = ServiceContext.UserService.FindMembersByEmail("hello@test.com", 0, 100, out totalRecs, StringPropertyMatchType.Exact); + var found = ServiceContext.UserService.FindByEmail("hello@test.com", 0, 100, out totalRecs, StringPropertyMatchType.Exact); Assert.AreEqual(1, found.Count()); } @@ -256,7 +256,7 @@ namespace Umbraco.Tests.Services ServiceContext.UserService.Save(users); int totalRecs; - var found = ServiceContext.UserService.GetAllMembers(0, 2, out totalRecs); + var found = ServiceContext.UserService.GetAll(0, 2, out totalRecs); Assert.AreEqual(2, found.Count()); // + 1 because of the built in admin user @@ -275,7 +275,7 @@ namespace Umbraco.Tests.Services var customUser = MockedUser.CreateUser(userType); ServiceContext.UserService.Save(customUser); - var found = ServiceContext.UserService.GetMemberCount(MemberCountType.All); + var found = ServiceContext.UserService.GetCount(MemberCountType.All); // + 1 because of the built in admin user Assert.AreEqual(12, found); @@ -306,7 +306,7 @@ namespace Umbraco.Tests.Services customUser.IsLockedOut = true; ServiceContext.UserService.Save(customUser); - var found = ServiceContext.UserService.GetMemberCount(MemberCountType.LockedOut); + var found = ServiceContext.UserService.GetCount(MemberCountType.LockedOut); Assert.AreEqual(6, found); } @@ -323,7 +323,7 @@ namespace Umbraco.Tests.Services customUser.IsApproved = false; ServiceContext.UserService.Save(customUser); - var found = ServiceContext.UserService.GetMemberCount(MemberCountType.Approved); + var found = ServiceContext.UserService.GetCount(MemberCountType.Approved); // + 1 because of the built in admin user Assert.AreEqual(6, found); diff --git a/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs index 0fc70a2ce4..1dc88b4b51 100644 --- a/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs +++ b/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs @@ -18,7 +18,7 @@ namespace Umbraco.Web.Security.Providers /// /// Custom Membership Provider for Umbraco Members (User authentication for Frontend applications NOT umbraco CMS) /// - public class MembersMembershipProvider : UmbracoServiceMembershipProvider, IUmbracoContentTypeMembershipProvider + public class MembersMembershipProvider : UmbracoMembershipProvider, IUmbracoMemberTypeMembershipProvider { public MembersMembershipProvider() : this(ApplicationContext.Current.Services.MemberService) diff --git a/src/Umbraco.Web/Security/Providers/UmbracoServiceMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs similarity index 93% rename from src/Umbraco.Web/Security/Providers/UmbracoServiceMembershipProvider.cs rename to src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs index 84bd8dc65b..6b6e3e96fa 100644 --- a/src/Umbraco.Web/Security/Providers/UmbracoServiceMembershipProvider.cs +++ b/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs @@ -19,14 +19,14 @@ namespace Umbraco.Web.Security.Providers /// /// Abstract Membership Provider that users any implementation of IMembershipMemberService{TEntity} service /// - public abstract class UmbracoServiceMembershipProvider : UmbracoMembershipProviderBase + public abstract class UmbracoMembershipProvider : UmbracoMembershipProviderBase where T : IMembershipMemberService where TEntity : class, IMembershipUser { protected IMembershipMemberService MemberService { get; private set; } - protected UmbracoServiceMembershipProvider(IMembershipMemberService memberService) + protected UmbracoMembershipProvider(IMembershipMemberService memberService) { MemberService = memberService; } @@ -134,7 +134,7 @@ namespace Umbraco.Web.Security.Providers if (MemberService.Exists(username)) { status = MembershipCreateStatus.DuplicateUserName; - LogHelper.Warn>("Cannot create member as username already exists: " + username); + LogHelper.Warn>("Cannot create member as username already exists: " + username); return null; } @@ -142,7 +142,7 @@ namespace Umbraco.Web.Security.Providers if (MemberService.GetByEmail(email) != null && RequiresUniqueEmail) { status = MembershipCreateStatus.DuplicateEmail; - LogHelper.Warn>( + LogHelper.Warn>( "Cannot create member as a member with the same email address exists: " + email); return null; } @@ -150,7 +150,7 @@ namespace Umbraco.Web.Security.Providers string salt; var encodedPassword = EncryptOrHashNewPassword(password, out salt); - var member = MemberService.CreateMemberWithIdentity( + var member = MemberService.CreateWithIdentity( username, email, FormatPasswordForStorage(encodedPassword, salt), @@ -199,7 +199,7 @@ namespace Umbraco.Web.Security.Providers /// public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) { - var byEmail = MemberService.FindMembersByEmail(emailToMatch, pageIndex, pageSize, out totalRecords, StringPropertyMatchType.Wildcard).ToArray(); + var byEmail = MemberService.FindByEmail(emailToMatch, pageIndex, pageSize, out totalRecords, StringPropertyMatchType.Wildcard).ToArray(); var collection = new MembershipUserCollection(); foreach (var m in byEmail) @@ -221,7 +221,7 @@ namespace Umbraco.Web.Security.Providers /// public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) { - var byEmail = MemberService.FindMembersByUsername(usernameToMatch, pageIndex, pageSize, out totalRecords, StringPropertyMatchType.Wildcard).ToArray(); + var byEmail = MemberService.FindByUsername(usernameToMatch, pageIndex, pageSize, out totalRecords, StringPropertyMatchType.Wildcard).ToArray(); var collection = new MembershipUserCollection(); foreach (var m in byEmail) @@ -244,7 +244,7 @@ namespace Umbraco.Web.Security.Providers { var membersList = new MembershipUserCollection(); - var pagedMembers = MemberService.GetAllMembers(pageIndex, pageSize, out totalRecords); + var pagedMembers = MemberService.GetAll(pageIndex, pageSize, out totalRecords); foreach (var m in pagedMembers) { @@ -266,7 +266,7 @@ namespace Umbraco.Web.Security.Providers /// public override int GetNumberOfUsersOnline() { - return MemberService.GetMemberCount(MemberCountType.Online); + return MemberService.GetCount(MemberCountType.Online); } /// @@ -463,7 +463,7 @@ namespace Umbraco.Web.Security.Providers if (RequiresUniqueEmail && user.Email.Trim().IsNullOrWhiteSpace() == false) { int totalRecs; - var byEmail = MemberService.FindMembersByEmail(user.Email.Trim(), 0, int.MaxValue, out totalRecs, StringPropertyMatchType.Exact); + var byEmail = MemberService.FindByEmail(user.Email.Trim(), 0, int.MaxValue, out totalRecs, StringPropertyMatchType.Exact); if (byEmail.Count(x => x.Id != m.Id) > 0) { throw new ProviderException(string.Format("A member with the email '{0}' already exists", user.Email)); @@ -498,12 +498,12 @@ namespace Umbraco.Web.Security.Providers if (member.IsApproved == false) { - LogHelper.Info>("Cannot validate member " + username + " because they are not approved"); + LogHelper.Info>("Cannot validate member " + username + " because they are not approved"); return false; } if (member.IsLockedOut) { - LogHelper.Info>("Cannot validate member " + username + " because they are currently locked out"); + LogHelper.Info>("Cannot validate member " + username + " because they are currently locked out"); return false; } @@ -521,7 +521,7 @@ namespace Umbraco.Web.Security.Providers { member.IsLockedOut = true; member.LastLockoutDate = DateTime.Now; - LogHelper.Info>("Member " + username + " is now locked out, max invalid password attempts exceeded"); + LogHelper.Info>("Member " + username + " is now locked out, max invalid password attempts exceeded"); } } else diff --git a/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs index e3ede8f6d8..2dbce6a350 100644 --- a/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs +++ b/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs @@ -13,7 +13,7 @@ namespace Umbraco.Web.Security.Providers /// /// Custom Membership Provider for Umbraco Users (User authentication for Umbraco Backend CMS) /// - public class UsersMembershipProvider : UmbracoServiceMembershipProvider, IUsersMembershipProvider + public class UsersMembershipProvider : UmbracoMembershipProvider, IUsersMembershipProvider { public UsersMembershipProvider() diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index a3081cdb8d..944d51536a 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -1,4 +1,4 @@ - + @@ -319,7 +319,7 @@ - + diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs index 4151c3cecd..148b6bc861 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs @@ -360,7 +360,7 @@ namespace umbraco.cms.presentation.members tp.ErrorControl.Visible = false; } - var memberTypeProvider = (IUmbracoContentTypeMembershipProvider) Membership.Provider; + var memberTypeProvider = (IUmbracoMemberTypeMembershipProvider) Membership.Provider; //update the membership provider var commentsProp = _contentControl.DataTypes.GetValue(memberTypeProvider.CommentPropertyTypeAlias); diff --git a/src/umbraco.businesslogic/User.cs b/src/umbraco.businesslogic/User.cs index 89ce9324f5..f0ebb4590d 100644 --- a/src/umbraco.businesslogic/User.cs +++ b/src/umbraco.businesslogic/User.cs @@ -341,7 +341,7 @@ namespace umbraco.BusinessLogic public static User[] getAll() { int totalRecs; - var users = ApplicationContext.Current.Services.UserService.GetAllMembers( + var users = ApplicationContext.Current.Services.UserService.GetAll( 0, int.MaxValue, out totalRecs); return users.Select(x => new User(x)) @@ -390,14 +390,14 @@ namespace umbraco.BusinessLogic int totalRecs; if (useExactMatch) { - return ApplicationContext.Current.Services.UserService.FindMembersByEmail( + return ApplicationContext.Current.Services.UserService.FindByEmail( email, 0, int.MaxValue, out totalRecs, StringPropertyMatchType.Exact) .Select(x => new User(x)) .ToArray(); } else { - return ApplicationContext.Current.Services.UserService.FindMembersByEmail( + return ApplicationContext.Current.Services.UserService.FindByEmail( string.Format("%{0}%", email), 0, int.MaxValue, out totalRecs, StringPropertyMatchType.Wildcard) .Select(x => new User(x)) .ToArray(); @@ -430,14 +430,14 @@ namespace umbraco.BusinessLogic int totalRecs; if (partialMatch) { - return ApplicationContext.Current.Services.UserService.FindMembersByUsername( + return ApplicationContext.Current.Services.UserService.FindByUsername( string.Format("%{0}%", login), 0, int.MaxValue, out totalRecs, StringPropertyMatchType.Wildcard) .Select(x => new User(x)) .ToArray(); } else { - return ApplicationContext.Current.Services.UserService.FindMembersByUsername( + return ApplicationContext.Current.Services.UserService.FindByUsername( login, 0, int.MaxValue, out totalRecs, StringPropertyMatchType.Exact) .Select(x => new User(x)) .ToArray(); diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs index b90d1e3eb0..75c6788640 100644 --- a/src/umbraco.cms/businesslogic/member/Member.cs +++ b/src/umbraco.cms/businesslogic/member/Member.cs @@ -113,7 +113,7 @@ namespace umbraco.cms.businesslogic.member public static IEnumerable GetAllAsList() { int totalRecs; - return ApplicationContext.Current.Services.MemberService.GetAllMembers(0, int.MaxValue, out totalRecs) + return ApplicationContext.Current.Services.MemberService.GetAll(0, int.MaxValue, out totalRecs) .Select(x => new Member(x)) .ToArray(); } @@ -153,7 +153,7 @@ namespace umbraco.cms.businesslogic.member public static Member[] getMemberFromFirstLetter(char letter) { int totalRecs; - return ApplicationContext.Current.Services.MemberService.FindMembersByUsername( + return ApplicationContext.Current.Services.MemberService.FindByUsername( letter.ToString(CultureInfo.InvariantCulture), 0, int.MaxValue, out totalRecs, StringPropertyMatchType.StartsWith) .Select(x => new Member(x)) .ToArray(); @@ -170,7 +170,7 @@ namespace umbraco.cms.businesslogic.member } else { - var found = ApplicationContext.Current.Services.MemberService.FindMembersByUsername( + var found = ApplicationContext.Current.Services.MemberService.FindByUsername( usernameToMatch, 0, int.MaxValue, out totalRecs, StringPropertyMatchType.StartsWith); return found.Select(x => new Member(x)).ToArray(); } @@ -290,7 +290,7 @@ namespace umbraco.cms.businesslogic.member return null; int totalRecs; - var found = ApplicationContext.Current.Services.MemberService.FindMembersByEmail( + var found = ApplicationContext.Current.Services.MemberService.FindByEmail( email, 0, int.MaxValue, out totalRecs, StringPropertyMatchType.Exact); return found.Select(x => new Member(x)).ToArray(); diff --git a/src/umbraco.providers/members/UmbracoMembershipProvider.cs b/src/umbraco.providers/members/UmbracoMembershipProvider.cs index 8f6a056712..6a36273164 100644 --- a/src/umbraco.providers/members/UmbracoMembershipProvider.cs +++ b/src/umbraco.providers/members/UmbracoMembershipProvider.cs @@ -30,7 +30,7 @@ namespace umbraco.providers.members /// Custom Membership Provider for Umbraco Members (User authentication for Frontend applications NOT umbraco CMS) /// [Obsolete("This has been superceded by Umbraco.Web.Security.Providers.MembersMembershipProvider")] - public class UmbracoMembershipProvider : UmbracoMembershipProviderBase, IUmbracoContentTypeMembershipProvider + public class UmbracoMembershipProvider : UmbracoMembershipProviderBase, IUmbracoMemberTypeMembershipProvider { public UmbracoMembershipProvider() { @@ -350,7 +350,7 @@ namespace umbraco.providers.members /// public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) { - var byEmail = ApplicationContext.Current.Services.MemberService.FindMembersByEmail(emailToMatch, pageIndex, pageSize, out totalRecords, StringPropertyMatchType.Wildcard).ToArray(); + var byEmail = ApplicationContext.Current.Services.MemberService.FindByEmail(emailToMatch, pageIndex, pageSize, out totalRecords, StringPropertyMatchType.Wildcard).ToArray(); var collection = new MembershipUserCollection(); foreach (var m in byEmail) @@ -372,7 +372,7 @@ namespace umbraco.providers.members /// public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) { - var byEmail = ApplicationContext.Current.Services.MemberService.FindMembersByUsername(usernameToMatch, pageIndex, pageSize, out totalRecords, StringPropertyMatchType.Wildcard).ToArray(); + var byEmail = ApplicationContext.Current.Services.MemberService.FindByUsername(usernameToMatch, pageIndex, pageSize, out totalRecords, StringPropertyMatchType.Wildcard).ToArray(); var collection = new MembershipUserCollection(); foreach (var m in byEmail) @@ -395,7 +395,7 @@ namespace umbraco.providers.members { var membersList = new MembershipUserCollection(); - var pagedMembers = ApplicationContext.Current.Services.MemberService.GetAllMembers(pageIndex, pageSize, out totalRecords); + var pagedMembers = ApplicationContext.Current.Services.MemberService.GetAll(pageIndex, pageSize, out totalRecords); foreach (var m in pagedMembers) { @@ -412,7 +412,7 @@ namespace umbraco.providers.members /// public override int GetNumberOfUsersOnline() { - return ApplicationContext.Current.Services.MemberService.GetMemberCount(MemberCountType.Online); + return ApplicationContext.Current.Services.MemberService.GetCount(MemberCountType.Online); } /// From 27cb1d5223113c7db95de064fd6370b1b4e1afd6 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 21 Feb 2014 16:20:07 +1100 Subject: [PATCH 7/7] completes: U4-4275 Hide built-in member type properties from the insert umbraco field list --- .../developer/Xslt/xsltInsertValueOf.aspx.cs | 29 +++++------------- .../umbraco/dialogs/umbracoField.aspx.cs | 30 +++++++------------ 2 files changed, 18 insertions(+), 41 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Xslt/xsltInsertValueOf.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Xslt/xsltInsertValueOf.aspx.cs index 05be8c77e7..267792a4b7 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Xslt/xsltInsertValueOf.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Xslt/xsltInsertValueOf.aspx.cs @@ -3,12 +3,14 @@ using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; +using System.Linq; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using umbraco.cms.businesslogic.propertytype; +using Umbraco.Core; namespace umbraco.developer { @@ -34,16 +36,20 @@ namespace umbraco.developer // generic properties string existingGenProps = ","; - foreach (PropertyType pt in PropertyType.GetAll()) + var exclude = Constants.Conventions.Member.GetStandardPropertyTypeStubs().Select(x => x.Key).ToArray(); + foreach (PropertyType pt in PropertyType.GetAll().Where(x => exclude.Contains(x.Alias) == false)) + { if (!existingGenProps.Contains("," + pt.Alias + ",")) { - if(UmbracoSettings.UseLegacyXmlSchema) + if (UmbracoSettings.UseLegacyXmlSchema) preValuesSource.Add(string.Format("data [@alias = '{0}']", pt.Alias)); else preValuesSource.Add(pt.Alias); existingGenProps += pt.Alias + ","; } + } + preValuesSource.Sort(); preValues.DataSource = preValuesSource; @@ -56,24 +62,5 @@ namespace umbraco.developer valueOf.Text = Request.QueryString["value"]; } - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - - } - #endregion } } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/umbracoField.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/umbracoField.aspx.cs index 671891701e..449d51832d 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/umbracoField.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/umbracoField.aspx.cs @@ -3,12 +3,14 @@ using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; +using System.Linq; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; - +using Umbraco.Core; +using Umbraco.Core.Persistence.SqlSyntax; using umbraco.DataLayer; namespace umbraco.dialogs @@ -58,7 +60,13 @@ namespace umbraco.dialogs } else { - fieldSql = "select distinct alias from cmsPropertyType order by alias"; + //exclude built-in memberhip properties from showing up here + var exclude = Constants.Conventions.Member.GetStandardPropertyTypeStubs() + .Select(x => SqlSyntaxContext.SqlSyntaxProvider.GetQuotedValue(x.Key)).ToArray(); + + fieldSql = string.Format( + "select distinct alias from cmsPropertyType where alias not in ({0}) order by alias", + string.Join(",", exclude)); pp_insertField.Text = ui.Text("templateEditor", "chooseField"); } @@ -98,24 +106,6 @@ namespace umbraco.dialogs } - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - } - #endregion /// /// JsInclude1 control.