From 6f281080e8921c71c87f444604c9990c4367f06e Mon Sep 17 00:00:00 2001 From: Tom Fulton Date: Mon, 28 Apr 2014 22:00:31 -0600 Subject: [PATCH 1/3] Route new Convert* methods through Helper, refactor This fixes the issue where the model sent to ConvertEditorToDb doesn't have a DataTypeGuid, thus we were unable to look up the correct PropertyEditor to run the Convert methods on. --- .../Extensions/ArchetypeHelper.cs | 38 +++++++++++++++++++ .../ArcheTypePropertyEditor.cs | 16 +++----- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs b/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs index 29b203d..b38f168 100644 --- a/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs +++ b/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs @@ -6,6 +6,7 @@ using System.Text; using System.Threading.Tasks; using System.Web.Http.ModelBinding; using Archetype.Umbraco.Models; +using AutoMapper; using Newtonsoft.Json; using Umbraco.Core; using Umbraco.Core.Models; @@ -28,12 +29,40 @@ namespace Archetype.Umbraco.Extensions _app = ApplicationContext.Current; } + + internal Models.Archetype DeserializeJsonToArchetype(string sourceJson, PreValueCollection dataTypePreValues) + { + try + { + var archetype = JsonConvert.DeserializeObject(sourceJson, _jsonSettings); + + //archetype.Fieldsets.First().Properties.First().DataTypeId + try + { + // Get list of configured properties and their types and map them to the deserialized archetype model + var preValue = GetArchetypePreValueFromPreValuesCollection(dataTypePreValues); + RetrieveAdditionalProperties(ref archetype, preValue); + } + catch (Exception ex) + { + } + + return archetype; + } + catch + { + return new Models.Archetype(); + } + + } + internal Models.Archetype DeserializeJsonToArchetype(string sourceJson, int dataTypeId) { try { var archetype = JsonConvert.DeserializeObject(sourceJson, _jsonSettings); + //archetype.Fieldsets.First().Properties.First().DataTypeId try { // Get list of configured properties and their types and map them to the deserialized archetype model @@ -72,6 +101,14 @@ namespace Archetype.Umbraco.Extensions }) as ArchetypePreValue; } + private ArchetypePreValue GetArchetypePreValueFromPreValuesCollection(PreValueCollection dataTypePreValues) + { + var preValueAsString = dataTypePreValues.PreValuesAsDictionary.First().Value.Value; + var preValue = JsonConvert.DeserializeObject(preValueAsString, _jsonSettings); + return preValue; + } + + private IDataTypeDefinition GetDataTypeByGuid(Guid guid) { return (IDataTypeDefinition) ApplicationContext.Current.ApplicationCache.RuntimeCache.GetCacheItem( @@ -96,6 +133,7 @@ namespace Archetype.Umbraco.Extensions var propertyAlias = property.Alias; foreach ( var propertyInst in fieldsetInst.Properties.Where(x => x.Alias == propertyAlias)) { + propertyInst.DataTypeGuid = property.DataTypeGuid.ToString(); propertyInst.DataTypeId = GetDataTypeByGuid(property.DataTypeGuid).Id; propertyInst.PropertyEditorAlias = property.PropertyEditorAlias; } diff --git a/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs index eda1e23..d790e64 100644 --- a/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs +++ b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Archetype.Umbraco.Extensions; using ClientDependency.Core; using Newtonsoft.Json; using Umbraco.Core; @@ -48,20 +49,14 @@ namespace Archetype.Umbraco.PropertyEditors protected JsonSerializerSettings _jsonSettings; public ArchetypePropertyValueEditor(PropertyValueEditor wrapped) - : base(wrapped) - { - var dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver(); - dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic; - - _jsonSettings = new JsonSerializerSettings { ContractResolver = dcr }; - } + : base(wrapped) { } public override string ConvertDbToString(Property property, PropertyType propertyType, IDataTypeService dataTypeService) { if (property.Value == null) return string.Empty; - var archetype = JsonConvert.DeserializeObject(property.Value.ToString(), _jsonSettings); + var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(property.Value.ToString(), propertyType.DataTypeDefinitionId); foreach (var fieldset in archetype.Fieldsets) { @@ -101,13 +96,12 @@ namespace Archetype.Umbraco.PropertyEditors return archetype; } - - public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue) + public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue) { if (editorValue.Value == null) return string.Empty; - var archetype = JsonConvert.DeserializeObject(editorValue.Value.ToString(), _jsonSettings); + var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(editorValue.Value.ToString(), editorValue.PreValues); foreach (var fieldset in archetype.Fieldsets) { From 4ad88a04e56832cc137321ad7ea8e037afc747c6 Mon Sep 17 00:00:00 2001 From: Tom Fulton Date: Mon, 28 Apr 2014 23:37:39 -0600 Subject: [PATCH 2/3] Misc cleanup --- .../Umbraco.Archetype/Extensions/ArchetypeHelper.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs b/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs index b38f168..e6c0607 100644 --- a/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs +++ b/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs @@ -1,16 +1,9 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Net.Mime; -using System.Text; -using System.Threading.Tasks; -using System.Web.Http.ModelBinding; using Archetype.Umbraco.Models; -using AutoMapper; using Newtonsoft.Json; using Umbraco.Core; using Umbraco.Core.Models; -using Umbraco.Core.Models.PublishedContent; namespace Archetype.Umbraco.Extensions { @@ -36,7 +29,6 @@ namespace Archetype.Umbraco.Extensions { var archetype = JsonConvert.DeserializeObject(sourceJson, _jsonSettings); - //archetype.Fieldsets.First().Properties.First().DataTypeId try { // Get list of configured properties and their types and map them to the deserialized archetype model @@ -62,7 +54,6 @@ namespace Archetype.Umbraco.Extensions { var archetype = JsonConvert.DeserializeObject(sourceJson, _jsonSettings); - //archetype.Fieldsets.First().Properties.First().DataTypeId try { // Get list of configured properties and their types and map them to the deserialized archetype model From 7a71afda0ebcb4a41636556aff8b3989f4bedb0e Mon Sep 17 00:00:00 2001 From: Tom Fulton Date: Mon, 28 Apr 2014 23:39:32 -0600 Subject: [PATCH 3/3] GetValue - *always* check the PropertyValueConverters Even if we want a string and the value is already a string, we should still hit the PropertyValueConverters for situations like the RTE's PVC, which performs parsing on the content. --- app/Umbraco/Umbraco.Archetype/Models/Property.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Umbraco/Umbraco.Archetype/Models/Property.cs b/app/Umbraco/Umbraco.Archetype/Models/Property.cs index a3c4522..902e434 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/Property.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/Property.cs @@ -28,9 +28,6 @@ namespace Archetype.Umbraco.Models public T GetValue() { - // If the value is of type T, just return it - if (Value is T) - return (T)Value; // Try Umbraco's PropertyValueConverters var converters = UmbracoContext.Current != null ? PropertyValueConvertersResolver.Current.Converters : Enumerable.Empty(); @@ -41,6 +38,10 @@ namespace Archetype.Umbraco.Models return convertedAttempt.Result; } + // If the value is of type T, just return it + if (Value is T) + return (T)Value; + // No PropertyValueConverters matched, so try a regular type conversion var convertAttempt2 = Value.TryConvertTo(); if (convertAttempt2.Success)