def delete_metadata(_: APICall, company_id: str, request: DeleteMetadataRequest): model_id = request.model ModelBLL.get_company_model_by_id(company_id=company_id, model_id=model_id, only_fields=("id", )) updated = metadata_delete(cls=Model, _id=model_id, keys=request.keys) if updated: Model.objects(id=model_id).update_one(last_update=datetime.utcnow()) return {"updated": updated}
def add_or_update_metadata(_: APICall, company_id: str, request: AddOrUpdateMetadataRequest): model_id = request.model ModelBLL.get_company_model_by_id(company_id=company_id, model_id=model_id) updated = metadata_add_or_update( cls=Model, _id=model_id, items=get_metadata_from_api(request.metadata), ) if updated: Model.objects(id=model_id).update_one(last_update=datetime.utcnow()) return {"updated": updated}
def _update_model(call: APICall, company_id, model_id=None): model_id = model_id or call.data["model"] model = ModelBLL.get_company_model_by_id(company_id=company_id, model_id=model_id) data = prepare_update_fields(call, company_id, call.data) task_id = data.get("task") iteration = data.get("iteration") if task_id and iteration is not None: TaskBLL.update_statistics( task_id=task_id, company_id=company_id, last_iteration_max=iteration, ) updated_count, updated_fields = Model.safe_update(company_id, model.id, data) if updated_count: if any(uf in updated_fields for uf in last_update_fields): model.update(upsert=False, last_update=datetime.utcnow()) new_project = updated_fields.get("project", model.project) if new_project != model.project: _reset_cached_tags(company_id, projects=[new_project, model.project]) else: _update_cached_tags(company_id, project=model.project, fields=updated_fields) conform_output_tags(call, updated_fields) unescape_metadata(call, updated_fields) return UpdateResponse(updated=updated_count, fields=updated_fields)
def delete(call: APICall, company_id, request: DeleteModelRequest): del_count, model = ModelBLL.delete_model(model_id=request.model, company_id=company_id, force=request.force) if del_count: _reset_cached_tags(company_id, projects=[model.project] if model.project else []) call.result.data = dict(deleted=bool(del_count), url=model.uri)
def set_ready(call: APICall, company_id: str, request: PublishModelRequest): updated, published_task = ModelBLL.publish_model( model_id=request.model, company_id=company_id, force_publish_task=request.force_publish_task, publish_task_func=publish_task if request.publish_task else None, ) call.result.data_model = PublishModelResponse( updated=updated, published_task=published_task)
def delete_metadata(_: APICall, company_id: str, request: DeleteMetadataRequest): model_id = request.model model = ModelBLL.get_company_model_by_id(company_id=company_id, model_id=model_id, only_fields=("id", )) return { "updated": Metadata.delete_metadata(model, keys=request.keys, last_update=datetime.utcnow()) }
def add_or_update_metadata(_: APICall, company_id: str, request: AddOrUpdateMetadataRequest): model_id = request.model model = ModelBLL.get_company_model_by_id(company_id=company_id, model_id=model_id) return { "updated": Metadata.edit_metadata( model, items=request.metadata, replace_metadata=request.replace_metadata, last_update=datetime.utcnow(), ) }
def edit(call: APICall, company_id, _): model_id = call.data["model"] with translate_errors_context(): model = ModelBLL.get_company_model_by_id(company_id=company_id, model_id=model_id) fields = parse_model_fields(call, create_fields) fields = prepare_update_fields(call, company_id, fields) for key in fields: field = getattr(model, key, None) value = fields[key] if (field and isinstance(value, dict) and isinstance(field, EmbeddedDocument)): d = field.to_mongo(use_db_field=False).to_dict() d.update(value) fields[key] = d iteration = call.data.get("iteration") task_id = model.task or fields.get("task") if task_id and iteration is not None: TaskBLL.update_statistics( task_id=task_id, company_id=company_id, last_iteration_max=iteration, ) if fields: if any(uf in fields for uf in last_update_fields): fields.update(last_update=datetime.utcnow()) updated = model.update(upsert=False, **fields) if updated: new_project = fields.get("project", model.project) if new_project != model.project: _reset_cached_tags(company_id, projects=[new_project, model.project]) else: _update_cached_tags(company_id, project=model.project, fields=fields) conform_output_tags(call, fields) call.result.data_model = UpdateResponse(updated=updated, fields=fields) else: call.result.data_model = UpdateResponse(updated=0)
def update_for_task(call: APICall, company_id, _): if call.requested_endpoint_version > ModelsBackwardsCompatibility.max_version: raise errors.moved_permanently.NotSupported( "use tasks.add_or_update_model") task_id = call.data["task"] uri = call.data.get("uri") iteration = call.data.get("iteration") override_model_id = call.data.get("override_model_id") if not (uri or override_model_id) or (uri and override_model_id): raise errors.bad_request.MissingRequiredFields( "exactly one field is required", fields=("uri", "override_model_id")) with translate_errors_context(): query = dict(id=task_id, company=company_id) task = Task.get_for_writing( id=task_id, company=company_id, _only=["models", "execution", "name", "status", "project"], ) if not task: raise errors.bad_request.InvalidTaskId(**query) allowed_states = [TaskStatus.created, TaskStatus.in_progress] if task.status not in allowed_states: raise errors.bad_request.InvalidTaskStatus( f"model can only be updated for tasks in the {allowed_states} states", **query, ) if override_model_id: model = ModelBLL.get_company_model_by_id( company_id=company_id, model_id=override_model_id) else: if "name" not in call.data: # use task name if name not provided call.data["name"] = task.name if "comment" not in call.data: call.data[ "comment"] = f"Created by task `{task.name}` ({task.id})" if task.models and task.models.output: # model exists, update model_id = task.models.output[-1].model res = _update_model(call, company_id, model_id=model_id).to_struct() res.update({"id": model_id, "created": False}) call.result.data = res return # new model, create fields = parse_model_fields(call, create_fields) # create and save model now = datetime.utcnow() model = Model( id=database.utils.id(), created=now, last_update=now, user=call.identity.user, company=company_id, project=task.project, framework=task.execution.framework, parent=task.models.input[0].model if task.models and task.models.input else None, design=task.execution.model_desc, labels=task.execution.model_labels, ready=(task.status == TaskStatus.published), **fields, ) model.save() _update_cached_tags(company_id, project=model.project, fields=fields) TaskBLL.update_statistics( task_id=task_id, company_id=company_id, last_iteration_max=iteration, models__output=[ ModelItem( model=model.id, name=TaskModelNames[TaskModelTypes.output], updated=datetime.utcnow(), ) ], ) call.result.data = {"id": model.id, "created": True}