presenton/servers/fastapi/api/v1/ppt/endpoints/theme_generate.py

75 lines
2.2 KiB
Python

from typing import Optional
from fastapi import APIRouter
from pydantic import BaseModel
from models.theme_data import ThemeData
from utils.theme_utils import (
IS_DARK_BELOW,
generate_color_palette,
get_lightness_key_at_distance,
)
THEME_ROUTER = APIRouter(prefix="/theme", tags=["V3 Theme"])
class GenerateThemeRequestV3(BaseModel):
primary: Optional[str] = None
background: Optional[str] = None
accent_1: Optional[str] = None
accent_2: Optional[str] = None
text_1: Optional[str] = None
text_2: Optional[str] = None
@THEME_ROUTER.post("/generate", response_model=ThemeData)
async def generate_theme_v3(request: GenerateThemeRequestV3) -> ThemeData:
color_palette = generate_color_palette(
request.primary,
request.background,
request.accent_1,
request.accent_2,
request.text_1,
request.text_2,
)
is_dark_theme = color_palette.background_lightness < IS_DARK_BELOW
graph_colors = list(color_palette.primary_variations.values())
if not is_dark_theme:
graph_colors.reverse()
theme_data = ThemeData(
primary=color_palette.primary,
background=color_palette.background,
card=color_palette.background_variations[
get_lightness_key_at_distance(
color_palette.background_lightness,
min_distance=1,
max_distance=1,
prefer_dark=not is_dark_theme,
)
],
stroke=color_palette.background_variations[
get_lightness_key_at_distance(
color_palette.background_lightness,
min_distance=2,
max_distance=2,
prefer_dark=not is_dark_theme,
)
],
background_text=color_palette.text_1,
primary_text=color_palette.text_2,
graph_0=graph_colors[0],
graph_1=graph_colors[1],
graph_2=graph_colors[2],
graph_3=graph_colors[3],
graph_4=graph_colors[4],
graph_5=graph_colors[5],
graph_6=graph_colors[6],
graph_7=graph_colors[7],
graph_8=graph_colors[8],
graph_9=graph_colors[9],
)
return theme_data