160 Zeilen
4.4 KiB
Python
160 Zeilen
4.4 KiB
Python
"""
|
|
Platform Name Value Object - Standardisiert Platform-Namen
|
|
"""
|
|
|
|
from typing import Optional
|
|
|
|
|
|
class PlatformName:
|
|
"""
|
|
Value Object für standardisierte Platform-Namen.
|
|
Stellt sicher, dass Platform-Namen konsistent behandelt werden.
|
|
"""
|
|
|
|
# Mapping von verschiedenen Schreibweisen zu kanonischen Namen
|
|
PLATFORM_MAPPINGS = {
|
|
# Kanonische Namen (für DB und interne Verwendung)
|
|
'instagram': 'instagram',
|
|
'facebook': 'facebook',
|
|
'tiktok': 'tiktok',
|
|
'x': 'x',
|
|
'gmail': 'gmail',
|
|
'vk': 'vk',
|
|
'ok': 'ok',
|
|
|
|
# Alternative Schreibweisen
|
|
'X': 'x',
|
|
'twitter': 'x',
|
|
'Twitter': 'x',
|
|
'X (Twitter)': 'x',
|
|
'ok.ru': 'ok',
|
|
'OK.ru': 'ok',
|
|
'VK': 'vk',
|
|
'Gmail': 'gmail',
|
|
'Instagram': 'instagram',
|
|
'Facebook': 'facebook',
|
|
'TikTok': 'tiktok'
|
|
}
|
|
|
|
# Display-Namen für UI
|
|
DISPLAY_NAMES = {
|
|
'instagram': 'Instagram',
|
|
'facebook': 'Facebook',
|
|
'tiktok': 'TikTok',
|
|
'x': 'X',
|
|
'gmail': 'Gmail',
|
|
'vk': 'VK',
|
|
'ok': 'OK.ru'
|
|
}
|
|
|
|
def __init__(self, name: str):
|
|
"""
|
|
Initialisiert ein PlatformName Value Object.
|
|
|
|
Args:
|
|
name: Platform-Name in beliebiger Schreibweise
|
|
"""
|
|
self._canonical_name = self._normalize(name)
|
|
if not self._canonical_name:
|
|
raise ValueError(f"Unknown platform: {name}")
|
|
|
|
def _normalize(self, name: str) -> Optional[str]:
|
|
"""
|
|
Normalisiert einen Platform-Namen zu seiner kanonischen Form.
|
|
|
|
Args:
|
|
name: Platform-Name in beliebiger Schreibweise
|
|
|
|
Returns:
|
|
Kanonischer Platform-Name oder None
|
|
"""
|
|
if not name:
|
|
return None
|
|
|
|
# Trimmen und in Mapping suchen
|
|
normalized = name.strip()
|
|
return self.PLATFORM_MAPPINGS.get(normalized, self.PLATFORM_MAPPINGS.get(normalized.lower()))
|
|
|
|
@property
|
|
def canonical(self) -> str:
|
|
"""
|
|
Gibt den kanonischen Namen zurück (für DB und interne Verwendung).
|
|
Immer lowercase.
|
|
"""
|
|
return self._canonical_name
|
|
|
|
@property
|
|
def display(self) -> str:
|
|
"""
|
|
Gibt den Display-Namen zurück (für UI).
|
|
Mit korrekter Groß-/Kleinschreibung.
|
|
"""
|
|
return self.DISPLAY_NAMES.get(self._canonical_name, self._canonical_name.title())
|
|
|
|
@property
|
|
def db_value(self) -> str:
|
|
"""
|
|
Gibt den Wert für Datenbank-Speicherung zurück.
|
|
Alias für canonical.
|
|
"""
|
|
return self.canonical
|
|
|
|
def matches(self, other: str) -> bool:
|
|
"""
|
|
Prüft, ob ein anderer Platform-Name diesem entspricht.
|
|
|
|
Args:
|
|
other: Zu vergleichender Platform-Name
|
|
|
|
Returns:
|
|
True wenn die Platforms übereinstimmen
|
|
"""
|
|
other_normalized = self._normalize(other)
|
|
return other_normalized == self._canonical_name if other_normalized else False
|
|
|
|
def __str__(self) -> str:
|
|
"""String-Repräsentation (Display-Name)."""
|
|
return self.display
|
|
|
|
def __repr__(self) -> str:
|
|
"""Debug-Repräsentation."""
|
|
return f"PlatformName(canonical='{self.canonical}', display='{self.display}')"
|
|
|
|
def __eq__(self, other) -> bool:
|
|
"""Gleichheitsvergleich."""
|
|
if isinstance(other, PlatformName):
|
|
return self._canonical_name == other._canonical_name
|
|
elif isinstance(other, str):
|
|
return self.matches(other)
|
|
return False
|
|
|
|
def __hash__(self) -> int:
|
|
"""Hash-Wert für Set/Dict-Verwendung."""
|
|
return hash(self._canonical_name)
|
|
|
|
@classmethod
|
|
def is_valid(cls, name: str) -> bool:
|
|
"""
|
|
Prüft, ob ein Platform-Name gültig ist.
|
|
|
|
Args:
|
|
name: Zu prüfender Platform-Name
|
|
|
|
Returns:
|
|
True wenn der Name gültig ist
|
|
"""
|
|
try:
|
|
cls(name)
|
|
return True
|
|
except ValueError:
|
|
return False
|
|
|
|
@classmethod
|
|
def get_all_canonical(cls) -> list:
|
|
"""
|
|
Gibt alle kanonischen Platform-Namen zurück.
|
|
|
|
Returns:
|
|
Liste aller kanonischen Platform-Namen
|
|
"""
|
|
return list(set(cls.PLATFORM_MAPPINGS.values())) |