feat: Receiver OOP hierarchy with per-receiver locale resolution
- Introduce Receiver base class + typed subclasses (TelegramReceiver, WebhookReceiver, EmailReceiver, etc.) in core/notifications/receiver.py - Dispatcher uses typed Receiver objects instead of raw dicts, with per-receiver locale-aware template rendering - load_link_data resolves locale from TelegramChat.language_override at load time: TargetReceiver.locale || chat.language_override || chat.language_code - Add language_override field to TelegramChat (separate from auto-detected language_code), with per-chat commands toggle and command dispatch using override language - Add locale field to TargetReceiver for explicit per-receiver overrides
This commit is contained in:
@@ -207,6 +207,21 @@ async def migrate_schema(engine: AsyncEngine) -> None:
|
||||
)
|
||||
logger.info("Added language_code column to telegram_chat table")
|
||||
|
||||
# Add language_override to telegram_chat if missing
|
||||
if not await _has_column(conn, "telegram_chat", "language_override"):
|
||||
await conn.execute(
|
||||
text("ALTER TABLE telegram_chat ADD COLUMN language_override TEXT DEFAULT ''")
|
||||
)
|
||||
logger.info("Added language_override column to telegram_chat table")
|
||||
|
||||
# Add locale to target_receiver if missing
|
||||
if await _has_table(conn, "target_receiver"):
|
||||
if not await _has_column(conn, "target_receiver", "locale"):
|
||||
await conn.execute(
|
||||
text("ALTER TABLE target_receiver ADD COLUMN locale TEXT DEFAULT ''")
|
||||
)
|
||||
logger.info("Added locale column to target_receiver table")
|
||||
|
||||
# Add commands_enabled to telegram_chat if missing (default disabled)
|
||||
if not await _has_column(conn, "telegram_chat", "commands_enabled"):
|
||||
await conn.execute(
|
||||
|
||||
@@ -95,7 +95,8 @@ class TelegramChat(SQLModel, table=True):
|
||||
title: str = Field(default="")
|
||||
chat_type: str = Field(default="private")
|
||||
username: str = Field(default="")
|
||||
language_code: str = Field(default="")
|
||||
language_code: str = Field(default="") # auto-detected from Telegram
|
||||
language_override: str = Field(default="") # manual override set by user
|
||||
commands_enabled: bool = Field(default=False)
|
||||
discovered_at: datetime = Field(default_factory=_utcnow)
|
||||
|
||||
@@ -279,6 +280,7 @@ class TargetReceiver(SQLModel, table=True):
|
||||
name: str = Field(default="")
|
||||
config: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
|
||||
receiver_key: str = Field(default="") # dedup key (e.g. chat_id, url, email)
|
||||
locale: str = Field(default="") # e.g. "en", "ru"; empty = use target default
|
||||
enabled: bool = Field(default=True)
|
||||
created_at: datetime = Field(default_factory=_utcnow)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user