label-studio-sdk 2.0.1__py3-none-any.whl → 2.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.

Potentially problematic release.


This version of label-studio-sdk might be problematic. Click here for more details.

Files changed (184) hide show
  1. label_studio_sdk/__init__.py +20 -0
  2. label_studio_sdk/actions/client.py +13 -13
  3. label_studio_sdk/actions/types/actions_list_response_item.py +3 -3
  4. label_studio_sdk/actions/types/actions_list_response_item_dialog.py +2 -2
  5. label_studio_sdk/annotations/client.py +441 -441
  6. label_studio_sdk/base_client.py +4 -0
  7. label_studio_sdk/comments/client.py +176 -176
  8. label_studio_sdk/export_storage/azure/client.py +274 -274
  9. label_studio_sdk/export_storage/gcs/client.py +263 -263
  10. label_studio_sdk/export_storage/local/client.py +206 -206
  11. label_studio_sdk/export_storage/redis/client.py +287 -287
  12. label_studio_sdk/export_storage/s3/client.py +347 -347
  13. label_studio_sdk/export_storage/s3s/client.py +678 -678
  14. label_studio_sdk/import_storage/azure/client.py +357 -357
  15. label_studio_sdk/import_storage/gcs/client.py +357 -357
  16. label_studio_sdk/import_storage/local/client.py +206 -206
  17. label_studio_sdk/import_storage/redis/client.py +309 -309
  18. label_studio_sdk/import_storage/s3/client.py +452 -452
  19. label_studio_sdk/import_storage/s3s/client.py +735 -735
  20. label_studio_sdk/jwt_settings/client.py +10 -10
  21. label_studio_sdk/ml/client.py +118 -118
  22. label_studio_sdk/ml/types/ml_list_model_versions_response.py +1 -1
  23. label_studio_sdk/model_providers/client.py +181 -181
  24. label_studio_sdk/organizations/members/client.py +8 -8
  25. label_studio_sdk/predictions/client.py +60 -60
  26. label_studio_sdk/projects/__init__.py +33 -1
  27. label_studio_sdk/projects/assignments/__init__.py +35 -0
  28. label_studio_sdk/projects/assignments/client.py +801 -0
  29. label_studio_sdk/projects/assignments/types/__init__.py +37 -0
  30. label_studio_sdk/projects/assignments/types/assignments_assign_request_type.py +5 -0
  31. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters.py +33 -0
  32. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters_conjunction.py +5 -0
  33. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters_items_item.py +44 -0
  34. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters_items_item_filter.py +31 -0
  35. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters_items_item_operator.py +23 -0
  36. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_filters_items_item_value.py +7 -0
  37. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_selected_items.py +9 -0
  38. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_selected_items_excluded.py +29 -0
  39. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_selected_items_included.py +29 -0
  40. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_request_type.py +5 -0
  41. label_studio_sdk/projects/assignments/types/assignments_bulk_assign_response.py +22 -0
  42. label_studio_sdk/projects/assignments/types/assignments_delete_request_type.py +5 -0
  43. label_studio_sdk/projects/assignments/types/assignments_update_request_type.py +5 -0
  44. label_studio_sdk/projects/client.py +445 -425
  45. label_studio_sdk/projects/exports/client.py +55 -55
  46. label_studio_sdk/projects/exports/types/exports_convert_response.py +1 -1
  47. label_studio_sdk/projects/members/__init__.py +2 -0
  48. label_studio_sdk/projects/members/client.py +137 -0
  49. label_studio_sdk/projects/stats/types/stats_iaa_response.py +5 -5
  50. label_studio_sdk/projects/types/projects_import_tasks_response.py +12 -12
  51. label_studio_sdk/prompts/client.py +211 -211
  52. label_studio_sdk/prompts/runs/client.py +33 -33
  53. label_studio_sdk/prompts/versions/client.py +72 -72
  54. label_studio_sdk/sso/__init__.py +5 -0
  55. label_studio_sdk/sso/client.py +22 -0
  56. label_studio_sdk/sso/saml/__init__.py +2 -0
  57. label_studio_sdk/sso/saml/client.py +278 -0
  58. label_studio_sdk/sso/scim/__init__.py +2 -0
  59. label_studio_sdk/sso/scim/client.py +278 -0
  60. label_studio_sdk/tasks/client.py +174 -174
  61. label_studio_sdk/types/__init__.py +18 -0
  62. label_studio_sdk/types/all_roles_project_list.py +94 -94
  63. label_studio_sdk/types/annotation.py +35 -35
  64. label_studio_sdk/types/annotation_request.py +27 -27
  65. label_studio_sdk/types/azure_blob_export_storage.py +29 -29
  66. label_studio_sdk/types/azure_blob_import_storage.py +33 -33
  67. label_studio_sdk/types/batch_failed_predictions.py +1 -1
  68. label_studio_sdk/types/billing_checks.py +14 -14
  69. label_studio_sdk/types/billing_flags.py +16 -16
  70. label_studio_sdk/types/blueprint_list.py +7 -8
  71. label_studio_sdk/types/child_filter.py +11 -10
  72. label_studio_sdk/types/comment.py +15 -15
  73. label_studio_sdk/types/comment_request.py +7 -8
  74. label_studio_sdk/types/comment_serializer_with_expanded_user.py +17 -18
  75. label_studio_sdk/types/converted_format.py +1 -1
  76. label_studio_sdk/types/converted_format_request.py +1 -1
  77. label_studio_sdk/types/export.py +8 -8
  78. label_studio_sdk/types/file_upload.py +3 -2
  79. label_studio_sdk/types/filter.py +10 -9
  80. label_studio_sdk/types/filter_group.py +4 -3
  81. label_studio_sdk/types/gcs_export_storage.py +23 -23
  82. label_studio_sdk/types/gcs_import_storage.py +27 -27
  83. label_studio_sdk/types/import_api_request.py +26 -26
  84. label_studio_sdk/types/inference_run_cost_estimate.py +10 -10
  85. label_studio_sdk/types/local_files_export_storage.py +23 -23
  86. label_studio_sdk/types/local_files_import_storage.py +26 -26
  87. label_studio_sdk/types/lse_annotation_filter_options.py +10 -10
  88. label_studio_sdk/types/lse_annotation_filter_options_request.py +10 -10
  89. label_studio_sdk/types/lse_export_create.py +12 -12
  90. label_studio_sdk/types/lse_fields.py +14 -14
  91. label_studio_sdk/types/lse_organization.py +17 -17
  92. label_studio_sdk/types/lse_organization_member_list.py +1 -1
  93. label_studio_sdk/types/lse_project_create.py +72 -72
  94. label_studio_sdk/types/lse_project_update.py +89 -89
  95. label_studio_sdk/types/lse_s3export_storage.py +46 -46
  96. label_studio_sdk/types/lse_s3export_storage_request.py +43 -43
  97. label_studio_sdk/types/lse_s3import_storage.py +53 -53
  98. label_studio_sdk/types/lse_s3import_storage_request.py +49 -49
  99. label_studio_sdk/types/lse_task.py +49 -49
  100. label_studio_sdk/types/lse_task_drafts_item.py +1 -1
  101. label_studio_sdk/types/lse_task_filter_options.py +14 -14
  102. label_studio_sdk/types/lse_task_filter_options_request.py +14 -14
  103. label_studio_sdk/types/lse_task_predictions_item.py +5 -5
  104. label_studio_sdk/types/lse_task_serializer_for_annotators.py +12 -12
  105. label_studio_sdk/types/lse_task_serializer_for_annotators_drafts_item.py +1 -1
  106. label_studio_sdk/types/lse_task_serializer_for_annotators_predictions_item.py +5 -5
  107. label_studio_sdk/types/lse_task_serializer_for_reviewers.py +49 -49
  108. label_studio_sdk/types/lse_task_serializer_for_reviewers_drafts_item.py +1 -1
  109. label_studio_sdk/types/lse_task_serializer_for_reviewers_predictions_item.py +5 -5
  110. label_studio_sdk/types/lse_user.py +13 -13
  111. label_studio_sdk/types/lse_user_api.py +11 -11
  112. label_studio_sdk/types/lse_user_organization_member_list.py +13 -13
  113. label_studio_sdk/types/lseapi_token_create.py +1 -1
  114. label_studio_sdk/types/lseapi_token_list.py +1 -1
  115. label_studio_sdk/types/lsejwt_settings.py +5 -5
  116. label_studio_sdk/types/ml_backend.py +27 -28
  117. label_studio_sdk/types/model_interface.py +12 -12
  118. label_studio_sdk/types/model_interface_request.py +7 -8
  119. label_studio_sdk/types/model_interface_serializer_get.py +13 -13
  120. label_studio_sdk/types/model_provider_connection.py +34 -34
  121. label_studio_sdk/types/model_provider_connection_request.py +15 -14
  122. label_studio_sdk/types/model_run.py +12 -12
  123. label_studio_sdk/types/organization_billing.py +1 -1
  124. label_studio_sdk/types/organization_id.py +2 -2
  125. label_studio_sdk/types/organization_invite.py +1 -1
  126. label_studio_sdk/types/organization_member.py +8 -9
  127. label_studio_sdk/types/organization_membership.py +2 -1
  128. label_studio_sdk/types/pause.py +23 -23
  129. label_studio_sdk/types/prediction.py +21 -21
  130. label_studio_sdk/types/prediction_request.py +16 -16
  131. label_studio_sdk/types/project.py +72 -72
  132. label_studio_sdk/types/project_group.py +22 -0
  133. label_studio_sdk/types/project_group_request.py +22 -0
  134. label_studio_sdk/types/project_group_role_enum.py +5 -0
  135. label_studio_sdk/types/project_import.py +21 -21
  136. label_studio_sdk/types/redis_export_storage.py +34 -34
  137. label_studio_sdk/types/redis_import_storage.py +37 -37
  138. label_studio_sdk/types/refined_prompt_response.py +11 -11
  139. label_studio_sdk/types/review_settings.py +29 -30
  140. label_studio_sdk/types/review_settings_request.py +29 -30
  141. label_studio_sdk/types/s3export_storage.py +45 -45
  142. label_studio_sdk/types/s3import_storage.py +44 -44
  143. label_studio_sdk/types/saml_settings.py +21 -0
  144. label_studio_sdk/types/saml_settings_update.py +22 -0
  145. label_studio_sdk/types/scim_settings.py +21 -0
  146. label_studio_sdk/types/scim_settings_update.py +22 -0
  147. label_studio_sdk/types/selected_items_request.py +1 -1
  148. label_studio_sdk/types/serialization_options.py +10 -10
  149. label_studio_sdk/types/serialization_options_request.py +10 -10
  150. label_studio_sdk/types/task_assignment.py +43 -0
  151. label_studio_sdk/types/third_party_model_version.py +11 -11
  152. label_studio_sdk/types/third_party_model_version_request.py +6 -7
  153. label_studio_sdk/types/type_enum.py +5 -0
  154. label_studio_sdk/types/user_simple.py +3 -3
  155. label_studio_sdk/types/user_simple_request.py +1 -1
  156. label_studio_sdk/types/version_response.py +19 -20
  157. label_studio_sdk/types/view.py +8 -8
  158. label_studio_sdk/types/webhook.py +16 -16
  159. label_studio_sdk/types/webhook_serializer_for_update.py +16 -16
  160. label_studio_sdk/types/workspace.py +10 -11
  161. label_studio_sdk/users/client.py +160 -160
  162. label_studio_sdk/views/client.py +164 -164
  163. label_studio_sdk/webhooks/client.py +183 -183
  164. label_studio_sdk/webhooks/types/webhooks_info_response.py +32 -32
  165. label_studio_sdk/webhooks/types/webhooks_info_response_annotation_created.py +1 -1
  166. label_studio_sdk/webhooks/types/webhooks_info_response_annotation_updated.py +1 -1
  167. label_studio_sdk/webhooks/types/webhooks_info_response_annotations_created.py +1 -1
  168. label_studio_sdk/webhooks/types/webhooks_info_response_annotations_deleted.py +1 -1
  169. label_studio_sdk/webhooks/types/webhooks_info_response_label_link_created.py +1 -1
  170. label_studio_sdk/webhooks/types/webhooks_info_response_label_link_deleted.py +1 -1
  171. label_studio_sdk/webhooks/types/webhooks_info_response_label_link_updated.py +1 -1
  172. label_studio_sdk/webhooks/types/webhooks_info_response_project_created.py +1 -1
  173. label_studio_sdk/webhooks/types/webhooks_info_response_project_deleted.py +1 -1
  174. label_studio_sdk/webhooks/types/webhooks_info_response_project_updated.py +1 -1
  175. label_studio_sdk/webhooks/types/webhooks_info_response_review_created.py +1 -1
  176. label_studio_sdk/webhooks/types/webhooks_info_response_review_updated.py +1 -1
  177. label_studio_sdk/webhooks/types/webhooks_info_response_reviews_deleted.py +1 -1
  178. label_studio_sdk/webhooks/types/webhooks_info_response_tasks_created.py +1 -1
  179. label_studio_sdk/webhooks/types/webhooks_info_response_tasks_deleted.py +1 -1
  180. label_studio_sdk/workspaces/client.py +40 -40
  181. {label_studio_sdk-2.0.1.dist-info → label_studio_sdk-2.0.3.dist-info}/METADATA +1 -1
  182. {label_studio_sdk-2.0.1.dist-info → label_studio_sdk-2.0.3.dist-info}/RECORD +184 -150
  183. {label_studio_sdk-2.0.1.dist-info → label_studio_sdk-2.0.3.dist-info}/LICENSE +0 -0
  184. {label_studio_sdk-2.0.1.dist-info → label_studio_sdk-2.0.3.dist-info}/WHEEL +0 -0
@@ -0,0 +1,801 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from ...core.client_wrapper import SyncClientWrapper
5
+ from .types.assignments_bulk_assign_request_selected_items import AssignmentsBulkAssignRequestSelectedItems
6
+ from .types.assignments_bulk_assign_request_type import AssignmentsBulkAssignRequestType
7
+ from .types.assignments_bulk_assign_request_filters import AssignmentsBulkAssignRequestFilters
8
+ from ...core.request_options import RequestOptions
9
+ from .types.assignments_bulk_assign_response import AssignmentsBulkAssignResponse
10
+ from ...core.jsonable_encoder import jsonable_encoder
11
+ from ...core.serialization import convert_and_respect_annotation_metadata
12
+ from ...core.unchecked_base_model import construct_type
13
+ from ...errors.bad_request_error import BadRequestError
14
+ from json.decoder import JSONDecodeError
15
+ from ...core.api_error import ApiError
16
+ from ...types.task_assignment import TaskAssignment
17
+ from .types.assignments_assign_request_type import AssignmentsAssignRequestType
18
+ from .types.assignments_delete_request_type import AssignmentsDeleteRequestType
19
+ from .types.assignments_update_request_type import AssignmentsUpdateRequestType
20
+ from ...core.client_wrapper import AsyncClientWrapper
21
+
22
+ # this is used as the default value for optional parameters
23
+ OMIT = typing.cast(typing.Any, ...)
24
+
25
+
26
+ class AssignmentsClient:
27
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
28
+ self._client_wrapper = client_wrapper
29
+
30
+ def bulk_assign(
31
+ self,
32
+ id: int,
33
+ *,
34
+ selected_items: AssignmentsBulkAssignRequestSelectedItems,
35
+ type: AssignmentsBulkAssignRequestType,
36
+ users: typing.Sequence[int],
37
+ filters: typing.Optional[AssignmentsBulkAssignRequestFilters] = OMIT,
38
+ request_options: typing.Optional[RequestOptions] = None,
39
+ ) -> AssignmentsBulkAssignResponse:
40
+ """
41
+ Assign multiple users to a collection of tasks within a specific project.
42
+
43
+ Parameters
44
+ ----------
45
+ id : int
46
+
47
+ selected_items : AssignmentsBulkAssignRequestSelectedItems
48
+ Task selection by IDs. If filters are applied, the selection will be applied to the filtered tasks.If "all" is `false`, `"included"` must be used. If "all" is `true`, `"excluded"` must be used.<br>Examples: `{"all": false, "included": [1, 2, 3]}` or `{"all": true, "excluded": [4, 5]}`
49
+
50
+ type : AssignmentsBulkAssignRequestType
51
+ Assignment type. Use AN for annotate or RE for review.
52
+
53
+ users : typing.Sequence[int]
54
+ List of user IDs to assign
55
+
56
+ filters : typing.Optional[AssignmentsBulkAssignRequestFilters]
57
+ Filters to apply on tasks. You can use [the helper class `Filters` from this page](https://labelstud.io/sdk/data_manager.html) to create Data Manager Filters.<br>Example: `{"conjunction": "or", "items": [{"filter": "filter:tasks:completed_at", "operator": "greater", "type": "Datetime", "value": "2021-01-01T00:00:00.000Z"}]}`
58
+
59
+ request_options : typing.Optional[RequestOptions]
60
+ Request-specific configuration.
61
+
62
+ Returns
63
+ -------
64
+ AssignmentsBulkAssignResponse
65
+ Success
66
+
67
+ Examples
68
+ --------
69
+ from label_studio_sdk import LabelStudio
70
+ from label_studio_sdk.projects.assignments import (
71
+ AssignmentsBulkAssignRequestSelectedItemsIncluded,
72
+ )
73
+
74
+ client = LabelStudio(
75
+ api_key="YOUR_API_KEY",
76
+ )
77
+ client.projects.assignments.bulk_assign(
78
+ id=1,
79
+ selected_items=AssignmentsBulkAssignRequestSelectedItemsIncluded(
80
+ all_=True,
81
+ ),
82
+ type="AN",
83
+ users=[1],
84
+ )
85
+ """
86
+ _response = self._client_wrapper.httpx_client.request(
87
+ f"api/projects/{jsonable_encoder(id)}/tasks/assignees",
88
+ method="POST",
89
+ json={
90
+ "filters": convert_and_respect_annotation_metadata(
91
+ object_=filters, annotation=AssignmentsBulkAssignRequestFilters, direction="write"
92
+ ),
93
+ "selectedItems": convert_and_respect_annotation_metadata(
94
+ object_=selected_items, annotation=AssignmentsBulkAssignRequestSelectedItems, direction="write"
95
+ ),
96
+ "type": type,
97
+ "users": users,
98
+ },
99
+ headers={
100
+ "content-type": "application/json",
101
+ },
102
+ request_options=request_options,
103
+ omit=OMIT,
104
+ )
105
+ try:
106
+ if 200 <= _response.status_code < 300:
107
+ return typing.cast(
108
+ AssignmentsBulkAssignResponse,
109
+ construct_type(
110
+ type_=AssignmentsBulkAssignResponse, # type: ignore
111
+ object_=_response.json(),
112
+ ),
113
+ )
114
+ if _response.status_code == 400:
115
+ raise BadRequestError(
116
+ typing.cast(
117
+ typing.Optional[typing.Any],
118
+ construct_type(
119
+ type_=typing.Optional[typing.Any], # type: ignore
120
+ object_=_response.json(),
121
+ ),
122
+ )
123
+ )
124
+ _response_json = _response.json()
125
+ except JSONDecodeError:
126
+ raise ApiError(status_code=_response.status_code, body=_response.text)
127
+ raise ApiError(status_code=_response.status_code, body=_response_json)
128
+
129
+ def list(
130
+ self, id: int, task_pk: int, *, request_options: typing.Optional[RequestOptions] = None
131
+ ) -> typing.List[TaskAssignment]:
132
+ """
133
+ Retrieve a list of tasks and assignees for those tasks for a specific project.
134
+
135
+ Parameters
136
+ ----------
137
+ id : int
138
+ A unique integer value identifying this project.
139
+
140
+ task_pk : int
141
+ A unique integer value identifying this task.
142
+
143
+ request_options : typing.Optional[RequestOptions]
144
+ Request-specific configuration.
145
+
146
+ Returns
147
+ -------
148
+ typing.List[TaskAssignment]
149
+ List of assignments for the task
150
+
151
+ Examples
152
+ --------
153
+ from label_studio_sdk import LabelStudio
154
+
155
+ client = LabelStudio(
156
+ api_key="YOUR_API_KEY",
157
+ )
158
+ client.projects.assignments.list(
159
+ id=1,
160
+ task_pk=1,
161
+ )
162
+ """
163
+ _response = self._client_wrapper.httpx_client.request(
164
+ f"api/projects/{jsonable_encoder(id)}/tasks/{jsonable_encoder(task_pk)}/assignees",
165
+ method="GET",
166
+ request_options=request_options,
167
+ )
168
+ try:
169
+ if 200 <= _response.status_code < 300:
170
+ return typing.cast(
171
+ typing.List[TaskAssignment],
172
+ construct_type(
173
+ type_=typing.List[TaskAssignment], # type: ignore
174
+ object_=_response.json(),
175
+ ),
176
+ )
177
+ _response_json = _response.json()
178
+ except JSONDecodeError:
179
+ raise ApiError(status_code=_response.status_code, body=_response.text)
180
+ raise ApiError(status_code=_response.status_code, body=_response_json)
181
+
182
+ def assign(
183
+ self,
184
+ id: int,
185
+ task_pk: int,
186
+ *,
187
+ type: AssignmentsAssignRequestType,
188
+ users: typing.Sequence[int],
189
+ request_options: typing.Optional[RequestOptions] = None,
190
+ ) -> TaskAssignment:
191
+ """
192
+ Assign a user to a task in a specific project.
193
+
194
+ Parameters
195
+ ----------
196
+ id : int
197
+ A unique integer value identifying this project.
198
+
199
+ task_pk : int
200
+ A unique integer value identifying this task.
201
+
202
+ type : AssignmentsAssignRequestType
203
+ Assignment type. Use AN for annotate or RE for review.
204
+
205
+ users : typing.Sequence[int]
206
+ List of user IDs to assign
207
+
208
+ request_options : typing.Optional[RequestOptions]
209
+ Request-specific configuration.
210
+
211
+ Returns
212
+ -------
213
+ TaskAssignment
214
+
215
+
216
+ Examples
217
+ --------
218
+ from label_studio_sdk import LabelStudio
219
+
220
+ client = LabelStudio(
221
+ api_key="YOUR_API_KEY",
222
+ )
223
+ client.projects.assignments.assign(
224
+ id=1,
225
+ task_pk=1,
226
+ type="AN",
227
+ users=[1],
228
+ )
229
+ """
230
+ _response = self._client_wrapper.httpx_client.request(
231
+ f"api/projects/{jsonable_encoder(id)}/tasks/{jsonable_encoder(task_pk)}/assignees",
232
+ method="POST",
233
+ json={
234
+ "type": type,
235
+ "users": users,
236
+ },
237
+ headers={
238
+ "content-type": "application/json",
239
+ },
240
+ request_options=request_options,
241
+ omit=OMIT,
242
+ )
243
+ try:
244
+ if 200 <= _response.status_code < 300:
245
+ return typing.cast(
246
+ TaskAssignment,
247
+ construct_type(
248
+ type_=TaskAssignment, # type: ignore
249
+ object_=_response.json(),
250
+ ),
251
+ )
252
+ _response_json = _response.json()
253
+ except JSONDecodeError:
254
+ raise ApiError(status_code=_response.status_code, body=_response.text)
255
+ raise ApiError(status_code=_response.status_code, body=_response_json)
256
+
257
+ def delete(
258
+ self,
259
+ id: int,
260
+ task_pk: int,
261
+ *,
262
+ type: typing.Optional[AssignmentsDeleteRequestType] = None,
263
+ users: typing.Optional[str] = None,
264
+ request_options: typing.Optional[RequestOptions] = None,
265
+ ) -> None:
266
+ """
267
+ Remove assignees for a task within a specific project.
268
+
269
+ Parameters
270
+ ----------
271
+ id : int
272
+ A unique integer value identifying this project.
273
+
274
+ task_pk : int
275
+ A unique integer value identifying this task.
276
+
277
+ type : typing.Optional[AssignmentsDeleteRequestType]
278
+ Assignment type to delete (optional). If omitted, deletes all assignments for the task.
279
+
280
+ users : typing.Optional[str]
281
+ Comma separated list of user IDs to delete, as a string. If omitted, deletes all assignees for the given type.
282
+
283
+ request_options : typing.Optional[RequestOptions]
284
+ Request-specific configuration.
285
+
286
+ Returns
287
+ -------
288
+ None
289
+
290
+ Examples
291
+ --------
292
+ from label_studio_sdk import LabelStudio
293
+
294
+ client = LabelStudio(
295
+ api_key="YOUR_API_KEY",
296
+ )
297
+ client.projects.assignments.delete(
298
+ id=1,
299
+ task_pk=1,
300
+ )
301
+ """
302
+ _response = self._client_wrapper.httpx_client.request(
303
+ f"api/projects/{jsonable_encoder(id)}/tasks/{jsonable_encoder(task_pk)}/assignees",
304
+ method="DELETE",
305
+ params={
306
+ "type": type,
307
+ "users": users,
308
+ },
309
+ request_options=request_options,
310
+ )
311
+ try:
312
+ if 200 <= _response.status_code < 300:
313
+ return
314
+ _response_json = _response.json()
315
+ except JSONDecodeError:
316
+ raise ApiError(status_code=_response.status_code, body=_response.text)
317
+ raise ApiError(status_code=_response.status_code, body=_response_json)
318
+
319
+ def update(
320
+ self,
321
+ id: int,
322
+ task_pk: int,
323
+ *,
324
+ type: AssignmentsUpdateRequestType,
325
+ users: typing.Sequence[int],
326
+ request_options: typing.Optional[RequestOptions] = None,
327
+ ) -> TaskAssignment:
328
+ """
329
+ Update the assignee for a task in a specific project.
330
+
331
+ Parameters
332
+ ----------
333
+ id : int
334
+ A unique integer value identifying this project.
335
+
336
+ task_pk : int
337
+ A unique integer value identifying this task.
338
+
339
+ type : AssignmentsUpdateRequestType
340
+ Assignment type. Use AN for annotate or RE for review.
341
+
342
+ users : typing.Sequence[int]
343
+ List of user IDs to assign
344
+
345
+ request_options : typing.Optional[RequestOptions]
346
+ Request-specific configuration.
347
+
348
+ Returns
349
+ -------
350
+ TaskAssignment
351
+
352
+
353
+ Examples
354
+ --------
355
+ from label_studio_sdk import LabelStudio
356
+
357
+ client = LabelStudio(
358
+ api_key="YOUR_API_KEY",
359
+ )
360
+ client.projects.assignments.update(
361
+ id=1,
362
+ task_pk=1,
363
+ type="AN",
364
+ users=[1],
365
+ )
366
+ """
367
+ _response = self._client_wrapper.httpx_client.request(
368
+ f"api/projects/{jsonable_encoder(id)}/tasks/{jsonable_encoder(task_pk)}/assignees",
369
+ method="PATCH",
370
+ json={
371
+ "type": type,
372
+ "users": users,
373
+ },
374
+ headers={
375
+ "content-type": "application/json",
376
+ },
377
+ request_options=request_options,
378
+ omit=OMIT,
379
+ )
380
+ try:
381
+ if 200 <= _response.status_code < 300:
382
+ return typing.cast(
383
+ TaskAssignment,
384
+ construct_type(
385
+ type_=TaskAssignment, # type: ignore
386
+ object_=_response.json(),
387
+ ),
388
+ )
389
+ _response_json = _response.json()
390
+ except JSONDecodeError:
391
+ raise ApiError(status_code=_response.status_code, body=_response.text)
392
+ raise ApiError(status_code=_response.status_code, body=_response_json)
393
+
394
+
395
+ class AsyncAssignmentsClient:
396
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
397
+ self._client_wrapper = client_wrapper
398
+
399
+ async def bulk_assign(
400
+ self,
401
+ id: int,
402
+ *,
403
+ selected_items: AssignmentsBulkAssignRequestSelectedItems,
404
+ type: AssignmentsBulkAssignRequestType,
405
+ users: typing.Sequence[int],
406
+ filters: typing.Optional[AssignmentsBulkAssignRequestFilters] = OMIT,
407
+ request_options: typing.Optional[RequestOptions] = None,
408
+ ) -> AssignmentsBulkAssignResponse:
409
+ """
410
+ Assign multiple users to a collection of tasks within a specific project.
411
+
412
+ Parameters
413
+ ----------
414
+ id : int
415
+
416
+ selected_items : AssignmentsBulkAssignRequestSelectedItems
417
+ Task selection by IDs. If filters are applied, the selection will be applied to the filtered tasks.If "all" is `false`, `"included"` must be used. If "all" is `true`, `"excluded"` must be used.<br>Examples: `{"all": false, "included": [1, 2, 3]}` or `{"all": true, "excluded": [4, 5]}`
418
+
419
+ type : AssignmentsBulkAssignRequestType
420
+ Assignment type. Use AN for annotate or RE for review.
421
+
422
+ users : typing.Sequence[int]
423
+ List of user IDs to assign
424
+
425
+ filters : typing.Optional[AssignmentsBulkAssignRequestFilters]
426
+ Filters to apply on tasks. You can use [the helper class `Filters` from this page](https://labelstud.io/sdk/data_manager.html) to create Data Manager Filters.<br>Example: `{"conjunction": "or", "items": [{"filter": "filter:tasks:completed_at", "operator": "greater", "type": "Datetime", "value": "2021-01-01T00:00:00.000Z"}]}`
427
+
428
+ request_options : typing.Optional[RequestOptions]
429
+ Request-specific configuration.
430
+
431
+ Returns
432
+ -------
433
+ AssignmentsBulkAssignResponse
434
+ Success
435
+
436
+ Examples
437
+ --------
438
+ import asyncio
439
+
440
+ from label_studio_sdk import AsyncLabelStudio
441
+ from label_studio_sdk.projects.assignments import (
442
+ AssignmentsBulkAssignRequestSelectedItemsIncluded,
443
+ )
444
+
445
+ client = AsyncLabelStudio(
446
+ api_key="YOUR_API_KEY",
447
+ )
448
+
449
+
450
+ async def main() -> None:
451
+ await client.projects.assignments.bulk_assign(
452
+ id=1,
453
+ selected_items=AssignmentsBulkAssignRequestSelectedItemsIncluded(
454
+ all_=True,
455
+ ),
456
+ type="AN",
457
+ users=[1],
458
+ )
459
+
460
+
461
+ asyncio.run(main())
462
+ """
463
+ _response = await self._client_wrapper.httpx_client.request(
464
+ f"api/projects/{jsonable_encoder(id)}/tasks/assignees",
465
+ method="POST",
466
+ json={
467
+ "filters": convert_and_respect_annotation_metadata(
468
+ object_=filters, annotation=AssignmentsBulkAssignRequestFilters, direction="write"
469
+ ),
470
+ "selectedItems": convert_and_respect_annotation_metadata(
471
+ object_=selected_items, annotation=AssignmentsBulkAssignRequestSelectedItems, direction="write"
472
+ ),
473
+ "type": type,
474
+ "users": users,
475
+ },
476
+ headers={
477
+ "content-type": "application/json",
478
+ },
479
+ request_options=request_options,
480
+ omit=OMIT,
481
+ )
482
+ try:
483
+ if 200 <= _response.status_code < 300:
484
+ return typing.cast(
485
+ AssignmentsBulkAssignResponse,
486
+ construct_type(
487
+ type_=AssignmentsBulkAssignResponse, # type: ignore
488
+ object_=_response.json(),
489
+ ),
490
+ )
491
+ if _response.status_code == 400:
492
+ raise BadRequestError(
493
+ typing.cast(
494
+ typing.Optional[typing.Any],
495
+ construct_type(
496
+ type_=typing.Optional[typing.Any], # type: ignore
497
+ object_=_response.json(),
498
+ ),
499
+ )
500
+ )
501
+ _response_json = _response.json()
502
+ except JSONDecodeError:
503
+ raise ApiError(status_code=_response.status_code, body=_response.text)
504
+ raise ApiError(status_code=_response.status_code, body=_response_json)
505
+
506
+ async def list(
507
+ self, id: int, task_pk: int, *, request_options: typing.Optional[RequestOptions] = None
508
+ ) -> typing.List[TaskAssignment]:
509
+ """
510
+ Retrieve a list of tasks and assignees for those tasks for a specific project.
511
+
512
+ Parameters
513
+ ----------
514
+ id : int
515
+ A unique integer value identifying this project.
516
+
517
+ task_pk : int
518
+ A unique integer value identifying this task.
519
+
520
+ request_options : typing.Optional[RequestOptions]
521
+ Request-specific configuration.
522
+
523
+ Returns
524
+ -------
525
+ typing.List[TaskAssignment]
526
+ List of assignments for the task
527
+
528
+ Examples
529
+ --------
530
+ import asyncio
531
+
532
+ from label_studio_sdk import AsyncLabelStudio
533
+
534
+ client = AsyncLabelStudio(
535
+ api_key="YOUR_API_KEY",
536
+ )
537
+
538
+
539
+ async def main() -> None:
540
+ await client.projects.assignments.list(
541
+ id=1,
542
+ task_pk=1,
543
+ )
544
+
545
+
546
+ asyncio.run(main())
547
+ """
548
+ _response = await self._client_wrapper.httpx_client.request(
549
+ f"api/projects/{jsonable_encoder(id)}/tasks/{jsonable_encoder(task_pk)}/assignees",
550
+ method="GET",
551
+ request_options=request_options,
552
+ )
553
+ try:
554
+ if 200 <= _response.status_code < 300:
555
+ return typing.cast(
556
+ typing.List[TaskAssignment],
557
+ construct_type(
558
+ type_=typing.List[TaskAssignment], # type: ignore
559
+ object_=_response.json(),
560
+ ),
561
+ )
562
+ _response_json = _response.json()
563
+ except JSONDecodeError:
564
+ raise ApiError(status_code=_response.status_code, body=_response.text)
565
+ raise ApiError(status_code=_response.status_code, body=_response_json)
566
+
567
+ async def assign(
568
+ self,
569
+ id: int,
570
+ task_pk: int,
571
+ *,
572
+ type: AssignmentsAssignRequestType,
573
+ users: typing.Sequence[int],
574
+ request_options: typing.Optional[RequestOptions] = None,
575
+ ) -> TaskAssignment:
576
+ """
577
+ Assign a user to a task in a specific project.
578
+
579
+ Parameters
580
+ ----------
581
+ id : int
582
+ A unique integer value identifying this project.
583
+
584
+ task_pk : int
585
+ A unique integer value identifying this task.
586
+
587
+ type : AssignmentsAssignRequestType
588
+ Assignment type. Use AN for annotate or RE for review.
589
+
590
+ users : typing.Sequence[int]
591
+ List of user IDs to assign
592
+
593
+ request_options : typing.Optional[RequestOptions]
594
+ Request-specific configuration.
595
+
596
+ Returns
597
+ -------
598
+ TaskAssignment
599
+
600
+
601
+ Examples
602
+ --------
603
+ import asyncio
604
+
605
+ from label_studio_sdk import AsyncLabelStudio
606
+
607
+ client = AsyncLabelStudio(
608
+ api_key="YOUR_API_KEY",
609
+ )
610
+
611
+
612
+ async def main() -> None:
613
+ await client.projects.assignments.assign(
614
+ id=1,
615
+ task_pk=1,
616
+ type="AN",
617
+ users=[1],
618
+ )
619
+
620
+
621
+ asyncio.run(main())
622
+ """
623
+ _response = await self._client_wrapper.httpx_client.request(
624
+ f"api/projects/{jsonable_encoder(id)}/tasks/{jsonable_encoder(task_pk)}/assignees",
625
+ method="POST",
626
+ json={
627
+ "type": type,
628
+ "users": users,
629
+ },
630
+ headers={
631
+ "content-type": "application/json",
632
+ },
633
+ request_options=request_options,
634
+ omit=OMIT,
635
+ )
636
+ try:
637
+ if 200 <= _response.status_code < 300:
638
+ return typing.cast(
639
+ TaskAssignment,
640
+ construct_type(
641
+ type_=TaskAssignment, # type: ignore
642
+ object_=_response.json(),
643
+ ),
644
+ )
645
+ _response_json = _response.json()
646
+ except JSONDecodeError:
647
+ raise ApiError(status_code=_response.status_code, body=_response.text)
648
+ raise ApiError(status_code=_response.status_code, body=_response_json)
649
+
650
+ async def delete(
651
+ self,
652
+ id: int,
653
+ task_pk: int,
654
+ *,
655
+ type: typing.Optional[AssignmentsDeleteRequestType] = None,
656
+ users: typing.Optional[str] = None,
657
+ request_options: typing.Optional[RequestOptions] = None,
658
+ ) -> None:
659
+ """
660
+ Remove assignees for a task within a specific project.
661
+
662
+ Parameters
663
+ ----------
664
+ id : int
665
+ A unique integer value identifying this project.
666
+
667
+ task_pk : int
668
+ A unique integer value identifying this task.
669
+
670
+ type : typing.Optional[AssignmentsDeleteRequestType]
671
+ Assignment type to delete (optional). If omitted, deletes all assignments for the task.
672
+
673
+ users : typing.Optional[str]
674
+ Comma separated list of user IDs to delete, as a string. If omitted, deletes all assignees for the given type.
675
+
676
+ request_options : typing.Optional[RequestOptions]
677
+ Request-specific configuration.
678
+
679
+ Returns
680
+ -------
681
+ None
682
+
683
+ Examples
684
+ --------
685
+ import asyncio
686
+
687
+ from label_studio_sdk import AsyncLabelStudio
688
+
689
+ client = AsyncLabelStudio(
690
+ api_key="YOUR_API_KEY",
691
+ )
692
+
693
+
694
+ async def main() -> None:
695
+ await client.projects.assignments.delete(
696
+ id=1,
697
+ task_pk=1,
698
+ )
699
+
700
+
701
+ asyncio.run(main())
702
+ """
703
+ _response = await self._client_wrapper.httpx_client.request(
704
+ f"api/projects/{jsonable_encoder(id)}/tasks/{jsonable_encoder(task_pk)}/assignees",
705
+ method="DELETE",
706
+ params={
707
+ "type": type,
708
+ "users": users,
709
+ },
710
+ request_options=request_options,
711
+ )
712
+ try:
713
+ if 200 <= _response.status_code < 300:
714
+ return
715
+ _response_json = _response.json()
716
+ except JSONDecodeError:
717
+ raise ApiError(status_code=_response.status_code, body=_response.text)
718
+ raise ApiError(status_code=_response.status_code, body=_response_json)
719
+
720
+ async def update(
721
+ self,
722
+ id: int,
723
+ task_pk: int,
724
+ *,
725
+ type: AssignmentsUpdateRequestType,
726
+ users: typing.Sequence[int],
727
+ request_options: typing.Optional[RequestOptions] = None,
728
+ ) -> TaskAssignment:
729
+ """
730
+ Update the assignee for a task in a specific project.
731
+
732
+ Parameters
733
+ ----------
734
+ id : int
735
+ A unique integer value identifying this project.
736
+
737
+ task_pk : int
738
+ A unique integer value identifying this task.
739
+
740
+ type : AssignmentsUpdateRequestType
741
+ Assignment type. Use AN for annotate or RE for review.
742
+
743
+ users : typing.Sequence[int]
744
+ List of user IDs to assign
745
+
746
+ request_options : typing.Optional[RequestOptions]
747
+ Request-specific configuration.
748
+
749
+ Returns
750
+ -------
751
+ TaskAssignment
752
+
753
+
754
+ Examples
755
+ --------
756
+ import asyncio
757
+
758
+ from label_studio_sdk import AsyncLabelStudio
759
+
760
+ client = AsyncLabelStudio(
761
+ api_key="YOUR_API_KEY",
762
+ )
763
+
764
+
765
+ async def main() -> None:
766
+ await client.projects.assignments.update(
767
+ id=1,
768
+ task_pk=1,
769
+ type="AN",
770
+ users=[1],
771
+ )
772
+
773
+
774
+ asyncio.run(main())
775
+ """
776
+ _response = await self._client_wrapper.httpx_client.request(
777
+ f"api/projects/{jsonable_encoder(id)}/tasks/{jsonable_encoder(task_pk)}/assignees",
778
+ method="PATCH",
779
+ json={
780
+ "type": type,
781
+ "users": users,
782
+ },
783
+ headers={
784
+ "content-type": "application/json",
785
+ },
786
+ request_options=request_options,
787
+ omit=OMIT,
788
+ )
789
+ try:
790
+ if 200 <= _response.status_code < 300:
791
+ return typing.cast(
792
+ TaskAssignment,
793
+ construct_type(
794
+ type_=TaskAssignment, # type: ignore
795
+ object_=_response.json(),
796
+ ),
797
+ )
798
+ _response_json = _response.json()
799
+ except JSONDecodeError:
800
+ raise ApiError(status_code=_response.status_code, body=_response.text)
801
+ raise ApiError(status_code=_response.status_code, body=_response_json)