there is Mediaplan CustomDefinitionResource:

# CustomResourceDefinition
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: mediaplans.crd.idom.project
spec:
  group: crds.idom.project
  scope: Namespaced
  names:
    plural: mediaplans
    singular: mediaplan
    kind: Mediaplan
    shortNames:
    - mediap
  versions:
  - name: v1alpha1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          apiVersion:
            type: string
            description: ‘A unique version for the Kubernetes API’
          kind:
            type: string
            description: ‘Type of resource’
          metadata:
            type: object
            properties:
            name:
              type: string
              description: ‘Name of the resource’
            required:
            - name
          spec:
            type: object
            properties:
              # scheduling
              schedule:
                type: string
                description: ‘Scheduling format for the mediaplan’
              # channel metadata
              channel:
                type: object
                properties:
                  name:
                    type: string
                    description: ‘Name of the channel’
                  guid:
                    type: string
                    description: ‘GUID of the channel’
                  id:
                    type: integer
                    description: ‘ID of the channel’
                  link:
                    type: string
                    description: ‘Link for the channel’
              messagingSettings:
                type: object
                properties:
                  # oneof: topic or files
                  # generation topics
                  topics:
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                          description: ‘Code for the topic’
                        weight:
                          type: integer
                          description: ‘Generation weight for the topic’
                          default: 1
                  # or choose files from s3
                  files:
                    type: array
                    items:
                      type: object
                      properties:
                        uri:
                          type: string
                          description: ‘URI for the file’
              # agent settings
              agentSettings:
                type: object
                properties:
                  # count
                  totalCount:
                    type: integer
                    description: ‘Total number of agents for the mediaplan’
                    default: 10
                  # credential comparison
                  credentials:
                    type: array
                    items:
                      type: object
                      properties:
                        key:
                          type: string
                          description: ‘Key for the credential’
                        value:
                          type: string
                          description: ‘Value for the credential’
                  # mimicry comparison
                  mimicry:
                    type: array
                    items:
                      type: object
                      properties:
                        key:
                          type: string
                          description: ‘Key for the mimicry option’
                        value:
                          type: string
                          description: ‘Value for the mimicry option’
              # common mediaplan settings
              commonSettings:
                type: object
                properties:
                  # output pkg generation coefficient
                  # define, how many packages will be generated for one incoming message
                  generationCoefficient:
                    type: number
                    description: ‘Output package generation coefficient’
                    default:
                  # total packages count
                  totalMessageCount:
                    type: integer
                    description: ‘Total number of messages for the mediaplan’
                  # estimated time for different messaging options
                  estimatedLeadTime:
                    type: string
                    description: ‘Estimated lead time for the mediaplan’
                  # disable mimicry options (for agents)
                  disableMimicryOptions:
                    type: boolean
                    description: ‘Disables mimicry options for agents’
                  # use image for packages
                  didImageUsedForGeneration:
                    type: boolean
                    description: ‘Indicates if an image was used for package generation’

please show a sample of a python application, which serve create/update/delete operations of Mediaplan CustomResourceDefinition through kopf lib. On create, if Mediaplan contain not null "spec.schedule" option, then application create an CronJob, else "Job". On update, do the same, if "spec.schedule" is not null, else first delete an existing job (with waiting), then create again. On delete, delete already existing CronJob or Job