@@ -2657,6 +2657,122 @@ def get_page_as_word(self, page_id):
2657
2657
url = "exportword?pageId={pageId}" .format (pageId = page_id )
2658
2658
return self .get (url , headers = headers , not_json_response = True )
2659
2659
2660
+
2661
+ def export_space_pdf (self , url ):
2662
+ try :
2663
+ running_task = True
2664
+ headers = self .form_token_headers
2665
+ log .info ("Initiate PDF export from Confluence Cloud" )
2666
+ response = self .session .post (url , headers = headers )
2667
+ print (response .text )
2668
+ response_string = response .decode (encoding = "utf-8" , errors = "ignore" )
2669
+ task_id = response_string .split ('name="ajs-taskId" content="' )[1 ].split ('">' )[0 ]
2670
+ poll_url = "/services/api/v1/task/{0}/progress" .format (task_id )
2671
+ while running_task :
2672
+ log .info ("Check if export task has completed." )
2673
+ progress_response = self .get (poll_url )
2674
+ print (progress_response )
2675
+ percentage_complete = int (progress_response .get ("progress" , 0 ))
2676
+ task_state = progress_response .get ("state" )
2677
+ if task_state == "FAILED" :
2678
+ log .error ("PDF conversion not successful." )
2679
+ return None
2680
+ elif percentage_complete == 100 :
2681
+ running_task = False
2682
+ log .info ("Task completed - {task_state}" .format (task_state = task_state ))
2683
+ log .debug ("Extract task results to download PDF." )
2684
+ task_result_url = progress_response .get ("result" )
2685
+ else :
2686
+ log .info (
2687
+ "{percentage_complete}% - {task_state}" .format (
2688
+ percentage_complete = percentage_complete , task_state = task_state
2689
+ )
2690
+ )
2691
+ time .sleep (3 )
2692
+ log .debug ("Task successfully done, querying the task result for the download url" )
2693
+ # task result url starts with /wiki, remove it.
2694
+ task_content = self .get (task_result_url [5 :], not_json_response = True )
2695
+ download_url = task_content .decode (encoding = "utf-8" , errors = "strict" )
2696
+ log .debug ("Successfully got the download url" )
2697
+ return download_url
2698
+ except IndexError as e :
2699
+ log .error (e )
2700
+ return None
2701
+ def get_space_export (self , space_key : str , export_type : str ) -> str :
2702
+ def get_atl_request (url ):
2703
+ # this is only applicable to html/csv/xml export
2704
+ response = self .get (url , advanced_mode = True )
2705
+ parsed_html = BeautifulSoup (response .text , "html.parser" )
2706
+ atl_token = parsed_html .find ("input" , {"name" : "atl_token" }).get ("value" )
2707
+ return atl_token
2708
+ try :
2709
+ running_task = True
2710
+ headers = self .form_token_headers
2711
+ print ("Initiate PDF export from Confluence Cloud" )
2712
+ log .info ("Initiate PDF export from Confluence Cloud" )
2713
+ form_data = {}
2714
+ url = ''
2715
+ if export_type == "csv" :
2716
+ form_data = {
2717
+ "atl_token" : get_atl_request (f"spaces/exportspacecsv.action?key={ space_key } " ),
2718
+ "exportType" : "TYPE_CSV" ,
2719
+ "contentOption" : "all" ,
2720
+ "includeComments" : "true" ,
2721
+ "confirm" : "Export"
2722
+ }
2723
+ elif export_type == "html" :
2724
+ form_data = {
2725
+ "atl_token" : get_atl_request (f"spaces/exportspacehtml.action?key={ space_key } " ),
2726
+ "exportType" : "TYPE_HTML" ,
2727
+ "contentOption" : "visibleOnly" ,
2728
+ "includeComments" : True ,
2729
+ "confirm" : "Export"
2730
+ }
2731
+ elif export_type == "xml" :
2732
+ form_data = {
2733
+ "atl_token" : get_atl_request (f"spaces/exportspacexml.action?key={ space_key } " ),
2734
+ "exportType" : "TYPE_XML" ,
2735
+ "contentOption" : "all" ,
2736
+ "includeComments" : "true" ,
2737
+ "confirm" : "Export" }
2738
+ elif export_type == "pdf" :
2739
+
2740
+ form_data = {
2741
+ # "atl_token": get_atl_request(f"spaces/flyingpdf/flyingpdf.action?key={space_key}"),
2742
+ "synchronous" : "false" ,
2743
+ "contentOption" : "visibleOnly" ,
2744
+ "confirm" : "Export"
2745
+ }
2746
+ else :
2747
+ raise ValueError ("Invalid export type" )
2748
+ url = f"/spaces/exportspace.action?key={ space_key } "
2749
+ # bypass self.confluence_client.post method because it serializes form data as JSON which is wrong
2750
+ if export_type == "pdf" :
2751
+
2752
+ url = self .url_joiner (url = self .url ,
2753
+ path = f"spaces/flyingpdf/doflyingpdf.action?key={ space_key } " )
2754
+ elif export_type == "csv" or export_type == "html" or export_type == "xml" :
2755
+ url = self .url_joiner (url = self .url , path = f"spaces/doexportspace.action?key={ space_key } " )
2756
+ response = self .session .post (url , headers = self .form_token_headers ,
2757
+ data = form_data )
2758
+
2759
+ parsed_html = BeautifulSoup (response .text , "html.parser" )
2760
+ print (parsed_html )
2761
+ poll_url = parsed_html .find ("meta" , {"name" : "ajs-pollURI" }).get ("content" )
2762
+ running_task = True
2763
+ while running_task :
2764
+ progress_response = self .get (poll_url )
2765
+ if progress_response ['complete' ]:
2766
+ parsed_html = BeautifulSoup (progress_response ['message' ], "html.parser" )
2767
+ download_url = parsed_html .find ("a" , {"class" : "space-export-download-path" }).get ("href" )
2768
+ return self .url .replace ('/wiki' , '' ) + download_url
2769
+ time .sleep (5 )
2770
+ return None
2771
+ except Exception as e :
2772
+ print (e )
2773
+ return None
2774
+
2775
+
2660
2776
def export_page (self , page_id ):
2661
2777
"""
2662
2778
Alias method for export page as pdf
0 commit comments