Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

confluence REST API, update attachment comments

Alex Perez
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
March 7, 2019

Hello!

I'm developing a script to help us in a content migration. 

The goal is :

-list all pages in a space,

-for each page, list all attachment

-for each attachment, find out the filename in a table and (if found) add a comment to the attachment (extracted from the external table).

 

I'm facing problems with the last step, I can get all attachments in a page by calling:

GET /rest/api/content/%pageID%/child/attachment

returns an array of 2 attachments (ok).

each attachment contains id, filename, metadata (Versions, author ..etc). Attachment ID format is "att16257549" (??)

 

I'm trying PUT /content/%pageID%/child/attachment/%attachmentId%

But seems like the attachment ID is not the same format as the previous step.

 

How can I add the comment to the attachment?

 

----- EDIT ----

in order to clarify the example

Im sending a PUT /content/%pageID%/child/attachment/att16259572

with this payload:

{"id":"att16259572","type":"attachment","status":"current","title":"Path LUN is dead.doc","ancestors":[],"operations":[],"children":[],"descendants":[],"body":[],"restrictions":[],"metadata":{"comment":"Path LUN is dead"}}

getting HTTP 400.

(and other variations, but the goal is only updating the attachment comment.)

2 answers

2 accepted

1 vote
Answer accepted
fwoon
Contributor
June 24, 2019

i always try to do a curl to verify then update the python code

curl -u <USERNAME>:<PASSWORD> -X PUT -H 'Content-Type: application/json' -d'{"id":"123456789","version":{"number":2},"metadata": {"comment": "HAHAH"}}' <BASE_URL>/rest/api/content/<PAGE_ID>/child/attachment/<ATTACHMENT_ID> | python -mjson.tool

 

def update_attachment(pageID, attachment_id, comment, version):
url = BASE_URL + pageId + "/child/attachment" + attachment_id
data = json.dumps({ "id": attachment_id, "version": {"number":version+1}, "metadata": {"comment": comment} })
headers = { "X-Atlassian-Token": "nocheck", 'Content-Type' : 'application/json' }
r = requests.put(url, data=data, headers=headers, auth=(username, password))
r.raise_for_status()
print r.text

Both curl and function works
the addition of att to the attachment id is NOT accurate...DO NOT ADD that att to the attachment id in the data nor the url

Alex Perez
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
June 25, 2019

god bless you!

i dont know where comes the "att" prefix from, but worked like a charm now

1 vote
Answer accepted
Stephen Sifers
Atlassian Team
Atlassian Team members are employees working across the company in a wide variety of roles.
March 12, 2019

Hello Alex,

Thank you for providing the entire concept of what you’re working on to include your steps and which step and endpoint you’re having issues with. Clearly, you know what you’re doing when it comes to scripting and API calls.

From reviewing your notes you have, It seems that when you’re making the PUT call to the endpoint of PUT /rest/api/content/{id}/child/attachment/{attachmentId} that you’re missing the version you want to update the attachment to. Each time we make a change to an attachment, to include comments, you have to change the version by an increment of one. If the attachment was version 1 and you make a PUT call to add a comment the version must increment to version 2. If the version is not changed, this would explain why you’re getting a STATUS 400 response.

As an example, if your version was 1 when you made the GET call then your PUT call payload would look as follows (Please note that version is now included).

{"id":"att16259572","type":"attachment","status":"current","title":"Path LUN is dead.doc",”version”:{“number”:2},"ancestors":[],"operations":[],"children":[],"descendants":[],"body":[],"restrictions":[],"metadata":{"comment":"Path LUN is dead"}}

You may find the version of the attachment from your GET call. You may have to expand the payload from the GET to see the version and increment up from that value. You may find the schema for the GET attachments at GET /rest/api/content/{id}/child/attachment (see SCHEMA under responses).

I hope this helps and clarifies why you’re getting the STATUS 400 error. Please do let us know if this contributed to resolving the issue.

Regards,
Stephen Sifers

Alex Perez
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
April 15, 2019

Hi Stephen, 

sorry by the late response but I broke my arm and Im just retaking topics  ...

I changed the API call as you advised, but is not working,

initially, in my forst message, the call was a PUT with 

{"id":"att16259572","type":"attachment","status":"current","title":"Path LUN is dead.doc","ancestors":[],"operations":[],"children":[],"descendants":[],"body":[],"restrictions":[],"metadata":{"comment":"Path LUN is dead"}}

Now, I changed it to (adding the version / number element)

{"id":"att4000440004440","type":"attachment","status":"current","title":"Asipresencia Operational Procedure.doc","version":{"number":4},"ancestors":[],"operations":[],"children":[],"descendants":[],"body":[],"restrictions":[],"metadata":{"comment":"test comment from API"}}

And tested also with (added version/number element from the previous GET call, but without incrementing it):

{"id":"att4000440004440","type":"attachment","status":"current","title":"Asipresencia Operational Procedure.doc","version":{"number":3},"ancestors":[],"operations":[],"children":[],"descendants":[],"body":[],"restrictions":[],"metadata":{"comment":"test comment from API"}}

But im getting a 400 errorcode in every case,

How can I figure out where is the problem with this call?

thank you

Stephen Sifers
Atlassian Team
Atlassian Team members are employees working across the company in a wide variety of roles.
April 17, 2019

Hello Alex,

Thank you for sending over what your JSON payload is for your PUT call. If you could, so I may better understand, include the GET call for the attachment in question? This will allow me to see what the JSON looks like and how it should be formatted for an update/PUT call.

We look forward to your response to help get your API calls updating as needed.

Regards,
Stephen Sifers

Suggest an answer

Log in or Sign up to answer
TAGS
AUG Leaders

Atlassian Community Events