from pydantic import BaseModel, Field from typing import List, Dict, Any, Optional from datetime import datetime class Label(BaseModel): """Label für ein Attribut oder eine Klasse mit Unterstützung für mehrere Sprachen""" default: str translations: Dict[str, str] = {} def get_label(self, language: str = None): """Gibt das Label in der angegebenen Sprache zurück, oder den Standardwert wenn nicht verfügbar""" if language and language in self.translations: return self.translations[language] return self.default class Mandate(BaseModel): """Datenmodell für einen Mandanten""" id: int = Field(description="Eindeutige ID des Mandanten") name: str = Field(description="Name des Mandanten") language: str = Field(description="Standardsprache des Mandanten") label: Label = Field( default=Label(default="Mandant", translations={"en": "Mandate", "fr": "Mandat"}), description="Label für die Klasse" ) # Labels für Attribute field_labels: Dict[str, Label] = { "id": Label(default="ID", translations={}), "name": Label(default="Name des Mandanten", translations={"en": "Mandate name", "fr": "Nom du mandat"}), "language": Label(default="Sprache", translations={"en": "Language", "fr": "Langue"}) } class User(BaseModel): """Datenmodell für einen Benutzer""" id: int = Field(description="Eindeutige ID des Benutzers") mandate_id: int = Field(description="ID des zugehörigen Mandanten") username: str = Field(description="Benutzername für die Anmeldung") email: Optional[str] = Field(None, description="E-Mail-Adresse des Benutzers") full_name: Optional[str] = Field(None, description="Vollständiger Name des Benutzers") language: str = Field(description="Bevorzugte Sprache des Benutzers") disabled: Optional[bool] = Field(False, description="Gibt an, ob der Benutzer deaktiviert ist") privilege: str = Field(description="Berechtigungsstufe") #sysadmin,admin,user label: Label = Field( default=Label(default="Benutzer", translations={"en": "User", "fr": "Utilisateur"}), description="Label für die Klasse" ) # Labels für Attribute field_labels: Dict[str, Label] = { "id": Label(default="ID", translations={}), "mandate_id": Label(default="Mandanten-ID", translations={"en": "Mandate ID", "fr": "ID de mandat"}), "username": Label(default="Benutzername", translations={"en": "Username", "fr": "Nom d'utilisateur"}), "email": Label(default="E-Mail", translations={"en": "Email", "fr": "E-mail"}), "full_name": Label(default="Vollständiger Name", translations={"en": "Full name", "fr": "Nom complet"}), "language": Label(default="Sprache", translations={"en": "Language", "fr": "Langue"}), "disabled": Label(default="Deaktiviert", translations={"en": "Disabled", "fr": "Désactivé"}), "privilege": Label(default="Berechtigungsstufe", translations={"en": "Access level", "fr": "Niveau d'accès"}), } class UserInDB(User): """Erweiterte Benutzerklasse mit Passwort-Hash""" hashed_password: str = Field(description="Hash des Benutzerpassworts") label: Label = Field( default=Label(default="Benutzer Zugriff", translations={"en": "User Access", "fr": "Accès de l'utilisateur"}), description="Label für die Klasse" ) # Zusätzliches Label für das Passwort-Feld field_labels: Dict[str, Label] = { "hashed_password": Label(default="Passwort-Hash", translations={"en": "Password hash", "fr": "Hachage de mot de passe"}) } class Token(BaseModel): """Datenmodell für ein Authentifizierungstoken""" access_token: str = Field(description="Das ausgestellte Zugriffstoken") token_type: str = Field(description="Typ des Tokens (meist 'bearer')") label: Label = Field( default=Label(default="Token", translations={"en": "Token", "fr": "Jeton"}), description="Label für die Klasse" ) # Labels für Attribute field_labels: Dict[str, Label] = { "access_token": Label(default="Zugriffstoken", translations={"en": "Access token", "fr": "Jeton d'accès"}), "token_type": Label(default="Token-Typ", translations={"en": "Token type", "fr": "Type de jeton"}) }