From dfb91b45fdf356b2ef99e0f045ef872d5b6728d2 Mon Sep 17 00:00:00 2001 From: Max Isom Date: Mon, 27 Jun 2022 10:21:04 -0500 Subject: [PATCH] Add support for updating access codes --- seamapi/access_codes.py | 62 +++++++++++++++++++++++++ seamapi/types.py | 12 +++++ tests/access_codes/test_access_codes.py | 3 ++ 3 files changed, 77 insertions(+) diff --git a/seamapi/access_codes.py b/seamapi/access_codes.py index 7ec57c6..a0151ac 100644 --- a/seamapi/access_codes.py +++ b/seamapi/access_codes.py @@ -170,6 +170,68 @@ def create( success_res: Any = action_attempt.result return AccessCode.from_dict(success_res["access_code"]) + def update( + self, + access_code: Union[AccessCodeId, AccessCode], + device: Optional[Union[DeviceId, Device]] = None, + name: Optional[str] = None, + code: Optional[str] = None, + starts_at: Optional[str] = None, + ends_at: Optional[str] = None, + ) -> AccessCode: + """Updates an access code on a device. + + Parameters + ---------- + access_code: AccessCodeId or AccessCode + Access code id or Access code to update + device : DeviceId or Device + New device to move access code to + name : str, optional + Access code name + code : str, optional + Access code value + starts_at : str, optional + Time when access code becomes effective + ends_at : str, optional + Time when access code ceases to be effective + + Raises + ------ + Exception + If the API request wasn't successful. + + Returns + ------ + AccessCode + """ + + access_code_id = to_access_code_id(access_code) + update_payload = {"access_code_id": access_code_id} + if device is not None: + update_payload["device_id"] = to_device_id(device) + if name is not None: + update_payload["name"] = name + if code is not None: + update_payload["code"] = code + if starts_at is not None: + update_payload["starts_at"] = starts_at + if ends_at is not None: + update_payload["ends_at"] = ends_at + res = requests.post( + f"{self.seam.api_url}/access_codes/update", + headers={"Authorization": f"Bearer {self.seam.api_key}"}, + json=update_payload, + ) + if not res.ok: + raise Exception(res.text) + action_attempt = self.seam.action_attempts.poll_until_ready( + res.json()["action_attempt"]["action_attempt_id"] + ) + success_res: Any = action_attempt.result + return AccessCode.from_dict(success_res["access_code"]) + + def delete( self, access_code: Union[AccessCodeId, AccessCode], diff --git a/seamapi/types.py b/seamapi/types.py index d9fa8af..1d2b5e5 100644 --- a/seamapi/types.py +++ b/seamapi/types.py @@ -140,6 +140,18 @@ def create( ) -> AccessCode: raise NotImplementedError + @abc.abstractmethod + def update( + self, + access_code: Union[AccessCodeId, AccessCode], + device: Optional[Union[DeviceId, Device]] = None, + name: Optional[str] = None, + code: Optional[str] = None, + starts_at: Optional[str] = None, + ends_at: Optional[str] = None, + ) -> AccessCode: + raise NotImplementedError + @abc.abstractmethod def delete( self, diff --git a/tests/access_codes/test_access_codes.py b/tests/access_codes/test_access_codes.py index d0c6238..bd317b4 100644 --- a/tests/access_codes/test_access_codes.py +++ b/tests/access_codes/test_access_codes.py @@ -16,5 +16,8 @@ def test_access_codes(seam: Seam): access_code = seam.access_codes.get(created_access_code.access_code_id) assert access_code.code == "4444" + access_code = seam.access_codes.update(access_code, name="Updated name") + assert access_code.name == "Updated name" + delete_action_attempt = seam.access_codes.delete(created_access_code) assert delete_action_attempt.status == "success"