From 46cd4c7ae3616d23331aff2a9ac58bda2c0713a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20D=C3=B6rfelt?= Date: Sat, 6 Jul 2024 16:26:03 +0200 Subject: [PATCH] make sure to delete notes and notebooks permanently Else there are some strange leftovers. --- joppy/api.py | 26 +++++++++++++------------- joppy/data_types.py | 9 +++++++++ test/test_api.py | 4 ++-- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/joppy/api.py b/joppy/api.py index 45b049e..124aab3 100644 --- a/joppy/api.py +++ b/joppy/api.py @@ -77,9 +77,11 @@ def _request( raise return response - def delete(self, path: str) -> requests.models.Response: + def delete( + self, path: str, query: Optional[dt.JoplinKwargs] = None + ) -> requests.models.Response: """Convenience method to issue a delete request.""" - return self._request("delete", path) + return self._request("delete", path, query=query) def get( self, path: str, query: Optional[dt.JoplinKwargs] = None @@ -135,9 +137,9 @@ def add_note(self, **data: dt.JoplinTypes) -> str: """Add a note.""" return str(self.post("/notes", data=data).json()["id"]) - def delete_note(self, id_: str) -> None: + def delete_note(self, id_: str, **query: dt.JoplinTypes) -> None: """Delete a note.""" - self.delete(f"/notes/{id_}") + self.delete(f"/notes/{id_}", query=query) def get_note(self, id_: str, **query: dt.JoplinTypes) -> dt.NoteData: """Get the note with the given ID.""" @@ -175,9 +177,9 @@ def add_notebook(self, **data: dt.JoplinTypes) -> str: """Add a notebook.""" return str(self.post("/folders", data=data).json()["id"]) - def delete_notebook(self, id_: str) -> None: + def delete_notebook(self, id_: str, **query: dt.JoplinTypes) -> None: """Delete a notebook.""" - self.delete(f"/folders/{id_}") + self.delete(f"/folders/{id_}", query=query) def get_notebook(self, id_: str, **query: dt.JoplinTypes) -> dt.NotebookData: """Get the notebook with the given ID.""" @@ -296,9 +298,7 @@ def modify_revision(self, id_: str, **data: dt.JoplinTypes) -> None: class Search(ApiBase): - def search( - self, **query: dt.JoplinTypes - ) -> Union[ + def search(self, **query: dt.JoplinTypes) -> Union[ dt.DataList[dt.NoteData], dt.DataList[dt.NotebookData], dt.DataList[dt.ResourceData], @@ -396,18 +396,18 @@ def add_resource_to_note(self, resource_id: str, note_id: str) -> None: self.modify_note(note_id, body=body_with_attachment) def delete_all_notes(self) -> None: - """Delete all notes.""" + """Delete all notes permanently.""" for note in self.get_all_notes(): assert note.id is not None - self.delete_note(note.id) + self.delete_note(note.id, permanent=1) def delete_all_notebooks(self) -> None: - """Delete all notebooks.""" + """Delete all notebooks permanently.""" for notebook in self.get_all_notebooks(): # Deleting the root notebooks is sufficient. if not notebook.parent_id: assert notebook.id is not None - self.delete_notebook(notebook.id) + self.delete_notebook(notebook.id, permanent=1) def delete_all_resources(self) -> None: """Delete all resources.""" diff --git a/joppy/data_types.py b/joppy/data_types.py index 05712a3..4eb8bc6 100644 --- a/joppy/data_types.py +++ b/joppy/data_types.py @@ -139,6 +139,15 @@ def fields(cls) -> Set[str]: def default_fields() -> Set[str]: return {"id", "parent_id", "title"} + def __repr__(self) -> str: + # show only fields with values + not_none_fields = ", ".join( + f"{field.name}={getattr(self, field.name)}" + for field in fields(self) + if getattr(self, field.name) is not None + ) + return f"{type(self).__name__}({not_none_fields})" + @dataclass class NoteData(BaseData): diff --git a/test/test_api.py b/test/test_api.py index 27fd610..4ac9212 100644 --- a/test/test_api.py +++ b/test/test_api.py @@ -235,7 +235,7 @@ def test_delete(self): notes = self.api.get_notes() self.assertEqual(len(notes.items), 1) - self.api.delete_note(id_=id_) + self.api.delete_note(id_=id_, permanent=1) self.assertEqual(self.api.get_notes().items, []) def test_get_note(self): @@ -995,7 +995,7 @@ def test_remove_orphaned_resources(self, filename): self.api.add_resource_to_note(resource_id=resource_id, note_id=note_id) # Delete the second note, which creates an orphaned resource. - self.api.delete_note(note_id) + self.api.delete_note(note_id, permanent=1) self.assertEqual(len(self.api.get_all_resources()), 2) code = self.get_example_code("remove_orphaned_resources")