docs: def task_submission_options(f):
      """
      Options shared by both transfer and delete task submission
      """
  
      def notify_opt_callback(ctx, param, value):
          """
          Parse --notify
          - "" is the same as "off"
          - parse by lowercase, comma-split, strip spaces
          - "off,x" is invalid for any x
          - "on,x" is valid for any valid x (other than "off")
          - "failed", "succeeded", "inactive" are normal vals
  
          In code, produces True, False, or a set
          """
          # if no value was set, don't set any explicit options
          # the API default is "everything on"
          if value is None:
              return {}
  
          value = value.lower()
          value = [x.strip() for x in value.split(",")]
          # [""] is what you'll get if value is "" to start with
          # special-case it into "off", which helps avoid surprising scripts
          # which take a notification settings as inputs and build --notify
          if value == [""]:
              value = ["off"]
  
          off = "off" in value
          on = "on" in value
          # set-ize it -- duplicates are fine
          vals = set([x for x in value if x not in ("off", "on")])
  
          if (vals or on) and off:
              raise click.UsageError('--notify cannot accept "off" and another value')
  
          allowed_vals = set(("on", "succeeded", "failed", "inactive"))
          if not vals <= allowed_vals:
              raise click.UsageError(
                  "--notify received at least one invalid value among {}".format(
                      list(vals)
                  )
              )
  
          # return the notification options to send!
          # on means don't set anything (default)
          if on:
              return {}
          # off means turn off everything
          if off:
              return {
                  "notify_on_succeeded": False,
                  "notify_on_failed": False,
                  "notify_on_inactive": False,
              }
          # otherwise, return the exact set of values seen
          else:
              return {
                  "notify_on_succeeded": "succeeded" in vals,
                  "notify_on_failed": "failed" in vals,
                  "notify_on_inactive": "inactive" in vals,
              }
  
      f = click.option(
          "--dry-run",
          is_flag=True,
          help=("Don't actually submit the task, print submission " "data instead"),
      )(f)
      f = click.option(
          "--notify",
          callback=notify_opt_callback,
          help=(
              "Comma separated list of task events which notify by email. "
              "'on' and 'off' may be used to enable or disable notifications "
              "for all event types. Otherwise, use 'succeeded', 'failed', or "
              "'inactive'"
          ),
      )(f)
      f = click.option(
          "--submission-id",
          help=(
              "Task submission ID, as generated by `globus task "
              "generate-submission-id`. Used for safe resubmission in the "
              "presence of network failures."
          ),
      )(f)
      f = click.option("--label", default=None, help="Set a label for this task.")(f)
      f = click.option(
          "--deadline",
          default=None,
          type=ISOTimeType(),
          help="Set a deadline for this to be canceled if not completed by.",
      )(f)
      f = click.option(
          "--skip-activation-check",
          is_flag=True,
          help=("Submit the task even if the endpoint(s) " "aren't currently activated."),
      )(f)
  
      return f