def validate(cls, task: Task, force=False): assert isinstance(task, Task) if task.parent and not Task.get(company=task.company, id=task.parent, _only=("id", ), include_public=True): raise errors.bad_request.InvalidTaskId("invalid parent", parent=task.parent) if task.project: Project.get_for_writing(company=task.company, id=task.project) model = cls.validate_execution_model(task) if model and not force and not model.ready: raise errors.bad_request.ModelNotReady("can't be used in a task", model=model.id) if task.execution: if task.execution.parameters: cls._validate_execution_parameters(task.execution.parameters) if task.output and task.output.destination: parsed_url = urlparse(task.output.destination) if parsed_url.scheme not in OutputDestinationField.schemes: raise errors.bad_request.FieldsValueError( "unsupported scheme for output destination", dest=task.output.destination, )
def validate(cls, task: Task): assert isinstance(task, Task) if task.parent and not Task.get( company=task.company, id=task.parent, _only=("id",), include_public=True ): raise errors.bad_request.InvalidTaskId("invalid parent", parent=task.parent) if task.project: Project.get_for_writing(company=task.company, id=task.project) cls.validate_execution_model(task) if task.execution: if task.execution.parameters: cls._validate_execution_parameters(task.execution.parameters)
def update(call: APICall): """ update :summary: Update project information. See `project.create` for parameters. :return: updated - `int` - number of projects updated fields - `[string]` - updated fields """ project_id = call.data["project"] with translate_errors_context(): project = Project.get_for_writing(company=call.identity.company, id=project_id) if not project: raise errors.bad_request.InvalidProjectId(id=project_id) fields = parse_from_call(call.data, create_fields, Project.get_fields(), discard_none_values=False) conform_tag_fields(call, fields, validate=True) fields["last_update"] = datetime.utcnow() with TimingContext("mongo", "projects_update"): updated = project.update(upsert=False, **fields) conform_output_tags(call, fields) call.result.data_model = UpdateResponse(updated=updated, fields=fields)
def delete(call): assert isinstance(call, APICall) project_id = call.data["project"] force = call.data.get("force", False) with translate_errors_context(): project = Project.get_for_writing(company=call.identity.company, id=project_id) if not project: raise errors.bad_request.InvalidProjectId(id=project_id) # NOTE: from this point on we'll use the project ID and won't check for company, since we assume we already # have the correct project ID. # Find the tasks which belong to the project for cls, error in ( (Task, errors.bad_request.ProjectHasTasks), (Model, errors.bad_request.ProjectHasModels), ): res = cls.objects( project=project_id, system_tags__nin=[EntityVisibility.archived.value]).only("id") if res and not force: raise error("use force=true to delete", id=project_id) updated_count = res.update(project=None) project.delete() call.result.data = {"deleted": 1, "disassociated_tasks": updated_count}
def validate( cls, task: Task, validate_model=True, validate_parent=True, validate_project=True, ): if ( validate_parent and task.parent and not Task.get( company=task.company, id=task.parent, _only=("id",), include_public=True ) ): raise errors.bad_request.InvalidTaskId("invalid parent", parent=task.parent) if ( validate_project and task.project and not Project.get_for_writing(company=task.company, id=task.project) ): raise errors.bad_request.InvalidProjectId(id=task.project) if validate_model: cls.validate_execution_model(task)