Skip to content

Commit f04c86e

Browse files
[Confluence] ConfluenceCloud: add remove_page_from_trash and remove_page_as_draft (#1707)
docs/confluence.rst documents remove_page_from_trash(page_id) and remove_page_as_draft(page_id), and the Server client has both, but the Cloud client does not, so Confluence(url="https://<site>.atlassian.net") and ConfluenceCloud raise "'Cloud' object has no attribute 'remove_page_from_trash'". Add both to Cloud with the same behaviour as the Server client: they call remove_page with status="trashed" and status="draft", which sends DELETE to /wiki/rest/api/content/{id} with that status.
1 parent 8d738d6 commit f04c86e

3 files changed

Lines changed: 52 additions & 0 deletions

File tree

‎atlassian/confluence/cloud/__init__.py‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,24 @@ def remove_page(self, page_id, status=None, recursive=False):
491491
return response
492492
return response.status_code
493493

494+
def remove_page_from_trash(self, page_id):
495+
"""
496+
Purge a page that is already in the trash.
497+
498+
:param page_id: page ID
499+
:return: the same value as :meth:`remove_page`
500+
"""
501+
return self.remove_page(page_id=page_id, status="trashed")
502+
503+
def remove_page_as_draft(self, page_id):
504+
"""
505+
Remove a draft page.
506+
507+
:param page_id: page ID
508+
:return: the same value as :meth:`remove_page`
509+
"""
510+
return self.remove_page(page_id=page_id, status="draft")
511+
494512
def get_page_child_count(self, page_id, type="page"):
495513
"""Return the number of direct children of ``type`` without listing them."""
496514
page = self.get_page_by_id(page_id, expand=f"children.{type}")

‎docs/confluence.rst‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,8 @@ Page actions
285285
confluence.remove_content(content_id):
286286
287287
# Remove page from trash
288+
# ``ConfluenceCloud`` (and ``Confluence`` with a Cloud URL) also provide
289+
# this and remove_page_as_draft, through ``/wiki/rest/api/content``.
288290
delete_status = confluence.remove_page_from_trash(page_id) # normally 204
289291
290292
# Remove page as draft

‎tests/confluence/test_confluence_cloud.py‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,38 @@ def test_remove_page_through_confluence_with_cloud_url(self, mock_delete):
481481
assert confluence.remove_page("123") == 204
482482
mock_delete.assert_called_once_with("rest/api/content/123", params={}, advanced_mode=True)
483483

484+
@patch.object(ConfluenceCloud, "delete")
485+
def test_remove_page_from_trash(self, mock_delete, confluence_cloud):
486+
response = Response()
487+
response.status_code = 204
488+
mock_delete.return_value = response
489+
490+
assert confluence_cloud.remove_page_from_trash("123") == 204
491+
mock_delete.assert_called_once_with("rest/api/content/123", params={"status": "trashed"}, advanced_mode=True)
492+
493+
@patch.object(ConfluenceCloud, "delete")
494+
def test_remove_page_as_draft(self, mock_delete, confluence_cloud):
495+
response = Response()
496+
response.status_code = 204
497+
mock_delete.return_value = response
498+
499+
assert confluence_cloud.remove_page_as_draft("123") == 204
500+
mock_delete.assert_called_once_with("rest/api/content/123", params={"status": "draft"}, advanced_mode=True)
501+
502+
@patch.object(ConfluenceCloud, "delete")
503+
def test_remove_page_from_trash_through_confluence_with_cloud_url(self, mock_delete):
504+
response = Response()
505+
response.status_code = 204
506+
mock_delete.return_value = response
507+
confluence = Confluence(url="https://test.atlassian.net", username="user", password="token")
508+
509+
assert confluence.remove_page_from_trash("123") == 204
510+
assert confluence.remove_page_as_draft("456") == 204
511+
assert [(call.args[0], call.kwargs["params"]) for call in mock_delete.call_args_list] == [
512+
("rest/api/content/123", {"status": "trashed"}),
513+
("rest/api/content/456", {"status": "draft"}),
514+
]
515+
484516
@patch.object(ConfluenceCloud, "delete")
485517
def test_delete_content(self, mock_delete, confluence_cloud):
486518
"""Test delete_content method."""

0 commit comments

Comments
 (0)