From d71e230173b82ca5789c81a4bf9b9a5273038637 Mon Sep 17 00:00:00 2001 From: deeplow Date: Mon, 10 Oct 2022 15:43:11 +0100 Subject: [PATCH] Update document state exclusively in convert() The document's state update is better update in the convert() function. This is because this function is always called for the conversion progress regardless of the frontend. --- dangerzone/container.py | 5 +++++ dangerzone/document.py | 10 ++++++++++ dangerzone/logic.py | 4 ---- tests/test_document.py | 6 ++++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/dangerzone/container.py b/dangerzone/container.py index f05dc7f..31a2413 100644 --- a/dangerzone/container.py +++ b/dangerzone/container.py @@ -173,6 +173,10 @@ def exec( if p.stdout is not None: for line in p.stdout: (error, text, percentage) = parse_progress(document, line) + if error: + document.mark_as_failed() + if percentage == 100.0: + document.mark_as_safe() if stdout_callback: stdout_callback(error, text, percentage) @@ -223,6 +227,7 @@ def convert( stdout_callback: Optional[Callable] = None, ) -> bool: success = False + document.mark_as_converting() if ocr_lang: ocr = "1" diff --git a/dangerzone/document.py b/dangerzone/document.py index 8d044a5..f825b78 100644 --- a/dangerzone/document.py +++ b/dangerzone/document.py @@ -25,6 +25,7 @@ class Document: # document conversion state STATE_UNCONVERTED = enum.auto() + STATE_CONVERTING = enum.auto() STATE_SAFE = enum.auto() STATE_FAILED = enum.auto() @@ -111,14 +112,23 @@ class Document: def is_unconverted(self) -> bool: return self.state is Document.STATE_UNCONVERTED + def is_converting(self) -> bool: + return self.state is Document.STATE_CONVERTING + def is_failed(self) -> bool: return self.state is Document.STATE_FAILED def is_safe(self) -> bool: return self.state is Document.STATE_SAFE + def mark_as_converting(self) -> None: + log.debug(f"Marking doc {self.id} as 'converting'") + self.state = Document.STATE_CONVERTING + def mark_as_failed(self) -> None: + log.debug(f"Marking doc {self.id} as 'failed'") self.state = Document.STATE_FAILED def mark_as_safe(self) -> None: + log.debug(f"Marking doc {self.id} as 'safe'") self.state = Document.STATE_SAFE diff --git a/dangerzone/logic.py b/dangerzone/logic.py index 21fbb69..b92870b 100644 --- a/dangerzone/logic.py +++ b/dangerzone/logic.py @@ -56,10 +56,6 @@ class DangerzoneCore(object): ocr_lang, stdout_callback, ) - if success: - document.mark_as_safe() - else: - document.mark_as_failed() max_jobs = container.get_max_parallel_conversions() with concurrent.futures.ThreadPoolExecutor(max_workers=max_jobs) as executor: diff --git a/tests/test_document.py b/tests/test_document.py index fe4d1dc..61621ad 100644 --- a/tests/test_document.py +++ b/tests/test_document.py @@ -93,6 +93,12 @@ def test_mark_as_safe(sample_doc: str) -> None: assert not d.is_unconverted() +def test_mark_as_converting(sample_doc: str) -> None: + d = Document(sample_doc) + d.mark_as_converting() + assert d.is_converting() + + def test_mark_as_failed(sample_doc: str) -> None: d = Document(sample_doc) d.mark_as_failed()