Giter Site home page Giter Site logo

kentico / xperience-by-kentico-kentico-migration-tool Goto Github PK

View Code? Open in Web Editor NEW
5.0 24.0 1.0 2.78 MB

A customizable tool that migrates older Kentico solutions to the latest version of Xperience by Kentico.

License: MIT License

C# 99.71% PowerShell 0.29%
dotnet kentico xperience-by-kentico xperience-by-kentico-integrations xperience-by-kentico-migrations

xperience-by-kentico-kentico-migration-tool's Introduction

Xperience by Kentico: Kentico Migration Tool

7-day bug-fix policy

CI: Build and Test

Description

This repository is part of the Xperience by Kentico Migration Toolkit.

The Kentico Migration Tool transfers content and other data from Kentico Xperience 13, Kentico 12 or Kentico 11 to Xperience by Kentico.

Library Version Matrix

Xperience Version Library Version
== 29.1.0 == 1.0.0
== 29.2.0 == 1.1.0
== 29.3.3 == 1.2.0

Dependencies

Quick Start

Follow the steps below to run the Kentico Migration Tool:

  1. Clone or download the Migration.Toolkit source code from this repository.

  2. Open the Migration.Toolkit.sln solution in Visual Studio.

  3. Configure the options in the Migration.Toolkit.CLI/appsettings.json configuration file. See Migration.Toolkit.CLI/README.md - Configuration for details.

  4. Rebuild the solution and restore all required NuGet packages.

  5. Open the command line prompt.

  6. Navigate to the output directory of the Migration.Toolkit.CLI project.

  7. Run the Migration.Toolkit.CLI.exe migrate command.

    • The following example shows the command with all parameters for complete migration:

      Migration.Toolkit.CLI.exe  migrate --sites --custom-modules --users --settings-keys --page-types --pages --attachments --contact-management --forms --media-libraries --data-protection --countries
  8. Observe the command line output. The command output is also stored in a log file (logs\log-<date>.txt under the output directory by default), which you can review later.

  9. Review the migration protocol, which provides information about the result of the migration, lists required manual steps, etc.

The data is now migrated to the target Xperience by Kentico instance according to your configuration. See Migration.Toolkit.CLI/README.md for detailed information about the migration CLI, configuration options, instructions related to individual object types, and manual migration steps.

Full Instructions

View the Usage Guide for more detailed instructions.

Changelog of recent updates

  • June 13, 2024
    • Migration of categories to taxonomies is available
  • March 11, 2024
    • Kentico Xperience 11 instances are supported as a source of migration
  • February 1, 2024
    • Kentico Xperience 12 instances are supported as a source of migration

Contributing

To see the guidelines for Contributing to Kentico open source software, please see Kentico's CONTRIBUTING.md for more information and follow the Kentico's CODE_OF_CONDUCT.

Instructions and technical details for contributing to this project can be found in Contributing Setup.

License

Distributed under the MIT License. See LICENSE.md for more information.

Support

7-day bug-fix policy

This project has Full support by 7-day bug-fix policy.

See SUPPORT.md for more information.

Security

For any security issues see Kentico's SECURITY.md.

xperience-by-kentico-kentico-migration-tool's People

Contributors

bkapustik avatar davidbkentico avatar davidslavik avatar fialafilip avatar hesspavel avatar liamgold avatar marcel-rbro avatar marcelvriend avatar michaljakubis avatar radekpetruska avatar seangwright avatar skurekjakub avatar snyk-bot avatar tkrch avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

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

Forkers

liamgold

xperience-by-kentico-kentico-migration-tool's Issues

Code cleanup

  • remove unused methods / classes
  • remove unnecessary comments
  • extract hardcoded strings to const wrapper classes

Page type migration - CmsResource not supported

05:05:05.140 fail: Migration.Toolkit.Core.Services.PrimaryKeyLocatorService[0] Mapping Migration.Toolkit.KX13.Models.CmsResource primary key is not supported
05:05:05.147 fail: Migration.Toolkit.Core.Behaviors.RequestHandlingBehavior[0] Error occured Migration.Toolkit.Core.MappingFailureException: Key 'Migration.Toolkit.KX13.Models.CmsResource.ResourceId.451' mapping failed: Target entity is missing at Migration.Toolkit.Core.Contexts.PrimaryKeyMappingContext.MapFromSource[T](Expression`1 keyNameSelector, Nullable`1 sourceId) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Contexts\PrimaryKeyMappingContext.cs:line 181    at Migration.Toolkit.Core.Mappers.CmsClassMapper.MapInternal(CmsClass source, DataClassInfo target, Boolean newInstance, MappingHelper mappingHelper, AddFailure addFailure) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Mappers\CmsClassMapper.cs:line 120    at Migration.Toolkit.Core.Abstractions.EntityMapperBase`2.Map(TSourceEntity source, TTargetEntity target) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Abstractions\EntityMapperBase.cs:line 46    at Migration.Toolkit.Core.Handlers.MigratePageTypesCommandHandler.SaveUsingKxoApi(CmsClass kx13Class, DataClassInfo kxoDataClass) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Handlers\MigratePageTypesCommandHandler.cs:line 160    at Migration.Toolkit.Core.Handlers.MigratePageTypesCommandHandler.Handle(MigratePageTypesCommand request, CancellationToken cancellationToken) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Handlers\MigratePageTypesCommandHandler.cs:line 116    at Migration.Toolkit.Core.Handlers.MigratePageTypesCommandHandler.Handle(MigratePageTypesCommand request, CancellationToken cancellationToken) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Handlers\MigratePageTypesCommandHandler.cs:line 123    at Migration.Toolkit.Core.Behaviors.CommandConstraintBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Behaviors\CommandConstraintBehavior.cs:line 57    at Migration.Toolkit.Core.Behaviors.RequestHandlingBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Behaviors\RequestHandlingBehavior.cs:line 32

MigrateSettingsKeysCommand

  • přenos kategorií
  • přenos resource pro kategorie
  • #11 Chybí resource strings
  • přenos jen těch settings key, které jsou přítomny v cílové instanci kxo

Fix EF warning 'Compiling a query which loads related ...'

06:26:10.061 warn: Microsoft.EntityFrameworkCore.Query[20504] Compiling a query which loads related collections for more than one collection navigation, either via 'Include' or through projection, but no 'QuerySplittingBehavior' has been configured. By default, Entity Framework will use 'QuerySplittingBehavior.SingleQuery', which can potentially result in slow query performance. See https://go.microsoft.com/fwlink/?linkid=2134277 for more information. To identify the query that's triggering this warning call 'ConfigureWarnings(w => w.Throw(RelationalEventId.MultipleCollectionIncludeWarning))'.

Migration protocol

Cílem komponenty je pořizovat protokol o tom co se povedlo, co je třeba migrovat manuálně.

Z výstupu by měl uživatel CLI pochopit co je třeba provést dál a jak pokračovat v migraci (co chybí, co je třeba napravit)

Protokol musí obsahovat informace vedoucí k identifikaci zdrojové entity a cílové entity.

Exception when migrating pages

11:44:05.370 info: Migration.Toolkit.Core.Behaviors.RequestHandlingBehavior[0] Handled CommandResult in elapsed: 00:00:00.2229251
Unhandled exception. CMS.DataEngine.LinqExpressionCannotBeExecutedException: The query provider failed to execute a query represented by a LINQ expression.
 ---> System.InvalidOperationException: Sequence contains more than one element
   at System.Linq.ThrowHelper.ThrowMoreThanOneElementException()
   at System.Linq.Enumerable.TryGetSingle[TSource](IEnumerable`1 source, Boolean& found)
   at lambda_method3422(Closure )
   at System.Linq.EnumerableExecutor`1.Execute()
   at System.Linq.EnumerableExecutor`1.ExecuteBoxed()
   at System.Linq.EnumerableQuery`1.System.Linq.IQueryProvider.Execute(Expression expression)
   at CMS.DataEngine.CMSQueryProvider`1.ExecuteInternal(Expression expression)
   --- End of inner exception stack trace ---
   at CMS.DataEngine.CMSQueryProvider`1.ExecuteInternal(Expression expression)
   at CMS.DataEngine.CMSQueryProvider`1.Execute(Expression expression)
   at CMS.DataEngine.CMSQueryProvider`1.Execute[TResult](Expression expression)
   at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source)
   at Migration.Toolkit.Core.Handlers.MigratePagesCommandHandler.Handle(MigratePagesCommand request, CancellationToken cancellationToken) in C:\inetpub\wwwroot\Migration Toolkit\Migration.Toolkit.Core\Handlers\MigratePagesCommandHandler.cs:line 152
   at Migration.Toolkit.Core.Handlers.MigratePagesCommandHandler.Handle(MigratePagesCommand request, CancellationToken cancellationToken) in C:\inetpub\wwwroot\Migration Toolkit\Migration.Toolkit.Core\Handlers\MigratePagesCommandHandler.cs:line 290
   at Migration.Toolkit.Core.Behaviors.RequestHandlingBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next) in C:\inetpub\wwwroot\Migration Toolkit\Migration.Toolkit.Core\Behaviors\RequestHandlingBehavior.cs:line 32
   at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.Handle(Object request, CancellationToken cancellationToken, ServiceFactory serviceFactory)
   at Program.<Main>$(String[] args) in C:\inetpub\wwwroot\Migration Toolkit\Migration.Toolkit.CLI\Program.cs:line 383
   at Program.<Main>$(String[] args) in C:\inetpub\wwwroot\Migration Toolkit\Migration.Toolkit.CLI\Program.cs:line 388
   at Program.<Main>(String[] args)

MigrateUsersCommand

Restrictions:

  • administrators must be migrated manualy
    Todos:

  • dependencies

    • User Role
    • User Site
  • migrovat CmsUserSite

  • migrovat CmsUserCulture ??

  • migrovat CmsUserRole

  • migrovat CmsRole

Support for other page type fields

Motivation

Currently, page type fields File, Attachments, and Pages are not supported (by the tool and XbK). Since at least File is probably used heavily in older versions, customers would like to migrate such data.
On top of that, the migration of the page type that contains one of these fields fails with NRE:

Migration.Toolkit.Core.Handlers.MigratePageTypesCommandHandler[0] Error while saving page type custom.News System.NullReferenceException: Object reference not set to an instance of an object.
    at CMS.DataEngine.TableManager.CreateTableByDefinition(DataClassInfo classInfo)
    at CMS.DataEngine.DataClassInfoProvider.EnsureDatabaseStructure(DataClassInfo classInfo, Boolean updateSystemFields)
    at CMS.DataEngine.DataClassInfoProvider.SetInfo(DataClassInfo info)
    at CMS.DataEngine.DataClassInfoProviderBase`1.SetDataClassInfo(DataClassInfo infoObj)
    at Migration.Toolkit.KXO.Api.KxoClassFacade.SetClass(DataClassInfo dataClassInfo) in .\Migration.Toolkit.KXO.Api\KxoClassFacade.cs:line 25
    at Migration.Toolkit.Core.Handlers.MigratePageTypesCommandHandler.SaveUsingKxoApi(CmsClass kx13Class, DataClassInfo kxoDataClass) in .\Migration.Toolkit.Core\Handlers\MigratePageTypesCommandHandler.cs:line 190

Proposed solution

There still should be a way to migrate the data:

  • Files and attachments might be copied over to a media library just like regular attachments.
  • Page relationships might be either simply skipped or an identifier of selected pages might be inserted into a plain text field.
  • At a minimum, the migration should not fail. Instead, report what data could not migrate.

Additional context

I can provide you with a backup of a project where you can test it. I used the following command:
Migration.Toolkit.CLI.exe migrate --siteId 1 --sites --users --media-libraries --page-types --pages --attachments --culture en-US

SettingsKey: selektivní migrace

  • Synchronizovat s deny listem?
  • s příznakem KeyIsCustom ?
  • volitelně?
  • hardcoded list pro vyřazení "private" / "internal" klíčů
    dotaz k #13

Running the migrate command ends up with process termination

When running the migrate command, in this case
Migration.Toolkit.CLI.exe migrate --siteId 1 --culture nl-BE --sites --users --settings-keys --page-types --pages --attachments --contact-management --forms --media-libraries --data-protection --countries it suddenly tells the process is terminated and ends up like this:

Process terminated. Assertion failed.
kx13CmsDocument != null
   at Migration.Toolkit.Core.Handlers.MigratePagesCommandHandler.Handle(MigratePagesCommand request, CancellationToken cancellationToken) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Handlers\MigratePagesCommandHandler.cs:line 145
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Migration.Toolkit.Core.Handlers.MigratePagesCommandHandler.Handle(MigratePagesCommand request, CancellationToken cancellationToken)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.<>c__DisplayClass1_0.<Handle>g__Handler|0()
   at Migration.Toolkit.Core.Behaviors.CommandConstraintBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Behaviors\CommandConstraintBehavior.cs:line 57
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Migration.Toolkit.Core.Behaviors.CommandConstraintBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.<>c__DisplayClass1_1.<Handle>b__2()
   at Migration.Toolkit.Core.Behaviors.RequestHandlingBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Behaviors\RequestHandlingBehavior.cs:line 32
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Migration.Toolkit.Core.Behaviors.RequestHandlingBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.<>c__DisplayClass1_1.<Handle>b__2()
   at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.<>c__DisplayClass1_1.<Handle>b__2()
   at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.<>c__DisplayClass1_1.<Handle>b__2()
   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.<>c__DisplayClass1_1.<Handle>b__2()
   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.<>c__DisplayClass1_1.<Handle>b__2()
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.Handle(IRequest`1 request, CancellationToken cancellationToken, ServiceFactory serviceFactory)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.Handle(Object request, CancellationToken cancellationToken, ServiceFactory serviceFactory)
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.Handle(Object request, CancellationToken cancellationToken, ServiceFactory serviceFactory)
   at MediatR.Mediator.Send(Object request, CancellationToken cancellationToken)
   at Program.<Main>$(String[] args) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.CLI\Program.cs:line 384
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2.Handle(Object request, CancellationToken cancellationToken, ServiceFactory serviceFactory)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at Migration.Toolkit.Core.Behaviors.RequestHandlingBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Behaviors\RequestHandlingBehavior.cs:line 46
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at Migration.Toolkit.Core.Behaviors.CommandConstraintBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Behaviors\CommandConstraintBehavior.cs:line 58
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at Migration.Toolkit.Core.Handlers.MigrateSettingKeysCommandHandler.Handle(MigrateSettingKeysCommand request, CancellationToken cancellationToken) in C:\inetpub\wwwroot\MigrationToolkit\Migration.Toolkit.Core\Handlers\MigrateSettingKeysCommandHandler.cs:line 122
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(StateManager stateManager, Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IList`1 entriesToSave, CancellationToken cancellationToken)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetResult()
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetExistingTaskResult(Task`1 task, TResult result)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(TResult result)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(IAsyncStateMachineBox box, Boolean allowInlining)   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task.FinishStageThree()
   at System.Threading.Tasks.Task.FinishStageTwo()
   at System.Threading.Tasks.Task.FinishSlow(Boolean userDelegateExecute)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
   at System.Threading.Tasks.Task.ExecuteEntryUnsafe(Thread threadPoolThread)
   at System.Threading.Tasks.ThreadPoolTaskScheduler.TryExecuteTaskInline(Task task, Boolean taskWasPreviouslyQueued)
   at System.Threading.Tasks.TaskScheduler.TryRunInline(Task task, Boolean taskWasPreviouslyQueued)
   at System.Threading.Tasks.TaskContinuation.InlineIfPossibleOrElseQueue(Task task, Boolean needsProtection)
   at System.Threading.Tasks.ContinueWithTaskContinuation.Run(Task completedTask, Boolean canInlineContinuationTask)
   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task`1.TrySetResult(TResult result)
   at System.Threading.Tasks.UnwrapPromise`1.TrySetFromTask(Task task, Boolean lookForOce)
   at System.Threading.Tasks.UnwrapPromise`1.ProcessInnerTask(Task task)
   at System.Threading.Tasks.UnwrapPromise`1.ProcessCompletedOuterTask(Task task)
   at System.Threading.Tasks.UnwrapPromise`1.Invoke(Task completingTask)
   at System.Threading.Tasks.Task.RunOrQueueCompletionAction(ITaskCompletionAction completionAction, Boolean allowInlining)
   at System.Threading.Tasks.Task.RunContinuations(Object continuationObject)
   at System.Threading.Tasks.Task.FinishContinuations()
   at System.Threading.Tasks.Task.FinishStageThree()
   at System.Threading.Tasks.Task.FinishStageTwo()
   at System.Threading.Tasks.Task.FinishSlow(Boolean userDelegateExecute)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
   at System.Threading.Tasks.Task.ExecuteEntryUnsafe(Thread threadPoolThread)
   at System.Threading.Tasks.Task.ExecuteFromThreadPool(Thread threadPoolThread)
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading.PortableThreadPool.WorkerThread.WorkerThreadStart()
   at `System.Threading.Thread.StartCallback()

Tested with a customers project

MigratePagesCommand

  • migrovat jen publikované
  • migrovat jen ve zvolené zdrojové culture mutaci (cílová zatím jen jedna možná)
  • workflow prozatím zanedbáno (jen publikované)

TODOS:

  • Only published
  • #3 Culture selection
  • #2 CoupledData table

MigrateFormsCommand

Zbývá:

  • Form Class migration
  • new Fields
    • FormAfterSubmitMode
    • FormAfterSubmitRelatedValue
  • Coupled data migration

Page Templates

This version brought Preset Templates feature to a Page Builder. In KX13 this feature was called Custom Templates, the code is basically the same and DB as well. Under the hood, it is still called Custom Templates.

Also custom properties were unlocked for Pages built on top of templates.

With this toolkit, customers should be able to migrate their KX13 Custom Templates into XbK Preset Templates (Including widget content and custom template properties. Excluding structured content.)

EDIT TK:

Get rid of .vs

Brief bug description

Folder .vs should not be part of the repository. Right now, it causes an error when you open the solution in Visual Studio because it tries to load a file from cached path. I believe most of the people will not put the code to C:\Work\Develop\kx13-to-kxo-migration\

Attachment conversion / migration

  • Change default target media library for attachments
    • Display name to Attachments for site {sitename}
    • Code name to AttachmentsForSite{sitename}
    • Description to Created by Xperience Migration.Toolkit
  • Directory for grouped attachment - add prefix __
  • Ensure links of attachment in friendly url format - NodeAliasPath work (legacy handler)
  • Create legacy attachment handler that loads data from media file
  • Remove configuration TargetAttachmentMediaLibraryName

MigrateMediaLibrariesCommand

  • migrovat včetně media files (pokusit se o migraci z FS/Blob, pokud nepůjde sepsat manuální návod jak na to a zaprotokolovat files
    k přenesení)

MigrateSettingsKeysCommand (updated)

  • Only Settings Keys (non custom keys) that are in target instance
  • Only required dependencies (CmsResource, CmsSettingsKeyCategory)
  • Refactor of mapper result - aggreate result

Page Type migration fails when using inherited page types

Brief bug description

Using the migrate command fails to migrate all page types in cases where inherited page types are used (some still work depending on order of the page types returned).

Repro steps

  1. Create a new page type in a KX13 source database as a normal page type 'Home', fields don't matter
  2. Create a new page type in same database as a normal page type 'Base', fields don't really matter
  3. Change Home to Inherit from Base.
  4. Run the migration command for just pages types and pages (or any other simple config) like migrate --siteId 2 --culture en-US --sites --users --page-types --pages
  5. See error

Expected behavior

Correct behavior would be to handle the situation not based on the Order of the ClassID but instead try to process the entire result set to find the "base" inherited Page Type for any Page Type that uses Inheritance.

Test environment

  • Platform/OS: .NET 6, Windows
  • Version: this repo's main branch

Additional context

An example log that shows the error:

2022-07-08T10:54:08.2083696-04:00  [WRN] Mapping "Migration.Toolkit.KX13.Models.CmsClass" primary key: 5510 failed, "Sequence contains no elements" (ecc18f30)
2022-07-08T10:54:08.2141618-04:00  [ERR] NeedManualAction: True, ReferenceName: MissingRequiredDependency, AdditionalInfo: DependencyType: CmsClass, FieldName: ClassId, SourceValue: 5510 (5a57336f)
2022-07-08T10:54:08.2144640-04:00  [ERR] Error while saving page type "McBeev.HomeNode" (d6bf0613)
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. (Parameter 'mapped')
   at Migration.Toolkit.Core.Handlers.MigratePageTypesCommandHandler.SaveUsingKxoApi(CmsClass kx13Class, DataClassInfo kxoDataClass) in C:\XbKMigrationToolkit\kx13-to-kxo-migration\Migration.Toolkit.Core\Handlers\MigratePageTypesCommandHandler.cs:line 182
2022-07-08T10:54:08.2179811-04:00  [WRN] Mapping "Migration.Toolkit.KX13.Models.CmsClass" primary key: 5513 failed, "Sequence contains no elements" (ecc18f30)
2022-07-08T10:54:08.2188951-04:00  [ERR] NeedManualAction: True, ReferenceName: MissingRequiredDependency, AdditionalInfo: DependencyType: CmsClass, FieldName: ClassId, SourceValue: 5513 (5bc1b678)
2022-07-08T10:54:08.2189670-04:00  [ERR] Error while saving page type "McBeev.MenuItemNode" (d6bf0613)
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. (Parameter 'mapped')
   at Migration.Toolkit.Core.Handlers.MigratePageTypesCommandHandler.SaveUsingKxoApi(CmsClass kx13Class, DataClassInfo kxoDataClass) in C:\XbKMigrationToolkit\kx13-to-kxo-migration\Migration.Toolkit.Core\Handlers\MigratePageTypesCommandHandler.cs:line 182

Notice how HomeNode is asking for a base node of 5510 (which should resolve to the correct BaseNode page type) but instead errors.

Screenshots

Add links to screenshots, if possible.
image

Create CoupledDataTable by XML definition

  • Forms
  • Page types

Cílem je zjistit jakým způsobem založit tabulku pro page custom data a form custom data

Navržená řešení:

  • dodání logiky pro vytvoření table
  • reverse-engineering (dekompilace kxo/kx13)
  • prostředek v kxo jak obnovit tabulky administrátorsky a přidání pokynů do návodu

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.