binalyze-air-sdk 1.0.2__py3-none-any.whl → 1.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- binalyze_air/__init__.py +77 -77
- binalyze_air/apis/__init__.py +67 -27
- binalyze_air/apis/acquisitions.py +107 -0
- binalyze_air/apis/api_tokens.py +49 -0
- binalyze_air/apis/assets.py +161 -0
- binalyze_air/apis/audit_logs.py +26 -0
- binalyze_air/apis/{authentication.py → auth.py} +29 -27
- binalyze_air/apis/auto_asset_tags.py +79 -75
- binalyze_air/apis/backup.py +177 -0
- binalyze_air/apis/baseline.py +46 -0
- binalyze_air/apis/cases.py +225 -0
- binalyze_air/apis/cloud_forensics.py +116 -0
- binalyze_air/apis/event_subscription.py +96 -96
- binalyze_air/apis/evidence.py +249 -53
- binalyze_air/apis/interact.py +153 -36
- binalyze_air/apis/investigation_hub.py +234 -0
- binalyze_air/apis/license.py +104 -0
- binalyze_air/apis/logger.py +83 -0
- binalyze_air/apis/multipart_upload.py +201 -0
- binalyze_air/apis/notifications.py +115 -0
- binalyze_air/apis/organizations.py +267 -0
- binalyze_air/apis/params.py +44 -39
- binalyze_air/apis/policies.py +186 -0
- binalyze_air/apis/preset_filters.py +79 -0
- binalyze_air/apis/recent_activities.py +71 -0
- binalyze_air/apis/relay_server.py +104 -0
- binalyze_air/apis/settings.py +395 -27
- binalyze_air/apis/tasks.py +80 -0
- binalyze_air/apis/triage.py +197 -0
- binalyze_air/apis/user_management.py +183 -74
- binalyze_air/apis/webhook_executions.py +50 -0
- binalyze_air/apis/webhooks.py +322 -230
- binalyze_air/base.py +207 -133
- binalyze_air/client.py +217 -1337
- binalyze_air/commands/__init__.py +175 -145
- binalyze_air/commands/acquisitions.py +661 -387
- binalyze_air/commands/api_tokens.py +55 -0
- binalyze_air/commands/assets.py +324 -362
- binalyze_air/commands/{authentication.py → auth.py} +36 -36
- binalyze_air/commands/auto_asset_tags.py +230 -230
- binalyze_air/commands/backup.py +47 -0
- binalyze_air/commands/baseline.py +32 -396
- binalyze_air/commands/cases.py +609 -602
- binalyze_air/commands/cloud_forensics.py +88 -0
- binalyze_air/commands/event_subscription.py +101 -101
- binalyze_air/commands/evidences.py +918 -988
- binalyze_air/commands/interact.py +172 -58
- binalyze_air/commands/investigation_hub.py +315 -0
- binalyze_air/commands/license.py +183 -0
- binalyze_air/commands/logger.py +126 -0
- binalyze_air/commands/multipart_upload.py +363 -0
- binalyze_air/commands/notifications.py +45 -0
- binalyze_air/commands/organizations.py +200 -221
- binalyze_air/commands/policies.py +175 -203
- binalyze_air/commands/preset_filters.py +55 -0
- binalyze_air/commands/recent_activities.py +32 -0
- binalyze_air/commands/relay_server.py +144 -0
- binalyze_air/commands/settings.py +431 -29
- binalyze_air/commands/tasks.py +95 -56
- binalyze_air/commands/triage.py +224 -360
- binalyze_air/commands/user_management.py +351 -126
- binalyze_air/commands/webhook_executions.py +77 -0
- binalyze_air/config.py +244 -244
- binalyze_air/exceptions.py +49 -49
- binalyze_air/http_client.py +426 -305
- binalyze_air/models/__init__.py +287 -285
- binalyze_air/models/acquisitions.py +365 -250
- binalyze_air/models/api_tokens.py +73 -0
- binalyze_air/models/assets.py +438 -438
- binalyze_air/models/audit.py +247 -272
- binalyze_air/models/audit_logs.py +14 -0
- binalyze_air/models/{authentication.py → auth.py} +69 -69
- binalyze_air/models/auto_asset_tags.py +227 -116
- binalyze_air/models/backup.py +138 -0
- binalyze_air/models/baseline.py +231 -231
- binalyze_air/models/cases.py +275 -275
- binalyze_air/models/cloud_forensics.py +145 -0
- binalyze_air/models/event_subscription.py +170 -171
- binalyze_air/models/evidence.py +65 -65
- binalyze_air/models/evidences.py +367 -348
- binalyze_air/models/interact.py +266 -135
- binalyze_air/models/investigation_hub.py +265 -0
- binalyze_air/models/license.py +150 -0
- binalyze_air/models/logger.py +83 -0
- binalyze_air/models/multipart_upload.py +352 -0
- binalyze_air/models/notifications.py +138 -0
- binalyze_air/models/organizations.py +293 -293
- binalyze_air/models/params.py +153 -127
- binalyze_air/models/policies.py +260 -249
- binalyze_air/models/preset_filters.py +79 -0
- binalyze_air/models/recent_activities.py +70 -0
- binalyze_air/models/relay_server.py +121 -0
- binalyze_air/models/settings.py +538 -84
- binalyze_air/models/tasks.py +215 -149
- binalyze_air/models/triage.py +141 -142
- binalyze_air/models/user_management.py +200 -97
- binalyze_air/models/webhook_executions.py +33 -0
- binalyze_air/queries/__init__.py +121 -133
- binalyze_air/queries/acquisitions.py +155 -155
- binalyze_air/queries/api_tokens.py +46 -0
- binalyze_air/queries/assets.py +186 -105
- binalyze_air/queries/audit.py +400 -416
- binalyze_air/queries/{authentication.py → auth.py} +55 -55
- binalyze_air/queries/auto_asset_tags.py +59 -59
- binalyze_air/queries/backup.py +66 -0
- binalyze_air/queries/baseline.py +21 -185
- binalyze_air/queries/cases.py +292 -292
- binalyze_air/queries/cloud_forensics.py +137 -0
- binalyze_air/queries/event_subscription.py +54 -54
- binalyze_air/queries/evidence.py +139 -139
- binalyze_air/queries/evidences.py +279 -279
- binalyze_air/queries/interact.py +140 -28
- binalyze_air/queries/investigation_hub.py +329 -0
- binalyze_air/queries/license.py +85 -0
- binalyze_air/queries/logger.py +58 -0
- binalyze_air/queries/multipart_upload.py +180 -0
- binalyze_air/queries/notifications.py +71 -0
- binalyze_air/queries/organizations.py +222 -222
- binalyze_air/queries/params.py +154 -115
- binalyze_air/queries/policies.py +149 -149
- binalyze_air/queries/preset_filters.py +60 -0
- binalyze_air/queries/recent_activities.py +44 -0
- binalyze_air/queries/relay_server.py +42 -0
- binalyze_air/queries/settings.py +533 -20
- binalyze_air/queries/tasks.py +125 -81
- binalyze_air/queries/triage.py +230 -230
- binalyze_air/queries/user_management.py +193 -83
- binalyze_air/queries/webhook_executions.py +39 -0
- binalyze_air_sdk-1.0.3.dist-info/METADATA +752 -0
- binalyze_air_sdk-1.0.3.dist-info/RECORD +132 -0
- {binalyze_air_sdk-1.0.2.dist-info → binalyze_air_sdk-1.0.3.dist-info}/WHEEL +1 -1
- binalyze_air/apis/endpoints.py +0 -22
- binalyze_air/apis/evidences.py +0 -216
- binalyze_air/apis/users.py +0 -68
- binalyze_air/commands/users.py +0 -101
- binalyze_air/models/endpoints.py +0 -76
- binalyze_air/models/users.py +0 -82
- binalyze_air/queries/endpoints.py +0 -25
- binalyze_air/queries/users.py +0 -69
- binalyze_air_sdk-1.0.2.dist-info/METADATA +0 -706
- binalyze_air_sdk-1.0.2.dist-info/RECORD +0 -82
- {binalyze_air_sdk-1.0.2.dist-info → binalyze_air_sdk-1.0.3.dist-info}/top_level.txt +0 -0
@@ -1,294 +1,294 @@
|
|
1
|
-
"""
|
2
|
-
Organization-related data models for the Binalyze AIR SDK.
|
3
|
-
"""
|
4
|
-
|
5
|
-
from typing import List, Optional, Dict, Any, Union
|
6
|
-
from datetime import datetime
|
7
|
-
from enum import Enum
|
8
|
-
from pydantic import Field
|
9
|
-
|
10
|
-
from ..base import AIRBaseModel, Filter
|
11
|
-
|
12
|
-
|
13
|
-
class OrganizationStatus(str, Enum):
|
14
|
-
"""Organization status."""
|
15
|
-
ACTIVE = "active"
|
16
|
-
SUSPENDED = "suspended"
|
17
|
-
INACTIVE = "inactive"
|
18
|
-
|
19
|
-
|
20
|
-
class UserRoleType(str, Enum):
|
21
|
-
"""User role type in organization."""
|
22
|
-
ADMIN = "admin"
|
23
|
-
USER = "user"
|
24
|
-
VIEWER = "viewer"
|
25
|
-
ANALYST = "analyst"
|
26
|
-
|
27
|
-
|
28
|
-
class FilterOption(AIRBaseModel):
|
29
|
-
"""Filter option model for API response metadata."""
|
30
|
-
|
31
|
-
name: str
|
32
|
-
type: str # text, select, etc.
|
33
|
-
options: List[Any] = []
|
34
|
-
filter_url: Optional[str] = Field(default=None, alias="filterUrl")
|
35
|
-
|
36
|
-
|
37
|
-
class Organization(AIRBaseModel):
|
38
|
-
"""Organization model with complete field mapping."""
|
39
|
-
|
40
|
-
id: int = Field(alias="_id")
|
41
|
-
name: str
|
42
|
-
note: Optional[str] = None
|
43
|
-
owner: Optional[str] = None
|
44
|
-
is_default: bool = Field(default=False, alias="isDefault")
|
45
|
-
shareable_deployment_enabled: bool = Field(default=True, alias="shareableDeploymentEnabled")
|
46
|
-
deployment_token: Optional[str] = Field(default=None, alias="deploymentToken")
|
47
|
-
contact: Dict[str, Any] = {}
|
48
|
-
total_endpoints: int = Field(default=0, alias="totalEndpoints")
|
49
|
-
tags: List[str] = []
|
50
|
-
statistics: Optional[Dict[str, Any]] = None # Organization statistics
|
51
|
-
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
52
|
-
updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
|
53
|
-
|
54
|
-
|
55
|
-
class UserProfile(AIRBaseModel):
|
56
|
-
"""User profile information."""
|
57
|
-
|
58
|
-
name: Optional[str] = None
|
59
|
-
surname: Optional[str] = None
|
60
|
-
department: Optional[str] = None
|
61
|
-
|
62
|
-
|
63
|
-
class UserGroup(AIRBaseModel):
|
64
|
-
"""User group information."""
|
65
|
-
|
66
|
-
id: str
|
67
|
-
name: str
|
68
|
-
organization_ids: List[int] = Field(default=[], alias="organizationIds")
|
69
|
-
|
70
|
-
|
71
|
-
class UserRole(AIRBaseModel):
|
72
|
-
"""User role information with full privileges."""
|
73
|
-
|
74
|
-
id: str = Field(alias="_id")
|
75
|
-
name: str
|
76
|
-
tag: str
|
77
|
-
created_by: str = Field(alias="createdBy")
|
78
|
-
privileges: List[str] = []
|
79
|
-
privilege_types: List[str] = Field(default=[], alias="privilegeTypes")
|
80
|
-
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
81
|
-
updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
|
82
|
-
|
83
|
-
|
84
|
-
class OrganizationUser(AIRBaseModel):
|
85
|
-
"""Enhanced organization user model with complete field mapping."""
|
86
|
-
|
87
|
-
# Core fields
|
88
|
-
id: str = Field(alias="_id")
|
89
|
-
email: str
|
90
|
-
username: str
|
91
|
-
strategy: Optional[str] = None
|
92
|
-
|
93
|
-
# Profile information
|
94
|
-
profile: Optional[UserProfile] = None
|
95
|
-
|
96
|
-
# Role and permission information
|
97
|
-
roles: List[UserRole] = []
|
98
|
-
groups: List[UserGroup] = []
|
99
|
-
|
100
|
-
# Organization and permission data
|
101
|
-
organization_ids: Optional[Union[str, List[int]]] = Field(default=None, alias="organizationIds") # Can be "ALL" or list
|
102
|
-
|
103
|
-
# Boolean flags
|
104
|
-
has_password: bool = Field(default=False, alias="hasPassword")
|
105
|
-
tfa_enabled: bool = Field(default=False, alias="tfaEnabled")
|
106
|
-
is_authorized_for_all_organizations: bool = Field(default=False, alias="isAuthorizedForAllOrganizations")
|
107
|
-
is_global_admin: bool = Field(default=False, alias="isGlobalAdmin")
|
108
|
-
is_organization_admin: bool = Field(default=False, alias="isOrganizationAdmin")
|
109
|
-
is_not_in_organizations: bool = Field(default=False, alias="isNotInOrganizations")
|
110
|
-
|
111
|
-
# Timestamps
|
112
|
-
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
113
|
-
updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
|
114
|
-
|
115
|
-
# Legacy fields for backward compatibility
|
116
|
-
first_name: Optional[str] = None
|
117
|
-
last_name: Optional[str] = None
|
118
|
-
role: Optional[str] = None
|
119
|
-
organization_id: Optional[int] = None
|
120
|
-
last_login: Optional[datetime] = None
|
121
|
-
is_active: bool = True
|
122
|
-
permissions: List[str] = []
|
123
|
-
|
124
|
-
|
125
|
-
class OrganizationUsersPaginatedResponse(AIRBaseModel):
|
126
|
-
"""Complete paginated response for organization users endpoint."""
|
127
|
-
|
128
|
-
entities: List[OrganizationUser]
|
129
|
-
filters: List[FilterOption] = []
|
130
|
-
sortables: List[str] = []
|
131
|
-
total_entity_count: int = Field(default=0, alias="totalEntityCount")
|
132
|
-
current_page: int = Field(default=1, alias="currentPage")
|
133
|
-
page_size: int = Field(default=10, alias="pageSize")
|
134
|
-
previous_page: int = Field(default=0, alias="previousPage")
|
135
|
-
total_page_count: int = Field(default=1, alias="totalPageCount")
|
136
|
-
next_page: int = Field(default=2, alias="nextPage")
|
137
|
-
|
138
|
-
|
139
|
-
class OrganizationRole(AIRBaseModel):
|
140
|
-
"""Organization role model."""
|
141
|
-
|
142
|
-
id: str
|
143
|
-
name: str
|
144
|
-
description: Optional[str] = None
|
145
|
-
organization_id: int
|
146
|
-
permissions: List[str] = []
|
147
|
-
created_at: Optional[datetime] = None
|
148
|
-
updated_at: Optional[datetime] = None
|
149
|
-
created_by: Optional[str] = None
|
150
|
-
is_system: bool = False
|
151
|
-
user_count: int = 0
|
152
|
-
|
153
|
-
|
154
|
-
class OrganizationLicense(AIRBaseModel):
|
155
|
-
"""Organization license model."""
|
156
|
-
|
157
|
-
id: str
|
158
|
-
organization_id: int
|
159
|
-
license_type: str
|
160
|
-
total_licenses: int = 0
|
161
|
-
used_licenses: int = 0
|
162
|
-
valid_from: Optional[datetime] = None
|
163
|
-
valid_until: Optional[datetime] = None
|
164
|
-
features: List[str] = []
|
165
|
-
is_active: bool = True
|
166
|
-
|
167
|
-
|
168
|
-
class OrganizationSettings(AIRBaseModel):
|
169
|
-
"""Organization settings model."""
|
170
|
-
|
171
|
-
organization_id: int
|
172
|
-
retention_policy: Dict[str, Any] = {}
|
173
|
-
security_settings: Dict[str, Any] = {}
|
174
|
-
notification_settings: Dict[str, Any] = {}
|
175
|
-
api_settings: Dict[str, Any] = {}
|
176
|
-
custom_settings: Dict[str, Any] = {}
|
177
|
-
|
178
|
-
|
179
|
-
class OrganizationFilter(Filter):
|
180
|
-
"""Filter for organization queries with complete parameter support."""
|
181
|
-
|
182
|
-
name: Optional[str] = None
|
183
|
-
search_term: Optional[str] = None
|
184
|
-
|
185
|
-
def to_params(self) -> Dict[str, Any]:
|
186
|
-
"""Convert filter to API parameters."""
|
187
|
-
params = {}
|
188
|
-
if self.name:
|
189
|
-
params["filter[name]"] = self.name
|
190
|
-
if self.search_term:
|
191
|
-
params["filter[searchTerm]"] = self.search_term
|
192
|
-
return params
|
193
|
-
|
194
|
-
|
195
|
-
class OrganizationsPaginatedResponse(AIRBaseModel):
|
196
|
-
"""Complete paginated response for organizations list endpoint."""
|
197
|
-
|
198
|
-
entities: List[Organization]
|
199
|
-
filters: List[FilterOption] = []
|
200
|
-
sortables: List[str] = []
|
201
|
-
total_entity_count: int = Field(default=0, alias="totalEntityCount")
|
202
|
-
current_page: int = Field(default=1, alias="currentPage")
|
203
|
-
page_size: int = Field(default=10, alias="pageSize")
|
204
|
-
previous_page: int = Field(default=0, alias="previousPage")
|
205
|
-
total_page_count: int = Field(default=1, alias="totalPageCount")
|
206
|
-
next_page: int = Field(default=2, alias="nextPage")
|
207
|
-
|
208
|
-
|
209
|
-
# Request models for organization operations
|
210
|
-
class CreateOrganizationRequest(AIRBaseModel):
|
211
|
-
"""Create organization request model with complete field mapping."""
|
212
|
-
|
213
|
-
name: str
|
214
|
-
shareable_deployment_enabled: bool = Field(default=True, alias="shareableDeploymentEnabled")
|
215
|
-
note: Optional[str] = None
|
216
|
-
contact: Optional[Dict[str, Any]] = None
|
217
|
-
tags: Optional[List[str]] = None
|
218
|
-
|
219
|
-
|
220
|
-
class UpdateOrganizationRequest(AIRBaseModel):
|
221
|
-
"""Update organization request model with complete field mapping."""
|
222
|
-
|
223
|
-
name: Optional[str] = None
|
224
|
-
note: Optional[str] = None
|
225
|
-
owner: Optional[str] = None # Added missing owner field
|
226
|
-
contact: Optional[Dict[str, Any]] = None
|
227
|
-
tags: Optional[List[str]] = None
|
228
|
-
|
229
|
-
|
230
|
-
class AddUserToOrganizationRequest(AIRBaseModel):
|
231
|
-
"""Add user to organization request model."""
|
232
|
-
|
233
|
-
user_id: str
|
234
|
-
email: str
|
235
|
-
username: str
|
236
|
-
role: Optional[str] = None
|
237
|
-
|
238
|
-
|
239
|
-
class AssignUsersToOrganizationRequest(AIRBaseModel):
|
240
|
-
"""Assign multiple users to organization request model."""
|
241
|
-
|
242
|
-
user_ids: List[str] = Field(alias="userIds")
|
243
|
-
|
244
|
-
|
245
|
-
class AddTagsToOrganizationRequest(AIRBaseModel):
|
246
|
-
"""Add tags to organization request model."""
|
247
|
-
|
248
|
-
tags: List[str]
|
249
|
-
|
250
|
-
|
251
|
-
class DeleteTagsFromOrganizationRequest(AIRBaseModel):
|
252
|
-
"""Delete tags from organization request model."""
|
253
|
-
|
254
|
-
tags: List[str]
|
255
|
-
|
256
|
-
|
257
|
-
class UpdateShareableDeploymentSettingsRequest(AIRBaseModel):
|
258
|
-
"""Update shareable deployment settings request model."""
|
259
|
-
|
260
|
-
status: bool
|
261
|
-
|
262
|
-
|
263
|
-
class UpdateDeploymentTokenRequest(AIRBaseModel):
|
264
|
-
"""Update deployment token request model."""
|
265
|
-
|
266
|
-
# Empty request body - the API generates a new token automatically
|
267
|
-
pass
|
268
|
-
|
269
|
-
|
270
|
-
class CheckOrganizationNameExistsResponse(AIRBaseModel):
|
271
|
-
"""Response model for checking if organization name exists."""
|
272
|
-
|
273
|
-
success: bool
|
274
|
-
result: bool
|
275
|
-
status_code: int = Field(alias="statusCode")
|
276
|
-
errors: List[str] = []
|
277
|
-
|
278
|
-
|
279
|
-
class ShareableDeploymentInfoResponse(AIRBaseModel):
|
280
|
-
"""Response model for shareable deployment information."""
|
281
|
-
|
282
|
-
success: bool
|
283
|
-
result: Optional[Dict[str, Any]] = None
|
284
|
-
status_code: int = Field(alias="statusCode")
|
285
|
-
errors: List[str] = []
|
286
|
-
|
287
|
-
|
288
|
-
class DeploymentTokenUpdateResponse(AIRBaseModel):
|
289
|
-
"""Response model for deployment token update."""
|
290
|
-
|
291
|
-
success: bool
|
292
|
-
result: Optional[Dict[str, str]] = None # Contains new token
|
293
|
-
status_code: int = Field(alias="statusCode")
|
1
|
+
"""
|
2
|
+
Organization-related data models for the Binalyze AIR SDK.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import List, Optional, Dict, Any, Union
|
6
|
+
from datetime import datetime
|
7
|
+
from enum import Enum
|
8
|
+
from pydantic import Field
|
9
|
+
|
10
|
+
from ..base import AIRBaseModel, Filter
|
11
|
+
|
12
|
+
|
13
|
+
class OrganizationStatus(str, Enum):
|
14
|
+
"""Organization status."""
|
15
|
+
ACTIVE = "active"
|
16
|
+
SUSPENDED = "suspended"
|
17
|
+
INACTIVE = "inactive"
|
18
|
+
|
19
|
+
|
20
|
+
class UserRoleType(str, Enum):
|
21
|
+
"""User role type in organization."""
|
22
|
+
ADMIN = "admin"
|
23
|
+
USER = "user"
|
24
|
+
VIEWER = "viewer"
|
25
|
+
ANALYST = "analyst"
|
26
|
+
|
27
|
+
|
28
|
+
class FilterOption(AIRBaseModel):
|
29
|
+
"""Filter option model for API response metadata."""
|
30
|
+
|
31
|
+
name: str
|
32
|
+
type: str # text, select, etc.
|
33
|
+
options: List[Any] = []
|
34
|
+
filter_url: Optional[str] = Field(default=None, alias="filterUrl")
|
35
|
+
|
36
|
+
|
37
|
+
class Organization(AIRBaseModel):
|
38
|
+
"""Organization model with complete field mapping."""
|
39
|
+
|
40
|
+
id: int = Field(alias="_id")
|
41
|
+
name: str
|
42
|
+
note: Optional[str] = None
|
43
|
+
owner: Optional[str] = None
|
44
|
+
is_default: bool = Field(default=False, alias="isDefault")
|
45
|
+
shareable_deployment_enabled: bool = Field(default=True, alias="shareableDeploymentEnabled")
|
46
|
+
deployment_token: Optional[str] = Field(default=None, alias="deploymentToken")
|
47
|
+
contact: Dict[str, Any] = {}
|
48
|
+
total_endpoints: int = Field(default=0, alias="totalEndpoints")
|
49
|
+
tags: List[str] = []
|
50
|
+
statistics: Optional[Dict[str, Any]] = None # Organization statistics
|
51
|
+
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
52
|
+
updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
|
53
|
+
|
54
|
+
|
55
|
+
class UserProfile(AIRBaseModel):
|
56
|
+
"""User profile information."""
|
57
|
+
|
58
|
+
name: Optional[str] = None
|
59
|
+
surname: Optional[str] = None
|
60
|
+
department: Optional[str] = None
|
61
|
+
|
62
|
+
|
63
|
+
class UserGroup(AIRBaseModel):
|
64
|
+
"""User group information."""
|
65
|
+
|
66
|
+
id: str
|
67
|
+
name: str
|
68
|
+
organization_ids: List[int] = Field(default=[], alias="organizationIds")
|
69
|
+
|
70
|
+
|
71
|
+
class UserRole(AIRBaseModel):
|
72
|
+
"""User role information with full privileges."""
|
73
|
+
|
74
|
+
id: str = Field(alias="_id")
|
75
|
+
name: str
|
76
|
+
tag: str
|
77
|
+
created_by: str = Field(alias="createdBy")
|
78
|
+
privileges: List[str] = []
|
79
|
+
privilege_types: List[str] = Field(default=[], alias="privilegeTypes")
|
80
|
+
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
81
|
+
updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
|
82
|
+
|
83
|
+
|
84
|
+
class OrganizationUser(AIRBaseModel):
|
85
|
+
"""Enhanced organization user model with complete field mapping."""
|
86
|
+
|
87
|
+
# Core fields
|
88
|
+
id: str = Field(alias="_id")
|
89
|
+
email: str
|
90
|
+
username: str
|
91
|
+
strategy: Optional[str] = None
|
92
|
+
|
93
|
+
# Profile information
|
94
|
+
profile: Optional[UserProfile] = None
|
95
|
+
|
96
|
+
# Role and permission information
|
97
|
+
roles: List[UserRole] = []
|
98
|
+
groups: List[UserGroup] = []
|
99
|
+
|
100
|
+
# Organization and permission data
|
101
|
+
organization_ids: Optional[Union[str, List[int]]] = Field(default=None, alias="organizationIds") # Can be "ALL" or list
|
102
|
+
|
103
|
+
# Boolean flags
|
104
|
+
has_password: bool = Field(default=False, alias="hasPassword")
|
105
|
+
tfa_enabled: bool = Field(default=False, alias="tfaEnabled")
|
106
|
+
is_authorized_for_all_organizations: bool = Field(default=False, alias="isAuthorizedForAllOrganizations")
|
107
|
+
is_global_admin: bool = Field(default=False, alias="isGlobalAdmin")
|
108
|
+
is_organization_admin: bool = Field(default=False, alias="isOrganizationAdmin")
|
109
|
+
is_not_in_organizations: bool = Field(default=False, alias="isNotInOrganizations")
|
110
|
+
|
111
|
+
# Timestamps
|
112
|
+
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
113
|
+
updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
|
114
|
+
|
115
|
+
# Legacy fields for backward compatibility
|
116
|
+
first_name: Optional[str] = None
|
117
|
+
last_name: Optional[str] = None
|
118
|
+
role: Optional[str] = None
|
119
|
+
organization_id: Optional[int] = None
|
120
|
+
last_login: Optional[datetime] = None
|
121
|
+
is_active: bool = True
|
122
|
+
permissions: List[str] = []
|
123
|
+
|
124
|
+
|
125
|
+
class OrganizationUsersPaginatedResponse(AIRBaseModel):
|
126
|
+
"""Complete paginated response for organization users endpoint."""
|
127
|
+
|
128
|
+
entities: List[OrganizationUser]
|
129
|
+
filters: List[FilterOption] = []
|
130
|
+
sortables: List[str] = []
|
131
|
+
total_entity_count: int = Field(default=0, alias="totalEntityCount")
|
132
|
+
current_page: int = Field(default=1, alias="currentPage")
|
133
|
+
page_size: int = Field(default=10, alias="pageSize")
|
134
|
+
previous_page: int = Field(default=0, alias="previousPage")
|
135
|
+
total_page_count: int = Field(default=1, alias="totalPageCount")
|
136
|
+
next_page: int = Field(default=2, alias="nextPage")
|
137
|
+
|
138
|
+
|
139
|
+
class OrganizationRole(AIRBaseModel):
|
140
|
+
"""Organization role model."""
|
141
|
+
|
142
|
+
id: str
|
143
|
+
name: str
|
144
|
+
description: Optional[str] = None
|
145
|
+
organization_id: int
|
146
|
+
permissions: List[str] = []
|
147
|
+
created_at: Optional[datetime] = None
|
148
|
+
updated_at: Optional[datetime] = None
|
149
|
+
created_by: Optional[str] = None
|
150
|
+
is_system: bool = False
|
151
|
+
user_count: int = 0
|
152
|
+
|
153
|
+
|
154
|
+
class OrganizationLicense(AIRBaseModel):
|
155
|
+
"""Organization license model."""
|
156
|
+
|
157
|
+
id: str
|
158
|
+
organization_id: int
|
159
|
+
license_type: str
|
160
|
+
total_licenses: int = 0
|
161
|
+
used_licenses: int = 0
|
162
|
+
valid_from: Optional[datetime] = None
|
163
|
+
valid_until: Optional[datetime] = None
|
164
|
+
features: List[str] = []
|
165
|
+
is_active: bool = True
|
166
|
+
|
167
|
+
|
168
|
+
class OrganizationSettings(AIRBaseModel):
|
169
|
+
"""Organization settings model."""
|
170
|
+
|
171
|
+
organization_id: int
|
172
|
+
retention_policy: Dict[str, Any] = {}
|
173
|
+
security_settings: Dict[str, Any] = {}
|
174
|
+
notification_settings: Dict[str, Any] = {}
|
175
|
+
api_settings: Dict[str, Any] = {}
|
176
|
+
custom_settings: Dict[str, Any] = {}
|
177
|
+
|
178
|
+
|
179
|
+
class OrganizationFilter(Filter):
|
180
|
+
"""Filter for organization queries with complete parameter support."""
|
181
|
+
|
182
|
+
name: Optional[str] = None
|
183
|
+
search_term: Optional[str] = None
|
184
|
+
|
185
|
+
def to_params(self) -> Dict[str, Any]:
|
186
|
+
"""Convert filter to API parameters."""
|
187
|
+
params = {}
|
188
|
+
if self.name:
|
189
|
+
params["filter[name]"] = self.name
|
190
|
+
if self.search_term:
|
191
|
+
params["filter[searchTerm]"] = self.search_term
|
192
|
+
return params
|
193
|
+
|
194
|
+
|
195
|
+
class OrganizationsPaginatedResponse(AIRBaseModel):
|
196
|
+
"""Complete paginated response for organizations list endpoint."""
|
197
|
+
|
198
|
+
entities: List[Organization]
|
199
|
+
filters: List[FilterOption] = []
|
200
|
+
sortables: List[str] = []
|
201
|
+
total_entity_count: int = Field(default=0, alias="totalEntityCount")
|
202
|
+
current_page: int = Field(default=1, alias="currentPage")
|
203
|
+
page_size: int = Field(default=10, alias="pageSize")
|
204
|
+
previous_page: int = Field(default=0, alias="previousPage")
|
205
|
+
total_page_count: int = Field(default=1, alias="totalPageCount")
|
206
|
+
next_page: int = Field(default=2, alias="nextPage")
|
207
|
+
|
208
|
+
|
209
|
+
# Request models for organization operations
|
210
|
+
class CreateOrganizationRequest(AIRBaseModel):
|
211
|
+
"""Create organization request model with complete field mapping."""
|
212
|
+
|
213
|
+
name: str
|
214
|
+
shareable_deployment_enabled: bool = Field(default=True, alias="shareableDeploymentEnabled")
|
215
|
+
note: Optional[str] = None
|
216
|
+
contact: Optional[Dict[str, Any]] = None
|
217
|
+
tags: Optional[List[str]] = None
|
218
|
+
|
219
|
+
|
220
|
+
class UpdateOrganizationRequest(AIRBaseModel):
|
221
|
+
"""Update organization request model with complete field mapping."""
|
222
|
+
|
223
|
+
name: Optional[str] = None
|
224
|
+
note: Optional[str] = None
|
225
|
+
owner: Optional[str] = None # Added missing owner field
|
226
|
+
contact: Optional[Dict[str, Any]] = None
|
227
|
+
tags: Optional[List[str]] = None
|
228
|
+
|
229
|
+
|
230
|
+
class AddUserToOrganizationRequest(AIRBaseModel):
|
231
|
+
"""Add user to organization request model."""
|
232
|
+
|
233
|
+
user_id: str
|
234
|
+
email: str
|
235
|
+
username: str
|
236
|
+
role: Optional[str] = None
|
237
|
+
|
238
|
+
|
239
|
+
class AssignUsersToOrganizationRequest(AIRBaseModel):
|
240
|
+
"""Assign multiple users to organization request model."""
|
241
|
+
|
242
|
+
user_ids: List[str] = Field(alias="userIds")
|
243
|
+
|
244
|
+
|
245
|
+
class AddTagsToOrganizationRequest(AIRBaseModel):
|
246
|
+
"""Add tags to organization request model."""
|
247
|
+
|
248
|
+
tags: List[str]
|
249
|
+
|
250
|
+
|
251
|
+
class DeleteTagsFromOrganizationRequest(AIRBaseModel):
|
252
|
+
"""Delete tags from organization request model."""
|
253
|
+
|
254
|
+
tags: List[str]
|
255
|
+
|
256
|
+
|
257
|
+
class UpdateShareableDeploymentSettingsRequest(AIRBaseModel):
|
258
|
+
"""Update shareable deployment settings request model."""
|
259
|
+
|
260
|
+
status: bool
|
261
|
+
|
262
|
+
|
263
|
+
class UpdateDeploymentTokenRequest(AIRBaseModel):
|
264
|
+
"""Update deployment token request model."""
|
265
|
+
|
266
|
+
# Empty request body - the API generates a new token automatically
|
267
|
+
pass
|
268
|
+
|
269
|
+
|
270
|
+
class CheckOrganizationNameExistsResponse(AIRBaseModel):
|
271
|
+
"""Response model for checking if organization name exists."""
|
272
|
+
|
273
|
+
success: bool
|
274
|
+
result: bool
|
275
|
+
status_code: int = Field(alias="statusCode")
|
276
|
+
errors: List[str] = []
|
277
|
+
|
278
|
+
|
279
|
+
class ShareableDeploymentInfoResponse(AIRBaseModel):
|
280
|
+
"""Response model for shareable deployment information."""
|
281
|
+
|
282
|
+
success: bool
|
283
|
+
result: Optional[Dict[str, Any]] = None
|
284
|
+
status_code: int = Field(alias="statusCode")
|
285
|
+
errors: List[str] = []
|
286
|
+
|
287
|
+
|
288
|
+
class DeploymentTokenUpdateResponse(AIRBaseModel):
|
289
|
+
"""Response model for deployment token update."""
|
290
|
+
|
291
|
+
success: bool
|
292
|
+
result: Optional[Dict[str, str]] = None # Contains new token
|
293
|
+
status_code: int = Field(alias="statusCode")
|
294
294
|
errors: List[str] = []
|