Skip to content

SPMT-style migration — a registered session with tasks, run like the cmdlets.

Mirrors Microsoft.SharePoint.MigrationTool.PowerShell:

Register-SPMTMigration    -> session.register(...)
Add-SPMTTask              -> session.add_task(...)
Show-SPMTMigration        -> session.show()
Start-SPMTMigration       -> session.start()
Stop-SPMTMigration        -> session.stop()
Unregister-SPMTMigration  -> session.unregister()

By default tasks upload over REST; pass --migration-api to package + ingest server-side (the SPMT path — full fidelity, needs the [azure] extra).

python migrate_spmt.py                       # examples/data -> Documents
python migrate_spmt.py --migration-api

Permissions

Requires: write access to the target library (and, for --migration-api, an app with the Sites.FullControl.All application permission).

View source

from __future__ import annotations

import argparse
from pathlib import Path

from office365.migration import MigrationSession, MigrationSettings
from office365.sharepoint.client_context import ClientContext
from tests.settings import cert_path, cert_thumbprint, client_id, site_url, tenant


def main():
    parser = argparse.ArgumentParser(description="SPMT-style migration session")
    parser.add_argument("--source", default="../../../data", help="local folder (default: examples/data)")
    parser.add_argument("--library", default="Documents", help="target library title")
    parser.add_argument("--migration-api", action="store_true", help="use the server-side Migration API")
    args = parser.parse_args()

    source = Path(args.source)
    if not source.is_dir():
        parser.error(f"not a directory: {source} — run this script from its own folder")

    ctx = ClientContext(site_url).with_client_certificate(tenant, client_id, cert_thumbprint, cert_path)

    # Register-SPMTMigration — the session settings + the target context
    session = MigrationSession().register(
        context=ctx,
        settings=MigrationSettings(use_migration_api=args.migration_api),
    )

    # Add-SPMTTask — a file-share task (a local folder -> a library)
    session.add_task(
        file_share_source=str(source),
        target_site_url=site_url,
        target_list=args.library,
    )

    # Start-SPMTMigration
    print("Migrating…", flush=True)
    for status in session.start():
        stats = status["stats"]
        print(
            f"  [{status['phase']}] {status['source']} -> {status['target']} "
            f"success={stats['success']} skipped={stats['skipped']} errors={stats['errors']}"
        )

    # Show-SPMTMigration
    for status in session.show():
        print(f"  task {status['id']}: {status['phase']}")

    # Unregister-SPMTMigration
    session.unregister()


if __name__ == "__main__":
    main()

← Back to Migrate