File: base.py

package info (click to toggle)
zabbix-cli 3.6.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,980 kB
  • sloc: python: 19,920; makefile: 5
file content (44 lines) | stat: -rw-r--r-- 1,497 bytes parent folder | download
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