scim2-client 0.6.1__py3-none-any.whl → 0.7.0__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.
- scim2_client/client.py +130 -146
- scim2_client/engines/httpx.py +84 -98
- scim2_client/engines/werkzeug.py +44 -52
- scim2_client-0.7.0.dist-info/METADATA +298 -0
- scim2_client-0.7.0.dist-info/RECORD +10 -0
- scim2_client-0.7.0.dist-info/WHEEL +4 -0
- scim2_client-0.6.1.dist-info/METADATA +0 -298
- scim2_client-0.6.1.dist-info/RECORD +0 -11
- scim2_client-0.6.1.dist-info/WHEEL +0 -4
- scim2_client-0.6.1.dist-info/licenses/LICENSE.md +0 -201
scim2_client/engines/httpx.py
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import sys
|
|
3
3
|
from contextlib import contextmanager
|
|
4
|
-
from typing import Optional
|
|
5
4
|
from typing import TypeVar
|
|
6
|
-
from typing import Union
|
|
7
5
|
|
|
8
6
|
from httpx import Client
|
|
9
7
|
from httpx import RequestError
|
|
@@ -72,15 +70,14 @@ class SyncSCIMClient(BaseSyncSCIMClient):
|
|
|
72
70
|
|
|
73
71
|
def create(
|
|
74
72
|
self,
|
|
75
|
-
resource:
|
|
76
|
-
check_request_payload:
|
|
77
|
-
check_response_payload:
|
|
78
|
-
expected_status_codes:
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
raise_scim_errors: Optional[bool] = None,
|
|
73
|
+
resource: AnyResource | dict,
|
|
74
|
+
check_request_payload: bool | None = None,
|
|
75
|
+
check_response_payload: bool | None = None,
|
|
76
|
+
expected_status_codes: list[int]
|
|
77
|
+
| None = BaseSyncSCIMClient.CREATION_RESPONSE_STATUS_CODES,
|
|
78
|
+
raise_scim_errors: bool | None = None,
|
|
82
79
|
**kwargs,
|
|
83
|
-
) ->
|
|
80
|
+
) -> AnyResource | Error | dict:
|
|
84
81
|
req = self._prepare_create_request(
|
|
85
82
|
resource=resource,
|
|
86
83
|
check_request_payload=check_request_payload,
|
|
@@ -105,17 +102,16 @@ class SyncSCIMClient(BaseSyncSCIMClient):
|
|
|
105
102
|
|
|
106
103
|
def query(
|
|
107
104
|
self,
|
|
108
|
-
resource_model:
|
|
109
|
-
id:
|
|
110
|
-
search_request:
|
|
111
|
-
check_request_payload:
|
|
112
|
-
check_response_payload:
|
|
113
|
-
expected_status_codes:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
raise_scim_errors: Optional[bool] = None,
|
|
105
|
+
resource_model: type[AnyResource] | None = None,
|
|
106
|
+
id: str | None = None,
|
|
107
|
+
search_request: SearchRequest | dict | None = None,
|
|
108
|
+
check_request_payload: bool | None = None,
|
|
109
|
+
check_response_payload: bool | None = None,
|
|
110
|
+
expected_status_codes: list[int]
|
|
111
|
+
| None = BaseSyncSCIMClient.QUERY_RESPONSE_STATUS_CODES,
|
|
112
|
+
raise_scim_errors: bool | None = None,
|
|
117
113
|
**kwargs,
|
|
118
|
-
) ->
|
|
114
|
+
) -> AnyResource | ListResponse[AnyResource] | Error | dict:
|
|
119
115
|
req = self._prepare_query_request(
|
|
120
116
|
resource_model=resource_model,
|
|
121
117
|
id=id,
|
|
@@ -144,15 +140,14 @@ class SyncSCIMClient(BaseSyncSCIMClient):
|
|
|
144
140
|
|
|
145
141
|
def search(
|
|
146
142
|
self,
|
|
147
|
-
search_request:
|
|
148
|
-
check_request_payload:
|
|
149
|
-
check_response_payload:
|
|
150
|
-
expected_status_codes:
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
raise_scim_errors: Optional[bool] = None,
|
|
143
|
+
search_request: SearchRequest | None = None,
|
|
144
|
+
check_request_payload: bool | None = None,
|
|
145
|
+
check_response_payload: bool | None = None,
|
|
146
|
+
expected_status_codes: list[int]
|
|
147
|
+
| None = BaseSyncSCIMClient.SEARCH_RESPONSE_STATUS_CODES,
|
|
148
|
+
raise_scim_errors: bool | None = None,
|
|
154
149
|
**kwargs,
|
|
155
|
-
) ->
|
|
150
|
+
) -> AnyResource | ListResponse[AnyResource] | Error | dict:
|
|
156
151
|
req = self._prepare_search_request(
|
|
157
152
|
search_request=search_request,
|
|
158
153
|
check_request_payload=check_request_payload,
|
|
@@ -179,13 +174,12 @@ class SyncSCIMClient(BaseSyncSCIMClient):
|
|
|
179
174
|
self,
|
|
180
175
|
resource_model: type,
|
|
181
176
|
id: str,
|
|
182
|
-
check_response_payload:
|
|
183
|
-
expected_status_codes:
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
raise_scim_errors: Optional[bool] = None,
|
|
177
|
+
check_response_payload: bool | None = None,
|
|
178
|
+
expected_status_codes: list[int]
|
|
179
|
+
| None = BaseSyncSCIMClient.DELETION_RESPONSE_STATUS_CODES,
|
|
180
|
+
raise_scim_errors: bool | None = None,
|
|
187
181
|
**kwargs,
|
|
188
|
-
) ->
|
|
182
|
+
) -> Error | dict | None:
|
|
189
183
|
req = self._prepare_delete_request(
|
|
190
184
|
resource_model=resource_model,
|
|
191
185
|
id=id,
|
|
@@ -208,15 +202,14 @@ class SyncSCIMClient(BaseSyncSCIMClient):
|
|
|
208
202
|
|
|
209
203
|
def replace(
|
|
210
204
|
self,
|
|
211
|
-
resource:
|
|
212
|
-
check_request_payload:
|
|
213
|
-
check_response_payload:
|
|
214
|
-
expected_status_codes:
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
raise_scim_errors: Optional[bool] = None,
|
|
205
|
+
resource: AnyResource | dict,
|
|
206
|
+
check_request_payload: bool | None = None,
|
|
207
|
+
check_response_payload: bool | None = None,
|
|
208
|
+
expected_status_codes: list[int]
|
|
209
|
+
| None = BaseSyncSCIMClient.REPLACEMENT_RESPONSE_STATUS_CODES,
|
|
210
|
+
raise_scim_errors: bool | None = None,
|
|
218
211
|
**kwargs,
|
|
219
|
-
) ->
|
|
212
|
+
) -> AnyResource | Error | dict:
|
|
220
213
|
req = self._prepare_replace_request(
|
|
221
214
|
resource=resource,
|
|
222
215
|
check_request_payload=check_request_payload,
|
|
@@ -243,15 +236,14 @@ class SyncSCIMClient(BaseSyncSCIMClient):
|
|
|
243
236
|
self,
|
|
244
237
|
resource_model: type[ResourceT],
|
|
245
238
|
id: str,
|
|
246
|
-
patch_op:
|
|
247
|
-
check_request_payload:
|
|
248
|
-
check_response_payload:
|
|
249
|
-
expected_status_codes:
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
raise_scim_errors: Optional[bool] = None,
|
|
239
|
+
patch_op: PatchOp[ResourceT] | dict,
|
|
240
|
+
check_request_payload: bool | None = None,
|
|
241
|
+
check_response_payload: bool | None = None,
|
|
242
|
+
expected_status_codes: list[int]
|
|
243
|
+
| None = BaseSyncSCIMClient.PATCH_RESPONSE_STATUS_CODES,
|
|
244
|
+
raise_scim_errors: bool | None = None,
|
|
253
245
|
**kwargs,
|
|
254
|
-
) ->
|
|
246
|
+
) -> ResourceT | Error | dict | None:
|
|
255
247
|
req = self._prepare_patch_request(
|
|
256
248
|
resource_model=resource_model,
|
|
257
249
|
id=id,
|
|
@@ -302,15 +294,14 @@ class AsyncSCIMClient(BaseAsyncSCIMClient):
|
|
|
302
294
|
|
|
303
295
|
async def create(
|
|
304
296
|
self,
|
|
305
|
-
resource:
|
|
306
|
-
check_request_payload:
|
|
307
|
-
check_response_payload:
|
|
308
|
-
expected_status_codes:
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
raise_scim_errors: Optional[bool] = None,
|
|
297
|
+
resource: AnyResource | dict,
|
|
298
|
+
check_request_payload: bool | None = None,
|
|
299
|
+
check_response_payload: bool | None = None,
|
|
300
|
+
expected_status_codes: list[int]
|
|
301
|
+
| None = BaseAsyncSCIMClient.CREATION_RESPONSE_STATUS_CODES,
|
|
302
|
+
raise_scim_errors: bool | None = None,
|
|
312
303
|
**kwargs,
|
|
313
|
-
) ->
|
|
304
|
+
) -> AnyResource | Error | dict:
|
|
314
305
|
req = self._prepare_create_request(
|
|
315
306
|
resource=resource,
|
|
316
307
|
check_request_payload=check_request_payload,
|
|
@@ -337,17 +328,16 @@ class AsyncSCIMClient(BaseAsyncSCIMClient):
|
|
|
337
328
|
|
|
338
329
|
async def query(
|
|
339
330
|
self,
|
|
340
|
-
resource_model:
|
|
341
|
-
id:
|
|
342
|
-
search_request:
|
|
343
|
-
check_request_payload:
|
|
344
|
-
check_response_payload:
|
|
345
|
-
expected_status_codes:
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
raise_scim_errors: Optional[bool] = None,
|
|
331
|
+
resource_model: type[Resource] | None = None,
|
|
332
|
+
id: str | None = None,
|
|
333
|
+
search_request: SearchRequest | dict | None = None,
|
|
334
|
+
check_request_payload: bool | None = None,
|
|
335
|
+
check_response_payload: bool | None = None,
|
|
336
|
+
expected_status_codes: list[int]
|
|
337
|
+
| None = BaseAsyncSCIMClient.QUERY_RESPONSE_STATUS_CODES,
|
|
338
|
+
raise_scim_errors: bool | None = None,
|
|
349
339
|
**kwargs,
|
|
350
|
-
) ->
|
|
340
|
+
) -> AnyResource | ListResponse[AnyResource] | Error | dict:
|
|
351
341
|
req = self._prepare_query_request(
|
|
352
342
|
resource_model=resource_model,
|
|
353
343
|
id=id,
|
|
@@ -376,15 +366,14 @@ class AsyncSCIMClient(BaseAsyncSCIMClient):
|
|
|
376
366
|
|
|
377
367
|
async def search(
|
|
378
368
|
self,
|
|
379
|
-
search_request:
|
|
380
|
-
check_request_payload:
|
|
381
|
-
check_response_payload:
|
|
382
|
-
expected_status_codes:
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
raise_scim_errors: Optional[bool] = None,
|
|
369
|
+
search_request: SearchRequest | None = None,
|
|
370
|
+
check_request_payload: bool | None = None,
|
|
371
|
+
check_response_payload: bool | None = None,
|
|
372
|
+
expected_status_codes: list[int]
|
|
373
|
+
| None = BaseAsyncSCIMClient.SEARCH_RESPONSE_STATUS_CODES,
|
|
374
|
+
raise_scim_errors: bool | None = None,
|
|
386
375
|
**kwargs,
|
|
387
|
-
) ->
|
|
376
|
+
) -> AnyResource | ListResponse[AnyResource] | Error | dict:
|
|
388
377
|
req = self._prepare_search_request(
|
|
389
378
|
search_request=search_request,
|
|
390
379
|
check_request_payload=check_request_payload,
|
|
@@ -413,13 +402,12 @@ class AsyncSCIMClient(BaseAsyncSCIMClient):
|
|
|
413
402
|
self,
|
|
414
403
|
resource_model: type,
|
|
415
404
|
id: str,
|
|
416
|
-
check_response_payload:
|
|
417
|
-
expected_status_codes:
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
raise_scim_errors: Optional[bool] = None,
|
|
405
|
+
check_response_payload: bool | None = None,
|
|
406
|
+
expected_status_codes: list[int]
|
|
407
|
+
| None = BaseAsyncSCIMClient.DELETION_RESPONSE_STATUS_CODES,
|
|
408
|
+
raise_scim_errors: bool | None = None,
|
|
421
409
|
**kwargs,
|
|
422
|
-
) ->
|
|
410
|
+
) -> Error | dict | None:
|
|
423
411
|
req = self._prepare_delete_request(
|
|
424
412
|
resource_model=resource_model,
|
|
425
413
|
id=id,
|
|
@@ -442,15 +430,14 @@ class AsyncSCIMClient(BaseAsyncSCIMClient):
|
|
|
442
430
|
|
|
443
431
|
async def replace(
|
|
444
432
|
self,
|
|
445
|
-
resource:
|
|
446
|
-
check_request_payload:
|
|
447
|
-
check_response_payload:
|
|
448
|
-
expected_status_codes:
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
raise_scim_errors: Optional[bool] = None,
|
|
433
|
+
resource: AnyResource | dict,
|
|
434
|
+
check_request_payload: bool | None = None,
|
|
435
|
+
check_response_payload: bool | None = None,
|
|
436
|
+
expected_status_codes: list[int]
|
|
437
|
+
| None = BaseAsyncSCIMClient.REPLACEMENT_RESPONSE_STATUS_CODES,
|
|
438
|
+
raise_scim_errors: bool | None = None,
|
|
452
439
|
**kwargs,
|
|
453
|
-
) ->
|
|
440
|
+
) -> AnyResource | Error | dict:
|
|
454
441
|
req = self._prepare_replace_request(
|
|
455
442
|
resource=resource,
|
|
456
443
|
check_request_payload=check_request_payload,
|
|
@@ -479,15 +466,14 @@ class AsyncSCIMClient(BaseAsyncSCIMClient):
|
|
|
479
466
|
self,
|
|
480
467
|
resource_model: type[ResourceT],
|
|
481
468
|
id: str,
|
|
482
|
-
patch_op:
|
|
483
|
-
check_request_payload:
|
|
484
|
-
check_response_payload:
|
|
485
|
-
expected_status_codes:
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
raise_scim_errors: Optional[bool] = None,
|
|
469
|
+
patch_op: PatchOp[ResourceT] | dict,
|
|
470
|
+
check_request_payload: bool | None = None,
|
|
471
|
+
check_response_payload: bool | None = None,
|
|
472
|
+
expected_status_codes: list[int]
|
|
473
|
+
| None = BaseAsyncSCIMClient.PATCH_RESPONSE_STATUS_CODES,
|
|
474
|
+
raise_scim_errors: bool | None = None,
|
|
489
475
|
**kwargs,
|
|
490
|
-
) ->
|
|
476
|
+
) -> ResourceT | Error | dict | None:
|
|
491
477
|
req = self._prepare_patch_request(
|
|
492
478
|
resource_model=resource_model,
|
|
493
479
|
id=id,
|
scim2_client/engines/werkzeug.py
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from contextlib import contextmanager
|
|
3
|
-
from typing import Optional
|
|
4
3
|
from typing import TypeVar
|
|
5
|
-
from typing import Union
|
|
6
4
|
from urllib.parse import urlencode
|
|
7
5
|
|
|
8
6
|
from scim2_models import AnyResource
|
|
@@ -80,7 +78,7 @@ class TestSCIMClient(BaseSyncSCIMClient):
|
|
|
80
78
|
def __init__(
|
|
81
79
|
self,
|
|
82
80
|
client: Client,
|
|
83
|
-
environ:
|
|
81
|
+
environ: dict | None = None,
|
|
84
82
|
scim_prefix: str = "",
|
|
85
83
|
*args,
|
|
86
84
|
**kwargs,
|
|
@@ -90,7 +88,7 @@ class TestSCIMClient(BaseSyncSCIMClient):
|
|
|
90
88
|
self.scim_prefix = scim_prefix
|
|
91
89
|
self.environ = environ or {}
|
|
92
90
|
|
|
93
|
-
def _make_url(self, url:
|
|
91
|
+
def _make_url(self, url: str | None) -> str:
|
|
94
92
|
url = url or ""
|
|
95
93
|
prefix = (
|
|
96
94
|
self.scim_prefix[:-1]
|
|
@@ -105,15 +103,14 @@ class TestSCIMClient(BaseSyncSCIMClient):
|
|
|
105
103
|
|
|
106
104
|
def create(
|
|
107
105
|
self,
|
|
108
|
-
resource:
|
|
109
|
-
check_request_payload:
|
|
110
|
-
check_response_payload:
|
|
111
|
-
expected_status_codes:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
raise_scim_errors: Optional[bool] = None,
|
|
106
|
+
resource: AnyResource | dict,
|
|
107
|
+
check_request_payload: bool | None = None,
|
|
108
|
+
check_response_payload: bool | None = None,
|
|
109
|
+
expected_status_codes: list[int]
|
|
110
|
+
| None = BaseSyncSCIMClient.CREATION_RESPONSE_STATUS_CODES,
|
|
111
|
+
raise_scim_errors: bool | None = None,
|
|
115
112
|
**kwargs,
|
|
116
|
-
) ->
|
|
113
|
+
) -> AnyResource | Error | dict:
|
|
117
114
|
req = self._prepare_create_request(
|
|
118
115
|
resource=resource,
|
|
119
116
|
check_request_payload=check_request_payload,
|
|
@@ -140,17 +137,16 @@ class TestSCIMClient(BaseSyncSCIMClient):
|
|
|
140
137
|
|
|
141
138
|
def query(
|
|
142
139
|
self,
|
|
143
|
-
resource_model:
|
|
144
|
-
id:
|
|
145
|
-
search_request:
|
|
146
|
-
check_request_payload:
|
|
147
|
-
check_response_payload:
|
|
148
|
-
expected_status_codes:
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
raise_scim_errors: Optional[bool] = None,
|
|
140
|
+
resource_model: type[AnyResource] | None = None,
|
|
141
|
+
id: str | None = None,
|
|
142
|
+
search_request: SearchRequest | dict | None = None,
|
|
143
|
+
check_request_payload: bool | None = None,
|
|
144
|
+
check_response_payload: bool | None = None,
|
|
145
|
+
expected_status_codes: list[int]
|
|
146
|
+
| None = BaseSyncSCIMClient.QUERY_RESPONSE_STATUS_CODES,
|
|
147
|
+
raise_scim_errors: bool | None = None,
|
|
152
148
|
**kwargs,
|
|
153
|
-
) ->
|
|
149
|
+
) -> AnyResource | ListResponse[AnyResource] | Error | dict:
|
|
154
150
|
req = self._prepare_query_request(
|
|
155
151
|
resource_model=resource_model,
|
|
156
152
|
id=id,
|
|
@@ -180,15 +176,14 @@ class TestSCIMClient(BaseSyncSCIMClient):
|
|
|
180
176
|
|
|
181
177
|
def search(
|
|
182
178
|
self,
|
|
183
|
-
search_request:
|
|
184
|
-
check_request_payload:
|
|
185
|
-
check_response_payload:
|
|
186
|
-
expected_status_codes:
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
raise_scim_errors: Optional[bool] = None,
|
|
179
|
+
search_request: SearchRequest | None = None,
|
|
180
|
+
check_request_payload: bool | None = None,
|
|
181
|
+
check_response_payload: bool | None = None,
|
|
182
|
+
expected_status_codes: list[int]
|
|
183
|
+
| None = BaseSyncSCIMClient.SEARCH_RESPONSE_STATUS_CODES,
|
|
184
|
+
raise_scim_errors: bool | None = None,
|
|
190
185
|
**kwargs,
|
|
191
|
-
) ->
|
|
186
|
+
) -> AnyResource | ListResponse[AnyResource] | Error | dict:
|
|
192
187
|
req = self._prepare_search_request(
|
|
193
188
|
search_request=search_request,
|
|
194
189
|
check_request_payload=check_request_payload,
|
|
@@ -217,13 +212,12 @@ class TestSCIMClient(BaseSyncSCIMClient):
|
|
|
217
212
|
self,
|
|
218
213
|
resource_model: type,
|
|
219
214
|
id: str,
|
|
220
|
-
check_response_payload:
|
|
221
|
-
expected_status_codes:
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
raise_scim_errors: Optional[bool] = None,
|
|
215
|
+
check_response_payload: bool | None = None,
|
|
216
|
+
expected_status_codes: list[int]
|
|
217
|
+
| None = BaseSyncSCIMClient.DELETION_RESPONSE_STATUS_CODES,
|
|
218
|
+
raise_scim_errors: bool | None = None,
|
|
225
219
|
**kwargs,
|
|
226
|
-
) ->
|
|
220
|
+
) -> Error | dict | None:
|
|
227
221
|
req = self._prepare_delete_request(
|
|
228
222
|
resource_model=resource_model,
|
|
229
223
|
id=id,
|
|
@@ -246,15 +240,14 @@ class TestSCIMClient(BaseSyncSCIMClient):
|
|
|
246
240
|
|
|
247
241
|
def replace(
|
|
248
242
|
self,
|
|
249
|
-
resource:
|
|
250
|
-
check_request_payload:
|
|
251
|
-
check_response_payload:
|
|
252
|
-
expected_status_codes:
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
raise_scim_errors: Optional[bool] = None,
|
|
243
|
+
resource: AnyResource | dict,
|
|
244
|
+
check_request_payload: bool | None = None,
|
|
245
|
+
check_response_payload: bool | None = None,
|
|
246
|
+
expected_status_codes: list[int]
|
|
247
|
+
| None = BaseSyncSCIMClient.REPLACEMENT_RESPONSE_STATUS_CODES,
|
|
248
|
+
raise_scim_errors: bool | None = None,
|
|
256
249
|
**kwargs,
|
|
257
|
-
) ->
|
|
250
|
+
) -> AnyResource | Error | dict:
|
|
258
251
|
req = self._prepare_replace_request(
|
|
259
252
|
resource=resource,
|
|
260
253
|
check_request_payload=check_request_payload,
|
|
@@ -281,15 +274,14 @@ class TestSCIMClient(BaseSyncSCIMClient):
|
|
|
281
274
|
self,
|
|
282
275
|
resource_model: type[ResourceT],
|
|
283
276
|
id: str,
|
|
284
|
-
patch_op:
|
|
285
|
-
check_request_payload:
|
|
286
|
-
check_response_payload:
|
|
287
|
-
expected_status_codes:
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
raise_scim_errors: Optional[bool] = None,
|
|
277
|
+
patch_op: PatchOp[ResourceT] | dict,
|
|
278
|
+
check_request_payload: bool | None = None,
|
|
279
|
+
check_response_payload: bool | None = None,
|
|
280
|
+
expected_status_codes: list[int]
|
|
281
|
+
| None = BaseSyncSCIMClient.PATCH_RESPONSE_STATUS_CODES,
|
|
282
|
+
raise_scim_errors: bool | None = None,
|
|
291
283
|
**kwargs,
|
|
292
|
-
) ->
|
|
284
|
+
) -> ResourceT | Error | dict | None:
|
|
293
285
|
req = self._prepare_patch_request(
|
|
294
286
|
resource_model=resource_model,
|
|
295
287
|
id=id,
|