Skip to content
This repository was archived by the owner on Jun 28, 2024. It is now read-only.

Commit 8021cdc

Browse files
fix: Update Devices and UnmanagedDevices clients (#101)
* Update Devices and UnmanagedDevices clients * Update types + test new params * Fix types, test list_device_providers * Fix import * More updates for types and params * Minor fixes
1 parent 474dcc0 commit 8021cdc

File tree

5 files changed

+230
-39
lines changed

5 files changed

+230
-39
lines changed

seamapi/access_codes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
class AccessCodes(AbstractAccessCodes):
2020
"""
21-
A class used to retreive access code data
21+
A class used to retrieve access code data
2222
through interaction with Seam API
2323
2424
...

seamapi/connected_accounts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def list(self) -> List[ConnectedAccount]:
7171
user_identifier=json_account["user_identifier"],
7272
account_type=json_account["account_type"],
7373
errors=json_account.get("errors", []),
74-
custom_metadata=json_account.get("custom_metadata", {})
74+
custom_metadata=json_account.get("custom_metadata", {}),
7575
)
7676
for json_account in json_accounts
7777
]

seamapi/devices.py

Lines changed: 101 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
AbstractSeam as Seam,
1212
DeviceType,
1313
)
14-
from typing import List, Union, Optional
14+
from typing import Any, List, Union, Optional, Dict
1515
from seamapi.utils.convert_to_id import (
1616
to_connect_webview_id,
1717
to_connected_account_id,
@@ -34,12 +34,14 @@ class Devices(AbstractDevices):
3434
3535
Methods
3636
-------
37-
list(connected_account=None, connect_webview=None, device_type=None, device_ids=None)
37+
list(connected_account=None, connected_accounts=None, connect_webview=None, device_type=None, device_ids=None, manufacturer=None)
3838
Gets a list of devices
3939
get(device=None, name=None)
4040
Gets a device
4141
update(device, name=None, properties=None, location=None)
4242
Updates a device
43+
list_device_providers(provider_category=None):
44+
Gets a list of device providers
4345
"""
4446

4547
seam: Seam
@@ -59,22 +61,33 @@ def __init__(self, seam: Seam):
5961
def list(
6062
self,
6163
connected_account: Union[ConnectedAccountId, ConnectedAccount] = None,
64+
connected_accounts: List[
65+
Union[ConnectedAccountId, ConnectedAccount]
66+
] = None,
6267
connect_webview: Union[ConnectWebviewId, ConnectWebview] = None,
6368
device_type: Optional[DeviceType] = None,
64-
device_ids: Optional[list] = None,
69+
device_types: Optional[List[DeviceType]] = None,
70+
device_ids: Optional[List[Union[DeviceId, Device]]] = None,
71+
manufacturer: Optional[str] = None,
6572
) -> List[Device]:
6673
"""Gets a list of devices.
6774
6875
Parameters
6976
----------
7077
connected_account : ConnectedAccountId or ConnectedAccount, optional
7178
Connected account id or ConnectedAccount to get devices associated with
79+
connected_accounts : ConnectedAccountId(s) or ConnectedAccount(s), optional
80+
Connected account ids or ConnectedAccount(s) to get devices associated with
7281
connect_webview : ConnectWebviewId or ConnectWebview, optional
7382
Connect webview id or ConnectWebview to get devices associated with
7483
device_type : DeviceType, optional
7584
Device type e.g. august_lock
76-
device_ids : Optional[list]
85+
device_types : List[DeviceType], optional
86+
List of device types e.g. august_lock
87+
device_ids : Optional[List[Union[DeviceId, Device]]]
7788
Device IDs to filter devices by
89+
manufacturer : Optional[str]
90+
Manufacturer name to filter devices by e.g. august, schlage
7891
7992
Raises
8093
------
@@ -88,9 +101,12 @@ def list(
88101

89102
params = parse_list_params(
90103
connected_account,
104+
connected_accounts,
91105
connect_webview,
92106
device_type,
93-
device_ids
107+
device_types,
108+
device_ids,
109+
manufacturer,
94110
)
95111

96112
res = self.seam.make_request(
@@ -209,7 +225,7 @@ def delete(self, device: Union[DeviceId, Device]) -> bool:
209225
210226
Returns
211227
------
212-
None
228+
Boolean
213229
"""
214230

215231
if not device:
@@ -222,7 +238,41 @@ def delete(self, device: Union[DeviceId, Device]) -> bool:
222238
json=delete_payload,
223239
)
224240

225-
return None
241+
return True
242+
243+
@report_error
244+
def list_device_providers(
245+
self, provider_category: Optional[str] = None
246+
) -> List[Dict[str, Any]]:
247+
"""Retrieve a list of device providers
248+
249+
Parameters
250+
----------
251+
provider_category : Optional[str]
252+
Provider category to filter by eg. stable
253+
254+
Raises
255+
------
256+
Exception
257+
If the API request wasn't successful.
258+
259+
Returns
260+
------
261+
List of device providers
262+
"""
263+
params = {}
264+
265+
if provider_category:
266+
params["provider_category"] = provider_category
267+
268+
res = self.seam.make_request(
269+
"GET",
270+
"/devices/list_device_providers",
271+
params=params,
272+
)
273+
274+
return res["device_providers"]
275+
226276

227277
class UnmanagedDevices(AbstractUnmanagedDevices):
228278
"""
@@ -238,9 +288,9 @@ class UnmanagedDevices(AbstractUnmanagedDevices):
238288
239289
Methods
240290
-------
241-
list(connected_account=None, connect_webview=None, device_type=None, device_ids=None)
291+
list(connected_account=None, connected_accounts=None, connect_webview=None, device_type=None, device_ids=None, manufacturer=None)
242292
Gets a list of unmanaged devices
243-
update(device, is_managed=False)
293+
update(device, is_managed)
244294
Updates an unmanaged device
245295
"""
246296

@@ -260,22 +310,33 @@ def __init__(self, seam: Seam):
260310
def list(
261311
self,
262312
connected_account: Union[ConnectedAccountId, ConnectedAccount] = None,
313+
connected_accounts: List[
314+
Union[ConnectedAccountId, ConnectedAccount]
315+
] = None,
263316
connect_webview: Union[ConnectWebviewId, ConnectWebview] = None,
264317
device_type: Optional[DeviceType] = None,
265-
device_ids: Optional[list] = None,
266-
) -> List[Device]:
267-
"""Gets a list of devices.
318+
device_types: Optional[List[DeviceType]] = None,
319+
device_ids: Optional[List[Union[DeviceId, Device]]] = None,
320+
manufacturer: Optional[str] = None,
321+
) -> List[UnmanagedDevice]:
322+
"""Gets a list of unmanaged devices.
268323
269324
Parameters
270325
----------
271326
connected_account : ConnectedAccountId or ConnectedAccount, optional
272327
Connected account id or ConnectedAccount to get devices associated with
328+
connected_accounts : ConnectedAccountId(s) or ConnectedAccount(s), optional
329+
Connected account ids or ConnectedAccount(s) to get devices associated with
273330
connect_webview : ConnectWebviewId or ConnectWebview, optional
274331
Connect webview id or ConnectWebview to get devices associated with
275332
device_type : DeviceType, optional
276333
Device type e.g. august_lock
277-
device_ids : Optional[list]
334+
device_types : List[DeviceType], optional
335+
List of device types e.g. august_lock
336+
device_ids : Optional[List[Union[DeviceId, Device]]]
278337
Device IDs to filter devices by
338+
manufacturer : Optional[str]
339+
Manufacturer name to filter devices by e.g. august, schlage
279340
280341
Raises
281342
------
@@ -284,14 +345,17 @@ def list(
284345
285346
Returns
286347
------
287-
A list of devices.
348+
A list of unmanaged devices.
288349
"""
289350

290351
params = parse_list_params(
291352
connected_account,
353+
connected_accounts,
292354
connect_webview,
293355
device_type,
294-
device_ids
356+
device_types,
357+
device_ids,
358+
manufacturer,
295359
)
296360

297361
res = self.seam.make_request(
@@ -307,15 +371,15 @@ def list(
307371
def update(
308372
self,
309373
device: Union[DeviceId, UnmanagedDevice],
310-
is_managed: Optional[bool] = False,
374+
is_managed: bool,
311375
) -> bool:
312-
"""Updates a device.
376+
"""Updates a device transitioning it from an unmanaged state to a managed one.
313377
314378
Parameters
315379
----------
316380
device : DeviceId or Device
317381
Device id or Device to update
318-
is_managed : bool, optional
382+
is_managed : bool
319383
The managed state of the device
320384
321385
Raises
@@ -331,37 +395,44 @@ def update(
331395
if not device:
332396
raise Exception("device is required")
333397

334-
update_payload = {
335-
"device_id": to_device_id(device),
336-
}
337-
if is_managed is not None:
338-
update_payload["is_managed"] = is_managed
339-
340398
self.seam.make_request(
341399
"POST",
342400
"/devices/unmanaged/update",
343-
json=update_payload,
401+
json={
402+
"device_id": to_device_id(device),
403+
"is_managed": is_managed,
404+
},
344405
)
345406

346407
return True
347408

348-
def parse_list_params (
409+
410+
def parse_list_params(
349411
connected_account,
412+
connected_accounts,
350413
connect_webview,
351414
device_type,
415+
device_types,
352416
device_ids,
417+
manufacturer,
353418
):
354419
params = {}
355420
if connected_account:
356421
params["connected_account_id"] = to_connected_account_id(
357422
connected_account
358423
)
424+
if connected_accounts:
425+
params["connected_account_ids"] = [
426+
to_connected_account_id(ca) for ca in connected_accounts
427+
]
359428
if connect_webview:
360-
params["connect_webview_id"] = to_connect_webview_id(
361-
connect_webview
362-
)
429+
params["connect_webview_id"] = to_connect_webview_id(connect_webview)
363430
if device_type:
364431
params["device_type"] = device_type
432+
if device_types is not None:
433+
params["device_types"] = device_types
365434
if device_ids is not None:
366-
params["device_ids"] = [to_device_id(d) for d in device_ids]
435+
params["device_ids"] = [to_device_id(d) for d in device_ids]
436+
if manufacturer:
437+
params["manufacturer"] = manufacturer
367438
return params

0 commit comments

Comments
 (0)