From 0cb5785c2ac51d8061b49975d20677512ed34eeb Mon Sep 17 00:00:00 2001 From: Ravi Shankar Date: Wed, 30 Jul 2025 20:02:25 +0530 Subject: [PATCH] Support cancellation for export --- hasty/exception.py | 4 ++++ hasty/export_job.py | 15 ++++++++++++++- hasty/requester.py | 6 ++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/hasty/exception.py b/hasty/exception.py index 4766e7b..7dfd3d4 100644 --- a/hasty/exception.py +++ b/hasty/exception.py @@ -14,6 +14,10 @@ def video_not_ready(cls): def invalid_activities(cls): return ValidationException("activities must be a non-empty list of ActitivityType objects or IDs") + @classmethod + def export_already_done_or_canceled(cls): + return ValidationException("Export job is already done or canceled, cannot cancel it again") + class AuthenticationException(Exception): def __init__(self, message): self.message = message diff --git a/hasty/export_job.py b/hasty/export_job.py index f500478..80e6efc 100644 --- a/hasty/export_job.py +++ b/hasty/export_job.py @@ -14,6 +14,7 @@ class ExportJob(HastyObject): endpoint = '/v1/projects/{project_id}/exports' endpoint_export = '/v1/projects/{project_id}/exports/{export_id}' + endpoint_job = '/v2/jobs/{job_id}' def __repr__(self): return self.get__repr__(OrderedDict({"id": self._id, "status": self._status})) @@ -118,5 +119,17 @@ def download(self, local_folder='.'): filepath = os.path.join(local_folder, filename) urllib.request.urlretrieve(url, filepath) logging.info(f"File {filepath} saved") - else: + elif self._status in ['INIT', 'RUNNING']: raise ValidationException.export_in_progress() + else: + raise ValidationException(f"Export job is in {self._status} state, cannot download") + + def cancel(self): + """ + Cancels the export job. + """ + if self._status in ['DONE', 'FAILED', 'CANCELED']: + raise ValidationException.export_already_done_or_canceled() + self._requester.delete(ExportJob.endpoint_job.format(job_id=self._id)) + self._status = "CANCELED" + return self diff --git a/hasty/requester.py b/hasty/requester.py index 57eb96a..9da1561 100644 --- a/hasty/requester.py +++ b/hasty/requester.py @@ -50,6 +50,9 @@ def request(self, method, endpoint, headers, params=None, json_data=None, data=N if response.status_code == 404: raise NotFound.object_not_found() + if response.status_code == 422: + raise ValidationException(response.json().get("message")) + if response.status_code > 299: response.raise_for_status() @@ -99,7 +102,6 @@ def delete(self, endpoint, json_data=None): headers=self.headers, json_data=json_data, cookies=self.cookies) - - if response.status_code != 204: + if response.status_code not in [202, 204]: # TODO Handle different status codes raise Exception("Something went wrong {}", response, response.text)