From 78663cdcafac0f439480aa15ab2fbc0d4e49fd23 Mon Sep 17 00:00:00 2001 From: Steven Goossens Date: Tue, 17 Oct 2023 22:16:46 +0200 Subject: [PATCH 1/5] Implement clear function to delete all subpages of the parent or space before uploading --- md2cf/__main__.py | 21 +++++++++++++++++++++ md2cf/api.py | 6 ++++++ 2 files changed, 27 insertions(+) diff --git a/md2cf/__main__.py b/md2cf/__main__.py index 7db41fb..0d7d170 100644 --- a/md2cf/__main__.py +++ b/md2cf/__main__.py @@ -243,6 +243,11 @@ def get_parser(): help="only upload pages and attachments that have changed. " "This adds a hash of the page or attachment contents to the update message", ) + parser.add_argument( + "--clear", + action="store_true", + help="delete all subpages in the space or of the parent pages before uploading new ones.", + ) parser.add_argument( "file_list", type=Path, @@ -317,6 +322,22 @@ def main(): ) sys.exit(1) + # if --clear is detected, we need to delete all the pages in the space or subpages of the parent pages + if args.clear: + if args.parent_id: + pages_to_delete = confluence.get_all_pages_from_parent_id(args.parent_id) + else: + pages_to_delete = confluence.get_all_pages_from_space(args.space) + + for page in pages_to_delete: + try: + confluence.delete_page(page.id) + console.log(f"Deleted page {page.title}") + except HTTPError as e: + error_console.log( + f"Failed to delete page {page.title} with error {e.response.content}" + ) + pages_to_upload = collect_pages_to_upload(args) page_title_counts = Counter([page.title for page in pages_to_upload]) diff --git a/md2cf/api.py b/md2cf/api.py index 54ba44a..23ca750 100644 --- a/md2cf/api.py +++ b/md2cf/api.py @@ -77,6 +77,9 @@ def _post(self, path, **kwargs): def _put(self, path, **kwargs): return self._request("PUT", path, **kwargs) + def _delete(self, path, **kwargs): + return self._request("DELETE", path, **kwargs) + def get_page( self, title=None, @@ -212,6 +215,9 @@ def update_page( return self._put(f"content/{page.id}", json=update_structure) + def delete_page(self, confluence_page): + return self._delete(f"content/{confluence_page.id}") + def get_attachment(self, confluence_page, name): existing_attachments = self._get( f"content/{confluence_page.id}/child/attachment", From b409a556ad4ae818173cc0fde2d6c8f7d89c2700 Mon Sep 17 00:00:00 2001 From: Steven Goossens Date: Wed, 18 Oct 2023 09:56:03 +0200 Subject: [PATCH 2/5] Get children --- md2cf/__main__.py | 7 +++++-- md2cf/api.py | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/md2cf/__main__.py b/md2cf/__main__.py index 0d7d170..ebf8962 100644 --- a/md2cf/__main__.py +++ b/md2cf/__main__.py @@ -324,10 +324,13 @@ def main(): # if --clear is detected, we need to delete all the pages in the space or subpages of the parent pages if args.clear: + pages_to_delete = [] if args.parent_id: pages_to_delete = confluence.get_all_pages_from_parent_id(args.parent_id) - else: - pages_to_delete = confluence.get_all_pages_from_space(args.space) + + # Don't implement cleaning of whole space + # else: + # pages_to_delete = confluence.get_all_pages_from_space(args.space) for page in pages_to_delete: try: diff --git a/md2cf/api.py b/md2cf/api.py index 23ca750..1e98ec6 100644 --- a/md2cf/api.py +++ b/md2cf/api.py @@ -218,6 +218,9 @@ def update_page( def delete_page(self, confluence_page): return self._delete(f"content/{confluence_page.id}") + def get_all_pages_from_parent_id(self, parent_id): + return self._get(f"content/{parent_id}/child/page") + def get_attachment(self, confluence_page, name): existing_attachments = self._get( f"content/{confluence_page.id}/child/attachment", From ded229e9db586f20eff9e4ba9f52faf532b147fd Mon Sep 17 00:00:00 2001 From: Steven Goossens Date: Wed, 18 Oct 2023 10:38:26 +0200 Subject: [PATCH 3/5] Update api.py --- md2cf/api.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/md2cf/api.py b/md2cf/api.py index 1e98ec6..f96b2bd 100644 --- a/md2cf/api.py +++ b/md2cf/api.py @@ -66,7 +66,11 @@ def __init__( def _request(self, method, path, **kwargs): r = self.api.request(method, urljoin(self.host, path), **kwargs) r.raise_for_status() - return bunchify(r.json()) + + if r.status_code != 204: + return bunchify(r.json()) + else: + return None def _get(self, path, **kwargs): return self._request("GET", path, **kwargs) @@ -219,7 +223,8 @@ def delete_page(self, confluence_page): return self._delete(f"content/{confluence_page.id}") def get_all_pages_from_parent_id(self, parent_id): - return self._get(f"content/{parent_id}/child/page") + pages = self._get(f"content/{parent_id}/child/page")['results'] + return pages def get_attachment(self, confluence_page, name): existing_attachments = self._get( From 79a7a536e02a168db6955503461e39660e6f39ab Mon Sep 17 00:00:00 2001 From: Steven Goossens Date: Wed, 18 Oct 2023 10:38:54 +0200 Subject: [PATCH 4/5] Update __main__.py Remove dangerous possibility to clean whole space --- md2cf/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/md2cf/__main__.py b/md2cf/__main__.py index ebf8962..64285e4 100644 --- a/md2cf/__main__.py +++ b/md2cf/__main__.py @@ -327,14 +327,14 @@ def main(): pages_to_delete = [] if args.parent_id: pages_to_delete = confluence.get_all_pages_from_parent_id(args.parent_id) - + # Don't implement cleaning of whole space # else: # pages_to_delete = confluence.get_all_pages_from_space(args.space) for page in pages_to_delete: try: - confluence.delete_page(page.id) + confluence.delete_page(page) console.log(f"Deleted page {page.title}") except HTTPError as e: error_console.log( From 5d5a21d3d365d4952a94094190a2b7a51ff9a007 Mon Sep 17 00:00:00 2001 From: Steven Goossens Date: Sun, 22 Oct 2023 11:37:57 +0200 Subject: [PATCH 5/5] Review based on comments --- md2cf/__main__.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/md2cf/__main__.py b/md2cf/__main__.py index ebf8962..8bd1b57 100644 --- a/md2cf/__main__.py +++ b/md2cf/__main__.py @@ -246,7 +246,7 @@ def get_parser(): parser.add_argument( "--clear", action="store_true", - help="delete all subpages in the space or of the parent pages before uploading new ones.", + help="delete all subpages of the parent pages before uploading new ones", ) parser.add_argument( "file_list", @@ -328,18 +328,8 @@ def main(): if args.parent_id: pages_to_delete = confluence.get_all_pages_from_parent_id(args.parent_id) - # Don't implement cleaning of whole space - # else: - # pages_to_delete = confluence.get_all_pages_from_space(args.space) - for page in pages_to_delete: - try: - confluence.delete_page(page.id) - console.log(f"Deleted page {page.title}") - except HTTPError as e: - error_console.log( - f"Failed to delete page {page.title} with error {e.response.content}" - ) + delete_page_and_subpages(confluence, page.id) pages_to_upload = collect_pages_to_upload(args) @@ -764,5 +754,18 @@ def collect_pages_to_upload(args): return pages_to_upload +def delete_page_and_subpages(confluence, page_id): + pages_to_delete = confluence.get_all_pages_from_parent_id(page_id) + for page in pages_to_delete: + try: + confluence.delete_page_and_subpages(page.id) + console.log(f"Deleted page {page.title}") + except HTTPError as e: + error_console.log( + f"Failed to delete page {page.title} with error {e.response.content}" + ) + confluence.delete_page(page_id) + + if __name__ == "__main__": main()