binalyze-air-sdk 1.0.1__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.
Files changed (142) hide show
  1. binalyze_air/__init__.py +77 -77
  2. binalyze_air/apis/__init__.py +67 -27
  3. binalyze_air/apis/acquisitions.py +107 -0
  4. binalyze_air/apis/api_tokens.py +49 -0
  5. binalyze_air/apis/assets.py +161 -0
  6. binalyze_air/apis/audit_logs.py +26 -0
  7. binalyze_air/apis/{authentication.py → auth.py} +29 -27
  8. binalyze_air/apis/auto_asset_tags.py +79 -75
  9. binalyze_air/apis/backup.py +177 -0
  10. binalyze_air/apis/baseline.py +46 -0
  11. binalyze_air/apis/cases.py +225 -0
  12. binalyze_air/apis/cloud_forensics.py +116 -0
  13. binalyze_air/apis/event_subscription.py +96 -96
  14. binalyze_air/apis/evidence.py +249 -53
  15. binalyze_air/apis/interact.py +153 -36
  16. binalyze_air/apis/investigation_hub.py +234 -0
  17. binalyze_air/apis/license.py +104 -0
  18. binalyze_air/apis/logger.py +83 -0
  19. binalyze_air/apis/multipart_upload.py +201 -0
  20. binalyze_air/apis/notifications.py +115 -0
  21. binalyze_air/apis/organizations.py +267 -0
  22. binalyze_air/apis/params.py +44 -39
  23. binalyze_air/apis/policies.py +186 -0
  24. binalyze_air/apis/preset_filters.py +79 -0
  25. binalyze_air/apis/recent_activities.py +71 -0
  26. binalyze_air/apis/relay_server.py +104 -0
  27. binalyze_air/apis/settings.py +395 -27
  28. binalyze_air/apis/tasks.py +80 -0
  29. binalyze_air/apis/triage.py +197 -0
  30. binalyze_air/apis/user_management.py +183 -74
  31. binalyze_air/apis/webhook_executions.py +50 -0
  32. binalyze_air/apis/webhooks.py +322 -230
  33. binalyze_air/base.py +207 -133
  34. binalyze_air/client.py +217 -1337
  35. binalyze_air/commands/__init__.py +175 -145
  36. binalyze_air/commands/acquisitions.py +661 -387
  37. binalyze_air/commands/api_tokens.py +55 -0
  38. binalyze_air/commands/assets.py +324 -362
  39. binalyze_air/commands/{authentication.py → auth.py} +36 -36
  40. binalyze_air/commands/auto_asset_tags.py +230 -230
  41. binalyze_air/commands/backup.py +47 -0
  42. binalyze_air/commands/baseline.py +32 -396
  43. binalyze_air/commands/cases.py +609 -602
  44. binalyze_air/commands/cloud_forensics.py +88 -0
  45. binalyze_air/commands/event_subscription.py +101 -101
  46. binalyze_air/commands/evidences.py +918 -988
  47. binalyze_air/commands/interact.py +172 -58
  48. binalyze_air/commands/investigation_hub.py +315 -0
  49. binalyze_air/commands/license.py +183 -0
  50. binalyze_air/commands/logger.py +126 -0
  51. binalyze_air/commands/multipart_upload.py +363 -0
  52. binalyze_air/commands/notifications.py +45 -0
  53. binalyze_air/commands/organizations.py +200 -221
  54. binalyze_air/commands/policies.py +175 -203
  55. binalyze_air/commands/preset_filters.py +55 -0
  56. binalyze_air/commands/recent_activities.py +32 -0
  57. binalyze_air/commands/relay_server.py +144 -0
  58. binalyze_air/commands/settings.py +431 -29
  59. binalyze_air/commands/tasks.py +95 -56
  60. binalyze_air/commands/triage.py +224 -360
  61. binalyze_air/commands/user_management.py +351 -126
  62. binalyze_air/commands/webhook_executions.py +77 -0
  63. binalyze_air/config.py +244 -244
  64. binalyze_air/exceptions.py +49 -49
  65. binalyze_air/http_client.py +426 -305
  66. binalyze_air/models/__init__.py +287 -285
  67. binalyze_air/models/acquisitions.py +365 -250
  68. binalyze_air/models/api_tokens.py +73 -0
  69. binalyze_air/models/assets.py +438 -438
  70. binalyze_air/models/audit.py +247 -272
  71. binalyze_air/models/audit_logs.py +14 -0
  72. binalyze_air/models/{authentication.py → auth.py} +69 -69
  73. binalyze_air/models/auto_asset_tags.py +227 -116
  74. binalyze_air/models/backup.py +138 -0
  75. binalyze_air/models/baseline.py +231 -231
  76. binalyze_air/models/cases.py +275 -275
  77. binalyze_air/models/cloud_forensics.py +145 -0
  78. binalyze_air/models/event_subscription.py +170 -171
  79. binalyze_air/models/evidence.py +65 -65
  80. binalyze_air/models/evidences.py +367 -348
  81. binalyze_air/models/interact.py +266 -135
  82. binalyze_air/models/investigation_hub.py +265 -0
  83. binalyze_air/models/license.py +150 -0
  84. binalyze_air/models/logger.py +83 -0
  85. binalyze_air/models/multipart_upload.py +352 -0
  86. binalyze_air/models/notifications.py +138 -0
  87. binalyze_air/models/organizations.py +293 -293
  88. binalyze_air/models/params.py +153 -127
  89. binalyze_air/models/policies.py +260 -249
  90. binalyze_air/models/preset_filters.py +79 -0
  91. binalyze_air/models/recent_activities.py +70 -0
  92. binalyze_air/models/relay_server.py +121 -0
  93. binalyze_air/models/settings.py +538 -84
  94. binalyze_air/models/tasks.py +215 -149
  95. binalyze_air/models/triage.py +141 -142
  96. binalyze_air/models/user_management.py +200 -97
  97. binalyze_air/models/webhook_executions.py +33 -0
  98. binalyze_air/queries/__init__.py +121 -133
  99. binalyze_air/queries/acquisitions.py +155 -155
  100. binalyze_air/queries/api_tokens.py +46 -0
  101. binalyze_air/queries/assets.py +186 -105
  102. binalyze_air/queries/audit.py +400 -416
  103. binalyze_air/queries/{authentication.py → auth.py} +55 -55
  104. binalyze_air/queries/auto_asset_tags.py +59 -59
  105. binalyze_air/queries/backup.py +66 -0
  106. binalyze_air/queries/baseline.py +21 -185
  107. binalyze_air/queries/cases.py +292 -292
  108. binalyze_air/queries/cloud_forensics.py +137 -0
  109. binalyze_air/queries/event_subscription.py +54 -54
  110. binalyze_air/queries/evidence.py +139 -139
  111. binalyze_air/queries/evidences.py +279 -279
  112. binalyze_air/queries/interact.py +140 -28
  113. binalyze_air/queries/investigation_hub.py +329 -0
  114. binalyze_air/queries/license.py +85 -0
  115. binalyze_air/queries/logger.py +58 -0
  116. binalyze_air/queries/multipart_upload.py +180 -0
  117. binalyze_air/queries/notifications.py +71 -0
  118. binalyze_air/queries/organizations.py +222 -222
  119. binalyze_air/queries/params.py +154 -115
  120. binalyze_air/queries/policies.py +149 -149
  121. binalyze_air/queries/preset_filters.py +60 -0
  122. binalyze_air/queries/recent_activities.py +44 -0
  123. binalyze_air/queries/relay_server.py +42 -0
  124. binalyze_air/queries/settings.py +533 -20
  125. binalyze_air/queries/tasks.py +125 -81
  126. binalyze_air/queries/triage.py +230 -230
  127. binalyze_air/queries/user_management.py +193 -83
  128. binalyze_air/queries/webhook_executions.py +39 -0
  129. binalyze_air_sdk-1.0.3.dist-info/METADATA +752 -0
  130. binalyze_air_sdk-1.0.3.dist-info/RECORD +132 -0
  131. {binalyze_air_sdk-1.0.1.dist-info → binalyze_air_sdk-1.0.3.dist-info}/WHEEL +1 -1
  132. binalyze_air/apis/endpoints.py +0 -22
  133. binalyze_air/apis/evidences.py +0 -216
  134. binalyze_air/apis/users.py +0 -68
  135. binalyze_air/commands/users.py +0 -101
  136. binalyze_air/models/endpoints.py +0 -76
  137. binalyze_air/models/users.py +0 -82
  138. binalyze_air/queries/endpoints.py +0 -25
  139. binalyze_air/queries/users.py +0 -69
  140. binalyze_air_sdk-1.0.1.dist-info/METADATA +0 -635
  141. binalyze_air_sdk-1.0.1.dist-info/RECORD +0 -82
  142. {binalyze_air_sdk-1.0.1.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] = []