File size: 2,895 Bytes
c6abe34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
"""
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