Replace video_warning with target_type + has_videos/has_photos
All checks were successful
Validate / Hassfest (push) Successful in 2s

Major template system improvements:
- Remove video_warning field from TemplateConfig model
- Add target_type, has_videos, has_photos to template context
- Templates use {% if target_type == "telegram" and has_videos %}
  for conditional Telegram warnings instead of a separate field
- date_format moved from "Telegram" to "Settings" group
- Add target type selector (Telegram/Webhook) in template editor
  to preview how templates render for each target type
- All template slots now use JinjaEditor (not plain <input>)
- Preview endpoint accepts target_type parameter
- Clean up TemplateConfigCreate schema (remove stale fields)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-19 21:11:38 +03:00
parent 510463cba6
commit 4babaddd87
9 changed files with 66 additions and 49 deletions

View File

@@ -67,7 +67,9 @@ _SAMPLE_CONTEXT = {
"removed_assets": ["asset-id-1", "asset-id-2"],
"people": ["Alice", "Bob"],
"shared": True,
"video_warning": "⚠️ Note: Videos may not be sent due to Telegram's 50 MB file size limit.",
"target_type": "telegram",
"has_videos": True,
"has_photos": True,
# Rename fields (always present, empty for non-rename events)
"old_name": "Old Album",
"new_name": "New Album",
@@ -82,27 +84,16 @@ _SAMPLE_CONTEXT = {
class TemplateConfigCreate(BaseModel):
name: str
description: str | None = None
icon: str | None = None
message_assets_added: str | None = None
message_assets_removed: str | None = None
message_album_renamed: str | None = None
message_album_deleted: str | None = None
message_asset_image: str | None = None
message_asset_video: str | None = None
message_assets_format: str | None = None
message_assets_more: str | None = None
message_people_format: str | None = None
date_format: str | None = None
common_date_template: str | None = None
date_if_unique_template: str | None = None
location_format: str | None = None
common_location_template: str | None = None
location_if_unique_template: str | None = None
favorite_indicator: str | None = None
periodic_summary_message: str | None = None
periodic_album_template: str | None = None
scheduled_assets_message: str | None = None
memory_mode_message: str | None = None
video_warning: str | None = None
date_format: str | None = None
TemplateConfigUpdate = TemplateConfigCreate # Same shape, all optional
@@ -203,6 +194,7 @@ async def preview_config(
class PreviewRequest(BaseModel):
template: str
target_type: str = "telegram" # "telegram" or "webhook"
@router.post("/preview-raw")
@@ -229,9 +221,10 @@ async def preview_raw(
# Pass 2: render with strict undefined to catch unknown variables
try:
ctx = {**_SAMPLE_CONTEXT, "target_type": body.target_type}
strict_env = SandboxedEnvironment(autoescape=False, undefined=StrictUndefined)
tmpl = strict_env.from_string(body.template)
rendered = tmpl.render(**_SAMPLE_CONTEXT)
rendered = tmpl.render(**ctx)
return {"rendered": rendered}
except UndefinedError as e:
# Still a valid template syntactically, but references unknown variable