1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
"""Base model for all configuration models."""
from __future__ import annotations
from typing import Any
from pydantic import BaseModel as PydanticBaseModel
from pydantic import ConfigDict
from pydantic import PrivateAttr
from pydantic import ValidationInfo
from pydantic import field_validator
from pydantic import model_validator
from typing_extensions import Self
from zabbix_cli.config.utils import check_deprecated_fields
class BaseModel(PydanticBaseModel):
model_config = ConfigDict(validate_assignment=True, extra="ignore")
_deprecation_checked: bool = PrivateAttr(default=False)
"""Has performed a deprecaction check for the fields on the model."""
@field_validator("*")
@classmethod
def _conf_bool_validator_compat(cls, v: Any, info: ValidationInfo) -> Any:
"""Handles old config files that specified bools as ON/OFF."""
if not isinstance(v, str):
return v
if v.upper() == "ON":
return True
if v.upper() == "OFF":
return False
return v
# TODO: move this validator to Config, so we can provide exact config
# field names, as well as optionally silencing the warnings with a flag.
@model_validator(mode="after")
def _check_deprecated_fields(self) -> Self:
"""Check for deprecated fields and log warnings."""
if not self._deprecation_checked:
check_deprecated_fields(self)
self._deprecation_checked = True
return self
|