Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions atlassian/confluence/cloud/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,24 @@ def remove_page(self, page_id, status=None, recursive=False):
return response
return response.status_code

def remove_page_from_trash(self, page_id):
"""
Purge a page that is already in the trash.

:param page_id: page ID
:return: the same value as :meth:`remove_page`
"""
return self.remove_page(page_id=page_id, status="trashed")

def remove_page_as_draft(self, page_id):
"""
Remove a draft page.

:param page_id: page ID
:return: the same value as :meth:`remove_page`
"""
return self.remove_page(page_id=page_id, status="draft")

def get_page_child_count(self, page_id, type="page"):
"""Return the number of direct children of ``type`` without listing them."""
page = self.get_page_by_id(page_id, expand=f"children.{type}")
Expand Down
2 changes: 2 additions & 0 deletions docs/confluence.rst
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,8 @@ Page actions
confluence.remove_content(content_id):

# Remove page from trash
# ``ConfluenceCloud`` (and ``Confluence`` with a Cloud URL) also provide
# this and remove_page_as_draft, through ``/wiki/rest/api/content``.
delete_status = confluence.remove_page_from_trash(page_id) # normally 204

# Remove page as draft
Expand Down
32 changes: 32 additions & 0 deletions tests/confluence/test_confluence_cloud.py
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,38 @@ def test_remove_page_through_confluence_with_cloud_url(self, mock_delete):
assert confluence.remove_page("123") == 204
mock_delete.assert_called_once_with("rest/api/content/123", params={}, advanced_mode=True)

@patch.object(ConfluenceCloud, "delete")
def test_remove_page_from_trash(self, mock_delete, confluence_cloud):
response = Response()
response.status_code = 204
mock_delete.return_value = response

assert confluence_cloud.remove_page_from_trash("123") == 204
mock_delete.assert_called_once_with("rest/api/content/123", params={"status": "trashed"}, advanced_mode=True)

@patch.object(ConfluenceCloud, "delete")
def test_remove_page_as_draft(self, mock_delete, confluence_cloud):
response = Response()
response.status_code = 204
mock_delete.return_value = response

assert confluence_cloud.remove_page_as_draft("123") == 204
mock_delete.assert_called_once_with("rest/api/content/123", params={"status": "draft"}, advanced_mode=True)

@patch.object(ConfluenceCloud, "delete")
def test_remove_page_from_trash_through_confluence_with_cloud_url(self, mock_delete):
response = Response()
response.status_code = 204
mock_delete.return_value = response
confluence = Confluence(url="https://test.atlassian.net", username="user", password="token")

assert confluence.remove_page_from_trash("123") == 204
assert confluence.remove_page_as_draft("456") == 204
assert [(call.args[0], call.kwargs["params"]) for call in mock_delete.call_args_list] == [
("rest/api/content/123", {"status": "trashed"}),
("rest/api/content/456", {"status": "draft"}),
]

@patch.object(ConfluenceCloud, "delete")
def test_delete_content(self, mock_delete, confluence_cloud):
"""Test delete_content method."""
Expand Down
Loading