Remove PropertyGroup.ParentId, sanitize Property groups/types

This commit is contained in:
Stephan
2015-11-17 12:30:37 +01:00
parent aaffa01f36
commit eb5589e064
39 changed files with 777 additions and 919 deletions

View File

@@ -157,31 +157,44 @@ namespace Umbraco.Core.Models
/// <summary>
/// Adds a PropertyGroup.
/// This method will also check if a group already exists with the same name and link it to the parent.
/// </summary>
/// <param name="groupName">Name of the PropertyGroup to add</param>
/// <returns>Returns <c>True</c> if a PropertyGroup with the passed in name was added, otherwise <c>False</c></returns>
public override bool AddPropertyGroup(string groupName)
{
if (PropertyGroups.Any(x => x.Name == groupName))
return false;
return AddAndReturnPropertyGroup(groupName) != null;
}
var propertyGroup = new PropertyGroup {Name = groupName, SortOrder = 0};
private PropertyGroup AddAndReturnPropertyGroup(string name)
{
// ensure we don't have it already
if (PropertyGroups.Any(x => x.Name == name))
return null;
if (CompositionPropertyGroups.Any(x => x.Name == groupName))
// create the new group
var group = new PropertyGroup { Name = name, SortOrder = 0 };
// check if it is inherited - there might be more than 1 but we want the 1st, to
// reuse its sort order - if there are more than 1 and they have different sort
// orders... there isn't much we can do anyways
var inheritGroup = CompositionPropertyGroups.FirstOrDefault(x => x.Name == name);
if (inheritGroup == null)
{
var firstGroup = CompositionPropertyGroups.First(x => x.Name == groupName && x.ParentId.HasValue == false);
propertyGroup.SetLazyParentId(new Lazy<int?>(() => firstGroup.Id));
// no, just local, set sort order
var lastGroup = PropertyGroups.LastOrDefault();
if (lastGroup != null)
group.SortOrder = lastGroup.SortOrder + 1;
}
else
{
// yes, inherited, re-use sort order
group.SortOrder = inheritGroup.SortOrder;
}
if (PropertyGroups.Any())
{
var last = PropertyGroups.Last();
propertyGroup.SortOrder = last.SortOrder + 1;
}
// add
PropertyGroups.Add(group);
PropertyGroups.Add(propertyGroup);
return true;
return group;
}
/// <summary>
@@ -193,38 +206,24 @@ namespace Umbraco.Core.Models
public override bool AddPropertyType(PropertyType propertyType, string propertyGroupName)
{
if (propertyType.HasIdentity == false)
{
propertyType.Key = Guid.NewGuid();
}
if (PropertyTypeExists(propertyType.Alias) == false)
{
if (PropertyGroups.Contains(propertyGroupName))
{
propertyType.PropertyGroupId = new Lazy<int>(() => PropertyGroups[propertyGroupName].Id);
PropertyGroups[propertyGroupName].PropertyTypes.Add(propertyType);
}
else
{
//If the PropertyGroup doesn't already exist we create a new one
var propertyTypes = new List<PropertyType> { propertyType };
var propertyGroup = new PropertyGroup(new PropertyTypeCollection(propertyTypes)) { Name = propertyGroupName, SortOrder = 1 };
//and check if its an inherited PropertyGroup, which exists in the composition
if (CompositionPropertyGroups.Any(x => x.Name == propertyGroupName))
{
var parentPropertyGroup = CompositionPropertyGroups.First(x => x.Name == propertyGroupName && x.ParentId.HasValue == false);
propertyGroup.SortOrder = parentPropertyGroup.SortOrder;
//propertyGroup.ParentId = parentPropertyGroup.Id;
propertyGroup.SetLazyParentId(new Lazy<int?>(() => parentPropertyGroup.Id));
}
// ensure no duplicate alias - over all composition properties
if (PropertyTypeExists(propertyType.Alias))
return false;
PropertyGroups.Add(propertyGroup);
}
// get and ensure a group local to this content type
var group = PropertyGroups.Contains(propertyGroupName)
? PropertyGroups[propertyGroupName]
: AddAndReturnPropertyGroup(propertyGroupName);
if (group == null)
return false;
return true;
}
// add property to group
propertyType.PropertyGroupId = new Lazy<int>(() => group.Id);
group.PropertyTypes.Add(propertyType);
return false;
return true;
}
/// <summary>

View File

@@ -17,7 +17,6 @@ namespace Umbraco.Core.Models
public class PropertyGroup : Entity, IEquatable<PropertyGroup>
{
private string _name;
private Lazy<int?> _parentId;
private int _sortOrder;
private PropertyTypeCollection _propertyTypes;
@@ -31,7 +30,6 @@ namespace Umbraco.Core.Models
}
private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo<PropertyGroup, string>(x => x.Name);
private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo<PropertyGroup, int?>(x => x.ParentId);
private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo<PropertyGroup, int>(x => x.SortOrder);
private readonly static PropertyInfo PropertyTypeCollectionSelector = ExpressionHelper.GetPropertyInfo<PropertyGroup, PropertyTypeCollection>(x => x.PropertyTypes);
void PropertyTypesChanged(object sender, NotifyCollectionChangedEventArgs e)
@@ -56,29 +54,6 @@ namespace Umbraco.Core.Models
}
}
/// <summary>
/// Gets or sets the Id of the Parent PropertyGroup.
/// </summary>
/// <remarks>
/// A Parent PropertyGroup corresponds to an inherited PropertyGroup from a composition.
/// If a PropertyType is inserted into an inherited group then a new group will be created with an Id reference to the parent.
/// </remarks>
[DataMember]
public int? ParentId
{
get
{
if (_parentId == null)
return default(int?);
return _parentId.Value;
}
set
{
_parentId = new Lazy<int?>(() => value);
OnPropertyChanged(ParentIdSelector);
}
}
/// <summary>
/// Gets or sets the Sort Order of the Group
/// </summary>
@@ -117,15 +92,6 @@ namespace Umbraco.Core.Models
}
}
/// <summary>
/// Sets the ParentId from the lazy integer id
/// </summary>
/// <param name="id">Id of the Parent</param>
internal void SetLazyParentId(Lazy<int?> id)
{
_parentId = id;
}
public bool Equals(PropertyGroup other)
{
if (base.Equals(other)) return true;

View File

@@ -1,28 +1,28 @@
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsDocumentType")]
[PrimaryKey("contentTypeNodeId", autoIncrement = false)]
[ExplicitColumns]
internal class DocumentTypeDto
{
[Column("contentTypeNodeId")]
[PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsDocumentType", OnColumns = "contentTypeNodeId, templateNodeId")]
[ForeignKey(typeof(ContentTypeDto), Column = "nodeId")]
[ForeignKey(typeof(NodeDto))]
public int ContentTypeNodeId { get; set; }
[Column("templateNodeId")]
[ForeignKey(typeof(TemplateDto), Column = "nodeId")]
public int TemplateNodeId { get; set; }
[Column("IsDefault")]
[Constraint(Default = "0")]
public bool IsDefault { get; set; }
[ResultColumn]
public ContentTypeDto ContentTypeDto { get; set; }
}
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.DatabaseAnnotations;
namespace Umbraco.Core.Models.Rdbms
{
[TableName("cmsDocumentType")]
[PrimaryKey("contentTypeNodeId", autoIncrement = false)]
[ExplicitColumns]
internal class ContentTypeTemplateDto
{
[Column("contentTypeNodeId")]
[PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsDocumentType", OnColumns = "contentTypeNodeId, templateNodeId")]
[ForeignKey(typeof(ContentTypeDto), Column = "nodeId")]
[ForeignKey(typeof(NodeDto))]
public int ContentTypeNodeId { get; set; }
[Column("templateNodeId")]
[ForeignKey(typeof(TemplateDto), Column = "nodeId")]
public int TemplateNodeId { get; set; }
[Column("IsDefault")]
[Constraint(Default = "0")]
public bool IsDefault { get; set; }
[ResultColumn]
public ContentTypeDto ContentTypeDto { get; set; }
}
}

View File

@@ -21,12 +21,6 @@ namespace Umbraco.Core.Models.Rdbms
[PrimaryKeyColumn(IdentitySeed = 12)]
public int Id { get; set; }
[Column("parentGroupId")]
[NullSetting(NullSetting = NullSettings.Null)]
//[Constraint(Default = "NULL")]
[ForeignKey(typeof(PropertyTypeGroupDto))]
public int? ParentGroupId { get; set; }
[Column("contenttypeNodeId")]
[ForeignKey(typeof(ContentTypeDto), Column = "nodeId")]
public int ContentTypeNodeId { get; set; }

View File

@@ -10,9 +10,6 @@ namespace Umbraco.Core.Models.Rdbms
[Column("PropertyTypeGroupId")]
public int? Id { get; set; }
[Column("parentGroupId")]
public int? ParentGroupId { get; set; }
[Column("PropertyGroupName")]
public string Text { get; set; }