"""Wizard step preset templates and management.
Provides hardcoded preset templates for common integrations like Discord and Overseerr,
allowing users to quickly add wizard steps through the Multi-Action create button.
"""
from dataclasses import dataclass
__all__ = ["WizardPreset", "create_step_from_preset", "get_available_presets"]
@dataclass
class WizardPreset:
"""Represents a wizard step preset template."""
id: str
name: str
description: str
template: str
title: str
# Available preset templates
PRESETS = {
"discord_community": WizardPreset(
id="discord_community",
name="Discord Community",
description="Add a Discord server widget to invite users to your community",
title="Discord community",
template="""## 💬 Join Our Discord Community
Stay connected with other users, get help, and share tips in our Discord server!
|||
### 🎮 What is Discord?
Discord is a free chat platform where our community hangs out. Join us to:
- Get help from other users
- Share your experience
- Stay updated on new content
- Connect with fellow enthusiasts
|||""",
),
"overseerr_requests": WizardPreset(
id="overseerr_requests",
name="Overseerr/Ombi Requests",
description="Add a link to your Overseerr/Ombi instance for media requests",
title="Automatic requests",
template="""## 🎬 Request New Content
Can't find what you're looking for? No problem!
|||
### 📝 Automatic Media Requests
Use our request system to ask for new movies or TV shows. Once approved, they'll be automatically downloaded and added to the library for everyone to enjoy.
**How it works:**
1. Search for the title you want
2. Submit your request
3. Get notified when it's available
|||
{{{{ widget:button url="{overseerr_url}" text="🎯 Open Request System" }}}}""",
),
}
def get_available_presets() -> list[WizardPreset]:
"""Get list of all available preset templates."""
return list(PRESETS.values())
def create_step_from_preset(preset_id: str, **kwargs) -> str:
"""Create wizard step content from a preset template.
Args:
preset_id: ID of the preset to use
**kwargs: Variables to substitute in the template (e.g., discord_id, overseerr_url)
Returns:
Rendered template content with variables substituted
Raises:
KeyError: If preset_id is not found
KeyError: If required template variables are missing
"""
if preset_id not in PRESETS:
raise KeyError(f"Preset '{preset_id}' not found")
preset = PRESETS[preset_id]
try:
return preset.template.format(**kwargs)
except KeyError as e:
raise KeyError(
f"Missing required variable for preset '{preset_id}': {e}"
) from e
def get_preset_title(preset_id: str) -> str:
"""Get the default title for a preset."""
if preset_id not in PRESETS:
raise KeyError(f"Preset '{preset_id}' not found")
return PRESETS[preset_id].title