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

Commit 8663cf7

Browse files
authored
Merge pull request #15 from seamapi/andrii-docs
2 parents 8cd89b7 + 95bdb62 commit 8663cf7

File tree

10 files changed

+690
-86
lines changed

10 files changed

+690
-86
lines changed

seamapi/access_codes.py

Lines changed: 50 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,10 @@
99
)
1010
from typing import List, Optional, Union, Any
1111
import requests
12-
13-
14-
def to_access_code_id(access_code: Union[AccessCodeId, AccessCode]) -> str:
15-
if isinstance(access_code, str):
16-
return access_code
17-
return access_code.access_code_id
18-
19-
20-
def to_device_id(device: Union[DeviceId, Device]) -> str:
21-
if isinstance(device, str):
22-
return device
23-
return device.device_id
12+
from seamapi.utils.convert_to_id import to_access_code_id, to_device_id
2413

2514

2615
class AccessCodes(AbstractAccessCodes):
27-
seam: Seam
2816
"""
2917
A class used to retreive access code data
3018
through interaction with Seam API
@@ -33,26 +21,28 @@ class AccessCodes(AbstractAccessCodes):
3321
3422
Attributes
3523
----------
36-
seam : dict
24+
seam : Seam
3725
Initial seam class
3826
3927
Methods
4028
-------
4129
list(device)
4230
Gets a list of access codes for a device
43-
get(access_code)
31+
get(access_code=None, device=None)
4432
Gets a certain access code of a device
45-
create(device, name, code=None, starts_at=None, ends_at=None)
33+
create(device, name=None, code=None, starts_at=None, ends_at=None)
4634
Creates an access code on a device
47-
delete(access_code)
35+
delete(access_code, device=None)
4836
Deletes an access code on a device
4937
"""
5038

39+
seam: Seam
40+
5141
def __init__(self, seam: Seam):
5242
"""
5343
Parameters
5444
----------
55-
seam : dict
45+
seam : Seam
5646
Intial seam class
5747
"""
5848

@@ -63,8 +53,8 @@ def list(self, device: Union[DeviceId, Device]) -> List[AccessCode]:
6353
6454
Parameters
6555
----------
66-
device : str or dict
67-
Device id or device dict
56+
device : DeviceId or Device
57+
Device id or Device to list access codes for
6858
6959
Raises
7060
------
@@ -73,7 +63,7 @@ def list(self, device: Union[DeviceId, Device]) -> List[AccessCode]:
7363
7464
Returns
7565
------
76-
A list of access codes for a device
66+
A list of access codes for a device.
7767
"""
7868

7969
device_id = to_device_id(device)
@@ -86,13 +76,19 @@ def list(self, device: Union[DeviceId, Device]) -> List[AccessCode]:
8676
access_codes = res.json()["access_codes"]
8777
return [AccessCode.from_dict(ac) for ac in access_codes]
8878

89-
def get(self, access_code: Union[AccessCodeId, AccessCode]) -> AccessCode:
90-
"""Gets a certain access code of a device.
79+
def get(
80+
self,
81+
access_code: Optional[Union[AccessCodeId, AccessCode]] = None,
82+
device: Optional[Union[DeviceId, AccessCode]] = None,
83+
) -> AccessCode:
84+
"""Gets a certain access code for a device.
9185
9286
Parameters
9387
----------
94-
access_code : str or dict
95-
Access code id or access code dict
88+
access_code : AccessCodeId or AccessCode, optional
89+
Access code id or AccessCode to get latest version of
90+
device : DeviceId or Device, optional
91+
Device id or Device to get an access code for
9692
9793
Raises
9894
------
@@ -101,14 +97,18 @@ def get(self, access_code: Union[AccessCodeId, AccessCode]) -> AccessCode:
10197
10298
Returns
10399
------
104-
An access code dict
100+
AccessCode
105101
"""
106102

107-
access_code_id = to_access_code_id(access_code)
103+
params = {}
104+
if access_code:
105+
params["access_code_id"] = to_access_code_id(access_code)
106+
if device:
107+
params["device_id"] = to_device_id(device)
108108
res = requests.get(
109109
f"{self.seam.api_url}/access_codes/get",
110110
headers={"Authorization": f"Bearer {self.seam.api_key}"},
111-
params={"access_code_id": access_code_id},
111+
params=params,
112112
)
113113
if not res.ok:
114114
raise Exception(res.text)
@@ -117,7 +117,7 @@ def get(self, access_code: Union[AccessCodeId, AccessCode]) -> AccessCode:
117117
def create(
118118
self,
119119
device: Union[DeviceId, Device],
120-
name: str,
120+
name: Optional[str] = None,
121121
code: Optional[str] = None,
122122
starts_at: Optional[str] = None,
123123
ends_at: Optional[str] = None,
@@ -126,9 +126,9 @@ def create(
126126
127127
Parameters
128128
----------
129-
device : str or dict
130-
Device id or device dict
131-
name : str
129+
device : DeviceId or Device
130+
Device id or Device to create an access code for
131+
name : str, optional
132132
Access code name
133133
code : str, optional
134134
Access code value
@@ -144,11 +144,13 @@ def create(
144144
145145
Returns
146146
------
147-
Access code dict
147+
AccessCode
148148
"""
149149

150150
device_id = to_device_id(device)
151-
create_payload = {"device_id": device_id, "name": name}
151+
create_payload = {"device_id": device_id}
152+
if name is not None:
153+
create_payload["name"] = name
152154
if code is not None:
153155
create_payload["code"] = code
154156
if starts_at is not None:
@@ -168,13 +170,19 @@ def create(
168170
success_res: Any = action_attempt.result
169171
return AccessCode.from_dict(success_res["access_code"])
170172

171-
def delete(self, access_code: Union[AccessCodeId, AccessCode]) -> ActionAttempt:
173+
def delete(
174+
self,
175+
access_code: Union[AccessCodeId, AccessCode],
176+
device: Optional[Union[DeviceId, AccessCode]] = None,
177+
) -> ActionAttempt:
172178
"""Deletes an access code on a device.
173179
174180
Parameters
175181
----------
176-
access_code : str or dict
177-
Access code id or access code dict
182+
access_code : AccessCodeId or AccessCode
183+
Access code id or AccessCode to delete it
184+
device : DeviceId or Device, optional
185+
Device id or Device to delete an access code on
178186
179187
Raises
180188
------
@@ -185,14 +193,17 @@ def delete(self, access_code: Union[AccessCodeId, AccessCode]) -> ActionAttempt:
185193
186194
Returns
187195
------
188-
An access code dict
196+
ActionAttempt
189197
"""
190198

191199
access_code_id = to_access_code_id(access_code)
200+
create_payload = {"access_code_id": access_code_id}
201+
if device is not None:
202+
create_payload["device_id"] = to_device_id(device)
192203
res = requests.delete(
193204
(f"{self.seam.api_url}/access_codes/delete"),
194205
headers={"Authorization": f"Bearer {self.seam.api_key}"},
195-
json={"access_code_id": access_code_id},
206+
json=create_payload,
196207
)
197208
if not res.ok:
198209
raise Exception(res.text)

seamapi/action_attempts.py

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,61 @@
88
import time
99
import requests
1010
from typing import Union
11+
from seamapi.utils.convert_to_id import to_action_attempt_id
1112

1213

13-
def to_action_attempt_id(action_attempt: Union[ActionAttemptId, ActionAttempt]) -> str:
14-
if isinstance(action_attempt, str):
15-
return action_attempt
16-
return action_attempt.action_attempt_id
14+
class ActionAttempts(AbstractActionAttempts):
15+
"""
16+
A class used to retrieve action attempt data
17+
through interaction with Seam API
1718
19+
...
20+
21+
Attributes
22+
----------
23+
seam : Seam
24+
Initial seam class
25+
26+
Methods
27+
-------
28+
get(action_attempt)
29+
Gets data about an action attempt
30+
poll_until_ready(action_attempt)
31+
Polls an action attempt until its status is 'success' or 'error'
32+
"""
1833

19-
class ActionAttempts(AbstractActionAttempts):
2034
seam: Seam
2135

2236
def __init__(self, seam: Seam):
37+
"""
38+
Parameters
39+
----------
40+
seam : Seam
41+
Initial seam class
42+
"""
43+
2344
self.seam = seam
2445

2546
def get(
2647
self, action_attempt: Union[ActionAttemptId, ActionAttempt]
2748
) -> ActionAttempt:
49+
"""Gets data about an action attempt.
50+
51+
Parameters
52+
----------
53+
action_attempt : ActionAttemptId or ActionAttempt
54+
Action attempt id or ActionAttempt to get latest state of
55+
56+
Raises
57+
------
58+
Exception
59+
If the API request wasn't successful.
60+
61+
Returns
62+
------
63+
ActionAttempt
64+
"""
65+
2866
action_attempt_id = to_action_attempt_id(action_attempt)
2967
res = requests.get(
3068
f"{self.seam.api_url}/action_attempts/get",
@@ -51,9 +89,23 @@ def get(
5189
def poll_until_ready(
5290
self, action_attempt: Union[ActionAttemptId, ActionAttempt]
5391
) -> ActionAttempt:
92+
"""
93+
Polls an action attempt until its status is 'success' or 'error'.
94+
95+
Parameters
96+
----------
97+
action_attempt : ActionAttemptId or ActionAttempt
98+
Action attempt id or ActionAttempt to be polled
99+
100+
Returns
101+
------
102+
ActionAttempt
103+
"""
104+
54105
updated_action_attempt = None
55106
while (
56-
updated_action_attempt is None or updated_action_attempt.status == "pending"
107+
updated_action_attempt is None
108+
or updated_action_attempt.status == "pending"
57109
):
58110
updated_action_attempt = self.get(action_attempt)
59111
time.sleep(0.25)

0 commit comments

Comments
 (0)