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