Skip to content

Commit bfa7eae

Browse files
author
gkowalc
committed
export to csv/html/xml method
1 parent c880174 commit bfa7eae

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

atlassian/confluence.py

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2657,6 +2657,122 @@ def get_page_as_word(self, page_id):
26572657
url = "exportword?pageId={pageId}".format(pageId=page_id)
26582658
return self.get(url, headers=headers, not_json_response=True)
26592659

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+
26602776
def export_page(self, page_id):
26612777
"""
26622778
Alias method for export page as pdf

0 commit comments

Comments
 (0)