Esri / arcgis-python-api

Documentation and samples for ArcGIS API for Python
https://developers.arcgis.com/python/
Apache License 2.0
1.81k stars 1.09k forks source link

Issues with Cloning Map Web App from one Organization to another Organization using clone_items() method #1706

Open angularpi opened 8 months ago

angularpi commented 8 months ago

Describe the bug Trying to use clone-items() method to clone Map Web App from Organization SOURCE to Organization TARGET in ArcGIS Online. The app is in the SOURCE folder along with 5 other apps. There are 7 Maps and about 60 feature layers in the same folder. The script runs for 10 minutes before backing out. I can see several Feature Layers in the TARGET Folder before the clone method deletes them in the back out process.

To Reproduce Steps to reproduce the behavior:

from arcgis.gis import GIS

# Log into Source ESRI Portal
sourceURL = "https://SOURCE.maps.arcgis.com/home/" # WriteSource ESRI Portal URL here
sourceUsername = "SourceAdmin" # Write admin username here, the script will promp for the password
sourceGis = GIS(sourceURL, sourceUsername)
print("Successfully logged in as: " + sourceGis.properties.user.username)
sourceGis

# Log into Target ESRI Portal
targetURL = "https://TARGET.maps.arcgis.com/home/" # WriteSource ESRI Portal URL here
targetUsername = "TargetAdmin" # Write admin username here, the script will promp for the password
targetGis = GIS(targetURL, targetUsername)
print("Successfully logged in as: " + targetGis.properties.user.username)
targetGis

# Cloning
webMapItem = sourceGis.content.get("c0ac61f6147c4ce2a83610a31ac31cc0")
clonedItems = targetGis.content.clone_items(items= [webMapItem], folder= 'TARGET from SOURCE', search_existing_items=True)

error:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
File ~\anaconda3\Lib\site-packages\arcgis\_impl\common\_clone.py:3925, in _FeatureServiceDefinition.clone(self)
   3922         spatial_reference = feature_service.properties[
   3923             "spatialReference"
   3924         ]
-> 3925     self._add_features(
   3926         new_layers,
   3927         relationships,
   3928         layer_field_mapping,
   3929         spatial_reference,
   3930     )
   3932 # once copy data has taken place, do WF necessary data migration

File ~\anaconda3\Lib\site-packages\arcgis\_impl\common\_clone.py:2753, in _FeatureServiceDefinition._add_features(self, layers, relationships, layer_field_mapping, spatial_reference)
   2752 is_generalized = True
-> 2753 layers[layer_id].container.manager.layers[layer_id].update_definition(
   2754     {
   2755         "multiScaleGeometryInfo": {"levels": []}
   2756     }  # {"multiScaleGeometryInfo": None}
   2757 )
   2758 layers[layer_id]._refresh()

IndexError: list index out of range

During handling of the above exception, another exception occurred:

_ItemCreateException                      Traceback (most recent call last)
Cell In[12], line 9
      3 display(webMapItem)
      5 #webMapItem
      6 
      7 #clonedItems = targetGis.content.clone_items?
----> 9 clonedItems = targetGis.content.clone_items(items= [webMapItem], folder= 'TARGET from SOURCE', owner='TargetAdmin', search_existing_items=True)

File ~\anaconda3\Lib\site-packages\arcgis\gis\__init__.py:8562, in ContentManager.clone_items(self, items, folder, item_extent, use_org_basemap, copy_data, copy_global_ids, search_existing_items, item_mapping, group_mapping, owner, preserve_item_id, **kwargs)
   8543     preserve_item_id = False
   8545 deep_cloner = clone._DeepCloner(
   8546     self._gis,
   8547     items,
   (...)
   8560     wab_code_attach=kwargs.pop("copy_code_attachment", True),
   8561 )
-> 8562 return deep_cloner.clone()

File ~\anaconda3\Lib\site-packages\arcgis\_impl\common\_clone.py:1322, in _DeepCloner.clone(self)
   1318 # elif len([node for node in self._graph.values() if isinstance(node, _StoryMapDefinition)]) > 0:
   1319 #    return self._clone_synchronous()
   1320 else:
   1321     with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:
-> 1322         results = executor.submit(self._clone, executor).result()
   1323         return results

File ~\anaconda3\Lib\concurrent\futures\_base.py:456, in Future.result(self, timeout)
    454     raise CancelledError()
    455 elif self._state == FINISHED:
--> 456     return self.__get_result()
    457 else:
    458     raise TimeoutError()

File ~\anaconda3\Lib\concurrent\futures\_base.py:401, in Future.__get_result(self)
    399 if self._exception:
    400     try:
--> 401         raise self._exception
    402     finally:
    403         # Break a reference cycle with the exception in self._exception
    404         self = None

File ~\anaconda3\Lib\concurrent\futures\thread.py:58, in _WorkItem.run(self)
     55     return
     57 try:
---> 58     result = self.fn(*self.args, **self.kwargs)
     59 except BaseException as exc:
     60     self.future.set_exception(exc)

File ~\anaconda3\Lib\site-packages\arcgis\_impl\common\_clone.py:1296, in _DeepCloner._clone(self, excecutor)
   1294             if item:
   1295                 item.delete()
-> 1296         raise ex
   1298 level += 1
   1299 leaf_nodes = self._get_leaf_nodes()

File ~\anaconda3\Lib\concurrent\futures\thread.py:58, in _WorkItem.run(self)
     55     return
     57 try:
---> 58     result = self.fn(*self.args, **self.kwargs)
     59 except BaseException as exc:
     60     self.future.set_exception(exc)

File ~\anaconda3\Lib\site-packages\arcgis\_impl\common\_clone.py:3996, in _FeatureServiceDefinition.clone(self)
   3994     return new_item
   3995 except Exception as ex:
-> 3996     raise _ItemCreateException(
   3997         "Failed to create {0} {1}: {2}".format(
   3998             original_item["type"], original_item["title"], str(ex)
   3999         ),
   4000         new_item,
   4001     )

_ItemCreateException: ('Failed to create Feature Service BMID_System: list index out of range', <Item title:"BMID_System" type:Feature Layer Collection owner:TargetAdmin>)

Screenshots If applicable, add screenshots to help explain your problem.

Expected behavior I expect clone_items() to copy the Map Web App, the associated Map, and associated Feature Layers from the SOURCE Organization to the TARGET Organization. I plan to execute the same script for each one of the 6 Apps (they share Feature Layers)

Platform (please complete the following information):

Additional context Add any other context about the problem here, attachments etc.

anotgrass commented 1 month ago

I am running into this issue as well. I posted in the esri community about it here: https://community.esri.com/t5/arcgis-api-for-python-questions/feature-layer-clone-items-issue-with/m-p/1418584#M9977

But, it seems that if a layer has multiScaleGeometryInfo, and the layer in the service is not ID=0, I run into this error.

In my case, I have one layer in my FS, and its ID is 156, not 0, it also has multiscalegeometryinfo (I guess it was published from a project with multiple layers in it, but all published individually)

It seems that it is looking for 0 instead of the actual layer id.

I've tested other layers where the ID is similar, but no multiscalegeometryinfo, and it clones fine.

Capture