diff --git a/src/Umbraco.Core/ObjectResolution/Resolution.cs b/src/Umbraco.Core/ObjectResolution/Resolution.cs
index 2c6dab4225..0dd30c9dc0 100644
--- a/src/Umbraco.Core/ObjectResolution/Resolution.cs
+++ b/src/Umbraco.Core/ObjectResolution/Resolution.cs
@@ -1,5 +1,6 @@
using System;
using System.Threading;
+using Umbraco.Core.Logging;
namespace Umbraco.Core.ObjectResolution
{
@@ -27,14 +28,14 @@ namespace Umbraco.Core.ObjectResolution
public static bool IsFrozen
{
get { return _isFrozen; }
- private set { _isFrozen = value; }
}
public static void EnsureIsFrozen()
{
if (!_isFrozen)
+ {
throw new InvalidOperationException("Resolution is not frozen, it is not yet possible to get values from it.");
-
+ }
}
///
@@ -71,20 +72,24 @@ namespace Umbraco.Core.ObjectResolution
// keep the class here because it needs write-access to Resolution.IsFrozen
private class DirtyBackdoor : IDisposable
{
- private static readonly System.Threading.ReaderWriterLockSlim _dirtyLock = new ReaderWriterLockSlim();
+ private static readonly ReaderWriterLockSlim DirtyLock = new ReaderWriterLockSlim();
private IDisposable _lock;
private bool _frozen;
public DirtyBackdoor()
{
- _lock = new WriteLock(_dirtyLock);
+ LogHelper.Debug(typeof(DirtyBackdoor), "Creating back door for resolution");
+
+ _lock = new WriteLock(DirtyLock);
_frozen = _isFrozen;
_isFrozen = false;
}
public void Dispose()
{
+ LogHelper.Debug(typeof(DirtyBackdoor), "Disposing back door for resolution");
+
_isFrozen = _frozen;
_lock.Dispose();
}
@@ -96,6 +101,8 @@ namespace Umbraco.Core.ObjectResolution
/// resolution is already frozen.
public static void Freeze()
{
+ LogHelper.Debug(typeof(Resolution), "Freezing resolution");
+
if (_isFrozen)
throw new InvalidOperationException("Resolution is frozen. It is not possible to freeze it again.");
@@ -110,6 +117,8 @@ namespace Umbraco.Core.ObjectResolution
/// To be used in unit tests.
internal static void Reset()
{
+ LogHelper.Debug(typeof(DirtyBackdoor), "Resetting resolution");
+
_isFrozen = false;
Frozen = null;
}
diff --git a/src/Umbraco.Web.UI/config/trees.config b/src/Umbraco.Web.UI/config/trees.config
index 0e85bccd05..46a523ce38 100644
--- a/src/Umbraco.Web.UI/config/trees.config
+++ b/src/Umbraco.Web.UI/config/trees.config
@@ -1,14 +1,11 @@
-
-
-
@@ -19,7 +16,6 @@
-
@@ -29,23 +25,18 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
index 61a7a07c50..001296792f 100644
--- a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
@@ -4,6 +4,7 @@ using Umbraco.Core.Models;
using Umbraco.Core.Models.Mapping;
using Umbraco.Web.Models.ContentEditing;
using umbraco;
+using System.Linq;
namespace Umbraco.Web.Models.Mapping
{
@@ -29,7 +30,11 @@ namespace Umbraco.Web.Models.Mapping
dto => dto.ContentTypeName,
expression => expression.MapFrom(content => content.ContentType.Name))
.ForMember(display => display.Properties, expression => expression.Ignore())
- .ForMember(display => display.Tabs, expression => expression.ResolveUsing())
+ .ForMember(display => display.Tabs,
+ expression => expression.ResolveUsing(
+ new TabsAndPropertiesResolver(
+ //do no map this properties (currently anyways, they were never there in 6.x)
+ Constants.Conventions.Member.StandardPropertyTypeStubs.Select(x => x.Value.Alias))))
.AfterMap(MapGenericCustomProperties);
//FROM IMember TO ContentItemBasic
@@ -58,7 +63,6 @@ namespace Umbraco.Web.Models.Mapping
///
private static void MapGenericCustomProperties(IMember member, MemberDisplay display)
{
-
TabsAndPropertiesResolver.MapGenericProperties(
member, display,
new ContentPropertyDisplay
@@ -82,6 +86,7 @@ namespace Umbraco.Web.Models.Mapping
Value = display.Email,
View = "textbox"
});
+
}
}
diff --git a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs
index 25038fc08e..3fa84932ae 100644
--- a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs
+++ b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs
@@ -15,6 +15,19 @@ namespace Umbraco.Web.Models.Mapping
///
internal class TabsAndPropertiesResolver : ValueResolver>>
{
+ private readonly IEnumerable _ignoreProperties;
+
+ public TabsAndPropertiesResolver()
+ {
+ _ignoreProperties = new List();
+ }
+
+ public TabsAndPropertiesResolver(IEnumerable ignoreProperties)
+ {
+ if (ignoreProperties == null) throw new ArgumentNullException("ignoreProperties");
+ _ignoreProperties = ignoreProperties;
+ }
+
///
/// Maps properties on to the generic properties tab
///
@@ -110,9 +123,13 @@ namespace Umbraco.Web.Models.Mapping
for (var i = 0; i < propertyGroups.Count(); i++)
{
var current = propertyGroups.Single(x => x.ParentId == currentParentId);
+
+ var propsForGroup = content.GetPropertiesForGroup(current)
+ .Where(x => _ignoreProperties.Contains(x.Alias) == false); //don't include ignored props
+
aggregateProperties.AddRange(
Mapper.Map, IEnumerable>(
- content.GetPropertiesForGroup(current)));
+ propsForGroup));
currentParentId = current.Id;
}
@@ -129,7 +146,8 @@ namespace Umbraco.Web.Models.Mapping
}
//now add the generic properties tab for any properties that don't belong to a tab
- var orphanProperties = content.GetNonGroupedProperties();
+ var orphanProperties = content.GetNonGroupedProperties()
+ .Where(x => _ignoreProperties.Contains(x.Alias) == false); //don't include ignored props
//now add the generic properties tab
aggregateTabs.Add(new Tab