advent22/api/advent22_api/core/config.py

142 lines
3.1 KiB
Python

import re
import tomllib
from enum import Enum
from random import Random
from pydantic import BaseModel, field_validator
from .settings import SETTINGS
from .webdav import WebDAV
class User(BaseModel):
name: str
password: str
class TransformedString(BaseModel):
class __Whitespace(str, Enum):
# Leerzeichen an Anfang und Ende entfernen
STRIP = "STRIP"
# whitespace entfernen
IGNORE = "IGNORE"
class __Case(str, Enum):
# GROSSBUCHSTABEN
UPPER = "UPPER"
# kleinbuchstaben
LOWER = "LOWER"
# ZuFÄllIg
RANDOM = "RANDOM"
value: str
whitespace: __Whitespace | None = __Whitespace.IGNORE
case: __Case | None = __Case.UPPER
@field_validator("whitespace", "case", mode="before")
def transform_from_str(cls, v) -> str | None:
if (result := str(v).upper()) != "KEEP":
return result
@property
def clean(self) -> str:
result = self.value
# Whitespace bearbeiten
if self.whitespace is self.__Whitespace.STRIP:
result = result.strip()
elif self.whitespace is self.__Whitespace.IGNORE:
result = re.sub(string=result, pattern=r"\s+", repl="")
# Groß-/Kleinschreibung verarbeiten
if self.case is self.__Case.UPPER:
result = result.upper()
elif self.case is self.__Case.LOWER:
result = result.lower()
elif self.case is self.__Case.RANDOM:
rnd = Random(self.value)
def randomcase(c: str) -> str:
if rnd.choice((True, False)):
return c.upper()
return c.lower()
result = "".join(randomcase(c) for c in result)
return result
class Puzzle(BaseModel):
# Titel
# TODO penner neue Route GET /user/title
title: str
# Lösungswort
solution: TransformedString
# Tag, an dem der Kalender startet
# TODO penner
begin_day: int = 1
# Monat, in dem der Kalender startet
# TODO penner
begin_month: int = 12
# Kalender so viele Tage nach der letzten Türöffnung schließen
# TODO penner
close_after: int = 90
class TTFont(BaseModel):
# Dateiname (in "/files")
file: str
# Schriftgröße für den Font
size: int = 50
class Image(BaseModel):
# Quadrat, Seitenlänge in px
# TODO penner
size: int = 1000
# Rand in px, wo keine Buchstaben untergebracht werden
# TODO penner
border: int = 60
# Schriftarten
# TODO
fonts: list[TTFont]
class Config(BaseModel):
admin: User
puzzle: Puzzle
image: Image
# Kalenderdefinition
calendar: str = "default.toml"
# Serverseitiger zusätzlicher "random" seed
random_seed: str = ""
# Fußzeile der Seite
footer: str = (
'<strong>Advent22</strong> by <a href="//www.lenaisten.de">Lenaisten e.V.</a>'
)
async def get_config() -> Config:
"""
Globale Konfiguration lesen
"""
txt = await WebDAV.read_str(path=SETTINGS.webdav.config_filename)
return Config.model_validate(tomllib.loads(txt))