Coder Social home page Coder Social logo

usyncmigrations's Introduction

uSync Migrations

uSync Migrations is a tool to help you migrate your site settings and content from Umbraco 7.x to the latest and greatest versions of Umbraco.

How to use this

Runs on Umbraco 10, 11 & 12

Getting Started

SEE our GETTING STARTED guide for more details

Install uSync

dotnet add package uSync 

uSync.Migrations.

dotnet add package uSync.Migrations --prerelease
  1. Don't do this on a live server!
  2. Install it.
  3. Put an Old uSync v7 folder somewhere in your shiny new uSync Folder
  4. Go to the Migrations tab in uSync.
  5. Do it .
  6. Import it.

Complex data ?

This release covers core things, Vorto and a few community editors.

if you want to migrate complex data you need to write a Migrator (implementing ISyncMigrator class) take a look at the uSync.Migrations.Migrators project.

If you want to see how you can customize the process. take a look at the MyMigrations project in this repo

And remember: contribute back any editors you think others will benefit from

Support ?

This is a pre-release early access beta migration tool. you can ask, but lets hope other people are watching.

usyncmigrations's People

Contributors

andrewmckaskill avatar bielu avatar bielu1 avatar bpadfield avatar carlsargunar avatar codingdk avatar craigs100 avatar deba22 avatar grey-muir avatar hendy avatar jhenkes avatar kevinjump avatar leekelleher avatar lottepitcher avatar marcemarc avatar martinlcp avatar mduncan98 avatar michaelchart avatar paulseal avatar peterkeating avatar prjseal avatar pronotion avatar ryan-woodruff-cantarus avatar skttl avatar snappercrumpleddog avatar soreng avatar stevetemple avatar wiggee11 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

usyncmigrations's Issues

Media Nodes not retaining Sort Order upon migration

When I was migrating a view I noticed that the images were not displaying in the correct order, I looked at the media tab in the back office and saw that the folders and images were not in the same order either. When I sorted the folder that the code was using to display the images I saw that this was reflected on the front end and the images were now ordered correctly.

I could not find any obvious sort by property that I could use to sort it and it seems like the migrated media types were sorted based on id, but is there a way that I can run the uSync Migrations so that the media nodes keep the order that they were in originally?

Please let me know if there is anything else I can help with.

Before Migration:
image

After Migration:
image

Feature - mapping config.

I was starting to put in replacement stuff into options - (e.g map property name from to something type config) but it seemed like i was about to make a new context style beast.

Thinking it would be better if this was a config object, that could be defined in code or loaded from json (because if you can't load from json are you even writing code).

e.g

MigrationMap object . (sits inside the config - but controls all aspects of what we do with stuff).

e.g.

  • say we wanted to rename the title property on all content using the "MyContentType" contentType
  • we want to map the "SimpleTextbox" datatype to the "myNewTextbox" data type
"config" : { 
     "properties" : {
           "MyContentType" : { 
                    "title": "pageTitle"
            }
     },
     "dataTypes"  : {
            "SimpleTextBox" :  "myNewTextBox" 
      }
 }

this will probably evolve as we go through the code, I am thinking now do we want to be able to let people force a conversion

e.g i want to convert this property from this content type into a Blocklist, but the same property on another type is nested content. ๐Ÿคท - this might be super helpful if we end up with multiple conversion scenarios for things like grids etc..

Can't migrate uSync Media properties from umbraco v7 to v11

I'm trying to migrate Megia from umbraco v7.15.1 to v11.3.1 using uSync.Migrations v4.0.0-beta016.
All media migrated well, but some properties were not migrated:

  • umbracoBytes
  • umbracoExtension
  • umbracoHeight
  • umbracoWidth

After investigation I found uSync.Migrations.Handlers.Seven.MediaMigrationHandler class where setted ignored properties.

Main question: for what we ignoring this properties?

Feature - mapping config

Ability to tell the migrator how to map properties in config .

e.g.

  • how to get from grid to custom block list or something
  • or leblender to something

A bigger one, will prob not make the first release !

Will likely be a bit complex, but the idea that in a config file somewhere you can say "this is the structure i have", and "this is the one i want", we have similar (albeit much simpler) in Translation manageer, it could be wrapped for common use cases so it might just be a how to get the grid from a to b- or nested content i want to map to x.

lots of things to think about with this one.

Umbraco.TinyMCEv3 Rich Text Editor Internal Links Not Working

uSync.Migrations: 4.0.0-phase.2.1
uSync.Cms: 10.3.3
Hi,

I noticed that the RTE internal links were not working, I think its because the localLink is missing umb://document/.

I was thinking about creating my own custom migratory to fix this but I couldn't find an example that updates the value of a property in the MyMigrationProfile.cs.

Before:
image

After:
image

As a workaround I ran the below SQL Script to get all the pages that are using the Umbraco.TinyMCEv3 and is using "localLink:".

  Select upd.id as 'umbracoPropertyData id'
  , propertyTypeId
  , udt.propertyEditorAlias
  , cpt.Alias as 'Property Type Alias'
  , ucv.text as 'Node Name'
  , ucv.[current]
  , published
  , varcharValue
  , textValue
	from umbracoPropertyData upd 
	INNER JOIN umbracoContentVersion ucv ON upd.versionId = ucv.Id 
	INNER JOIN cmsPropertyType as cpt on cpt.id = upd.propertyTypeId
	INNER JOIN umbracoDataType as udt on cpt.dataTypeId = udt.nodeId
	INNER JOIN umbracoDocument as ud on ud.nodeId = ucv.nodeId
	WHERE  (ucv.[current] = 1 and propertyEditorAlias='Umbraco.TinyMCE' and textValue like '%href="/{localLink:%') 

Please let me know if there is a better way to go about this.

Suddenly having issues converting MediaPicker(s)

Hello Kevin & Umbraco Community,

The (obsolete) property editor Umbraco.MediaPicker is causing me pain in a recent migration. While I see the correct GUID across all config files, the conversion step doesn't translate the GUID into a { key, mediaKey } pair.

I've confirmed that the media's GUID is correct. The last entry below is produced by uSync after I manually edit the content in the backoffice, choose the correct media file, and save and publish the content node.

Environment Details
Software Umbraco 7 Umbraco 10
Umbraco 7.15.10 10.5.1
uSync 4.0.16 10.6.1
uSync.Content 4.1.9.1 - - -
uSync.Core 6.0.15 - - -
uSync.Migrations - - - 4.0.0-phase.3
  1. How should media GUIDs look (1) after export and (2) after conversion?
  2. How would you recommend I continue debugging or troubleshooting this issue?
  3. Do you suggest running any other packages or tools in the Umbraco 7 environment, prior to running a full export?

Export from uSync in Umbraco 7:

This is from the file produced by uSync's "full export".

<featuredArticleImage>13d3c008-0e9c-4916-a99b-a4a84c371c84</featuredArticleImage>

Converted by uSync in Umbraco 10:

This is from the file produced by uSync.Migrations' "convert files".

<featuredArticleImage>
  <Value><![CDATA[13d3c008-0e9c-4916-a99b-a4a84c371c84]]></Value>
</featuredArticleImage>

Edited and Published in Umbraco 10:

This is from the file produced by uSync after editing the content through Umbraco, assigning the correct image, and saving & publishing.

<featuredArticleImage>
  <Value><![CDATA[[
{
  "key": "3adcbc38-c33d-471e-bc52-f602844c6d8b",
  "mediaKey": "13d3c008-0e9c-4916-a99b-a4a84c371c84"
}
]]]></Value>
  </featuredArticleImage>

As always - the time, effort, and products you share with the community make all of our work easier. My clients benefit so much from your efforts because I'm able to spend more time elsewhere.
Just want to say thanks for all your help,
โ€“ Mark

Umbraco.RadioButtonList - Migrates with Duplicate Id's for Config ValueListItems

The error occurs when attempting to view the datatype or any of the content using the datatype after migration.
After further investigation, it appears to be due to the fact that the datatype was migrated with each option having the same id.

After manually going into the database and ensuring each id is unique I was once again able to access the nodes as expected.

Pull request incoming...

NullRef exception with vorto property when values = null

Not sure if this is a bug in uSyncMigrations or just a weird behaviour from uSync in our v7 build.

We are attempting a migration from v7 to v11 with a solution using vorto initially.

I have a doc type using vorto for a few plain text properties. Some properties have values:null when looking at the content that was generated by uSync. Example here:

<type><![CDATA[{"values":null,"dtdGuid":"7cdf9aa2-89d5-4157-ac84-5dd9935a9e71"}]]></type>

When we run the process, we get the following exception:

System.NullReferenceException: Object reference not set to an instance of an object.

   at uSync.Migrations.Handlers.Shared.SharedContentBaseHandler`1.GetVariedValueNode(ISyncVariationPropertyMigrator migrator, String contentTypeAlias, String propertyName, SyncMigrationContentProperty migrationProperty, SyncMigrationContext context)

   at uSync.Migrations.Handlers.Shared.SharedContentBaseHandler`1.ConvertPropertyValue(String itemType, String contentType, XElement property, SyncMigrationContext context)

   at uSync.Migrations.Handlers.Shared.SharedContentBaseHandler`1.MigrateFile(XElement source, Int32 level, SyncMigrationContext context)

   at uSync.Migrations.Handlers.MigrationHandlerBase`1.MigrateFolder(String folder, Int32 level, SyncMigrationContext context)

I suspect the issue comes from that line: https://github.com/Jumoo/uSyncMigrations/blob/491ddeeb64a8442f18b824e4046e96ff6860b85f/uSync.Migrations/Handlers/Shared/SharedContentBaseHandler.cs#LL176C58-L176C64 as there's no null check for the Values property.

If I replace the content of the property by an empty xml node: then the process works fine for this file, but then I have the same issue with other files. I am wondering if I should manually clean them up or if it's an issue with uSync.Migrations.

When marking a content type as being a element, it does not affect any of the related compositions

When calling the AddElementType method the the MigrationContext, only the referenced content type is being marked as an element

An example of the call can be seen here

When an element has compositions, it is not possible to mark these as elements to.

A workaround could be to treat all compositions as elements, but that solution may no fit all usecases.

The issue seems to that when converting a grid using Doc Type Grid Editor, all the doctypes need to be marked as elements. After doing this manually once, I quickly turned to code.


public class DtgeGridMigrator : GridMigrator
{
    private readonly IGridConfig _gridConfig;

    public DtgeGridMigrator(IGridConfig gridGridConfig)
    {
        _gridConfig = gridGridConfig;
    }

    public override object GetConfigValues(SyncMigrationDataTypeProperty dataTypeProperty, SyncMigrationContext context)
    {
        foreach (var editor in _gridConfig.EditorsConfig.Editors)
        {
            if (editor?.Config.TryGetValue("allowedDocTypes", out var allowedDocTypes) != true)
            {
                continue;
            }

            if (allowedDocTypes is JArray docTypes)
            {
                var contentTypeAliases = docTypes.Values<string>();

                foreach (var docType in contentTypeAliases)
                {
                    var contentTypeKey = context.GetContentTypeKey(docType.TrimStart('^').TrimEnd('$'));
                    context.AddElementType(contentTypeKey);
                    // TODO : mark compositions as elements
                }
            }
        }

        var config = base.GetConfigValues(dataTypeProperty, context);
        
        return config;
    }

The missing marking as element, causes Models Builder to fail, with an error like

Cannot generate model for type 'GridElement' because it is an element type, but it is composed of 'GridBackground' which is not.

cmsPropertyTypeGroup duplicate id issue

Been trying out Usync Migrations this week to take a v7 site to v10 and it's been great but I've hit an issue with trying to migrate the the v7 content types.

I think the issue is with duplicate tab names, the way they've been setup in v7 means there's loads of content types with a tab called "Content" when I run the import the first content type with that name gets inserted into the cmsPropertyTypeGroup table but subsquent ContentTypes on the import with tabs called "Content" reuse the guid which then causes primary key violation errors.

Here's an example of the error:

Cannot insert duplicate key row in object 'dbo.cmsPropertyTypeGroup' with unique index 'IX_cmsPropertyTypeGroupUniqueID'. The duplicate key value is (8f43317b-8530-3639-b95c-87f38a42cc29).

The statement has been terminated.
at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)

at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)

at Microsoft.Data.SqlClient.SqlDataReader.TryConsumeMetaData()

at Microsoft.Data.SqlClient.SqlDataReader.get_MetaData()

at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)

at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean isAsync, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)

at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String method)

at Microsoft.Data.SqlClient.SqlCommand.ExecuteScalar()

at Umbraco.Cms.Infrastructure.Persistence.FaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)

at NPoco.Database.ExecuteScalarHelper(DbCommand cmd)

at NPoco.Database.InsertAsyncImp[T](PocoData pocoData, String tableName, String primaryKeyName, Boolean autoIncrement, T poco, Boolean sync)

at NPoco.Database.Insert[T](String tableName, String primaryKeyName, Boolean autoIncrement, T poco)

at NPoco.Database.Insert[T](T poco)

at Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement.ContentTypeRepositoryBase`1.PersistNewBaseContentType(IContentTypeComposition entity)

at Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement.ContentTypeRepository.PersistNewItem(IContentType entity)

at Umbraco.Cms.Core.Cache.FullDataSetRepositoryCachePolicy2.Create(TEntity entity, Action1 persistNew)

at Umbraco.Cms.Core.Services.ContentTypeServiceBase`2.Save(TItem item, Int32 userId)

at uSync.Core.Serialization.Serializers.ContentTypeBaseSerializer`1.SaveItem(TObject item)

at uSync.Core.Serialization.SyncSerializerRoot`1.Deserialize(XElement node, SyncSerializerOptions options)

at uSync.BackOffice.SyncHandlers.SyncHandlerRoot2.ImportElement(XElement node, String filename, HandlerSettings settings, uSyncImportOptions options)

Any help on a workaround/fix for this would be massivly appriciated.

Thanks

Umbraco.RadioButtonList values not migrated correctly

There seems to be a mismatch between the value that uSyncMigrations produces and what Umbraco 9/10/11 expects for a RadioButtonList property. New Umbraco is expecting the text name of the item, whereas it's the index (or Alias?) of the prevalue that's imported. This means that any RadioButtonList properties will show up with no value selected.

When exporting a Umbraco.RadioButtonList property from a v7 site, the value in your content.config file is the index of the prevalue item, e.g. <theme>2</theme>

The uSync Migrator doesn't change this value, and it's then imported by uSync into your new Umbraco site.

New Umbraco stores RadioButtonList values as the string value for the item.

In order to upgrade the RadioButtonList migrator to change indexes into string values, we would need access to the data type config/PreValues in the GetContentValue method...

415 error on upload zip

I've created a zip from a v7 site, but whenever I try and upload it to the v10 site I'm migrating to, the Validate in uSync.Migrations method throws a 415 error, and I'm not sure why!

The zip file seems to contain files, but I can't get the target site to accept it.

Error reading JToken from JsonReader

Version: 4.0.0-phase.3
This error stops the conversion from working on out on Umbraco V11.4

Stack trace as follows:

[14:44:22 ERR] Error while processing E:\_Projects\_SATCWork\um-base-11\backend\UM-Backend.Web\uSync\v9\DataTypes\IconAndTextBlockList.config
Newtonsoft.Json.JsonReaderException: Error reading JToken from JsonReader. Path '', line 0, position 0.
   at Newtonsoft.Json.Linq.JToken.ReadFrom(JsonReader reader, JsonLoadSettings settings)
   at Newtonsoft.Json.Linq.JToken.Parse(String json, JsonLoadSettings settings)
   at uSync.Migrations.Handlers.Shared.SharedDataTypeHandler.MigrateFile(XElement source, Int32 level, SyncMigrationContext context)
   at uSync.Migrations.Handlers.MigrationHandlerBase`1.MigrateFolder(String folder, Int32 level, SyncMigrationContext context)

Config file is as follows:

<?xml version="1.0" encoding="utf-8"?>
<Empty Key="79c93b51-dcd8-4a4f-a771-8995fe087835" Alias="Icon and Text Block List" Change="Delete" />

Thanks for creating this!! We <3 uSync

Error converting value {null} to type 'System.Guid' For nested content

Are nested content supposed to have a key?
I have a bunch of nested content that describes PDF files their json data from the content.config looks like this:

 {
    "ncContentTypeAlias": "overenskomstsfil",
    "key": null,
    "description": "Pdf description",
    "name": "Pdf name",
    "fileId": "5071",
    "datafile": "63368c17-58a9-4cdc-a583-dd79009975b5",
    "gyldigFra": "2018-04-01T00:00:00",
    "url": "/media/15001/5071.pdf"
  }

The migrations throws this error Error converting value {null} to type 'System.Guid'. Path '[0].key', line 4, position 15.

It seems to be expecting a guid on "key"

Migrating Nested content error

Hello,
I have found a problem trying to migrate nested content to block list on all of my page.
(try both way use export on Umbraco8 and push it to a Umbraco 10 or link Umbraco 8 DB to Umbraco10 Website and convert).
Edit: its possible that is the grid on a nested content
I want to know if its linked to your process or if i need to create some Migration converte for this ?

Here the error :
Content,Content\sรฉance-dinformation-bachelor-en-รฉconomie-dentreprise-fรฉvrier-2023,Failed migrating [Umbraco.NestedContent - TDComponents] : Additional text encountered after finished reading JSON content: [. Path '', line 29, position 1.,Error

Full error :

System.Exception: Failed migrating [Umbraco.NestedContent - TDComponents] : Additional text encountered after finished reading JSON content: [. Path '', line 29, position 1.   ---> Newtonsoft.Json.JsonReaderException: Additional text encountered after finished reading JSON content: [. Path '', line 29, position 1.     at Newtonsoft.Json.JsonTextReader.Read()     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)     at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)     at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)     at uSync.Migrations.Migrators.Optional.NestedToBlockListMigrator.GetContentValue(SyncMigrationContentProperty contentProperty, SyncMigrationContext context)     at uSync.Migrations.Handlers.Shared.SharedContentBaseHandler`1.MigrateContentValue(SyncMigrationContentProperty migrationProperty, SyncMigrationContext context)     at uSync.Migrations.Handlers.Shared.SharedContentBaseHandler`1.ConvertPropertyValue(String itemType, String contentType, XElement property, SyncMigrationContext context)     --- End of inner exception stack trace ---     at uSync.Migrations.Handlers.Shared.SharedContentBaseHandler`1.ConvertPropertyValue(String itemType, String contentType, XElement property, SyncMigrationContext context)     at uSync.Migrations.Handlers.Shared.SharedContentBaseHandler`1.MigrateFile(XElement source, Int32 level, SyncMigrationContext context)     at uSync.Migrations.Handlers.MigrationHandlerBase`1.MigrateFolder(String folder, Int32 level, SyncMigrationContext context)

Here the tdcomponent xml data from your files :

<TDComponents>
      <Value Culture="de-ch"><![CDATA[[
  {
    "key": "36bdf4f7-d9f2-4c39-9fa0-65cf2e7ec860",
    "name": "Event info details",
    "ncContentTypeAlias": "TDComponentEventInfoDetails",
    "TDComponentName": "Event details",
    "TDComponentBaseBackgroundColor": "{\"value\":\"ffffff\",\"label\":\"White\",\"sortOrder\":5,\"id\":\"6\"}",
    "TDComponentGrid": "{\r\n  \"name\": \"1 column layout\",\r\n  \"sections\": [\r\n    {\r\n      \"grid\": \"60\",\r\n      \"rows\": [\r\n        {\r\n          \"name\": \"1/1\",\r\n          \"id\": \"1586bc9e-c155-a399-36ae-a4e11fc0379e\",\r\n          \"areas\": [\r\n            {\r\n              \"grid\": \"60\",\r\n              \"controls\": [\r\n                {\r\n                  \"value\": \"<h3>Sie interessieren sich fรผr eine Bachelorausbildung?</h3>\\n<p>Wir laden Sie herzlich zu unserem Informationsabend ein, um Ihnen einen Einblick in die Ausbildung zum Bachelor of Science in Betriebsรถkonomie zu gewรคhren. Das Studium kann in Vollzeit-Zyklus oder berufsbegleitend absolviert werden.<br /><br /></p>\\n<ul>\\n<li class=\\\"text-bold\\\">Donnerstag, 2. Februar 2023, um 18.00 Uhr</li>\\n</ul>\\n<p>Bei unserem Infoanlass erhalten Sie grundlegende Informationen รผber die HSW Freiburg. Wir informieren Sie รผber unseren mehrsprachigen Bachelor in Betriebsรถkonomie. Zudem haben Sie die Gelegenheit, sich direkt mit ehemaligen Absolvierenden auszutauschen, die Studienleitung persรถnlich kennen zu lernen und haben die Mรถglichkeit, Fragen zu stellen.</p>\\n<p>Ein zweiter Informationsabend findet am Donnerstag, 09. Mรคrz 2023 um 18:00 Uhr statt.</p>\",\r\n                  \"editor\": {\r\n                    \"alias\": \"rte\",\r\n                    \"view\": null\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                }\r\n              ],\r\n              \"styles\": null,\r\n              \"config\": null\r\n            }\r\n          ],\r\n          \"styles\": null,\r\n          \"config\": null\r\n        }\r\n      ]\r\n    }\r\n  ]\r\n}",
    "umbracoNaviHide": "0"
  },
  {
    "key": "f12d8574-941c-4406-b247-c99d4b7d74bd",
    "name": "รœber den Bachelor",
    "ncContentTypeAlias": "TDComponentGridContent",
    "TDComponentGridContentGrid": "{\r\n  \"name\": \"1 column layout\",\r\n  \"sections\": [\r\n    {\r\n      \"grid\": \"60\",\r\n      \"rows\": [\r\n        {\r\n          \"name\": \"1/1\",\r\n          \"id\": \"0c24268c-ca11-cab4-8ad4-d3c514d3bc9f\",\r\n          \"areas\": [\r\n            {\r\n              \"grid\": \"60\",\r\n              \"controls\": [\r\n                {\r\n                  \"value\": \"<h3>Schwerpunkte unseres Bachelors</h3>\\n<p>Sie haben die Mรถglichkeit, den Studiengang berufsbegleitend oder in Vollzeit zu absolvieren. Zu wรคhlen, ob Sie den Studiengang auf Deutsch oder Franzรถsisch, zweisprachig (FR/DE) oder dreisprachig (FR/DE/EN) verfolgen mรถchten.ย </p>\",\r\n                  \"editor\": {\r\n                    \"alias\": \"rte\",\r\n                    \"view\": null\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                },\r\n                {\r\n                  \"value\": {\r\n                    \"constrain\": true,\r\n                    \"height\": 240,\r\n                    \"width\": 360,\r\n                    \"url\": \"https://tube.switch.ch/videos/doH2NJc3sG\",\r\n                    \"info\": \"\",\r\n                    \"preview\": \"<iframe src=\\\"https://tube.switch.ch/embed/doH2NJc3sG\\\" frameborder=\\\"0\\\" width=\\\"360\\\" height=\\\"240\\\" title=\\\"Video HEG-FR\\\" webkitallowfullscreen mozallowfullscreen allowfullscreen allowfullscreen></iframe>\"\r\n                  },\r\n                  \"editor\": {\r\n                    \"alias\": \"embed\",\r\n                    \"view\": null\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                },\r\n                {\r\n                  \"value\": {\r\n                    \"macroAlias\": \"TDBiglinksListPages\",\r\n                    \"macroParamsDictionary\": {\r\n                      \"TDBiglinksListPagesContent\": \"[{&quot;name&quot;:&quot;Betriebsรถkonomie&quot;,&quot;id&quot;:1555,&quot;udi&quot;:&quot;umb://document/0deeccaf87d24fbea49a4a666d8b122b&quot;,&quot;icon&quot;:&quot;icon-school color-black&quot;,&quot;trashed&quot;:false,&quot;key&quot;:&quot;0deeccaf-87d2-4fbe-a49a-4a666d8b122b&quot;,&quot;parentId&quot;:1091,&quot;alias&quot;:null,&quot;path&quot;:&quot;-1,1085,1090,1091,1555&quot;,&quot;metaData&quot;:{&quot;ContentTypeAlias&quot;:&quot;TDFormation&quot;,&quot;IsPublished&quot;:true,&quot;IsContainer&quot;:false},&quot;isImportant&quot;:false}]\",\r\n                      \"TDBiglinksListPagesLarge\": \"0\",\r\n                      \"TDBiglinksListPagesNegative\": \"0\",\r\n                      \"TDBiglinksListPagesDescription\": \"0\"\r\n                    }\r\n                  },\r\n                  \"editor\": {\r\n                    \"alias\": \"macro\",\r\n                    \"view\": null\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                }\r\n              ],\r\n              \"styles\": null,\r\n              \"config\": null\r\n            }\r\n          ],\r\n          \"styles\": null,\r\n          \"config\": null\r\n        }\r\n      ]\r\n    }\r\n  ]\r\n}",
    "TDComponentName": "รœber den Bachelor",
    "TDComponentBaseBackgroundColor": "{\"value\":\"ffffff\",\"label\":\"White\",\"sortOrder\":5,\"id\":\"6\"}",
    "umbracoNaviHide": "0"
  },
  {
    "key": "1b5d4e51-dab9-4e6d-9a5e-cbcff0e59457",
    "name": "Contacts",
    "ncContentTypeAlias": "TDComponentProductContact",
    "TDComponentName": "Kontakt",
    "TDComponentBaseBackgroundColor": "{\"value\":\"6e777c\",\"label\":\"Third\",\"sortOrder\":2,\"id\":\"3\"}",
    "umbracoNaviHide": "0",
    "TDComponentProductContactTitle": "Fragen? Kontaktieren Sie uns."
  }
]]]></Value>
      <Value Culture="en-ch"><![CDATA[[
  {
    "key": "1d0d1381-d76f-4047-8cb0-2b9422d0f74d",
    "name": "Event info details",
    "ncContentTypeAlias": "TDComponentEventInfoDetails",
    "TDComponentName": "Event details",
    "TDComponentBaseBackgroundColor": "{\"value\":\"ffffff\",\"label\":\"White\",\"sortOrder\":5,\"id\":\"6\"}",
    "TDComponentGrid": "{\r\n  \"name\": \"1 column layout\",\r\n  \"sections\": [\r\n    {\r\n      \"grid\": \"60\",\r\n      \"rows\": [\r\n        {\r\n          \"name\": \"1/1\",\r\n          \"id\": \"1586bc9e-c155-a399-36ae-a4e11fc0379e\",\r\n          \"areas\": [\r\n            {\r\n              \"grid\": \"60\",\r\n              \"controls\": [\r\n                {\r\n                  \"value\": \"<h3>Interested to follow a Bachelor degree in Business Administration?ย </h3>\\n<p>In order to know better this formation, we invite you to participate at an information evening in French or German, on Thursday the 2nd of February 2023, at 6:00 p.m., at the HEG-FR.ย </p>\\n<p>Another information session will take place on the 9th of March 2023, 6:00 p.m.ย </p>\",\r\n                  \"editor\": {\r\n                    \"alias\": \"rte\",\r\n                    \"view\": null\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                }\r\n              ],\r\n              \"styles\": null,\r\n              \"config\": null\r\n            }\r\n          ],\r\n          \"styles\": null,\r\n          \"config\": null\r\n        }\r\n      ]\r\n    }\r\n  ]\r\n}",
    "umbracoNaviHide": "0"
  },
  {
    "key": "ab9e7d66-69f2-4b68-b380-5ce51c8700c0",
    "name": "Points forts",
    "ncContentTypeAlias": "TDComponentGridContent",
    "TDComponentGridContentGrid": "{\r\n  \"name\": \"1 column layout\",\r\n  \"sections\": [\r\n    {\r\n      \"grid\": \"60\",\r\n      \"rows\": [\r\n        {\r\n          \"name\": \"1/1\",\r\n          \"id\": \"482e8977-4e31-ef4a-6deb-57d1813fc92f\",\r\n          \"areas\": [\r\n            {\r\n              \"grid\": \"60\",\r\n              \"controls\": [\r\n                {\r\n                  \"value\": \"<h3>Strengths of our Bachelorย </h3>\\n<div>Vous avez la possibilitรฉ de suivre la formation en emploi ou ร  plein temps. De choisir, si vous dรฉsirez suivre le cursus en franรงais ou en allemand, en bilingue (FR/DE) ou en trilingue (FR/DE/EN).ย </div>\",\r\n                  \"editor\": {\r\n                    \"alias\": \"rte\",\r\n                    \"view\": \"rte\"\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                },\r\n                {\r\n                  \"value\": {\r\n                    \"constrain\": true,\r\n                    \"height\": 240,\r\n                    \"width\": 360,\r\n                    \"url\": \"https://tube.switch.ch/videos/r7brGaWjUG\",\r\n                    \"info\": \"\",\r\n                    \"preview\": \"<iframe src=\\\"https://tube.switch.ch/embed/r7brGaWjUG\\\" frameborder=\\\"0\\\" width=\\\"360\\\" height=\\\"240\\\" title=\\\"Video HEG-FR\\\" webkitallowfullscreen mozallowfullscreen allowfullscreen allowfullscreen></iframe>\"\r\n                  },\r\n                  \"editor\": {\r\n                    \"alias\": \"embed\",\r\n                    \"view\": \"embed\"\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                },\r\n                {\r\n                  \"value\": {\r\n                    \"macroAlias\": \"TDBiglinksListPages\",\r\n                    \"macroParamsDictionary\": {\r\n                      \"TDBiglinksListPagesContent\": \"[{&quot;score&quot;:1.35283208,&quot;name&quot;:&quot;Business administration&quot;,&quot;id&quot;:&quot;1555&quot;,&quot;udi&quot;:&quot;umb://document/0deeccaf87d24fbea49a4a666d8b122b&quot;,&quot;icon&quot;:&quot;icon-school color-black&quot;,&quot;trashed&quot;:false,&quot;key&quot;:&quot;0deeccaf-87d2-4fbe-a49a-4a666d8b122b&quot;,&quot;parentId&quot;:1091,&quot;alias&quot;:null,&quot;path&quot;:&quot;&quot;,&quot;metaData&quot;:{&quot;contentType&quot;:&quot;TDFormation&quot;,&quot;Url&quot;:&quot;/en/studies/bachelor/business-administration/&quot;},&quot;menuUrl&quot;:&quot;/umbraco/backoffice/UmbracoTrees/ContentTree/GetMenu?id=1555&amp;application=undefined&quot;,&quot;editorPath&quot;:&quot;undefined/undefined/edit/1555&quot;,&quot;subTitle&quot;:&quot;/en/studies/bachelor/business-administration/&quot;,&quot;selected&quot;:true,&quot;isImportant&quot;:false}]\",\r\n                      \"TDBiglinksListPagesLarge\": \"0\",\r\n                      \"TDBiglinksListPagesNegative\": \"0\",\r\n                      \"TDBiglinksListPagesDescription\": \"0\"\r\n                    }\r\n                  },\r\n                  \"editor\": {\r\n                    \"alias\": \"macro\",\r\n                    \"view\": \"macro\"\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                }\r\n              ],\r\n              \"styles\": null,\r\n              \"config\": null\r\n            }\r\n          ],\r\n          \"styles\": null,\r\n          \"config\": null\r\n        }\r\n      ]\r\n    }\r\n  ]\r\n}",
    "TDComponentName": "Points forts",
    "TDComponentBaseBackgroundColor": "{\"value\":\"ffffff\",\"label\":\"White\",\"sortOrder\":5,\"id\":\"6\"}",
    "umbracoNaviHide": "0"
  },
  {
    "key": "278ad702-0191-4168-a9ef-3a77dc59417f",
    "name": "Contacts",
    "ncContentTypeAlias": "TDComponentProductContact",
    "TDComponentName": "Contact",
    "TDComponentBaseBackgroundColor": "{\"value\":\"6e777c\",\"label\":\"Third\",\"sortOrder\":2,\"id\":\"3\"}",
    "umbracoNaviHide": "0",
    "TDComponentProductContactTitle": "Vous avez des questions ?"
  }
]]]></Value>
      <Value Culture="fr-ch"><![CDATA[[
  {
    "key": "26754858-3c0a-42f3-ada6-d9a7bd47ed2b",
    "name": "Event info details",
    "ncContentTypeAlias": "TDComponentEventInfoDetails",
    "TDComponentName": "Event details",
    "TDComponentBaseBackgroundColor": "{\"value\":\"ffffff\",\"label\":\"White\",\"sortOrder\":5,\"id\":\"6\"}",
    "TDComponentGrid": "{\r\n  \"name\": \"1 column layout\",\r\n  \"sections\": [\r\n    {\r\n      \"grid\": \"60\",\r\n      \"rows\": [\r\n        {\r\n          \"name\": \"1/1\",\r\n          \"id\": \"1586bc9e-c155-a399-36ae-a4e11fc0379e\",\r\n          \"areas\": [\r\n            {\r\n              \"grid\": \"60\",\r\n              \"controls\": [\r\n                {\r\n                  \"value\": \"<h3>Vous รชtes intรฉress.รฉ.e.s ร  suivre une formation Bachelor?</h3>\\n<p>Afin de vous permettre de mieux connaรฎtre la formation Bachelor of Science en รฉconomie d'entreprise, nous vous invitons ร  une soirรฉe d'information le <strong>Jeudi 2 fรฉvrier 2023 ร  18h00.</strong></p>\\n<p>Nous vous prรฉsentons:</p>\\n<ul>\\n<li>Notre cursus</li>\\n<li>Nos modalitรฉs d'รฉtudes</li>\\n</ul>\\n<p>Une seconde soirรฉe d'information aura lieu le jeudi 9 mars 2023 ร  18h00.</p>\",\r\n                  \"editor\": {\r\n                    \"alias\": \"rte\",\r\n                    \"view\": \"rte\"\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                }\r\n              ],\r\n              \"styles\": null,\r\n              \"config\": null\r\n            }\r\n          ],\r\n          \"styles\": null,\r\n          \"config\": null\r\n        }\r\n      ]\r\n    }\r\n  ]\r\n}",
    "umbracoNaviHide": "0"
  },
  {
    "key": "6314ed67-9764-4e4c-ac34-7259e49fa1ca",
    "name": "Points forts",
    "ncContentTypeAlias": "TDComponentGridContent",
    "TDComponentGridContentGrid": "{\r\n  \"name\": \"1 column layout\",\r\n  \"sections\": [\r\n    {\r\n      \"grid\": \"60\",\r\n      \"rows\": [\r\n        {\r\n          \"name\": \"1/1\",\r\n          \"id\": \"482e8977-4e31-ef4a-6deb-57d1813fc92f\",\r\n          \"areas\": [\r\n            {\r\n              \"grid\": \"60\",\r\n              \"controls\": [\r\n                {\r\n                  \"value\": \"<h3>Points forts de notre Bachelor</h3>\\n<div>Vous avez la possibilitรฉ de suivre la formation en emploi ou ร  plein temps. De choisir, si vous dรฉsirez suivre le cursus en franรงais ou en allemand, en bilingue (FR/DE) ou en trilingue (FR/DE/EN).ย </div>\",\r\n                  \"editor\": {\r\n                    \"alias\": \"rte\",\r\n                    \"view\": \"rte\"\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                },\r\n                {\r\n                  \"value\": {\r\n                    \"constrain\": true,\r\n                    \"height\": 240,\r\n                    \"width\": 360,\r\n                    \"url\": \"https://tube.switch.ch/videos/7e7cc3a6\",\r\n                    \"info\": \"\",\r\n                    \"preview\": \"<iframe src=\\\"https://tube.switch.ch/embed/7e7cc3a6\\\" frameborder=\\\"0\\\" width=\\\"360\\\" height=\\\"240\\\" title=\\\"Video HEG-FR\\\" webkitallowfullscreen mozallowfullscreen allowfullscreen allowfullscreen></iframe>\"\r\n                  },\r\n                  \"editor\": {\r\n                    \"alias\": \"embed\",\r\n                    \"view\": \"embed\"\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                },\r\n                {\r\n                  \"value\": {\r\n                    \"macroAlias\": \"TDBiglinksListPages\",\r\n                    \"macroParamsDictionary\": {\r\n                      \"TDBiglinksListPagesContent\": \"[{&quot;score&quot;:1.18674755,&quot;name&quot;:&quot;ร‰conomie d&#x27;entreprise&quot;,&quot;id&quot;:&quot;1555&quot;,&quot;udi&quot;:&quot;umb://document/0deeccaf87d24fbea49a4a666d8b122b&quot;,&quot;icon&quot;:&quot;icon-school color-black&quot;,&quot;trashed&quot;:false,&quot;key&quot;:&quot;0deeccaf-87d2-4fbe-a49a-4a666d8b122b&quot;,&quot;parentId&quot;:1091,&quot;alias&quot;:null,&quot;path&quot;:&quot;-1,1085,1090,1091,1555&quot;,&quot;metaData&quot;:{&quot;contentType&quot;:&quot;TDFormation&quot;,&quot;Url&quot;:&quot;http://www.heg-fr.ch/fr/etudes/bachelor/economie-d-entreprise/&quot;},&quot;menuUrl&quot;:&quot;/umbraco/backoffice/UmbracoTrees/ContentTree/GetMenu?id=1555&amp;application=undefined&quot;,&quot;editorPath&quot;:&quot;undefined/undefined/edit/1555&quot;,&quot;subTitle&quot;:&quot;http://www.heg-fr.ch/fr/etudes/bachelor/economie-d-entreprise/&quot;,&quot;selected&quot;:true,&quot;isImportant&quot;:false}]\",\r\n                      \"TDBiglinksListPagesLarge\": \"0\",\r\n                      \"TDBiglinksListPagesNegative\": \"0\",\r\n                      \"TDBiglinksListPagesDescription\": \"0\"\r\n                    }\r\n                  },\r\n                  \"editor\": {\r\n                    \"alias\": \"macro\",\r\n                    \"view\": \"macro\"\r\n                  },\r\n                  \"styles\": null,\r\n                  \"config\": null\r\n                }\r\n              ],\r\n              \"styles\": null,\r\n              \"config\": null\r\n            }\r\n          ],\r\n          \"styles\": null,\r\n          \"config\": null\r\n        }\r\n      ]\r\n    }\r\n  ]\r\n}",
    "TDComponentName": "Points forts",
    "TDComponentBaseBackgroundColor": "{\"value\":\"ffffff\",\"label\":\"White\",\"sortOrder\":5,\"id\":\"6\"}",
    "umbracoNaviHide": "0"
  },
  {
    "key": "1ecdc075-5400-48f0-9772-2faace524ff5",
    "name": "Contacts",
    "ncContentTypeAlias": "TDComponentProductContact",
    "TDComponentName": "Contact",
    "TDComponentBaseBackgroundColor": "{\"value\":\"6e777c\",\"label\":\"Third\",\"sortOrder\":2,\"id\":\"3\"}",
    "umbracoNaviHide": "0",
    "TDComponentProductContactTitle": "Vous avez des questions?"
  }
]]]></Value>
    </TDComponents>

LeBlender

Are there any experience with LeBlender for the Grid editor? Seems like that will be a hassle to migrate as there's no similar thing in Umbraco 10+?
Maybe an upgrade to the new Block Grid is the way to go?

Feature Request: Migrate specific bits instead of doing full migration

HI Kevin!
I think it would be great to be able to choose which bits we want migrate, as if we work on last fixes we want just fix some bits in Media or Content, we don't want do processing to all as it add time on top waiting to specific part being migrated.
I am happy to help with creating it if you point me where I can start looking to add it :)

v7 to v12 Migration - Content not importing

I am migrating a site with around ~23,000 content nodes and 30,000 media nodes. The media appears to import fine but the content does not.

During the content import, the root nodes get logged as follows:

Document {ContentName} (id={ContentId}) has been published.

where ContentId is always zero?

I wondering if this is the source of my issues because this happens for all top-level nodes from the original v7 site and all subsequent imports fail with publish errors because the parent is not published.

Failed to publish FailedPublishPathNotPublished

I will update the issue as/when I do find anything further but in the meantime if anyone has any ideas I'd welcome them.

Question: umbraco 8 migration path..

I was trying to take a u8 export and migrate into a clean u10 site.

I put the usync/v8 folder in the clean u10 site and ran the migration in place, selecting the v8 folder.

I'm guessing this isn't an intended pathway, as the dtge migrators didn't create any of the elements that relate to the dtge existing doctypes?

Is the prefered pathway here to update the existing db from v8 to v10, and then migrate in place, before then usync exporting, to import into a clean v10? Or is that just overkill?

Document Type Missing Template Refrence

When I ran the Migrations I saw that some of the Document Types were missing their Templates. For example, I have a "Standard Content Page" Document Type that is supposed to Allow the "StandardContentPage" Template, but it has not after the migration. But the Template for the Home Page and Contact Us page did keep their document types.

I checked the data folders to see the difference between them but could not spot any obvious differences.

ContactUs.config Template

<?xml version="1.0" encoding="utf-8"?>
<Template>
  <Name>Contact Us</Name>
  <Key>19f4d3b3-5be5-4b52-93a5-7d01d1a49cad</Key>
  <Alias>ContactUs</Alias>
  <Master>Master</Master>
</Template>

StandardContentPage.config Template

<?xml version="1.0" encoding="utf-8"?>
<Template>
  <Name>StandardContentPage</Name>
  <Key>6473fff6-a1ed-4a19-8c71-2a0bfe767de9</Key>
  <Alias>StandardContentPage</Alias>
  <Master>BodyWidgets</Master>
</Template>

Contact Us def.config Document Type

<?xml version="1.0" encoding="utf-8"?>
<DocumentType>
  <Info>
    <Key>d48402d2-a3a8-b04f-cbd4-1ca27e60b179</Key>
    <Name>Contact Us</Name>
    <Alias>ContactUs</Alias>
    <Icon>icon-phone</Icon>
    <Thumbnail>folder.png</Thumbnail>
    <Description></Description>
    <AllowAtRoot>False</AllowAtRoot>
    <IsListView>False</IsListView>
    <Master Key="b4a7382f-7480-e881-d9db-edb3f4904c57">Page</Master>
    <Compositions>
      <Composition Key="1e5fd902-96af-8f71-5444-4a76c5e4cb0b">MasterOverrides</Composition>
      <Composition Key="8b64b514-b0e6-a661-7db5-986309a011e3">PageOverrides</Composition>
      <Composition Key="9ca1e059-f241-d79a-691c-4e6ee3a065cd">RightHandColumn</Composition>
      <Composition Key="b4a7382f-7480-e881-d9db-edb3f4904c57">Page</Composition>
    </Compositions>
    <DefaultTemplate>ContactUs</DefaultTemplate>
    <AllowedTemplates>
      <Template>ContactUs</Template>
    </AllowedTemplates>
  </Info>
  <Structure />
  <GenericProperties />
  <Tabs />
</DocumentType>

Standard Content Page dev.config Document Type

<?xml version="1.0" encoding="utf-8"?>
<DocumentType>
  <Info>
    <Key>334ae0b7-9bb6-aa99-05d6-9170066ffa7b</Key>
    <Name>Standard Content Page</Name>
    <Alias>StandardContentPage</Alias>
    <Icon>icon-document</Icon>
    <Thumbnail>folder.png</Thumbnail>
    <Description></Description>
    <AllowAtRoot>False</AllowAtRoot>
    <IsListView>False</IsListView>
    <Master Key="aee5ce48-d999-f45c-6dc5-5e435d3b5ee4">ContentPage</Master>
    <Compositions>
      <Composition Key="1e5fd902-96af-8f71-5444-4a76c5e4cb0b">MasterOverrides</Composition>
      <Composition Key="4ff66cfd-aa85-bc06-30ea-38e75323947f">MainContent</Composition>
      <Composition Key="8b64b514-b0e6-a661-7db5-986309a011e3">PageOverrides</Composition>
      <Composition Key="9ca1e059-f241-d79a-691c-4e6ee3a065cd">RightHandColumn</Composition>
      <Composition Key="aee5ce48-d999-f45c-6dc5-5e435d3b5ee4">ContentPage</Composition>
      <Composition Key="f3c344d6-0c99-56a5-25d4-2024751b60d4">AdditionalContent</Composition>
    </Compositions>
    <DefaultTemplate>StandardContentPage</DefaultTemplate>
    <AllowedTemplates>
      <Template>StandardContentPage</Template>
    </AllowedTemplates>
  </Info>
  <Structure>
    <DocumentType Key="334ae0b7-9bb6-aa99-05d6-9170066ffa7b">StandardContentPage</DocumentType>
  </Structure>
  <GenericProperties>
    <GenericProperty>
      <Key>2c486b1a-bd17-4878-ae3a-0bf90551a197</Key>
      <Name>Sub Title</Name>
      <Alias>subTitle</Alias>
      <Definition>0cc0eba1-9960-42c9-bf9b-60e150b429ae</Definition>
      <Type>Umbraco.Textbox</Type>
      <Mandatory>false</Mandatory>
      <Validation></Validation>
      <Description><![CDATA[]]></Description>
      <SortOrder>0</SortOrder>
      <Tab>Content</Tab>
    </GenericProperty>
    <GenericProperty>
      <Key>a8c5efff-e395-4031-b3e2-005e6a095540</Key>
      <Name>Tags</Name>
      <Alias>tags</Alias>
      <Definition>8d3f73f5-dd1d-478a-b09c-8341a80d816c</Definition>
      <Type>Umbraco.Tags</Type>
      <Mandatory>false</Mandatory>
      <Validation></Validation>
      <Description><![CDATA[]]></Description>
      <SortOrder>1</SortOrder>
      <Tab>Content</Tab>
    </GenericProperty>
  </GenericProperties>
  <Tabs>
    <Tab>
      <Caption>Main Content</Caption>
      <SortOrder>0</SortOrder>
    </Tab>
    <Tab>
      <Caption>Content</Caption>
      <SortOrder>0</SortOrder>
    </Tab>
  </Tabs>
</DocumentType>

Umbraco 7
image

Umbraco 10
image

Feature - Property Mapping

I've seen this somewhere @leekelleher ๐Ÿ˜‰

the ability to quickly define property mapping,

eg.

  • titte is now pageTitle
  • content is not blockContent

should just be nice an simple ,e.g file that can be dropped into the root of the migration to define this.

Also should have

  • blocking. e.g the ignore properties
  • work across doctypes, content and media.

Feature - Vorto Migrations -

Note for self really.

Vorto's are a special case, in Umbraco 7 Vorto acheives multi-lingual by sotring language against the value

{
  "values": {
    "en-US": "<p style=\"text-align: left;\">Welcome to the content in another box, using vorto</p>\n<p>ย </p>",
    "cy-GB": "<p>This is an update at 14:54</p>",
    "fr": "<p style=\"text-align: left;\">Bienvenue au contenu dans une autre boรฎte, ร  lโ€™aide de vorto</p>\n<p>ย </p>",
    "de": "<p style=\"text-align: left;\">Welcome to the content in another box, using vorto</p>\n<p>ย </p>"
  },
  "dtdGuid": "b5679d51-95ba-428c-bd22-e5c76b2b2f5d"
}

the dtdguid is the guid to the datatype that is the vorto. (in this instance its a text box)

this means it can also store things like nested content :(with a grid inside it!)

{
  "values": {
    "en-US": "[{\"name\":\"Some Titles\",\"ncContentTypeAlias\":\"aChildContentItem\",\"someTitle\":\"Some Titles\",\"grid\":\"{\\r\\n  \\\"name\\\": \\\"2 column layout\\\",\\r\\n  \\\"sections\\\": [\\r\\n    {\\r\\n      \\\"grid\\\": 4,\\r\\n      \\\"rows\\\": [\\r\\n        {\\r\\n          \\\"label\\\": \\\"Headline\\\",\\r\\n          \\\"name\\\": \\\"Headline\\\",\\r\\n          \\\"areas\\\": [\\r\\n            {\\r\\n              \\\"grid\\\": 12,\\r\\n              \\\"hasConfig\\\": false,\\r\\n              \\\"controls\\\": [\\r\\n                {\\r\\n                  \\\"value\\\": \\\"Grid Headline\\\",\\r\\n                  \\\"editor\\\": {\\r\\n                    \\\"alias\\\": \\\"headline\\\"\\r\\n                  },\\r\\n                  \\\"active\\\": false\\r\\n                }\\r\\n              ],\\r\\n              \\\"active\\\": false\\r\\n            }\\r\\n          ],\\r\\n          \\\"hasConfig\\\": false,\\r\\n          \\\"id\\\": \\\"a6e5b65a-f28f-fb80-1889-7d41a0b7f1ed\\\",\\r\\n          \\\"active\\\": false\\r\\n        }\\r\\n      ]\\r\\n    },\\r\\n    {\\r\\n      \\\"grid\\\": 8,\\r\\n      \\\"rows\\\": [\\r\\n        {\\r\\n          \\\"label\\\": \\\"Headline\\\",\\r\\n          \\\"name\\\": \\\"Headline\\\",\\r\\n          \\\"areas\\\": [\\r\\n            {\\r\\n              \\\"grid\\\": 12,\\r\\n              \\\"hasConfig\\\": false,\\r\\n              \\\"controls\\\": [\\r\\n                {\\r\\n                  \\\"value\\\": \\\"<p>Some content in the grid, inside the nested content item</p>\\\",\\r\\n                  \\\"editor\\\": {\\r\\n                    \\\"alias\\\": \\\"rte\\\"\\r\\n                  },\\r\\n                  \\\"active\\\": false\\r\\n                }\\r\\n              ],\\r\\n              \\\"active\\\": false\\r\\n            }\\r\\n          ],\\r\\n          \\\"hasConfig\\\": false,\\r\\n          \\\"id\\\": \\\"58a5cf67-004d-58be-110e-557d3809ef04\\\",\\r\\n          \\\"active\\\": true\\r\\n        }\\r\\n      ]\\r\\n    }\\r\\n  ]\\r\\n}\",\"someContent\":\"<p>Some Content in the page.ย </p>\"},{\"name\":\"Another bits\",\"ncContentTypeAlias\":\"aChildContentItem\",\"someTitle\":\"Another bits\",\"grid\":\"\",\"someContent\":\"<p>Some more content in the pageย </p>\"}]",
    "cy-GB": "[{\"name\":\"Rhai teitlau\",\"ncContentTypeAlias\":\"aChildContentItem\",\"someTitle\":\"Rhai teitlau\",\"grid\":\"\",\"someContent\":\"<p>Rhai cynnwys y dudalen.</p>\"},{\"name\":\"Darnau arall\",\"ncContentTypeAlias\":\"aChildContentItem\",\"someTitle\":\"Darnau arall\",\"grid\":\"\",\"someContent\":\"<p>Mwy o gynnwys ar y dudalen</p>\"}]",
    "fr": "[{\"name\":\"Certains titres\",\"ncContentTypeAlias\":\"aChildContentItem\",\"someTitle\":\"Certains titres\",\"grid\":\"\",\"someContent\":\"<p>Certains contenu dans la page.</p>\"},{\"name\":\"Certains titres\",\"ncContentTypeAlias\":\"aChildContentItem\",\"someTitle\":\"Certains titres\",\"grid\":\"\",\"someContent\":\"<p>Certains contenu dans la page.</p>\"}]",
    "en-IN": null,
    "de": "[\r\n  {\r\n    \"name\": \"Some Titles\",\r\n    \"ncContentTypeAlias\": \"aChildContentItem\",\r\n    \"someTitle\": \"Some Titles\",\r\n    \"grid\": \"{\\r\\n  \\\"name\\\": \\\"2 column layout\\\",\\r\\n  \\\"sections\\\": [\\r\\n    {\\r\\n      \\\"grid\\\": \\\"4\\\",\\r\\n      \\\"rows\\\": [\\r\\n        {\\r\\n          \\\"label\\\": \\\"Headline\\\",\\r\\n          \\\"name\\\": \\\"Headline\\\",\\r\\n          \\\"hasConfig\\\": false,\\r\\n          \\\"id\\\": \\\"a6e5b65a-f28f-fb80-1889-7d41a0b7f1ed\\\",\\r\\n          \\\"areas\\\": [\\r\\n            {\\r\\n              \\\"grid\\\": \\\"12\\\",\\r\\n              \\\"hasConfig\\\": false,\\r\\n              \\\"controls\\\": [\\r\\n                {\\r\\n                  \\\"value\\\": \\\"Grid Headline\\\",\\r\\n                  \\\"editor\\\": {\\r\\n                    \\\"alias\\\": \\\"headline\\\"\\r\\n                  },\\r\\n                  \\\"active\\\": false\\r\\n                }\\r\\n              ]\\r\\n            }\\r\\n          ]\\r\\n        }\\r\\n      ]\\r\\n    },\\r\\n    {\\r\\n      \\\"grid\\\": \\\"8\\\",\\r\\n      \\\"rows\\\": [\\r\\n        {\\r\\n          \\\"label\\\": \\\"Headline\\\",\\r\\n          \\\"name\\\": \\\"Headline\\\",\\r\\n          \\\"hasConfig\\\": false,\\r\\n          \\\"id\\\": \\\"58a5cf67-004d-58be-110e-557d3809ef04\\\",\\r\\n          \\\"areas\\\": [\\r\\n            {\\r\\n              \\\"grid\\\": \\\"12\\\",\\r\\n              \\\"hasConfig\\\": false,\\r\\n              \\\"controls\\\": [\\r\\n                {\\r\\n                  \\\"value\\\": \\\"<p>Some content in the grid, inside the nested content item</p>\\\",\\r\\n                  \\\"editor\\\": {\\r\\n                    \\\"alias\\\": \\\"rte\\\"\\r\\n                  },\\r\\n                  \\\"active\\\": false\\r\\n                }\\r\\n              ]\\r\\n            }\\r\\n          ]\\r\\n        }\\r\\n      ]\\r\\n    }\\r\\n  ]\\r\\n}\",\r\n    \"someContent\": \"<p>Some Content in the page.ย </p>\"\r\n  },\r\n  {\r\n    \"name\": \"Another bits\",\r\n    \"ncContentTypeAlias\": \"aChildContentItem\",\r\n    \"someTitle\": \"Another bits\",\r\n    \"grid\": \"\",\r\n    \"someContent\": \"<p>Some more content in the pageย </p>\"\r\n  }\r\n]"
  },
  "dtdGuid": "7583da93-4eca-458d-85b7-a68931ef34c9"
}

Rather than write anything fancy that can copy with any property editor that might have multiple values in, i think we will accept this is a vorto specific thing and alter the code in the base handler

    var editorAlias = context.GetEditorAlias(contentType, property.Name.LocalName);

    // with the editorAlias, we can do any migrations of the string types here...
    var migratedValue = MigrateContentValue(editorAlias, property.Value, context);

    var newProperty = new XElement(property.Name.LocalName);
    newProperty.Add(new XElement("Value", new XCData(migratedValue)));
    propertiesList.Add(newProperty);

https://github.com/Jumoo/uSyncMigrations/blob/dev/uSync.Migrations/Handlers/ContentBaseMigrationHandler.cs#L143-L150

At the moment this code doesn't know about languages (variants)

but it can, and i think we can have it if it detects that the parent property is a vorto element, that it does the splitting, and then passes the individual languages on to the migration MigrateContentValue property multiple times.

it could then take the result and put it into tags so it would become variant aware.

This is a bit of thinking to do about how we convert a variant datatype to something else, but from a content point of view i think this will do what we need.

Clean - Refactor Context.

The Migration context - rules the world but its a grown a bit like the ever consuming ball of stuff in that PlayStation game I've never played. so it needs some refactoring and cleaning .

Plans in my head

  • move out of models into 'Context' ?
  • split into sub classes for lookups, mappings, ?? maybe something else (e.g context.lookup.GetDatatypeKey(alias) context.mapping.GetEditorAlias(existingAlias) )
  • be more consitant with the names of things

Step 2 is not clear enough for beginners

In the readme its not fully clear what this means exactly for a uSync beginner:

  • Put an Old uSync v7 folder somewhere in your shiny new uSync Folder

Do I need to install the core uSync package (https://www.nuget.org/packages/uSync) in this case 8.11.3 for v8 or 4.0.16 for v7?
Do I then run an uSync export which then populates a Usync folder on disk?

Happy to send over a PR to update the README, let me know if I have got anything wrong.

Grid Layouts and BlockGrid Migrations

When Migrating from Grid to BlockGrid I'm finding that anything other than a single column layout is not behaving as expected (I'm talking specifically the Grid Layouts or "sections" not Row Configurations - these work as expected). As far as I can tell it doesn't generate the BlockGrid layout but makes reference to them by key. Also the structure of the generated xml doesn't seem correct, instead of getting a top level Layout with areas for each column I'm seeing (what I assume to be) the Layout referenced multiple times. The only obvious reason I can think that the layout is not being generated is because it's called "2 column layout" i.e it starts with a number.

Just had a look at the datatype files and found that confusingly the Layouts are referred to as templates and the Row Configurations are called layouts.

Feature - Dashboard workflow

At the moment import a bit of a blunt instrument

  • migrations looks for /usync/data/
  • assumes thats v7
  • exports things to a clean usync/v9 folder.

Ideally

  • Continue to look for old folder
  • Offer an 'Upload uSync Files' options
  • Do the migration into another location
  • run the import against this folder.

Macro Migration Issue

After running the migrations tool I get the error " XML Not valid for type Macro. " On further investigation it appears the xml structure exported from Umbraco 7 has the key attribute within the macro tag as an attribute and not as a separate element. The macros appear to have all been given a key of 00000000-0000-0000-0000-000000000000 and overwritten each other leaving a single file called 00000000-0000-0000-0000-000000000000.config in the uSync/Migrations/datetime/Macros folder. I've included some of the files from uSync v7 export which you should be able to use to replicate the problem.
samples.zip

Error in GUID parsing for related links & related links 2 datatype

@KevinJump I have a ton of related links content that have guids in various places within the captions and links themselves, see screenshot.

image

The parser isn't quite clever enough to capture the correct portion of the Json and ensure only "link" and "internal" Guids are encapsulated in quotes to create valid Json.

Suggested improvement (as yet untested)

private string WrapGuidsWithQuotes(string value)
{
string guidRegEx = @"(""internal""|""link""):(\b[A-Fa-f0-9]{8}(?:-[A-Fa-f0-9]{4}){3}-[A-Fa-f0-9]{12}\b)";
HashSet uniqueMatches = new HashSet();

    foreach (Match m in Regex.Matches(value, guidRegEx)) {
        uniqueMatches.Add(m.Groups[1].Value);
    }

    foreach (var guid in uniqueMatches) { 
      value = value.Replace(guid, "\"" + guid + "\"")
            .Replace("\"\"", "\"");
    }
    return value;
}

Content Picker being set to be an integer

My content picker v7 usync file looks like this:

<?xml version="1.0" encoding="utf-8"?>
<DataType Name="Content Picker" Key="a6857c73-d6e9-480c-b6e6-f15f6ad11125" Id="Umbraco.ContentPickerAlias" DatabaseType="Integer">
  <PreValues />
</DataType>

That changes the data type of a content picker to be an Integer, which breaks the picker going forward (needs to support JSON). Happy to try to debug and submit a PR, but not sure what the best approach is.

Maybe this commit will fix it already?

Minimum version of umbraco and usync for migration

What is the minimum required version to be able to convert and migrate a website?
I am currently trying with a umbraco 7.4 site and the latest usync 3.x.x.740 and it seems to detect the version correctly initially but then won't convert it. Not throwing errors. Just going to the migration screen with nothing to show for it.

EDIT:
Recopied the files and it seems to have converted correctly.

Ability to migrate Umbraco Forms + Users and Members

A nice addition to this tool would be the ability to migratie umbraco forms + users and members too.

I think this is a very important step that is currently missing to really be able to fully migrate an Umbraco 7 installation to Umbraco 10 without needing to update the database to Umbraco 8 at all. Is this a feature that might be added in the future?

Thanks in advance

Question: `Convert in place` workflow in version 4 vs version 3

I'd been using the v3 releases to convert in place for updating legacy grid + dtge to blockgrid and only had to have settings configs (no content configs) in order for the conversion to update the property and the property content using uSync Migrations.

Having updated to v4 the workflow seems to have changed, in that running the same convert in place migration I now end up with the property converted from legacy grid to blockgrid but showing empty content?
I may be missing something but I now seem to have to also export all content and run both the import settings and import content as part of the convert in place workflow. (so less of a convert in place and now more akin to the export/import I'd expect with a v7/8 migration)

Is that the case and is that intended? Perhaps I'm missing something... maybe a setting in the migrationPlan?

I also noticed that with the change to MigrationPlan over MigrationProfile that some of the previous settings are ignored, like the source folder and target migration folder?
It's mitigated by the new functionality for saving migration plans to be able to rerun in the backoffice, but again this seems more like functionality for v7/8 migrations rather than convert in place?

Archetype

Is it correct that there is no Archetype migrator?
If there's none, which migrator would be best to use as an example if we should implement it ourselves?

/Rune

v7 to v10 DTGE Not Migrating

I've exported uSync data from a V7 site, and as far as I can tell, everything is there in the files. When I import in the v10 site, I select the one stop upgrade, I'd expect to see the nested content turned into block lists and the DTGE turned into block grid.

The nested content works as expected. Nested Content DocTypes are correctly marked as Elements, and the properties have migrated, along with their content.

However for the DTGE editors, it hasn't worked. There are Bock Grid Data Types created for each of the DTGE properties from the old site, but they have no settings, and no allowed block types. All of the property data for any of the content that was previously a DTGE is reset to empty block grid JSON.

I've also noticed that the DocTypes for the Grid elements have NOT been set as elements either. There's nothing in the Umbraco logs or uSync report that indicates there's been a problem either.

Does anyone know what could cause this, or where I should be looking for debugging? Happy to submit a PR with a fix if I can get this working!

Migrating a property into two properties?

Hi!

I'm migrating a site where they've used a "Date Range Picker" (Diplo.DateRangePicker). I'm not sure if there is a good alternative for Umbraco 11 but in this scenario it would work for me with just having two date pickers. To the current property "dateRange" would need to be translated into "startDate" and "endDate".

I've been playing around but not really managed to get this to work. Would you say that this could be done and if yes, any pointers? =D

NestedContent Migrator: Value cannot be null. (Parameter 'source')

I've made a export from a Umbraco V7 project and tries to import it into a V10 project and i get this error:

   at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
   at System.Linq.Enumerable.Select[TSource,TResult](IEnumerable`1 source, Func`2 selector)
   at uSync.Migrations.Migrators.NestedContentMigrator.GetConfigValues(SyncMigrationDataTypeProperty dataTypeProperty, SyncMigrationContext context)
   at uSync.Migrations.Handlers.DataTypeMigrationHandler.MigrateFile(XElement source, Int32 level, SyncMigrationContext context)
   at uSync.Migrations.Handlers.MigrationHandlerBase`1.MigrateFolder(String folder, Int32 level, SyncMigrationContext context)
   at uSync.Migrations.Handlers.MigrationHandlerBase`1.MigrateFolder(String folder, Int32 level, SyncMigrationContext context)
   at uSync.Migrations.Handlers.MigrationHandlerBase`1.DoMigration(SyncMigrationContext context)
   at uSync.Migrations.Services.SyncMigrationService.MigrateFromDisk(Guid migrationId, String sourceRoot, SyncMigrationContext migrationContext, IOrderedEnumerable`1 handlers)
   at uSync.Migrations.Services.SyncMigrationService.MigrateFiles(MigrationOptions options)
   at lambda_method921(Closure , Object , Object[] )
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted

I'm not sure of which file is causing it and why.

Let me know if you need more details ๐Ÿ™‚

Idea: Enhancements for SyncMigrationContext

Hi,

I've been trying out uSyncMigrations for the last few days, and the out-of-the box experience is great.

To support som very old (homemade) property editors I had to create something to map from a content ID (int) to a content Key (Guid). This was done a bit hard, with a class like this:

internal class SyncPropertyWithIdMigrator : SyncPropertyMigratorBase
{
    private readonly Dictionary<int, Guid> _idToKey = new();
    
    private readonly IOptions<MigrationOptions> _migrationOptions;

    protected SyncPropertyWithIdMigrator(IOptions<MigrationOptions> migrationOptions)
    {
        _migrationOptions = migrationOptions;
    }

    protected Guid? GetMediaKeyFromId(int id) => GetKeyFromId(id, "media");

    protected Guid? GetContentKeyFromId(int id) => GetKeyFromId(id, "content");

    private Guid? GetKeyFromId(int id, string folder)
    {
        if (_idToKey.TryGetValue(id, out var key))
        {
            return key;
        }

        var source = Path.Combine(_migrationOptions.Value.Source, folder);
       
        var files = Directory.EnumerateFiles(source, "*.config", SearchOption.AllDirectories);

        foreach (var path in files)
        {
            var content = XElement.Load(path);

            if (id != content.Attribute("id").ValueOrDefault(default(int)))
            {
                continue;
            }

            var guid = content.Attribute("guid").ValueOrDefault(Guid.Empty);

            if (guid == Guid.Empty)
            {
                continue;
            }
            
            _idToKey[id] = guid;

            return guid;
        }

        return null;
    }

}

In this case it would have helped if it was possible to have some more information in the the path to the migration source, since it can differ from the injected options. I tried to look into the services exposed, if there was a way to read the migration folder, but it doesn't look like there is any information available about a specific migration (ie the path to the xml files).

I think that populating an id-to-key dictionary would be helpfull for a lot of these very old sites.

Another way to implement it, could be to add another notication type like SyncMigrationStartingNotification, that could hold information about the sourcefiles, the handler type (content, media etc), and then maybe expose an "AdditionalData" dictionary on SyncMigrationContext to allow the data to be stored.

Multinode Tree Picker inside Nested Content not migrated

The v7 content:

<homeMembers guid="e989b557-690b-4057-b836-3d4c5725594c" id="1603" nodeName="Members" isDoc="" updated="2022-11-29T09:30:28.8030000Z" parentGUID="00000000-0000-0000-0000-000000000000" nodeTypeAlias="homeMembers" templateAlias="HomeMembers" sortOrder="1" published="true" isBlueprint="false"> <noIndex>0</noIndex> <pageTitle><![CDATA[Home - Members]]></pageTitle> <rows><![CDATA[[ { "key": "23f2545f-5392-4a4f-b08f-2088fd7c5ab8", "name": "New Home Carousel & Blocks - Member (Professional (+18))", "ncContentTypeAlias": "nCnewHomeCarouselPlusBlocksMember", "personalisationGroups": "22536,22571,22590,22591,22592,22593,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589" },

The migrated content (v10):

<Content Key="e989b557-690b-4057-b836-3d4c5725594c" Alias="Members" Level="1"> <Info> <Parent Key="00000000-0000-0000-0000-000000000000"></Parent> <Path>/Members</Path> <Trashed>false</Trashed> <ContentType>homeMembers</ContentType> <CreateDate>2022-11-29T09:30:28</CreateDate> <NodeName Default="Members" /> <SortOrder>1</SortOrder> <Published Default="true" /> <Schedule /> <Template Key="52e33f8e-2621-4174-b10f-61c49cb41b83">HomeMembers</Template> </Info> <Properties> <pageTitle> <Value><![CDATA[Home - Members]]></Value> </pageTitle> <rows> <Value><![CDATA[[ { "key": "23f2545f-5392-4a4f-b08f-2088fd7c5ab8", "name": "New Home Carousel & Blocks - Member (Professional (+18))", "ncContentTypeAlias": "nCnewHomeCarouselPlusBlocksMember", "personalisationGroups": "" },

personalisationGroups is the multinode tree picker field.

Thanks
Tony

Migrate to different Property Editors depending on Data Type

Hi!

I've just started looking at this great repo and forked the code to play around with it.

I think we might have scenarios where we want to migrate a Property Editor into different property editors depending on the Data Type. So not all "Umbraco.Grid" should be a Grid Block Editor, in some scenarios we want to change that Data Type to be a Block List.

I was looking at the SyncPropertyMigratorBase which exposes GetEditorAlias, GetDatabaseType and GetDatabaseType that gets called when migrating DataTypes. However the SyncMigrationDataTypeProperty only contains info about the Property Editor and not enough information to identify the individual Data Type.

If the "Content Type Key" or "Content Type Alias" was exposed here we would be able to act differently. The same thing applies for the "GetContentValue"-method.

This might be by design and there might be other ways around this?

Errors Parsing the Config Data

Reference:

  • uSync 10.3.1.-beta001
  • uSync.Migrations 4.0.0-phase.2.1

Hi Everyone,

I'm running into an issue with this file, and potentially others after it, where the parsing seems to blow up.

image

Newtonsoft.Json.JsonReaderException: After parsing a value an unexpected character was encountered: 1. Path '[0].link', line 4, position 14.
   at Newtonsoft.Json.JsonTextReader.ParsePostValue(Boolean ignoreComments)
   at Newtonsoft.Json.JsonTextReader.Read()
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
   at uSync.Migrations.Migrators.RelatedLinksMigrator.GetContentValue(SyncMigrationContentProperty contentProperty, SyncMigrationContext context)
   at uSync.Migrations.Handlers.Shared.SharedContentBaseHandler`1.MigrateContentValue(SyncMigrationContentProperty migrationProperty, SyncMigrationContext context)
   at uSync.Migrations.Handlers.Shared.SharedContentBaseHandler`1.ConvertPropertyValue(String itemType, String contentType, XElement property, SyncMigrationContext context)
   at uSync.Migrations.Handlers.Shared.SharedContentBaseHandler`1.MigrateFile(XElement source, Int32 level, SyncMigrationContext context)
   at uSync.Migrations.Handlers.MigrationHandlerBase`1.MigrateFolder(String folder, Int32 level, SyncMigrationContext context)

I believe the error is being reported with the very first link property:

  {
    "caption": "Credit Reports",
    "link": "18d02d55-6aa5-4689-b980-2ba3238658cd", // HERE
    "newWindow": false,
    "internal": "18d02d55-6aa5-4689-b980-2ba3238658cd",
    "edit": false,
    "isInternal": true,
    "internalName": "Credit Reports",
    "type": "internal",
    "title": "Credit Reports"
  },

I validated the JSON below in an external validator, just in case there was something my eyes didn't see. The JSON came back valid. Here is the entire config file for reference:

<?xml version="1.0" encoding="utf-8"?>
<membersOnlyHeaderShortcut guid="89a3cde2-c885-4f23-895e-4d6e4bd4b605" id="4063" nodeName="Reports" isDoc="" updated="2018-01-21T15:29:45.0270000Z" parentGUID="eba0bf09-2c38-4387-bc4c-bebc79a84595" nodeTypeAlias="membersOnlyHeaderShortcut" templateAlias="" sortOrder="1" published="true" isBlueprint="false">
  <commentToFirstApprover></commentToFirstApprover>
  <excludeFromSitemap>0</excludeFromSitemap>
  <excludeFromSiteSearch>0</excludeFromSiteSearch>
  <firstApprover><![CDATA[[
  6
]]]></firstApprover>
  <hasRunningWorkflow><![CDATA[No]]></hasRunningWorkflow>
  <links><![CDATA[[
  {
    "caption": "Credit Reports",
    "link": "18d02d55-6aa5-4689-b980-2ba3238658cd",
    "newWindow": false,
    "internal": "18d02d55-6aa5-4689-b980-2ba3238658cd",
    "edit": false,
    "isInternal": true,
    "internalName": "Credit Reports",
    "type": "internal",
    "title": "Credit Reports"
  },
  {
    "caption": "Deposit Reports",
    "link": "66473c23-240e-42f4-a6e9-afe112a4abef",
    "newWindow": false,
    "internal": "66473c23-240e-42f4-a6e9-afe112a4abef",
    "edit": false,
    "isInternal": true,
    "internalName": "Demand Deposit Reports",
    "type": "internal",
    "title": "Deposit Reports"
  },
  {
    "caption": "Safekeeping Reports",
    "link": "e4b9c55c-60ab-4a18-ac59-cb12ac7e780c",
    "newWindow": false,
    "internal": "e4b9c55c-60ab-4a18-ac59-cb12ac7e780c",
    "edit": false,
    "isInternal": true,
    "internalName": "Safekeeping/Pledge Reports",
    "type": "internal",
    "title": "Safekeeping Reports"
  },
  {
    "caption": "Funds Transfer Reports",
    "link": "d199b112-a54e-4a1d-863f-9a489cd7eb61",
    "newWindow": false,
    "internal": "d199b112-a54e-4a1d-863f-9a489cd7eb61",
    "edit": false,
    "isInternal": true,
    "internalName": "Funds Transfer Reports",
    "type": "internal",
    "title": "Funds Transfer Reports"
  },
  {
    "caption": "Capital Stock Reports",
    "link": "d23cdbce-106d-4408-9da7-7bdce4f5a83b",
    "newWindow": false,
    "internal": "d23cdbce-106d-4408-9da7-7bdce4f5a83b",
    "edit": false,
    "isInternal": true,
    "internalName": "Your Stock",
    "type": "internal",
    "title": "Capital Stock Reports"
  },
  {
    "caption": "All Reports",
    "link": "bffdb065-fa6c-4155-bd29-b23202d9b49c",
    "newWindow": false,
    "internal": "bffdb065-fa6c-4155-bd29-b23202d9b49c",
    "edit": false,
    "isInternal": true,
    "internalName": "All reports",
    "type": "internal",
    "title": "All Reports"
  },
  {
    "caption": "Set Up Report Bundles",
    "link": "fdfb70fc-7580-4425-bdfa-913b95630391",
    "newWindow": false,
    "internal": "fdfb70fc-7580-4425-bdfa-913b95630391",
    "edit": false,
    "isInternal": true,
    "internalName": "Report bundles",
    "type": "internal",
    "title": "Set Up Report Bundles"
  }
]]]></links>
  <metadataDescription></metadataDescription>
  <publishAt></publishAt>
  <umbracoUrlAlias></umbracoUrlAlias>
  <unPublishAt></unPublishAt>
  <workflowHistory></workflowHistory>
</membersOnlyHeaderShortcut>

Any help would be appreciated. I'm not sure how to debug this.

Media properties are not included in the migration

I tried to make an upgrade from 8.11.1 to 11.2.1

From left to right, the properties title and photographer are missing after the migration.
The crops defined on the Image Cropper was missing as well.

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.