From e267b7700a39d97a0c306046568a128e8e7d8f5d Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 19 Feb 2014 14:23:48 +1100 Subject: [PATCH] Ensures that member properties are created when member type property type's are added (same as U4-1407), streamlines how this occurs on the base class. Streamlines how empty aliases are validated at the repo level for members, media, content. Makes built-in member property type's non-editable --- .../Repositories/ContentRepository.cs | 27 -- .../Repositories/ContentTypeBaseRepository.cs | 39 +++ .../Repositories/ContentTypeRepository.cs | 13 +- .../Repositories/MediaRepository.cs | 29 +- .../Repositories/MediaTypeRepository.cs | 3 + .../Repositories/MemberRepository.cs | 11 +- .../Repositories/MemberTypeRepository.cs | 3 + .../Repositories/VersionableRepositoryBase.cs | 39 +++ .../GenericProperties/GenericProperty.ascx | 10 +- .../controls/ContentTypeControlNew.ascx.cs | 260 ++++++------------ .../GenericProperties/GenericProperty.ascx.cs | 181 +++++------- .../GenericProperty.ascx.designer.cs | 9 + .../GenericPropertyWrapper.cs | 167 ++++++----- .../umbraco/members/EditMember.aspx.cs | 1 + .../umbraco/members/EditMemberType.aspx.cs | 124 ++++----- 15 files changed, 402 insertions(+), 514 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index df652b14b3..24048a0e76 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -577,33 +577,6 @@ namespace Umbraco.Core.Persistence.Repositories return content; } - private PropertyCollection GetPropertyCollection(int id, Guid versionId, IContentType contentType, DateTime createDate, DateTime updateDate) - { - var sql = new Sql(); - sql.Select("*") - .From() - .InnerJoin() - .On(left => left.PropertyTypeId, right => right.Id) - .Where(x => x.NodeId == id) - .Where(x => x.VersionId == versionId); - - var propertyDataDtos = Database.Fetch(sql); - var propertyFactory = new PropertyFactory(contentType, versionId, id, createDate, updateDate); - var properties = propertyFactory.BuildEntity(propertyDataDtos); - - var newProperties = properties.Where(x => x.HasIdentity == false); - foreach (var property in newProperties) - { - var propertyDataDto = new PropertyDataDto{ NodeId = id, PropertyTypeId = property.PropertyTypeId, VersionId = versionId }; - int primaryKey = Convert.ToInt32(Database.Insert(propertyDataDto)); - - property.Version = versionId; - property.Id = primaryKey; - } - - return new PropertyCollection(properties); - } - private string EnsureUniqueNodeName(int parentId, string nodeName, int id = 0) { if (EnsureUniqueNaming == false) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs index ad27b6e757..e2ea48b78c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Threading.Tasks; +using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; @@ -304,6 +305,10 @@ namespace Umbraco.Core.Persistence.Repositories var datatype = Database.FirstOrDefault("WHERE controlId = @Id", new { Id = propertyType.DataTypeId }); propertyType.DataTypeDefinitionId = datatype.DataTypeId; } + + //validate the alias! + ValidateAlias(propertyType); + var propertyTypeDto = propertyGroupFactory.BuildPropertyTypeDto(tabId, propertyType); int typePrimaryKey = propertyType.HasIdentity ? Database.Update(propertyTypeDto) @@ -381,5 +386,39 @@ namespace Umbraco.Core.Persistence.Repositories return new PropertyTypeCollection(list); } + + protected void ValidateAlias(PropertyType pt) + { + Mandate.That(string.IsNullOrEmpty(pt.Alias) == false, + () => + { + var message = + string.Format( + "{0} '{1}' cannot have an empty Alias. This is most likely due to invalid characters stripped from the Alias.", + "Property Type", + pt.Name); + var exception = new InvalidOperationException(message); + + LogHelper.Error>(message, exception); + throw exception; + }); + } + + protected void ValidateAlias(TEntity entity) + { + Mandate.That(string.IsNullOrEmpty(entity.Alias) == false, + () => + { + var message = + string.Format( + "{0} '{1}' cannot have an empty Alias. This is most likely due to invalid characters stripped from the Alias.", + typeof(TEntity).Name, + entity.Name); + var exception = new InvalidOperationException(message); + + LogHelper.Error>(message, exception); + throw exception; + }); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs index ba92af9964..948e9d1367 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs @@ -208,18 +208,7 @@ namespace Umbraco.Core.Persistence.Repositories protected override void PersistUpdatedItem(IContentType entity) { - Mandate.That(string.IsNullOrEmpty(entity.Alias) == false, - () => - { - var message = - string.Format( - "ContentType '{0}' cannot have an empty Alias. This is most likely due to invalid characters stripped from the Alias.", - entity.Name); - var exception = new Exception(message); - - LogHelper.Error(message, exception); - throw exception; - }); + ValidateAlias(entity); //Updates Modified date ((ContentType)entity).UpdatingEntity(); diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs index 65dbdb79a2..241b5ad799 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs @@ -358,34 +358,7 @@ namespace Umbraco.Core.Persistence.Repositories } #endregion - - private PropertyCollection GetPropertyCollection(int id, Guid versionId, IMediaType contentType, DateTime createDate, DateTime updateDate) - { - var sql = new Sql(); - sql.Select("*") - .From() - .InnerJoin() - .On(left => left.PropertyTypeId, right => right.Id) - .Where(x => x.NodeId == id) - .Where(x => x.VersionId == versionId); - - var propertyDataDtos = Database.Fetch(sql); - var propertyFactory = new PropertyFactory(contentType, versionId, id, createDate, updateDate); - var properties = propertyFactory.BuildEntity(propertyDataDtos); - - var newProperties = properties.Where(x => x.HasIdentity == false); - foreach (var property in newProperties) - { - var propertyDataDto = new PropertyDataDto { NodeId = id, PropertyTypeId = property.PropertyTypeId, VersionId = versionId }; - int primaryKey = Convert.ToInt32(Database.Insert(propertyDataDto)); - - property.Version = versionId; - property.Id = primaryKey; - } - - return new PropertyCollection(properties); - } - + private string EnsureUniqueNodeName(int parentId, string nodeName, int id = 0) { if (EnsureUniqueNaming == false) diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs index 515557c4ef..18ff7e8e4c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; @@ -162,6 +163,8 @@ namespace Umbraco.Core.Persistence.Repositories protected override void PersistUpdatedItem(IMediaType entity) { + ValidateAlias(entity); + //Updates Modified date ((MediaType)entity).UpdatingEntity(); diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs index 4c3810de6a..5b46e73658 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs @@ -600,6 +600,8 @@ namespace Umbraco.Core.Persistence.Repositories var factory = new MemberReadOnlyFactory(memberTypes); var member = factory.BuildEntity(dto); + member.Properties = GetPropertyCollection(dto.NodeId, dto.VersionId, member.ContentType, dto.CreateDate, dto.UpdateDate); + return member; } @@ -613,8 +615,15 @@ namespace Umbraco.Core.Persistence.Repositories var memberTypeList = _memberTypeRepository.GetAll(); memberTypeList.ForEach(x => memberTypes.Add(x.Alias, x)); + var entities = new List(); var factory = new MemberReadOnlyFactory(memberTypes); - return dtos.Select(factory.BuildEntity); + foreach (var dto in dtos) + { + var entity = factory.BuildEntity(dto); + entity.Properties = GetPropertyCollection(dto.NodeId, dto.VersionId, entity.ContentType, dto.CreateDate, dto.UpdateDate); + entities.Add(entity); + } + return entities; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs index 74c885936d..f0f9a3b20d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Umbraco.Core.Logging; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; @@ -194,6 +195,8 @@ namespace Umbraco.Core.Persistence.Repositories protected override void PersistUpdatedItem(IMemberType entity) { + ValidateAlias(entity); + //Updates Modified date ((MemberType)entity).UpdatingEntity(); diff --git a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs index 1b3ff63eea..0a5535d719 100644 --- a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; +using Umbraco.Core.Models; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Caching; +using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories @@ -90,5 +92,42 @@ namespace Umbraco.Core.Persistence.Repositories protected abstract void PerformDeleteVersion(int id, Guid versionId); #endregion + + /// + /// This is a fix for U4-1407 - when property types are added to a content type - the property of the entity are not actually created + /// and we get YSODs + /// + /// + /// + /// + /// + /// + /// + protected PropertyCollection GetPropertyCollection(int id, Guid versionId, IContentTypeComposition contentType, DateTime createDate, DateTime updateDate) + { + var sql = new Sql(); + sql.Select("*") + .From() + .InnerJoin() + .On(left => left.PropertyTypeId, right => right.Id) + .Where(x => x.NodeId == id) + .Where(x => x.VersionId == versionId); + + var propertyDataDtos = Database.Fetch(sql); + var propertyFactory = new PropertyFactory(contentType, versionId, id, createDate, updateDate); + var properties = propertyFactory.BuildEntity(propertyDataDtos).ToArray(); + + var newProperties = properties.Where(x => x.HasIdentity == false); + foreach (var property in newProperties) + { + var propertyDataDto = new PropertyDataDto { NodeId = id, PropertyTypeId = property.PropertyTypeId, VersionId = versionId }; + int primaryKey = Convert.ToInt32(Database.Insert(propertyDataDto)); + + property.Version = versionId; + property.Id = primaryKey; + } + + return new PropertyCollection(properties); + } } } \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/controls/GenericProperties/GenericProperty.ascx b/src/Umbraco.Web.UI/umbraco/controls/GenericProperties/GenericProperty.ascx index bd20a7d269..81eb991fba 100644 --- a/src/Umbraco.Web.UI/umbraco/controls/GenericProperties/GenericProperty.ascx +++ b/src/Umbraco.Web.UI/umbraco/controls/GenericProperties/GenericProperty.ascx @@ -8,8 +8,9 @@ style="padding: 0px; display: block; margin: 0px;">

+ - + @@ -20,7 +21,7 @@