main
py 137 lines 3.79 KB
Raw
1 from datetime import datetime
2 from typing import Any
3 from typing import Dict
4 from typing import List
5 from typing import Optional
6
7 from pydantic import BaseModel
8 from pydantic import ConfigDict
9 from pydantic import Field
10 from pydantic import field_validator
11
12
13 class SyncConfig(BaseModel):
14 interval: int = 0
15 api_key: str = ""
16 source: str = ""
17
18
19 class PartnerInfo(BaseModel):
20 reseller: bool = False
21 reseller_level: str = ""
22
23
24 class SSOConfig(BaseModel):
25 sso_entrypoint: str = ""
26 sso_certificate: str = ""
27 client_id: str = ""
28 client_secret: str = ""
29 openid_authorization: str = ""
30 openid_token: str = ""
31
32 model_config = ConfigDict(from_attributes=True)
33
34
35 class OrgAuth(BaseModel):
36 token: str = ""
37 expires: Optional[datetime] = None
38
39
40 class Organization(BaseModel):
41 name: str
42 description: Optional[str] = None
43 company_type: str = ""
44 # image: str = ""
45 id: str
46 org: Optional[str] = None
47 org_auth: OrgAuth = Field(default_factory=OrgAuth)
48 users: Optional[List[str]] = Field(default_factory=list, description="List of user IDs associated with the organization")
49 role: str = ""
50 roles: List[str] = []
51 active_apps: List[str] = []
52 cloud_sync: bool = False
53 cloud_sync_active: bool = True
54 sync_config: SyncConfig = Field(default_factory=SyncConfig)
55 sync_features: Dict[str, Any] = Field(default_factory=dict)
56 invites: Optional[Any] = None
57 child_orgs: Optional[List[str]] = None
58 manager_orgs: Optional[List[str]] = None
59 creator_org: Optional[str] = None
60 disabled: bool = False
61 partner_info: PartnerInfo = Field(default_factory=PartnerInfo)
62 sso_config: SSOConfig = Field(default_factory=SSOConfig)
63 main_priority: str = ""
64 region: str = ""
65 region_url: str = ""
66 tutorials: List[Any] = []
67
68
69 class OrganizationsListResponse(BaseModel):
70 success: bool
71 message: str
72 data: List[Organization]
73 total_count: int = Field(description="Total number of organizations")
74
75
76 class OrganizationResponse(BaseModel):
77 success: bool
78 message: str
79 data: Optional[Organization] = None
80
81
82 class DetailedOrganization(BaseModel):
83 name: str
84 description: str = ""
85 company_type: str = ""
86 image: str = ""
87 id: str
88 org: str = ""
89 org_auth: OrgAuth = Field(default_factory=OrgAuth)
90 users: List[Any] = []
91 role: str = ""
92 roles: List[str] = []
93 active_apps: List[str] = []
94 cloud_sync: bool = False
95 cloud_sync_active: bool = True
96 sync_config: SyncConfig = Field(default_factory=SyncConfig)
97 sync_features: Dict[str, Any] = Field(default_factory=dict)
98 invites: Optional[Any] = None
99 manager_orgs: Optional[List[str]] = None
100 creator_org: Optional[str] = None
101 disabled: bool = False
102 partner_info: PartnerInfo = Field(default_factory=PartnerInfo)
103 sso_config: SSOConfig = Field(default_factory=SSOConfig)
104 main_priority: str = ""
105 region: str = ""
106 region_url: str = ""
107 tutorials: List[Any] = []
108
109 @field_validator("manager_orgs", mode="before")
110 @classmethod
111 def validate_manager_orgs(cls, v):
112 """
113 Validate and normalize manager_orgs field.
114 Handles various input types and converts them to proper format or None.
115 """
116 if v is None:
117 return None
118
119 # If it's already a list, validate each item is a string
120 if isinstance(v, list):
121 try:
122 return [str(item) for item in v if item is not None]
123 except Exception:
124 return None
125
126 # If it's a single value, convert to list
127 if isinstance(v, (str, int)):
128 return [str(v)]
129
130 # For any other type, return None
131 return None
132
133
134 class DetailedOrganizationResponse(BaseModel):
135 success: bool
136 message: str
137 data: Optional[DetailedOrganization] = None