def provide_external_input(self, external_data: typing.Dict): """ A method gathering user's input for the current Step :return: :raises: pydantic.ValidationError """ try: CurrentStep = self.import_class(self.current_step) except ImportError: print( f"Provide Exteranal input for {self.workflow.name}: import error of {self.current_step}" ) self.state = JobState.FAILED return if not CurrentStep.UserInputSchema.__fields__: raise WrongState( f"Current Workflow's Step {CurrentStep} does not accept external input." ) if self.state != JobState.INPUT_REQUIRED: raise WrongState(f"Wrong Workflow's state: {self.state}.") # pydantic validate the data structure external_data = CurrentStep.UserInputSchema(**external_data) # update serialized job's state with provided external data try: self.storage["data"][self.current_step_number][ "external_data"] = external_data.dict() except IndexError: self.storage["data"].append({ "step": self.current_step, "external_data": external_data.dict() }) self.state = JobState.INPUT_RECEIVED self.save()