Skip to content

Commit

Permalink
make sure to delete notes and notebooks permanently
Browse files Browse the repository at this point in the history
Else there are some strange leftovers.
  • Loading branch information
marph91 committed Jul 6, 2024
1 parent a0221a4 commit 46cd4c7
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 15 deletions.
26 changes: 13 additions & 13 deletions joppy/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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."""
Expand Down Expand Up @@ -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."""
Expand Down Expand Up @@ -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],
Expand Down Expand Up @@ -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."""
Expand Down
9 changes: 9 additions & 0 deletions joppy/data_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
4 changes: 2 additions & 2 deletions test/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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")
Expand Down

0 comments on commit 46cd4c7

Please sign in to comment.