def patch(self, schedule_name: str, token: AccessToken.Payload): """Update all properties of a schedule but _id and most_recent_task""" query = {"name": schedule_name} schedule = Schedules().find_one(query, {"config.task_name": 1}) if not schedule: raise ScheduleNotFound() try: update = UpdateSchema().load(request.get_json()) # , partial=True # empty dict passes the validator but troubles mongo if not request.get_json(): raise ValidationError("Update can't be empty") # ensure we test flags according to new task_name if present if "task_name" in update: if "flags" not in update: raise ValidationError( "Can't update offliner without updating flags") flags_schema = ScheduleConfigSchema.get_offliner_schema( update["task_name"]) else: flags_schema = ScheduleConfigSchema.get_offliner_schema( schedule["config"]["task_name"]) if "flags" in update: flags_schema().load(update["flags"]) except ValidationError as e: raise InvalidRequestJSON(e.messages) if "name" in update: if Schedules().count_documents({"name": update["name"]}): raise BadRequest( "Schedule with name `{}` already exists".format( update["name"])) config_keys = [ "task_name", "warehouse_path", "image", "resources", "platform", "flags", ] mongo_update = { f"config.{key}" if key in config_keys else key: value for key, value in update.items() } matched_count = (Schedules().update_one(query, { "$set": mongo_update }).matched_count) if matched_count: return Response(status=HTTPStatus.NO_CONTENT) raise ScheduleNotFound()
def post(self, schedule_name: str, token: AccessToken.Payload): """Update all properties of a schedule but _id and most_recent_task""" query = {"name": schedule_name} schedule = Schedules().find_one(query) if not schedule: raise ScheduleNotFound() request_json = CloneSchema().load(request.get_json()) new_schedule_name = request_json["name"] # ensure it's not a duplicate if Schedules().find_one({"name": new_schedule_name}, {"name": 1}): raise BadRequest("schedule with name `{}` already exists".format( new_schedule_name)) schedule.pop("_id", None) schedule.pop("most_recent_task", None) schedule.pop("duration", None) schedule["name"] = new_schedule_name schedule["enabled"] = False schedule["duration"] = {"default": get_default_duration()} # insert document schedule_id = Schedules().insert_one(schedule).inserted_id return make_response(jsonify({"_id": str(schedule_id)}), HTTPStatus.CREATED)
def delete(self, schedule_name: str, token: AccessToken.Payload): """Delete a schedule.""" query = {"name": schedule_name} result = Schedules().delete_one(query) if result.deleted_count == 0: raise ScheduleNotFound() return Response(status=HTTPStatus.NO_CONTENT)
def get(self, schedule_name: str): """Get schedule object.""" query = {"name": schedule_name} schedule = Schedules().find_one(query, {"_id": 0}) if schedule is None: raise ScheduleNotFound() schedule["config"].update(command_information_for(schedule["config"])) return jsonify(schedule)
def get(self, schedule_name: str): """Get schedule object.""" query = {"name": schedule_name} schedule = Schedules().find_one(query, {"_id": 0}) if schedule is None: raise ScheduleNotFound() schedule["config"] = expanded_config(schedule["config"]) return jsonify(schedule)
def get(self, schedule_name: str, token: AccessToken.Payload): """Get schedule object.""" query = {"name": schedule_name} schedule = Schedules().find_one(query, {"_id": 0}) if schedule is None: raise ScheduleNotFound() schedule["config"] = expanded_config(schedule["config"]) if not token or not token.get_permission("schedules", "update"): remove_secrets_from_response(schedule) return jsonify(schedule)