Exemplo n.º 1
0
    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()