2022-08-28 23:59:57 +00:00
|
|
|
"""
|
|
|
|
Configuration definition.
|
|
|
|
|
|
|
|
Converts per-run (environment) variables and config files into the
|
|
|
|
"python world" using `pydantic`.
|
|
|
|
|
|
|
|
Pydantic models might have convenience methods attached.
|
|
|
|
"""
|
|
|
|
|
2022-09-08 00:24:36 +00:00
|
|
|
from typing import Any, Optional
|
2022-08-28 23:59:57 +00:00
|
|
|
|
2022-09-05 14:39:34 +00:00
|
|
|
from pydantic import BaseModel, BaseSettings, root_validator
|
|
|
|
|
|
|
|
|
|
|
|
class DavSettings(BaseModel):
|
|
|
|
"""
|
|
|
|
Connection to a DAV server.
|
|
|
|
"""
|
|
|
|
|
2022-09-08 00:24:36 +00:00
|
|
|
protocol: Optional[str] = None
|
|
|
|
host: Optional[str] = None
|
|
|
|
username: Optional[str] = None
|
|
|
|
password: Optional[str] = None
|
|
|
|
path: Optional[str] = None
|
2022-09-05 14:39:34 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
def url(self) -> str:
|
|
|
|
"""
|
|
|
|
Combined DAV URL.
|
|
|
|
"""
|
|
|
|
|
|
|
|
return f"{self.protocol}://{self.host}{self.path}"
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
@property
|
|
|
|
def default(cls) -> "DavSettings":
|
|
|
|
return cls(
|
|
|
|
protocol="https",
|
|
|
|
host="example.com",
|
|
|
|
username="ovdashboard",
|
|
|
|
password="secret",
|
|
|
|
)
|
2022-08-28 23:59:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
|
|
"""
|
2022-09-05 14:39:34 +00:00
|
|
|
Per-run settings.
|
2022-08-28 23:59:57 +00:00
|
|
|
"""
|
|
|
|
|
|
|
|
production_mode: bool = False
|
2022-09-07 11:58:43 +00:00
|
|
|
log_level: str = "INFO" if production_mode else "DEBUG"
|
2022-09-07 00:23:31 +00:00
|
|
|
cache_seconds: int = 30
|
|
|
|
cache_size: int = 30
|
|
|
|
|
2022-08-28 23:59:57 +00:00
|
|
|
api_v1_prefix: str = "api/v1"
|
|
|
|
openapi_url: str = "/openapi.json"
|
2022-09-07 11:58:43 +00:00
|
|
|
docs_url: Optional[str] = None if production_mode else "/docs"
|
|
|
|
redoc_url: Optional[str] = None if production_mode else "/redoc"
|
2022-08-29 00:36:13 +00:00
|
|
|
|
2022-09-05 14:39:34 +00:00
|
|
|
webdav: DavSettings = DavSettings()
|
2022-09-07 00:23:31 +00:00
|
|
|
webdav_retries: int = 20
|
2022-09-05 20:17:27 +00:00
|
|
|
webdav_prefix: str = "/ovdashboard"
|
2022-09-06 22:55:23 +00:00
|
|
|
config_path: str = "config.txt"
|
2022-08-29 00:36:13 +00:00
|
|
|
|
2022-09-07 00:23:31 +00:00
|
|
|
caldav: DavSettings = DavSettings()
|
2022-08-29 19:20:03 +00:00
|
|
|
|
2022-09-05 14:39:34 +00:00
|
|
|
class Config:
|
2022-09-08 00:24:36 +00:00
|
|
|
env_file = ".env"
|
|
|
|
env_file_encoding = "utf-8"
|
2022-09-05 14:39:34 +00:00
|
|
|
env_nested_delimiter = "__"
|
2022-09-05 12:54:02 +00:00
|
|
|
|
2022-09-05 14:39:34 +00:00
|
|
|
@root_validator(pre=True)
|
|
|
|
@classmethod
|
2022-09-08 00:24:36 +00:00
|
|
|
def validate_dav_settings(cls, values: dict[str, Any]) -> dict[str, Any]:
|
2022-09-05 14:39:34 +00:00
|
|
|
# ensure both settings dicts are created
|
|
|
|
for key in ("webdav", "caldav"):
|
|
|
|
if key not in values:
|
|
|
|
values[key] = {}
|
2022-08-28 23:59:57 +00:00
|
|
|
|
2022-09-05 14:39:34 +00:00
|
|
|
default_dav = DavSettings.default.dict()
|
|
|
|
|
|
|
|
for key in default_dav:
|
|
|
|
# if "webdav" value is not specified, use default
|
|
|
|
if key not in values["webdav"]:
|
|
|
|
values["webdav"][key] = default_dav[key]
|
|
|
|
|
|
|
|
# if "caldav" value is not specified, use "webdav" value
|
|
|
|
if key not in values["caldav"]:
|
|
|
|
values["caldav"][key] = values["webdav"][key]
|
|
|
|
|
|
|
|
# add default "path"s if None
|
|
|
|
if values["webdav"]["path"] is None:
|
|
|
|
values["webdav"]["path"] = "/remote.php/webdav"
|
|
|
|
|
|
|
|
if values["caldav"]["path"] is None:
|
|
|
|
values["caldav"]["path"] = "/remote.php/dav"
|
2022-09-05 12:54:02 +00:00
|
|
|
|
2022-09-05 14:39:34 +00:00
|
|
|
return values
|
2022-08-28 23:59:57 +00:00
|
|
|
|
|
|
|
|
2022-09-08 00:24:36 +00:00
|
|
|
SETTINGS = Settings()
|