def publish_task( cls, task_id: str, company_id: str, publish_model: bool, force: bool, status_reason: str = "", status_message: str = "", ) -> dict: task = cls.get_task_with_access( task_id, company_id=company_id, requires_write_access=True ) if not force: validate_status_change(task.status, TaskStatus.published) previous_task_status = task.status output = task.output or Output() publish_failed = False try: # set state to publishing task.status = TaskStatus.publishing task.save() # publish task models if task.output.model and publish_model: output_model = ( Model.objects(id=task.output.model) .only("id", "task", "ready") .first() ) if output_model and not output_model.ready: cls.model_set_ready( model_id=task.output.model, company_id=company_id, publish_task=False, ) # set task status to published, and update (or set) it's new output (view and models) return ChangeStatusRequest( task=task, new_status=TaskStatus.published, force=force, status_reason=status_reason, status_message=status_message, ).execute(published=datetime.utcnow(), output=output) except Exception as ex: publish_failed = True raise ex finally: if publish_failed: task.status = previous_task_status task.save()
def clone_task( cls, company_id, user_id, task_id, name: Optional[str] = None, comment: Optional[str] = None, parent: Optional[str] = None, project: Optional[str] = None, tags: Optional[Sequence[str]] = None, system_tags: Optional[Sequence[str]] = None, execution_overrides: Optional[dict] = None, ) -> Task: task = cls.get_by_id(company_id=company_id, task_id=task_id) execution_dict = task.execution.to_proper_dict() if task.execution else {} if execution_overrides: parameters = execution_overrides.get("parameters") if parameters is not None: execution_overrides["parameters"] = { ParameterKeyEscaper.escape(k): v for k, v in parameters.items() } execution_dict = deep_merge(execution_dict, execution_overrides) artifacts = execution_dict.get("artifacts") if artifacts: execution_dict["artifacts"] = [ a for a in artifacts if a.get("mode") != ArtifactModes.output ] now = datetime.utcnow() with translate_errors_context(): new_task = Task( id=create_id(), user=user_id, company=company_id, created=now, last_update=now, name=name or task.name, comment=comment or task.comment, parent=parent or task.parent, project=project or task.project, tags=tags or task.tags, system_tags=system_tags or [], type=task.type, script=task.script, output=Output(destination=task.output.destination) if task.output else None, execution=execution_dict, ) cls.validate(new_task) new_task.save() return new_task
def prepare_create_fields(call: APICall, valid_fields=None, output=None, previous_task: Task = None): valid_fields = valid_fields if valid_fields is not None else create_fields t_fields = task_fields t_fields.add("output_dest") fields = parse_from_call(call.data, valid_fields, t_fields) # Move output_dest to output.destination output_dest = fields.get("output_dest") if output_dest is not None: fields.pop("output_dest") if output: output.destination = output_dest else: output = Output(destination=output_dest) fields["output"] = output try: dpath.delete(fields, "script/requirements") except dpath.exceptions.PathNotFound: pass # Make sure there are no duplicate tags tags = fields.get("tags") if tags: fields["tags"] = list(set(tags)) # Strip all script fields (remove leading and trailing whitespace chars) to avoid unusable names and paths for field in task_script_fields: try: path = "script/%s" % field value = dpath.get(fields, path) if isinstance(value, six.string_types): value = value.strip() dpath.set(fields, path, value) except KeyError: pass parameters = safe_get(fields, "execution/parameters") if parameters is not None: parameters = {k.strip(): v for k, v in parameters.items()} dpath.set(fields, "execution/parameters", parameters) return fields
def prepare_create_fields( call: APICall, valid_fields=None, output=None, previous_task: Task = None ): valid_fields = valid_fields if valid_fields is not None else create_fields t_fields = task_fields t_fields.add("output_dest") fields = parse_from_call(call.data, valid_fields, t_fields) # Move output_dest to output.destination output_dest = fields.get("output_dest") if output_dest is not None: fields.pop("output_dest") if output: output.destination = output_dest else: output = Output(destination=output_dest) fields["output"] = output return prepare_for_save(call, fields)
def clone_task( cls, company_id, user_id, task_id, name: Optional[str] = None, comment: Optional[str] = None, parent: Optional[str] = None, project: Optional[str] = None, tags: Optional[Sequence[str]] = None, system_tags: Optional[Sequence[str]] = None, hyperparams: Optional[dict] = None, configuration: Optional[dict] = None, execution_overrides: Optional[dict] = None, validate_references: bool = False, ) -> Task: task = cls.get_by_id(company_id=company_id, task_id=task_id, allow_public=True) execution_dict = task.execution.to_proper_dict() if task.execution else {} execution_model_overriden = False params_dict = { field: value for field, value in ( ("hyperparams", hyperparams), ("configuration", configuration), ) if value is not None } if execution_overrides: params_dict["execution"] = {} for legacy_param in ("parameters", "configuration"): legacy_value = execution_overrides.pop(legacy_param, None) if legacy_value is not None: params_dict["execution"] = legacy_value execution_dict = deep_merge(execution_dict, execution_overrides) execution_model_overriden = execution_overrides.get("model") is not None params_prepare_for_save(params_dict, previous_task=task) artifacts = execution_dict.get("artifacts") if artifacts: execution_dict["artifacts"] = [ a for a in artifacts if a.get("mode") != ArtifactModes.output ] now = datetime.utcnow() with translate_errors_context(): new_task = Task( id=create_id(), user=user_id, company=company_id, created=now, last_update=now, name=name or task.name, comment=comment or task.comment, parent=parent or task.parent, project=project or task.project, tags=tags or task.tags, system_tags=system_tags or [], type=task.type, script=task.script, output=Output(destination=task.output.destination) if task.output else None, execution=execution_dict, configuration=params_dict.get("configuration") or task.configuration, hyperparams=params_dict.get("hyperparams") or task.hyperparams, ) cls.validate( new_task, validate_model=validate_references or execution_model_overriden, validate_parent=validate_references or parent, validate_project=validate_references or project, ) new_task.save() if task.project == new_task.project: updated_tags = tags updated_system_tags = system_tags else: updated_tags = new_task.tags updated_system_tags = new_task.system_tags org_bll.update_tags( company_id, Tags.Task, project=new_task.project, tags=updated_tags, system_tags=updated_system_tags, ) return new_task