docs: def verify_developer_rights(prefixed_name):
      """
      Checks if the current user is a developer of the app or global workflow
      with the given name. If the app/global workflow exists and the user has
      developer rights to it, the function returns a named tuple representing
      the executable that was queried.
      """
      assert(prefixed_name.startswith('app-') or prefixed_name.startswith('globalworkflow-'))
  
      if prefixed_name.partition('-')[0] == 'app':
          exception_type = dxpy.app_builder.AppBuilderException
          describe_method = dxpy.api.app_describe
          exception_msg = \
              'An app with the given name already exists and you are not a developer of that app'
      else:
          exception_type = dxpy.workflow_builder.WorkflowBuilderException
          describe_method = dxpy.api.global_workflow_describe
          exception_msg = \
              'A global workflow with the given name already exists and you are not a developer of that workflow'
  
      name_already_exists = True
      is_developer = False
      version = None
      executable_id = None
      FoundExecutable = collections.namedtuple('FoundExecutable', ['name', 'version', 'id'])
      try:
          describe_output = describe_method(prefixed_name,
                                            input_params={"fields": {"isDeveloperFor": True,
                                                                     "version": True,
                                                                     "id": True}})
          is_developer = describe_output['isDeveloperFor']
          version = describe_output['version']
          executable_id = describe_output['id']
      except dxpy.exceptions.DXAPIError as e:
          if e.name == 'ResourceNotFound':
              name_already_exists = False
          elif e.name == 'PermissionDenied':
              raise exception_type(exception_msg)
          else:
              raise e
  
      if not name_already_exists:
          # This app/workflow doesn't exist yet so its creation will succeed
          # (or at least, not fail on the basis of the ACL).
          return FoundExecutable(name=None, version=None, id=None)
  
      name_without_prefix = prefixed_name.partition('-')[2]
      if not is_developer:
          raise exception_type('You are not a developer for {n}'.format(n=name_without_prefix))
  
      return FoundExecutable(name=name_without_prefix, version=version, id=executable_id)