Skip to content

Commit 676c323

Browse files
Jira: Add functionality to get comments on an issue (#1064)
* Jira: Add functionality to get comments on an issue Implement: - issue_get_comments(issue_id) - issue_get_comment(issue_id, comment_id) - issues_get_comments_by_id(comment_id, [comment_id ...]) * Update quotes * PR Comments * Jira: Add functionality to get comments on an issue Implement: - issue_get_comments(issue_id) - issue_get_comment(issue_id, comment_id) - issues_get_comments_by_id(comment_id, [comment_id ...]) Signed-off-by: Martyn Bristow <martyn.bristow@gmail.com> * Jira: Add functionality to get comments on an issue Implement: - issue_get_comments(issue_id) - issue_get_comment(issue_id, comment_id) - issues_get_comments_by_id(comment_id, [comment_id ...]) Signed-off-by: Martyn Bristow <martyn.bristow@gmail.com> Signed-off-by: Martyn Bristow <martyn.bristow@gmail.com>
1 parent 05ba009 commit 676c323

File tree

7 files changed

+294
-0
lines changed

7 files changed

+294
-0
lines changed

atlassian/jira.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,46 @@ def get_cluster_zdu_state(self):
353353
url = self.resource_url("cluster/zdu/state")
354354
return self.get(url)
355355

356+
# Issue Comments
357+
def issue_get_comments(self, issue_id):
358+
"""
359+
Get Comments on an Issue
360+
:param issue_id: Issue ID
361+
:raises: requests.exceptions.HTTPError
362+
:return:
363+
"""
364+
base_url = self.resource_url("issue")
365+
url = "{base_url}/{issue_id}/comment".format(base_url=base_url, issue_id=issue_id)
366+
return self.get(url)
367+
368+
def issues_get_comments_by_id(self, *args):
369+
"""
370+
Get Comments on Multiple Issues
371+
:param *args: int Issue ID's
372+
:raises: requests.exceptions.HTTPError
373+
:return:
374+
"""
375+
if not all([isinstance(i, int) for i in args]):
376+
raise TypeError("Arguments to `issues_get_comments_by_id` must be int")
377+
data = {"ids": list(args)}
378+
base_url = self.resource_url("comment")
379+
url = "{base_url}/list".format(base_url=base_url)
380+
return self.post(url, data=data)
381+
382+
def issue_get_comment(self, issue_id, comment_id):
383+
"""
384+
Get a single comment
385+
:param issue_id: int or str
386+
:param comment_id: int
387+
:raises: requests.exceptions.HTTPError
388+
:return:
389+
"""
390+
base_url = self.resource_url("issue")
391+
url = "{base_url}/{issue_id}/comment/{comment_id}".format(
392+
base_url=base_url, issue_id=issue_id, comment_id=comment_id
393+
)
394+
return self.get(url)
395+
356396
"""
357397
Comments properties
358398
Reference: https://docs.atlassian.com/software/jira/docs/api/REST/8.5.0/#api/2/comment/{commentId}/properties

docs/jira.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,14 @@ Manage issues
261261
# Restore an issue
262262
issue_restore(issue_id_or_key)
263263
264+
# Issue Comments
265+
jira.issue_get_comments(issue_id_or_key)
266+
267+
jira.issue_get_comment(issue_id_or_key, comment_id)
268+
269+
jira.issues_get_comments_by_id(comment_id, [comment_id...])
270+
271+
264272
Epic Issues
265273
-------------
266274

examples/jira/jira_get_comment.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
""" Example: Get Comments on a Jira Issue
2+
"""
3+
# coding=utf-8
4+
from atlassian import Jira
5+
6+
7+
def main():
8+
jira = Jira(url="https://atlassian-python.atlassian.net/", username="martyn.bristow@gmail.com", password="...")
9+
10+
print("\n*Get Comments on INT-1*")
11+
comments = jira.issue_get_comments("INT-1")
12+
print(comments)
13+
14+
print("\n*Get a single comment on INT-1*")
15+
comments = jira.issue_get_comment(10000, 10001)
16+
print(comments)
17+
18+
print("\n*Get a set of comments*")
19+
comments = jira.issues_get_comments_by_id(10000, 10002)
20+
print(comments)
21+
22+
23+
if __name__ == "__main__":
24+
main()
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
responses["fields=*all"] = {
2+
"maxResults": 1048576,
3+
"startAt": 0,
4+
"total": 2,
5+
"isLast": true,
6+
"values": [
7+
{
8+
"self": "https://atlassian-python.atlassian.net/rest/api/2/issue/10000/comment/10000",
9+
"id": "10000",
10+
"author": {
11+
"self": "https://atlassian-python.atlassian.net/rest/api/2/user?accountId=557058%3Adc675182-d776-46f5-90fb-fe5637b71397",
12+
"accountId": "557058:dc675182-d776-46f5-90fb-fe5637b71397",
13+
"emailAddress": "martyn.bristow@gmail.com",
14+
"avatarUrls": {
15+
"48x48": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
16+
"24x24": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
17+
"16x16": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
18+
"32x32": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
19+
},
20+
"displayName": "Martyn Bristow",
21+
"active": true,
22+
"timeZone": "Europe/London",
23+
"accountType": "atlassian",
24+
},
25+
"body": "Some Text comment",
26+
"updateAuthor": {
27+
"self": "https://atlassian-python.atlassian.net/rest/api/2/user?accountId=557058%3Adc675182-d776-46f5-90fb-fe5637b71397",
28+
"accountId": "557058:dc675182-d776-46f5-90fb-fe5637b71397",
29+
"emailAddress": "martyn.bristow@gmail.com",
30+
"avatarUrls": {
31+
"48x48": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
32+
"24x24": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
33+
"16x16": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
34+
"32x32": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
35+
},
36+
"displayName": "Martyn Bristow",
37+
"active": true,
38+
"timeZone": "Europe/London",
39+
"accountType": "atlassian",
40+
},
41+
"created": "2022-10-25T20:21:33.277+0100",
42+
"updated": "2022-10-25T20:21:33.277+0100",
43+
"jsdPublic": true,
44+
},
45+
{
46+
"self": "https://atlassian-python.atlassian.net/rest/api/2/issue/10000/comment/10001",
47+
"id": "10001",
48+
"author": {
49+
"self": "https://atlassian-python.atlassian.net/rest/api/2/user?accountId=557058%3Adc675182-d776-46f5-90fb-fe5637b71397",
50+
"accountId": "557058:dc675182-d776-46f5-90fb-fe5637b71397",
51+
"emailAddress": "martyn.bristow@gmail.com",
52+
"avatarUrls": {
53+
"48x48": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
54+
"24x24": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
55+
"16x16": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
56+
"32x32": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
57+
},
58+
"displayName": "Martyn Bristow",
59+
"active": true,
60+
"timeZone": "Europe/London",
61+
"accountType": "atlassian",
62+
},
63+
"body": "Second Comment",
64+
"updateAuthor": {
65+
"self": "https://atlassian-python.atlassian.net/rest/api/2/user?accountId=557058%3Adc675182-d776-46f5-90fb-fe5637b71397",
66+
"accountId": "557058:dc675182-d776-46f5-90fb-fe5637b71397",
67+
"emailAddress": "martyn.bristow@gmail.com",
68+
"avatarUrls": {
69+
"48x48": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
70+
"24x24": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
71+
"16x16": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
72+
"32x32": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
73+
},
74+
"displayName": "Martyn Bristow",
75+
"active": true,
76+
"timeZone": "Europe/London",
77+
"accountType": "atlassian",
78+
},
79+
"created": "2022-10-25T20:21:40.840+0100",
80+
"updated": "2022-10-25T20:21:40.840+0100",
81+
"jsdPublic": true,
82+
},
83+
],
84+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
responses[None] = {
2+
"self": "https://atlassian-python.atlassian.net/rest/api/2/issue/10000/comment/10000",
3+
"id": "10000",
4+
"author": {
5+
"self": "https://atlassian-python.atlassian.net/rest/api/2/user?accountId=557058%3Adc675182-d776-46f5-90fb-fe5637b71397",
6+
"accountId": "557058:dc675182-d776-46f5-90fb-fe5637b71397",
7+
"emailAddress": "martyn.bristow@gmail.com",
8+
"avatarUrls": {
9+
"48x48": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
10+
"24x24": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
11+
"16x16": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
12+
"32x32": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
13+
},
14+
"displayName": "Martyn Bristow",
15+
"active": true,
16+
"timeZone": "Europe/London",
17+
"accountType": "atlassian",
18+
},
19+
"body": "Some Text comment",
20+
"updateAuthor": {
21+
"self": "https://atlassian-python.atlassian.net/rest/api/2/user?accountId=557058%3Adc675182-d776-46f5-90fb-fe5637b71397",
22+
"accountId": "557058:dc675182-d776-46f5-90fb-fe5637b71397",
23+
"emailAddress": "martyn.bristow@gmail.com",
24+
"avatarUrls": {
25+
"48x48": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
26+
"24x24": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
27+
"16x16": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
28+
"32x32": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
29+
},
30+
"displayName": "Martyn Bristow",
31+
"active": true,
32+
"timeZone": "Europe/London",
33+
"accountType": "atlassian",
34+
},
35+
"created": "2022-10-25T20:21:33.277+0100",
36+
"updated": "2022-10-25T20:21:33.277+0100",
37+
"jsdPublic": true,
38+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
responses[None] = {
2+
"startAt": 0,
3+
"maxResults": 1048576,
4+
"total": 2,
5+
"comments": [
6+
{
7+
"self": "https://atlassian-python.atlassian.net/rest/api/2/issue/10000/comment/10000",
8+
"id": "10000",
9+
"author": {
10+
"self": "https://atlassian-python.atlassian.net/rest/api/2/user?accountId=557058%3Adc675182-d776-46f5-90fb-fe5637b71397",
11+
"accountId": "557058:dc675182-d776-46f5-90fb-fe5637b71397",
12+
"emailAddress": "martyn.bristow@gmail.com",
13+
"avatarUrls": {
14+
"48x48": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
15+
"24x24": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
16+
"16x16": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
17+
"32x32": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
18+
},
19+
"displayName": "Martyn Bristow",
20+
"active": true,
21+
"timeZone": "Europe/London",
22+
"accountType": "atlassian",
23+
},
24+
"body": "Some Text comment",
25+
"updateAuthor": {
26+
"self": "https://atlassian-python.atlassian.net/rest/api/2/user?accountId=557058%3Adc675182-d776-46f5-90fb-fe5637b71397",
27+
"accountId": "557058:dc675182-d776-46f5-90fb-fe5637b71397",
28+
"emailAddress": "martyn.bristow@gmail.com",
29+
"avatarUrls": {
30+
"48x48": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
31+
"24x24": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
32+
"16x16": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
33+
"32x32": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
34+
},
35+
"displayName": "Martyn Bristow",
36+
"active": true,
37+
"timeZone": "Europe/London",
38+
"accountType": "atlassian",
39+
},
40+
"created": "2022-10-25T20:21:33.277+0100",
41+
"updated": "2022-10-25T20:21:33.277+0100",
42+
"jsdPublic": true,
43+
},
44+
{
45+
"self": "https://atlassian-python.atlassian.net/rest/api/2/issue/10000/comment/10001",
46+
"id": "10001",
47+
"author": {
48+
"self": "https://atlassian-python.atlassian.net/rest/api/2/user?accountId=557058%3Adc675182-d776-46f5-90fb-fe5637b71397",
49+
"accountId": "557058:dc675182-d776-46f5-90fb-fe5637b71397",
50+
"emailAddress": "martyn.bristow@gmail.com",
51+
"avatarUrls": {
52+
"48x48": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
53+
"24x24": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
54+
"16x16": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
55+
"32x32": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
56+
},
57+
"displayName": "Martyn Bristow",
58+
"active": true,
59+
"timeZone": "Europe/London",
60+
"accountType": "atlassian",
61+
},
62+
"body": "Second Comment",
63+
"updateAuthor": {
64+
"self": "https://atlassian-python.atlassian.net/rest/api/2/user?accountId=557058%3Adc675182-d776-46f5-90fb-fe5637b71397",
65+
"accountId": "557058:dc675182-d776-46f5-90fb-fe5637b71397",
66+
"emailAddress": "martyn.bristow@gmail.com",
67+
"avatarUrls": {
68+
"48x48": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
69+
"24x24": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
70+
"16x16": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
71+
"32x32": "https://secure.gravatar.com/avatar/6f1cc3b97033de549f9d156d0eea4a34?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FMB-4.png",
72+
},
73+
"displayName": "Martyn Bristow",
74+
"active": true,
75+
"timeZone": "Europe/London",
76+
"accountType": "atlassian",
77+
},
78+
"created": "2022-10-25T20:21:40.840+0100",
79+
"updated": "2022-10-25T20:21:40.840+0100",
80+
"jsdPublic": true,
81+
},
82+
],
83+
}

tests/test_jira.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,20 @@ def test_get_epic_issues(self):
2727
def test_get_epic_issues_not_found(self):
2828
with self.assertRaises(HTTPError):
2929
self.jira.epic_issues("BAR-11")
30+
31+
def test_get_issue_comments(self):
32+
"""Can retrieve issue comments"""
33+
resp = self.jira.issue_get_comments("FOO-123")
34+
self.assertEqual(len(resp["comments"]), 2)
35+
self.assertEqual(resp["total"], 2)
36+
37+
def test_get_issue_comment(self):
38+
"""Can retrieve issue comments"""
39+
resp = self.jira.issue_get_comment("FOO-123", 10000)
40+
self.assertEqual(resp["body"], "Some Text comment")
41+
self.assertEqual(resp["id"], "10000")
42+
43+
def test_get_issue_comment_not_found(self):
44+
"""Get comment on issue by id, but not found"""
45+
with self.assertRaises(HTTPError):
46+
self.jira.epic_issues("BAR-11")

0 commit comments

Comments
 (0)