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

Commit 066370d

Browse files
Implement backup codes (#116)
* Add missing props related to codes, add * Fix pull_backup_access_code method * Format
1 parent 1bd5bdb commit 066370d

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

seamapi/access_codes.py

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,12 @@ class AccessCodes(AbstractAccessCodes):
3434
Gets a list of access codes for a device
3535
get(access_code=None, device=None)
3636
Gets a certain access code of a device
37-
create(device, name=None, code=None, starts_at=None, ends_at=None)
37+
create(device, name=None, code=None, starts_at=None, ends_at=None, attempt_for_offline_device=None, wait_for_code=None, timeout=None, allow_external_modification=None, prefer_native_scheduling=None, use_backup_access_code_pool=None)
3838
Creates an access code on a device
3939
delete(access_code, device=None)
4040
Deletes an access code on a device
41+
pull_backup_access_code(access_code)
42+
Pulls a backup access code.
4143
"""
4244

4345
seam: Seam
@@ -147,6 +149,9 @@ def create(
147149
attempt_for_offline_device: Optional[bool] = True,
148150
wait_for_code: Optional[bool] = False,
149151
timeout: Optional[int] = 300,
152+
allow_external_modification: Optional[bool] = None,
153+
prefer_native_scheduling: Optional[bool] = None,
154+
use_backup_access_code_pool: Optional[bool] = None,
150155
) -> AccessCode:
151156
"""Creates an access code on a device.
152157
@@ -169,6 +174,12 @@ def create(
169174
Poll the access code until the code is known.
170175
timeout : int, optional:
171176
Maximum polling time in seconds.
177+
allow_external_modification : bool, optional:
178+
Allow external modifications of the access code e.g. through the lock provider's app. False by default.
179+
prefer_native_scheduling : bool, optional:
180+
Where possible, prefer lock provider's native access code scheduling. True by default.
181+
use_backup_access_code_pool : bool, optional:
182+
Activate backup access code pool. False by default.
172183
173184
Raises
174185
------
@@ -198,6 +209,18 @@ def create(
198209
create_payload[
199210
"attempt_for_offline_device"
200211
] = attempt_for_offline_device
212+
if allow_external_modification is not None:
213+
create_payload[
214+
"allow_external_modification"
215+
] = allow_external_modification
216+
if prefer_native_scheduling is not None:
217+
create_payload[
218+
"prefer_native_scheduling"
219+
] = prefer_native_scheduling
220+
if use_backup_access_code_pool is not None:
221+
create_payload[
222+
"use_backup_access_code_pool"
223+
] = use_backup_access_code_pool
201224

202225
if (
203226
wait_for_code
@@ -241,7 +264,7 @@ def create(
241264
errors=access_code.errors,
242265
)
243266

244-
access_code = access_codes.get(access_code)
267+
access_code = self.seam.access_codes.get(access_code)
245268

246269
return access_code
247270

@@ -417,3 +440,33 @@ def delete(
417440
)
418441

419442
return action_attempt
443+
444+
@report_error
445+
def pull_backup_access_code(
446+
self,
447+
access_code: Union[AccessCode, AccessCodeId],
448+
) -> AccessCode:
449+
"""Pulls a backup access code.
450+
451+
Parameters
452+
----------
453+
access_code : Union[AccessCode, AccessCodeId]
454+
Access code ID or AccessCode
455+
456+
Raises
457+
------
458+
Exception
459+
If the API request wasn't successful.
460+
461+
Returns
462+
------
463+
AccessCode
464+
"""
465+
466+
res = self.seam.make_request(
467+
"POST",
468+
"/access_codes/pull_backup_access_code",
469+
json={"access_code_id": to_access_code_id(access_code)},
470+
)
471+
472+
return AccessCode.from_dict(res["backup_access_code"])

seamapi/types.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,21 @@ class ConnectedAccount:
194194
@dataclass
195195
class AccessCode:
196196
access_code_id: str
197+
device_id: str
197198
type: str
198199
code: str
200+
created_at: str
199201
starts_at: Optional[str] = None
200202
ends_at: Optional[str] = None
201203
name: Optional[str] = ""
202204
status: Optional[str] = None
203205
common_code_key: Optional[str] = None
206+
is_managed: Optional[bool] = None
207+
is_waiting_for_code_assignment: Optional[bool] = None
208+
is_scheduled_on_device: Optional[bool] = None
209+
pulled_backup_access_code_id: Optional[str] = None
210+
is_backup_access_code_available: Optional[bool] = None
211+
is_backup: Optional[bool] = None
204212

205213

206214
@dataclass
@@ -331,13 +339,18 @@ def create_multiple(
331339

332340
@abc.abstractmethod
333341
def create(
334-
self,
335342
device: Union[DeviceId, Device],
336343
name: Optional[str] = None,
337344
code: Optional[str] = None,
338345
starts_at: Optional[str] = None,
339346
ends_at: Optional[str] = None,
340347
common_code_key: Optional[str] = None,
348+
attempt_for_offline_device: Optional[bool] = True,
349+
wait_for_code: Optional[bool] = False,
350+
timeout: Optional[int] = 300,
351+
allow_external_modification: Optional[bool] = None,
352+
prefer_native_scheduling: Optional[bool] = None,
353+
use_backup_access_code_pool: Optional[bool] = None,
341354
) -> AccessCode:
342355
raise NotImplementedError
343356

@@ -361,6 +374,13 @@ def delete(
361374
) -> ActionAttempt:
362375
raise NotImplementedError
363376

377+
@abc.abstractmethod
378+
def pull_backup_access_code(
379+
self,
380+
access_code: Union[AccessCode, AccessCodeId],
381+
) -> AccessCode:
382+
raise NotImplementedError
383+
364384

365385
class AbstractNoiseThresholds(abc.ABC):
366386
@abc.abstractmethod

0 commit comments

Comments
 (0)