- Add Russian language support (title_ru, subtitle_ru) for hero banners - Add fuel/transmission translations for Mongolian (경유→Дизель, 오토→Автомат) - Improve Vehicle Requests admin page: - Display real request ID and user email - Show detailed request info (maker, grade, year, fuel, mileage) - Replace modal search with Cars page integration - Add "Add to Request" flow in Cars page for vehicle recommendations - Fix image URL handling in FilmStripSlider and car detail page 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
106 lines
2.7 KiB
Python
106 lines
2.7 KiB
Python
from pydantic import BaseModel, HttpUrl
|
|
from typing import Optional
|
|
from datetime import datetime
|
|
|
|
|
|
# ==================== Hero Banner Settings ====================
|
|
|
|
class HeroBannerSettingsBase(BaseModel):
|
|
slide_interval: int = 3000
|
|
animation_type: str = "film-strip"
|
|
image_width: int = 500
|
|
image_height: int = 300
|
|
auto_play: bool = True
|
|
|
|
|
|
class HeroBannerSettingsUpdate(BaseModel):
|
|
slide_interval: Optional[int] = None
|
|
animation_type: Optional[str] = None
|
|
image_width: Optional[int] = None
|
|
image_height: Optional[int] = None
|
|
auto_play: Optional[bool] = None
|
|
|
|
|
|
class HeroBannerSettingsResponse(HeroBannerSettingsBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
# ==================== Hero Banner ====================
|
|
|
|
class HeroBannerBase(BaseModel):
|
|
title_ko: Optional[str] = None
|
|
title_en: Optional[str] = None
|
|
title_mn: Optional[str] = None
|
|
title_ru: Optional[str] = None # 러시아어
|
|
subtitle_ko: Optional[str] = None
|
|
subtitle_en: Optional[str] = None
|
|
subtitle_mn: Optional[str] = None
|
|
subtitle_ru: Optional[str] = None # 러시아어
|
|
image_url: str
|
|
link_url: Optional[str] = None
|
|
car_id: Optional[int] = None
|
|
is_active: bool = True
|
|
display_order: int = 0
|
|
|
|
|
|
class HeroBannerCreate(HeroBannerBase):
|
|
pass
|
|
|
|
|
|
class HeroBannerUpdate(BaseModel):
|
|
title_ko: Optional[str] = None
|
|
title_en: Optional[str] = None
|
|
title_mn: Optional[str] = None
|
|
title_ru: Optional[str] = None # 러시아어
|
|
subtitle_ko: Optional[str] = None
|
|
subtitle_en: Optional[str] = None
|
|
subtitle_mn: Optional[str] = None
|
|
subtitle_ru: Optional[str] = None # 러시아어
|
|
image_url: Optional[str] = None
|
|
link_url: Optional[str] = None
|
|
car_id: Optional[int] = None
|
|
is_active: Optional[bool] = None
|
|
display_order: Optional[int] = None
|
|
|
|
|
|
class HeroBannerResponse(HeroBannerBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class HeroBannerListResponse(BaseModel):
|
|
id: int
|
|
title_ko: Optional[str] = None
|
|
title_en: Optional[str] = None
|
|
image_url: str
|
|
link_url: Optional[str] = None
|
|
car_id: Optional[int] = None
|
|
is_active: bool
|
|
display_order: int
|
|
created_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
# 다국어 지원 응답 (Public API용)
|
|
class HeroBannerLocalizedResponse(BaseModel):
|
|
id: int
|
|
title: Optional[str] = None
|
|
subtitle: Optional[str] = None
|
|
image_url: str
|
|
link_url: Optional[str] = None
|
|
car_id: Optional[int] = None
|
|
|
|
class Config:
|
|
from_attributes = True
|