importargparsefromoffice365.sharepoint.client_contextimportClientContextfromtests.settingsimportcert_path,cert_thumbprint,client_id,site_url,team_site_url,tenantdefmake_ctx(url:str)->ClientContext:returnClientContext(url).with_client_certificate(tenant,client_id=client_id,thumbprint=cert_thumbprint,cert_path=cert_path)defmain():parser=argparse.ArgumentParser(description="Copy a field via its schema XML")parser.add_argument("--field",required=True,help="Field internal name or title")parser.add_argument("--source",default=team_site_url,help="Source site URL")parser.add_argument("--target",default=site_url,help="Target site URL")parser.add_argument("--list-title",help="Target list (default: site columns)")parser.add_argument("--keep",action="store_true",help="Keep the copied field (default: delete after demo)")args=parser.parse_args()source=make_ctx(args.source)source_field=source.web.fields.get_by_internal_name_or_title(args.field)source.load(source_field,["SchemaXml"]).execute_query()ifsource_field.schema_xmlisNone:raiseSystemExit(f"Field '{args.field}' not found in the source site.")target=make_ctx(args.target)scope=target.web.fieldsifargs.list_title:scope=target.web.lists.get_by_title(args.list_title).fieldscopied=scope.create_field_as_xml(source_field.schema_xml).execute_query()scope_name="site column"ifnotargs.list_titleelseargs.list_titleprint(f"Copied '{args.field}' as '{copied.internal_name}' ({scope_name})")ifnotargs.keep:copied.delete_object().execute_query()print(" (copied field removed after demo)")if__name__=="__main__":main()