Esri / ArcREST

python package for REST API (AGS, AGOL, webmap JSON, etc..)
Apache License 2.0
192 stars 155 forks source link

FeatureLayer.applyEdits(addFeatures=[],updateFeatures=[]) incorrect response #244

Closed DShokes closed 8 years ago

DShokes commented 8 years ago

ArcRest or ArcRestHelper

ArcRest

Version or date of download

3.5.3

Bug or Enhancement

Bug

Repo Steps or Enhancement details

Running applyEdits from the REST page with [] in either addFeatures or updateFeatures, returns:

{ "addResults" : [ ], "updateResults" : [ ], "deleteResults" : [ ] }

However, in arcREST, running FeatureLayer.applyEdits(addFeatures=[],updateFeatures=[]) returns:

{"error":{"code":400,"message" : "","details":[ "Invalid parameters"]}}

This occurs because there is no parameter added unless the list contains features.To mimic the REST page, the applyEdits arguments defaulting to "[]" would have to change to None and two instance checks would have to be added:

    def applyEdits(self,
                   addFeatures=None,
                   updateFeatures=None,
                   deleteFeatures=None,
                   gdbVersion=None,
                   useGlobalIds=False,
                   rollbackOnFailure=True):

        editURL = self._url + "/applyEdits"
        params = {"f": "json",
                  "useGlobalIds" : userGlobalIds,
                  "rollbackOnFailure" : rollbackOnFailure
                  }
        if gdbVersion is not None:
            params['gdbVersion'] = gdbVersion
##Add## 
        if isinstance(addFeatures,list):
            params['adds'] = json.dumps([])
#####
        if len(addFeatures) > 0 and \
           isinstance(addFeatures[0], Feature):
            params['adds'] = json.dumps([f.asDictionary for f in addFeatures],
                                        default=_date_handler)
##Add##
        if isinstance(updateFeatures,list):
            params['updates'] = json.dumps([])
####
        if len(updateFeatures) > 0 and \
           isinstance(updateFeatures[0], Feature):
            params['updates'] = json.dumps([f.asDictionary for f in updateFeatures],
                                           default=_date_handler)
        if deleteFeatures is not None and \
           isinstance(deleteFeatures, str):
            params['deletes'] = deleteFeatures
        return self._post(url=editURL, param_dict=params,
                             securityHandler=self._securityHandler,
                             proxy_port=self._proxy_port,
                             proxy_url=self._proxy_url)

This would still ensure FeatureLayer.applyEdits(addFeatures=None) returns the correct "invalid parameters" error. In my case, addFeatures was an empty list variable and the script was looking for "addResults" from applyEdits results.

achapkowski commented 8 years ago

@DShokes - should be fixed. Tested on both 10.4, and 10.3.1. Please pull the latest.

DShokes commented 8 years ago

Looks good thank you.

>>> flTrees.applyEdits()
{u'addResults': [], u'deleteResults': [], u'updateResults': []}
>>> flTrees.applyEdits(addFeatures=[])
{u'addResults': [], u'deleteResults': [], u'updateResults': []}