Files
xsl-validator/src/conf.py
T

202 lines
5.6 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from os import path
from pathlib import Path
from sys import platform
from typing import Tuple, Type
from pydantic import Field
from pydantic_yaml import to_yaml_str, parse_yaml_file_as
from enum import Enum
import logging
from pydantic import BaseModel
from pydantic_settings import BaseSettings, PydanticBaseSettingsSource, SettingsConfigDict, JsonConfigSettingsSource
logger = logging.getLogger(__name__)
app_name = "DocuMentor"
if platform == "win32":
config_path = f"%APPDATA%\\{app_name}\\config.json"
elif platform in ("linux", "linux2"):
config_path = f"~/.config/{app_name}/config.json"
elif platform == "darwin":
config_path = f"~/Library/Application Support/{app_name}/͏͏͏͏config.json"
else:
config_path = f"~/.config/{app_name}/config.json"
config_path = Path(path.expandvars(config_path))
class JavaVm(BaseModel):
id: int
version: str
path_to_binary_file: Path
class DiffPdf(BaseModel):
id: int
version: str
path_to_binary_file: Path
default_params: list[str]
output_file_extension: str = "pdf"
class SaxonJar(BaseModel):
id: int
version: str
path_to_jar_file: Path
output_file_extension: str = "fo"
class ApacheFop(BaseModel):
id: int
version: str
path_to_dir: Path
output_file_extension: str = "pdf"
class XslDir(BaseModel):
id: int
name: str
path_to_root_dir: Path
class SSLMode(str, Enum):
DISABLE = "disable"
ALLOW = "allow"
PREFER = "prefer"
REQUIRE = "require"
VERIFY_CA = "verify-ca"
VERIFY_FULL = "verify-full"
class PostgreSqlDb(BaseModel):
id: int
name: str
host: str
port: int = 5432
database: str
username: str
password: str
ssl_mode: SSLMode = SSLMode.PREFER
class PdfProject(BaseModel):
id: int = Field(..., description="Eindeutige Projekt-ID", gt=0)
name: str = Field(..., description="Projekt-Name", min_length=1, max_length=255)
project_dir: Path = Field(..., description="Pfad zum Projekt-Verzeichnis")
java_vm_id: int = Field(..., description="ID der Java VM", gt=0)
diff_pdf_id: int = Field(..., description="ID der diff-pdf Konfiguration", gt=0)
saxon_jar_id: int = Field(..., description="ID der Saxon JAR Konfiguration", gt=0)
apache_fop_id: int = Field(..., description="ID der Apache FOP Konfiguration", gt=0)
xsl_dir_id: int = Field(..., description="ID des XSL-Verzeichnisses", gt=0)
postgre_sql_db_id: int = Field(..., description="ID der PostgreSQL Datenbank", gt=0)
def getXsl(self) -> str:
global app_settings
value = [x.name for x in app_settings.xsl_dirs if x.id == self.xsl_dir_id]
return value[0] if len(value) else ""
def getJavaVm(self) -> str:
global app_settings
value = [x.version for x in app_settings.java_vms if x.id == self.java_vm_id]
return value[0] if len(value) else ""
def getSaxon(self) -> str:
global app_settings
value = [x.version for x in app_settings.saxon_jars if x.id == self.saxon_jar_id]
return value[0] if len(value) else ""
def getApacheFop(self) -> str:
global app_settings
value = [x.version for x in app_settings.apache_fops if x.id == self.apache_fop_id]
return value[0] if len(value) else ""
def getDiffPdf(self) -> str:
global app_settings
value = [x.version for x in app_settings.diff_pdfs if x.id == self.diff_pdf_id]
return value[0] if len(value) else ""
def getPostgreSqlDb(self) -> str:
global app_settings
value = [x.name for x in app_settings.postgresql_dbs if x.id == self.postgre_sql_db_id]
return value[0] if len(value) else ""
class AppSettings(BaseSettings):
java_vms: list[JavaVm] = []
diff_pdfs: list[DiffPdf] = []
saxon_jars: list[SaxonJar] = []
apache_fops: list[ApacheFop] = []
xsl_dirs: list[XslDir] = []
pdf_projects: list[PdfProject] = []
postgresql_dbs: list[PostgreSqlDb] = []
theme: str | None = None
model_config = SettingsConfigDict(json_file=config_path)
@classmethod
def settings_customise_sources(
cls,
settings_cls: Type[BaseSettings],
init_settings: PydanticBaseSettingsSource,
env_settings: PydanticBaseSettingsSource,
dotenv_settings: PydanticBaseSettingsSource,
file_secret_settings: PydanticBaseSettingsSource,
) -> Tuple[PydanticBaseSettingsSource, ...]:
return (JsonConfigSettingsSource(settings_cls),)
def save(self):
global config_path
# Ordner existert nicht
if not config_path.parent.exists():
config_path.parent.mkdir(parents=True, exist_ok=True)
# Konfiguration speichern
with open(config_path, "wb") as c:
c.write(app_settings.model_dump_json(indent=4).encode())
app_settings = AppSettings()
class Xml(BaseModel):
xml: Path
class XslFile(BaseModel):
id: tuple
bez: str
xsl_file: Path
xslt_params: dict[str, str] = {}
xmls: list[Xml] = []
class TreeNode(BaseModel):
id: tuple
bez: str
xslt_params: dict[str, str] = {}
children: list["TreeNode|XslFile"]
class PdfProjectSettings(BaseModel):
"""
Speichert die Projekteinstellungen direkt im Projektordner in einer .yaml-Datei.
"""
nodes: list[TreeNode] = []
@classmethod
def readSettings(cls, project_dir: Path):
return parse_yaml_file_as(PdfProjectSettings, project_dir / "project.yaml")
def writeSettings(self, project_dir: Path):
with open(project_dir / "project.yaml", "w", encoding="utf8") as f:
f.write(to_yaml_str(self))