Skip to content

Commit c4e1309

Browse files
committed
Confluence: Support setting version message for new Confluence pages
#1464
1 parent 7bbd674 commit c4e1309

3 files changed

Lines changed: 40 additions & 7 deletions

File tree

‎atlassian/confluence/server/__init__.py‎

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,7 @@ def create_page(
912912
editor=None,
913913
full_width=False,
914914
status="current",
915+
version_comment=None,
915916
):
916917
"""
917918
Create page from scratch
@@ -925,6 +926,7 @@ def create_page(
925926
:param editor: OPTIONAL: v2 to be created in the new editor
926927
:param full_width: DEFAULT: False
927928
:param status: either 'current' or 'draft'
929+
:param version_comment: optional message recorded with the first page version
928930
:return:
929931
"""
930932
log.info('Creating %s "%s" -> "%s"', type, space, title)
@@ -939,6 +941,8 @@ def create_page(
939941
}
940942
if parent_id:
941943
data["ancestors"] = [{"type": type, "id": parent_id}]
944+
if version_comment is not None:
945+
data["version"] = {"message": version_comment}
942946
if editor is not None and editor in ["v1", "v2"]:
943947
data["metadata"]["properties"]["editor"] = {"value": editor}
944948
if full_width is True:
@@ -1923,14 +1927,19 @@ def update_or_create(
19231927
full_width=full_width,
19241928
)
19251929
else:
1930+
create_kwargs = {
1931+
"space": space,
1932+
"parent_id": parent_id,
1933+
"title": title,
1934+
"body": body,
1935+
"representation": representation,
1936+
"editor": editor,
1937+
"full_width": full_width,
1938+
}
1939+
if version_comment is not None:
1940+
create_kwargs["version_comment"] = version_comment
19261941
result = self.create_page(
1927-
space=space,
1928-
parent_id=parent_id,
1929-
title=title,
1930-
body=body,
1931-
representation=representation,
1932-
editor=editor,
1933-
full_width=full_width,
1942+
**create_kwargs,
19341943
)
19351944

19361945
log.info(

‎docs/confluence.rst‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,9 @@ Page actions
265265
confluence.update_or_create(parent_id, title, body, representation='storage', full_width=False)
266266
confluence.update_or_create(title=title, body=body, space='SPACEKEY')
267267
268+
# Server/Data Center: annotate the first page revision on creation.
269+
confluence.create_page('SPACEKEY', title, body, version_comment='Initial import')
270+
268271
# Preserve Confluence storage macros when updating tables. Do not round-trip
269272
# a page containing images through pandas.read_html(...).to_html(), because
270273
# pandas represents embedded image cells as missing values and serializes

‎tests/confluence/test_confluence_server.py‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ def test_bad_request_includes_a_bounded_non_json_response(self, confluence_serve
6767
with pytest.raises(HTTPError, match="Malformed XHTML near the table macro"):
6868
confluence_server.raise_for_status(response)
6969

70+
@patch.object(ConfluenceServer, "post")
71+
def test_create_page_includes_first_version_comment(self, mock_post, confluence_server):
72+
mock_post.return_value = {"id": "123"}
73+
74+
confluence_server.create_page("TEAM", "Report", "<p>Body</p>", version_comment="Initial import")
75+
76+
assert mock_post.call_args.kwargs["data"]["version"] == {"message": "Initial import"}
77+
7078
@patch.object(ConfluenceServer, "_get_paged")
7179
def test_get_all_page_versions_follows_paginated_history(self, mock_get_paged, confluence_server):
7280
mock_get_paged.return_value = iter([{"number": 2}, {"number": 1}])
@@ -359,6 +367,19 @@ def test_update_or_create_creates_top_level_page_with_explicit_space(
359367
full_width=False,
360368
)
361369

370+
@patch.object(ConfluenceServer, "create_page")
371+
@patch.object(ConfluenceServer, "page_exists", return_value=False)
372+
def test_update_or_create_passes_version_comment_when_creating(
373+
self, mock_page_exists, mock_create_page, confluence_server
374+
):
375+
mock_create_page.return_value = {"id": "123", "_links": {"tinyui": "/x/abc"}}
376+
377+
confluence_server.update_or_create(
378+
title="Top level", body="<p>Body</p>", space="TEAM", version_comment="Initial import"
379+
)
380+
381+
assert mock_create_page.call_args.kwargs["version_comment"] == "Initial import"
382+
362383
def test_update_or_create_requires_space_for_a_top_level_page(self, confluence_server):
363384
with pytest.raises(ApiValueError, match="space is required"):
364385
confluence_server.update_or_create(title="Top level", body="<p>Body</p>")

0 commit comments

Comments
 (0)