fix: commit semantic repair changes
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# [DEF:SettingsRouter:Module]
|
||||
#
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 4
|
||||
# @SEMANTICS: settings, api, router, fastapi
|
||||
# @PURPOSE: Provides API endpoints for managing application settings and Superset environments.
|
||||
# @LAYER: UI (API)
|
||||
@@ -23,11 +23,16 @@ from ...core.superset_client import SupersetClient
|
||||
from ...services.llm_prompt_templates import normalize_llm_settings
|
||||
from ...models.llm import ValidationPolicy
|
||||
from ...models.config import AppConfigRecord
|
||||
from ...schemas.settings import ValidationPolicyCreate, ValidationPolicyUpdate, ValidationPolicyResponse
|
||||
from ...schemas.settings import (
|
||||
ValidationPolicyCreate,
|
||||
ValidationPolicyUpdate,
|
||||
ValidationPolicyResponse,
|
||||
)
|
||||
from ...core.database import get_db
|
||||
from sqlalchemy.orm import Session
|
||||
# [/SECTION]
|
||||
|
||||
|
||||
# [DEF:LoggingConfigResponse:Class]
|
||||
# @COMPLEXITY: 1
|
||||
# @PURPOSE: Response model for logging configuration with current task log level.
|
||||
@@ -36,6 +41,8 @@ class LoggingConfigResponse(BaseModel):
|
||||
level: str
|
||||
task_log_level: str
|
||||
enable_belief_state: bool
|
||||
|
||||
|
||||
# [/DEF:LoggingConfigResponse:Class]
|
||||
|
||||
router = APIRouter()
|
||||
@@ -49,13 +56,15 @@ router = APIRouter()
|
||||
def _normalize_superset_env_url(raw_url: str) -> str:
|
||||
normalized = str(raw_url or "").strip().rstrip("/")
|
||||
if normalized.lower().endswith("/api/v1"):
|
||||
normalized = normalized[:-len("/api/v1")]
|
||||
normalized = normalized[: -len("/api/v1")]
|
||||
return normalized.rstrip("/")
|
||||
|
||||
|
||||
# [/DEF:_normalize_superset_env_url:Function]
|
||||
|
||||
|
||||
# [DEF:_validate_superset_connection_fast:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Run lightweight Superset connectivity validation without full pagination scan.
|
||||
# @PRE: env contains valid URL and credentials.
|
||||
# @POST: Raises on auth/API failures; returns None on success.
|
||||
@@ -71,10 +80,13 @@ def _validate_superset_connection_fast(env: Environment) -> None:
|
||||
"columns": ["id"],
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
# [/DEF:_validate_superset_connection_fast:Function]
|
||||
|
||||
|
||||
# [DEF:get_settings:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Retrieves all application settings.
|
||||
# @PRE: Config manager is available.
|
||||
# @POST: Returns masked AppConfig.
|
||||
@@ -82,7 +94,7 @@ def _validate_superset_connection_fast(env: Environment) -> None:
|
||||
@router.get("", response_model=AppConfig)
|
||||
async def get_settings(
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
_ = Depends(has_permission("admin:settings", "READ"))
|
||||
_=Depends(has_permission("admin:settings", "READ")),
|
||||
):
|
||||
with belief_scope("get_settings"):
|
||||
logger.info("[get_settings][Entry] Fetching all settings")
|
||||
@@ -93,10 +105,13 @@ async def get_settings(
|
||||
if env.password:
|
||||
env.password = "********"
|
||||
return config
|
||||
|
||||
|
||||
# [/DEF:get_settings:Function]
|
||||
|
||||
|
||||
# [DEF:update_global_settings:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Updates global application settings.
|
||||
# @PRE: New settings are provided.
|
||||
# @POST: Global settings are updated.
|
||||
@@ -106,30 +121,36 @@ async def get_settings(
|
||||
async def update_global_settings(
|
||||
settings: GlobalSettings,
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
_ = Depends(has_permission("admin:settings", "WRITE"))
|
||||
_=Depends(has_permission("admin:settings", "WRITE")),
|
||||
):
|
||||
with belief_scope("update_global_settings"):
|
||||
logger.info("[update_global_settings][Entry] Updating global settings")
|
||||
|
||||
|
||||
config_manager.update_global_settings(settings)
|
||||
return settings
|
||||
|
||||
|
||||
# [/DEF:update_global_settings:Function]
|
||||
|
||||
|
||||
# [DEF:get_storage_settings:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Retrieves storage-specific settings.
|
||||
# @RETURN: StorageConfig - The storage configuration.
|
||||
@router.get("/storage", response_model=StorageConfig)
|
||||
async def get_storage_settings(
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
_ = Depends(has_permission("admin:settings", "READ"))
|
||||
_=Depends(has_permission("admin:settings", "READ")),
|
||||
):
|
||||
with belief_scope("get_storage_settings"):
|
||||
return config_manager.get_config().settings.storage
|
||||
|
||||
|
||||
# [/DEF:get_storage_settings:Function]
|
||||
|
||||
|
||||
# [DEF:update_storage_settings:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Updates storage-specific settings.
|
||||
# @PARAM: storage (StorageConfig) - The new storage settings.
|
||||
# @POST: Storage settings are updated and saved.
|
||||
@@ -138,21 +159,24 @@ async def get_storage_settings(
|
||||
async def update_storage_settings(
|
||||
storage: StorageConfig,
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
_ = Depends(has_permission("admin:settings", "WRITE"))
|
||||
_=Depends(has_permission("admin:settings", "WRITE")),
|
||||
):
|
||||
with belief_scope("update_storage_settings"):
|
||||
is_valid, message = config_manager.validate_path(storage.root_path)
|
||||
if not is_valid:
|
||||
raise HTTPException(status_code=400, detail=message)
|
||||
|
||||
|
||||
settings = config_manager.get_config().settings
|
||||
settings.storage = storage
|
||||
config_manager.update_global_settings(settings)
|
||||
return config_manager.get_config().settings.storage
|
||||
|
||||
|
||||
# [/DEF:update_storage_settings:Function]
|
||||
|
||||
|
||||
# [DEF:get_environments:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Lists all configured Superset environments.
|
||||
# @PRE: Config manager is available.
|
||||
# @POST: Returns list of environments.
|
||||
@@ -160,7 +184,7 @@ async def update_storage_settings(
|
||||
@router.get("/environments", response_model=List[Environment])
|
||||
async def get_environments(
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
_ = Depends(has_permission("admin:settings", "READ"))
|
||||
_=Depends(has_permission("admin:settings", "READ")),
|
||||
):
|
||||
with belief_scope("get_environments"):
|
||||
logger.info("[get_environments][Entry] Fetching environments")
|
||||
@@ -169,10 +193,13 @@ async def get_environments(
|
||||
env.copy(update={"url": _normalize_superset_env_url(env.url)})
|
||||
for env in environments
|
||||
]
|
||||
|
||||
|
||||
# [/DEF:get_environments:Function]
|
||||
|
||||
|
||||
# [DEF:add_environment:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Adds a new Superset environment.
|
||||
# @PRE: Environment data is valid and reachable.
|
||||
# @POST: Environment is added to config.
|
||||
@@ -182,25 +209,32 @@ async def get_environments(
|
||||
async def add_environment(
|
||||
env: Environment,
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
_ = Depends(has_permission("admin:settings", "WRITE"))
|
||||
_=Depends(has_permission("admin:settings", "WRITE")),
|
||||
):
|
||||
with belief_scope("add_environment"):
|
||||
logger.info(f"[add_environment][Entry] Adding environment {env.id}")
|
||||
env = env.copy(update={"url": _normalize_superset_env_url(env.url)})
|
||||
|
||||
|
||||
# Validate connection before adding (fast path)
|
||||
try:
|
||||
_validate_superset_connection_fast(env)
|
||||
except Exception as e:
|
||||
logger.error(f"[add_environment][Coherence:Failed] Connection validation failed: {e}")
|
||||
raise HTTPException(status_code=400, detail=f"Connection validation failed: {e}")
|
||||
logger.error(
|
||||
f"[add_environment][Coherence:Failed] Connection validation failed: {e}"
|
||||
)
|
||||
raise HTTPException(
|
||||
status_code=400, detail=f"Connection validation failed: {e}"
|
||||
)
|
||||
|
||||
config_manager.add_environment(env)
|
||||
return env
|
||||
|
||||
|
||||
# [/DEF:add_environment:Function]
|
||||
|
||||
|
||||
# [DEF:update_environment:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Updates an existing Superset environment.
|
||||
# @PRE: ID and valid environment data are provided.
|
||||
# @POST: Environment is updated in config.
|
||||
@@ -211,17 +245,19 @@ async def add_environment(
|
||||
async def update_environment(
|
||||
id: str,
|
||||
env: Environment,
|
||||
config_manager: ConfigManager = Depends(get_config_manager)
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
):
|
||||
with belief_scope("update_environment"):
|
||||
logger.info(f"[update_environment][Entry] Updating environment {id}")
|
||||
|
||||
|
||||
env = env.copy(update={"url": _normalize_superset_env_url(env.url)})
|
||||
|
||||
# If password is masked, we need the real one for validation
|
||||
env_to_validate = env.copy(deep=True)
|
||||
if env_to_validate.password == "********":
|
||||
old_env = next((e for e in config_manager.get_environments() if e.id == id), None)
|
||||
old_env = next(
|
||||
(e for e in config_manager.get_environments() if e.id == id), None
|
||||
)
|
||||
if old_env:
|
||||
env_to_validate.password = old_env.password
|
||||
|
||||
@@ -229,33 +265,42 @@ async def update_environment(
|
||||
try:
|
||||
_validate_superset_connection_fast(env_to_validate)
|
||||
except Exception as e:
|
||||
logger.error(f"[update_environment][Coherence:Failed] Connection validation failed: {e}")
|
||||
raise HTTPException(status_code=400, detail=f"Connection validation failed: {e}")
|
||||
logger.error(
|
||||
f"[update_environment][Coherence:Failed] Connection validation failed: {e}"
|
||||
)
|
||||
raise HTTPException(
|
||||
status_code=400, detail=f"Connection validation failed: {e}"
|
||||
)
|
||||
|
||||
if config_manager.update_environment(id, env):
|
||||
return env
|
||||
raise HTTPException(status_code=404, detail=f"Environment {id} not found")
|
||||
|
||||
|
||||
# [/DEF:update_environment:Function]
|
||||
|
||||
|
||||
# [DEF:delete_environment:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Deletes a Superset environment.
|
||||
# @PRE: ID is provided.
|
||||
# @POST: Environment is removed from config.
|
||||
# @PARAM: id (str) - The ID of the environment to delete.
|
||||
@router.delete("/environments/{id}")
|
||||
async def delete_environment(
|
||||
id: str,
|
||||
config_manager: ConfigManager = Depends(get_config_manager)
|
||||
id: str, config_manager: ConfigManager = Depends(get_config_manager)
|
||||
):
|
||||
with belief_scope("delete_environment"):
|
||||
logger.info(f"[delete_environment][Entry] Deleting environment {id}")
|
||||
config_manager.delete_environment(id)
|
||||
return {"message": f"Environment {id} deleted"}
|
||||
|
||||
|
||||
# [/DEF:delete_environment:Function]
|
||||
|
||||
|
||||
# [DEF:test_environment_connection:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Tests the connection to a Superset environment.
|
||||
# @PRE: ID is provided.
|
||||
# @POST: Returns success or error status.
|
||||
@@ -263,29 +308,35 @@ async def delete_environment(
|
||||
# @RETURN: dict - Success message or error.
|
||||
@router.post("/environments/{id}/test")
|
||||
async def test_environment_connection(
|
||||
id: str,
|
||||
config_manager: ConfigManager = Depends(get_config_manager)
|
||||
id: str, config_manager: ConfigManager = Depends(get_config_manager)
|
||||
):
|
||||
with belief_scope("test_environment_connection"):
|
||||
logger.info(f"[test_environment_connection][Entry] Testing environment {id}")
|
||||
|
||||
|
||||
# Find environment
|
||||
env = next((e for e in config_manager.get_environments() if e.id == id), None)
|
||||
if not env:
|
||||
raise HTTPException(status_code=404, detail=f"Environment {id} not found")
|
||||
|
||||
|
||||
try:
|
||||
_validate_superset_connection_fast(env)
|
||||
|
||||
logger.info(f"[test_environment_connection][Coherence:OK] Connection successful for {id}")
|
||||
|
||||
logger.info(
|
||||
f"[test_environment_connection][Coherence:OK] Connection successful for {id}"
|
||||
)
|
||||
return {"status": "success", "message": "Connection successful"}
|
||||
except Exception as e:
|
||||
logger.error(f"[test_environment_connection][Coherence:Failed] Connection failed for {id}: {e}")
|
||||
logger.error(
|
||||
f"[test_environment_connection][Coherence:Failed] Connection failed for {id}: {e}"
|
||||
)
|
||||
return {"status": "error", "message": str(e)}
|
||||
|
||||
|
||||
# [/DEF:test_environment_connection:Function]
|
||||
|
||||
|
||||
# [DEF:get_logging_config:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Retrieves current logging configuration.
|
||||
# @PRE: Config manager is available.
|
||||
# @POST: Returns logging configuration.
|
||||
@@ -293,19 +344,22 @@ async def test_environment_connection(
|
||||
@router.get("/logging", response_model=LoggingConfigResponse)
|
||||
async def get_logging_config(
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
_ = Depends(has_permission("admin:settings", "READ"))
|
||||
_=Depends(has_permission("admin:settings", "READ")),
|
||||
):
|
||||
with belief_scope("get_logging_config"):
|
||||
logging_config = config_manager.get_config().settings.logging
|
||||
return LoggingConfigResponse(
|
||||
level=logging_config.level,
|
||||
task_log_level=logging_config.task_log_level,
|
||||
enable_belief_state=logging_config.enable_belief_state
|
||||
enable_belief_state=logging_config.enable_belief_state,
|
||||
)
|
||||
|
||||
|
||||
# [/DEF:get_logging_config:Function]
|
||||
|
||||
|
||||
# [DEF:update_logging_config:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Updates logging configuration.
|
||||
# @PRE: New logging config is provided.
|
||||
# @POST: Logging configuration is updated and saved.
|
||||
@@ -315,23 +369,28 @@ async def get_logging_config(
|
||||
async def update_logging_config(
|
||||
config: LoggingConfig,
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
_ = Depends(has_permission("admin:settings", "WRITE"))
|
||||
_=Depends(has_permission("admin:settings", "WRITE")),
|
||||
):
|
||||
with belief_scope("update_logging_config"):
|
||||
logger.info(f"[update_logging_config][Entry] Updating logging config: level={config.level}, task_log_level={config.task_log_level}")
|
||||
|
||||
logger.info(
|
||||
f"[update_logging_config][Entry] Updating logging config: level={config.level}, task_log_level={config.task_log_level}"
|
||||
)
|
||||
|
||||
# Get current settings and update logging config
|
||||
settings = config_manager.get_config().settings
|
||||
settings.logging = config
|
||||
config_manager.update_global_settings(settings)
|
||||
|
||||
|
||||
return LoggingConfigResponse(
|
||||
level=config.level,
|
||||
task_log_level=config.task_log_level,
|
||||
enable_belief_state=config.enable_belief_state
|
||||
enable_belief_state=config.enable_belief_state,
|
||||
)
|
||||
|
||||
|
||||
# [/DEF:update_logging_config:Function]
|
||||
|
||||
|
||||
# [DEF:ConsolidatedSettingsResponse:Class]
|
||||
# @COMPLEXITY: 1
|
||||
# @PURPOSE: Response model for consolidated application settings.
|
||||
@@ -343,10 +402,13 @@ class ConsolidatedSettingsResponse(BaseModel):
|
||||
logging: dict
|
||||
storage: dict
|
||||
notifications: dict = {}
|
||||
|
||||
|
||||
# [/DEF:ConsolidatedSettingsResponse:Class]
|
||||
|
||||
|
||||
# [DEF:get_consolidated_settings:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 4
|
||||
# @PURPOSE: Retrieves all settings categories in a single call
|
||||
# @PRE: Config manager is available.
|
||||
# @POST: Returns all consolidated settings.
|
||||
@@ -354,15 +416,18 @@ class ConsolidatedSettingsResponse(BaseModel):
|
||||
@router.get("/consolidated", response_model=ConsolidatedSettingsResponse)
|
||||
async def get_consolidated_settings(
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
_ = Depends(has_permission("admin:settings", "READ"))
|
||||
_=Depends(has_permission("admin:settings", "READ")),
|
||||
):
|
||||
with belief_scope("get_consolidated_settings"):
|
||||
logger.info("[get_consolidated_settings][Entry] Fetching all consolidated settings")
|
||||
|
||||
logger.info(
|
||||
"[get_consolidated_settings][Entry] Fetching all consolidated settings"
|
||||
)
|
||||
|
||||
config = config_manager.get_config()
|
||||
|
||||
|
||||
from ...services.llm_provider import LLMProviderService
|
||||
from ...core.database import SessionLocal
|
||||
|
||||
db = SessionLocal()
|
||||
notifications_payload = {}
|
||||
try:
|
||||
@@ -376,13 +441,18 @@ async def get_consolidated_settings(
|
||||
"base_url": p.base_url,
|
||||
"api_key": "********",
|
||||
"default_model": p.default_model,
|
||||
"is_active": p.is_active
|
||||
} for p in providers
|
||||
"is_active": p.is_active,
|
||||
}
|
||||
for p in providers
|
||||
]
|
||||
|
||||
config_record = db.query(AppConfigRecord).filter(AppConfigRecord.id == "global").first()
|
||||
config_record = (
|
||||
db.query(AppConfigRecord).filter(AppConfigRecord.id == "global").first()
|
||||
)
|
||||
if config_record and isinstance(config_record.payload, dict):
|
||||
notifications_payload = config_record.payload.get("notifications", {}) or {}
|
||||
notifications_payload = (
|
||||
config_record.payload.get("notifications", {}) or {}
|
||||
)
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
@@ -395,12 +465,15 @@ async def get_consolidated_settings(
|
||||
llm_providers=llm_providers_list,
|
||||
logging=config.settings.logging.dict(),
|
||||
storage=config.settings.storage.dict(),
|
||||
notifications=notifications_payload
|
||||
notifications=notifications_payload,
|
||||
)
|
||||
|
||||
|
||||
# [/DEF:get_consolidated_settings:Function]
|
||||
|
||||
|
||||
# [DEF:update_consolidated_settings:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Bulk update application settings from the consolidated view.
|
||||
# @PRE: User has admin permissions, config is valid.
|
||||
# @POST: Settings are updated and saved via ConfigManager.
|
||||
@@ -408,32 +481,34 @@ async def get_consolidated_settings(
|
||||
async def update_consolidated_settings(
|
||||
settings_patch: dict,
|
||||
config_manager: ConfigManager = Depends(get_config_manager),
|
||||
_ = Depends(has_permission("admin:settings", "WRITE"))
|
||||
_=Depends(has_permission("admin:settings", "WRITE")),
|
||||
):
|
||||
with belief_scope("update_consolidated_settings"):
|
||||
logger.info("[update_consolidated_settings][Entry] Applying consolidated settings patch")
|
||||
|
||||
logger.info(
|
||||
"[update_consolidated_settings][Entry] Applying consolidated settings patch"
|
||||
)
|
||||
|
||||
current_config = config_manager.get_config()
|
||||
current_settings = current_config.settings
|
||||
|
||||
|
||||
# Update connections if provided
|
||||
if "connections" in settings_patch:
|
||||
current_settings.connections = settings_patch["connections"]
|
||||
|
||||
|
||||
# Update LLM if provided
|
||||
if "llm" in settings_patch:
|
||||
current_settings.llm = normalize_llm_settings(settings_patch["llm"])
|
||||
|
||||
|
||||
# Update Logging if provided
|
||||
if "logging" in settings_patch:
|
||||
current_settings.logging = LoggingConfig(**settings_patch["logging"])
|
||||
|
||||
|
||||
# Update Storage if provided
|
||||
if "storage" in settings_patch:
|
||||
new_storage = StorageConfig(**settings_patch["storage"])
|
||||
is_valid, message = config_manager.validate_path(new_storage.root_path)
|
||||
if not is_valid:
|
||||
raise HTTPException(status_code=400, detail=message)
|
||||
raise HTTPException(status_code=400, detail=message)
|
||||
current_settings.storage = new_storage
|
||||
|
||||
if "notifications" in settings_patch:
|
||||
@@ -443,23 +518,28 @@ async def update_consolidated_settings(
|
||||
|
||||
config_manager.update_global_settings(current_settings)
|
||||
return {"status": "success", "message": "Settings updated"}
|
||||
|
||||
|
||||
# [/DEF:update_consolidated_settings:Function]
|
||||
|
||||
|
||||
# [DEF:get_validation_policies:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Lists all validation policies.
|
||||
# @RETURN: List[ValidationPolicyResponse] - List of policies.
|
||||
@router.get("/automation/policies", response_model=List[ValidationPolicyResponse])
|
||||
async def get_validation_policies(
|
||||
db: Session = Depends(get_db),
|
||||
_ = Depends(has_permission("admin:settings", "READ"))
|
||||
db: Session = Depends(get_db), _=Depends(has_permission("admin:settings", "READ"))
|
||||
):
|
||||
with belief_scope("get_validation_policies"):
|
||||
return db.query(ValidationPolicy).all()
|
||||
|
||||
|
||||
# [/DEF:get_validation_policies:Function]
|
||||
|
||||
|
||||
# [DEF:create_validation_policy:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Creates a new validation policy.
|
||||
# @PARAM: policy (ValidationPolicyCreate) - The policy data.
|
||||
# @RETURN: ValidationPolicyResponse - The created policy.
|
||||
@@ -467,7 +547,7 @@ async def get_validation_policies(
|
||||
async def create_validation_policy(
|
||||
policy: ValidationPolicyCreate,
|
||||
db: Session = Depends(get_db),
|
||||
_ = Depends(has_permission("admin:settings", "WRITE"))
|
||||
_=Depends(has_permission("admin:settings", "WRITE")),
|
||||
):
|
||||
with belief_scope("create_validation_policy"):
|
||||
db_policy = ValidationPolicy(**policy.dict())
|
||||
@@ -475,10 +555,13 @@ async def create_validation_policy(
|
||||
db.commit()
|
||||
db.refresh(db_policy)
|
||||
return db_policy
|
||||
|
||||
|
||||
# [/DEF:create_validation_policy:Function]
|
||||
|
||||
|
||||
# [DEF:update_validation_policy:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Updates an existing validation policy.
|
||||
# @PARAM: id (str) - The ID of the policy to update.
|
||||
# @PARAM: policy (ValidationPolicyUpdate) - The updated policy data.
|
||||
@@ -488,40 +571,45 @@ async def update_validation_policy(
|
||||
id: str,
|
||||
policy: ValidationPolicyUpdate,
|
||||
db: Session = Depends(get_db),
|
||||
_ = Depends(has_permission("admin:settings", "WRITE"))
|
||||
_=Depends(has_permission("admin:settings", "WRITE")),
|
||||
):
|
||||
with belief_scope("update_validation_policy"):
|
||||
db_policy = db.query(ValidationPolicy).filter(ValidationPolicy.id == id).first()
|
||||
if not db_policy:
|
||||
raise HTTPException(status_code=404, detail="Policy not found")
|
||||
|
||||
|
||||
update_data = policy.dict(exclude_unset=True)
|
||||
for key, value in update_data.items():
|
||||
setattr(db_policy, key, value)
|
||||
|
||||
|
||||
db.commit()
|
||||
db.refresh(db_policy)
|
||||
return db_policy
|
||||
|
||||
|
||||
# [/DEF:update_validation_policy:Function]
|
||||
|
||||
|
||||
# [DEF:delete_validation_policy:Function]
|
||||
# @COMPLEXITY: 3
|
||||
# @COMPLEXITY: 2
|
||||
# @PURPOSE: Deletes a validation policy.
|
||||
# @PARAM: id (str) - The ID of the policy to delete.
|
||||
@router.delete("/automation/policies/{id}")
|
||||
async def delete_validation_policy(
|
||||
id: str,
|
||||
db: Session = Depends(get_db),
|
||||
_ = Depends(has_permission("admin:settings", "WRITE"))
|
||||
_=Depends(has_permission("admin:settings", "WRITE")),
|
||||
):
|
||||
with belief_scope("delete_validation_policy"):
|
||||
db_policy = db.query(ValidationPolicy).filter(ValidationPolicy.id == id).first()
|
||||
if not db_policy:
|
||||
raise HTTPException(status_code=404, detail="Policy not found")
|
||||
|
||||
|
||||
db.delete(db_policy)
|
||||
db.commit()
|
||||
return {"message": "Policy deleted"}
|
||||
|
||||
|
||||
# [/DEF:delete_validation_policy:Function]
|
||||
|
||||
# [/DEF:SettingsRouter:Module]
|
||||
|
||||
Reference in New Issue
Block a user