docs: def applyEdits(self,
                     addFeatures=None,
                     updateFeatures=None,
                     deleteFeatures=None,
                     gdbVersion=None,
                     useGlobalIds=False,
                     rollbackOnFailure=True,
                     attachments=None):
          """
             This operation adds, updates, and deletes features to the
             associated feature layer or table in a single call.
             Inputs:
                addFeatures - The array of features to be added.  These
                              features should be common.Feature objects, or
                              they should be a list of dictionary features.
                updateFeatures - The array of features to be updateded.
                                 These features should be common.Feature
                                 objects or a list of dictionary formed
                                 features.
                deleteFeatures - string of OIDs to remove from service or a
                                 list of values.
                gdbVersion - Geodatabase version to apply the edits.
                useGlobalIds - instead of referencing the default Object ID
                                field, the service will look at a GUID field
                                to track changes.  This means the GUIDs will
                                be passed instead of OIDs for delete,
                                update or add features.
                rollbackOnFailure - Optional parameter to specify if the
                                    edits should be applied only if all
                                    submitted edits succeed. If false, the
                                    server will apply the edits that succeed
                                    even if some of the submitted edits fail.
                                    If true, the server will apply the edits
                                    only if all edits succeed. The default
                                    value is true.
                attachments - Optional parameter which requires the layer's
                              supportsApplyEditsWithGlobalIds property to be
                              true.
                              Use the attachments parameter to add, update or
                              delete attachments. Applies only when the
                              useGlobalIds parameter is set to true. For
                              adds, the globalIds of the attachments provided
                              by the client are preserved. When useGlobalIds
                              is true, updates and deletes are identified by
                              each feature or attachment globalId rather than
                              their objectId or attachmentId.
  
                              Dictionary Format:
                              {
                              "adds": [<attachment1>, <attachment2>],
                              "updates": [<attachment1>, <attachment2>],
                              "deletes": ["<attachmentGlobalId1>",
                                          "<attachmentGlobalId2>"]
                              }
             Output:
                dictionary of messages
          """
          editURL = self._url + "/applyEdits"
          params = {"f": "json",
                    "useGlobalIds" : useGlobalIds,
                    "rollbackOnFailure" : rollbackOnFailure
                    }
          if gdbVersion is not None:
              params['gdbVersion'] = gdbVersion
          if addFeatures is None:
              addFeatures = []
          if updateFeatures is None:
              updateFeatures = []
          if len(addFeatures) > 0 and \
             isinstance(addFeatures[0], Feature):
              params['adds'] = json.dumps([f.asDictionary for f in addFeatures],
                                          default=_date_handler)
          elif len(addFeatures) > 0 and \
               isinstance(addFeatures[0], dict):
              params['adds'] = json.dumps(addFeatures, default=_date_handler)
          elif len(addFeatures) == 0:
              params['adds'] = json.dumps(addFeatures)
          if len(updateFeatures) > 0 and \
             isinstance(updateFeatures[0], Feature):
              params['updates'] = json.dumps([f.asDictionary for f in updateFeatures],
                                             default=_date_handler)
          elif len(updateFeatures) > 0 and \
               isinstance(updateFeatures[0], dict):
              params['updates'] = json.dumps(updateFeatures,
                                             default=_date_handler)
          elif updateFeatures is None or \
               len(updateFeatures) == 0:
              updateFeatures = json.dumps([])
          if deleteFeatures is not None and \
             isinstance(deleteFeatures, str):
              params['deletes'] = deleteFeatures
          elif deleteFeatures is not None and \
               isinstance(deleteFeatures, list):
              params['deletes'] = ",".join([str(f) for f in deleteFeatures])
          else:
              params['deletes'] = ""
          if attachments is None:
              params['attachments'] = ""
          else:
              params['attachments'] = attachments
          res = self._post(url=editURL,
                            param_dict=params,
                            securityHandler=self._securityHandler,
                            proxy_port=self._proxy_port,
                            proxy_url=self._proxy_url)
          return res