| """ |
| Pydantic models for team and organization schemas. |
| """ |
| from datetime import datetime |
| from typing import Optional, List |
| from uuid import UUID |
| from pydantic import BaseModel, Field |
|
|
|
|
| class OrganizationCreate(BaseModel): |
| """Request schema for creating an organization.""" |
| name: str = Field(..., min_length=2, max_length=100) |
| description: Optional[str] = Field(None, max_length=500) |
| logo_url: Optional[str] = None |
| primary_color: Optional[str] = Field("#FF5733", pattern="^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$") |
| secondary_color: Optional[str] = Field("#333333", pattern="^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$") |
| jersey_style: Optional[str] = Field("Solid", max_length=50) |
| home_court: Optional[str] = None |
| website: Optional[str] = None |
| phone: Optional[str] = None |
| email: Optional[str] = None |
| twitter_handle: Optional[str] = None |
| instagram_handle: Optional[str] = None |
| competition_settings: Optional[dict] = None |
| roster_settings: Optional[dict] = None |
|
|
|
|
| class OrganizationUpdate(BaseModel): |
| """Request schema for updating an organization.""" |
| name: Optional[str] = Field(None, min_length=2, max_length=100) |
| description: Optional[str] = Field(None, max_length=500) |
| logo_url: Optional[str] = None |
| primary_color: Optional[str] = Field(None, pattern="^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$") |
| secondary_color: Optional[str] = Field(None, pattern="^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$") |
| jersey_style: Optional[str] = Field(None, max_length=50) |
| home_court: Optional[str] = None |
| website: Optional[str] = None |
| phone: Optional[str] = None |
| email: Optional[str] = None |
| twitter_handle: Optional[str] = None |
| instagram_handle: Optional[str] = None |
| competition_settings: Optional[dict] = None |
| roster_settings: Optional[dict] = None |
|
|
|
|
| class Organization(BaseModel): |
| """Complete organization model returned from API.""" |
| id: UUID |
| name: str |
| description: Optional[str] = None |
| logo_url: Optional[str] = None |
| primary_color: str = "#FF5733" |
| secondary_color: str = "#333333" |
| jersey_style: str = "Solid" |
| home_court: Optional[str] = None |
| website: Optional[str] = None |
| phone: Optional[str] = None |
| email: Optional[str] = None |
| twitter_handle: Optional[str] = None |
| instagram_handle: Optional[str] = None |
| competition_settings: Optional[dict] = None |
| roster_settings: Optional[dict] = None |
| owner_id: UUID |
| created_at: datetime |
| updated_at: Optional[datetime] = None |
| |
| class Config: |
| from_attributes = True |
|
|
|
|
| class OrganizationWithStats(Organization): |
| """Organization with aggregated statistics.""" |
| player_count: int = 0 |
| video_count: int = 0 |
| total_analysis_count: int = 0 |
|
|
|
|
| class OrganizationListResponse(BaseModel): |
| """Response schema for listing organizations.""" |
| organizations: List[Organization] |
| total: int |
|
|