Skip to content

Commit f146a9b

Browse files
authored
[Jira] Fix get method data retrieval failures when advanced mode is on (#1449)
* [Rest Client] Add helper method to get content _get_response_content is to be used for chaining together response retrieval. This is useful in the case where you are querying the API and then immediately extracting some data from the response. This method is needed to account for the case where advanced mode is on and the initial get call returns a requests.Response rather than a dictionary. * [Jira] Update retrieval method calls For methods that query the API and then immediately retrieve some data from the response, replace the get call with the new _get_response_content method to account for advanced mode usage. * [Jira] Fix get_issue_labels data retrieval
1 parent e9520ab commit f146a9b

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

atlassian/jira.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,7 +1232,7 @@ def get_issue_changelog(self, issue_key, start=None, limit=None):
12321232
return self.get(url, params=params)
12331233
else:
12341234
url = "{base_url}/{issue_key}?expand=changelog".format(base_url=base_url, issue_key=issue_key)
1235-
return (self.get(url) or {}).get("changelog", params)
1235+
return self._get_response_content(url, fields=[("changelog", params)])
12361236

12371237
def issue_add_json_worklog(self, key, worklog):
12381238
"""
@@ -1378,7 +1378,7 @@ def get_issue_labels(self, issue_key):
13781378
url = "{base_url}/{issue_key}?fields=labels".format(base_url=base_url, issue_key=issue_key)
13791379
if self.advanced_mode:
13801380
return self.get(url)
1381-
return (self.get(url) or {}).get("fields").get("labels")
1381+
return self._get_response_content(url, fields=[("fields",), ("labels",)])
13821382

13831383
def update_issue(self, issue_key, update):
13841384
"""
@@ -1919,12 +1919,14 @@ def set_issue_status_by_transition_id(self, issue_key, transition_id):
19191919
def get_issue_status(self, issue_key):
19201920
base_url = self.resource_url("issue")
19211921
url = "{base_url}/{issue_key}?fields=status".format(base_url=base_url, issue_key=issue_key)
1922-
return (((self.get(url) or {}).get("fields") or {}).get("status") or {}).get("name") or {}
1922+
fields = [("fields",), ("status",), ("name",)]
1923+
return self._get_response_content(url, fields=fields) or {}
19231924

19241925
def get_issue_status_id(self, issue_key):
19251926
base_url = self.resource_url("issue")
19261927
url = "{base_url}/{issue_key}?fields=status".format(base_url=base_url, issue_key=issue_key)
1927-
return (self.get(url) or {}).get("fields").get("status").get("id")
1928+
fields = [("fields",), ("status",), ("id",)]
1929+
return self._get_response_content(url, fields=fields)
19281930

19291931
def get_issue_transitions_full(self, issue_key, transition_id=None, expand=None):
19301932
"""
@@ -2721,7 +2723,7 @@ def get_project_actors_for_role_project(self, project_key, role_id):
27212723
"""
27222724
base_url = self.resource_url("project")
27232725
url = "{base_url}/{projectIdOrKey}/role/{id}".format(base_url=base_url, projectIdOrKey=project_key, id=role_id)
2724-
return (self.get(url) or {}).get("actors")
2726+
return self._get_response_content(url, fields=[("actors",)])
27252727

27262728
def delete_project_actors(self, project_key, role_id, actor, actor_type=None):
27272729
"""
@@ -3080,7 +3082,7 @@ def get_assignable_users_for_issue(self, issue_key, username=None, start=0, limi
30803082
def get_status_id_from_name(self, status_name):
30813083
base_url = self.resource_url("status")
30823084
url = "{base_url}/{name}".format(base_url=base_url, name=status_name)
3083-
return int((self.get(url) or {}).get("id"))
3085+
return int(self._get_response_content(url, fields=[("id",)]))
30843086

30853087
def get_status_for_project(self, project_key):
30863088
base_url = self.resource_url("project")
@@ -3181,7 +3183,7 @@ def get_issue_link_types(self):
31813183
a name and a label for the outward and inward link relationship.
31823184
"""
31833185
url = self.resource_url("issueLinkType")
3184-
return (self.get(url) or {}).get("issueLinkTypes")
3186+
return self._get_response_content(url, fields=[("issueLinkTypes",)])
31853187

31863188
def get_issue_link_types_names(self):
31873189
"""
@@ -3712,7 +3714,7 @@ def get_all_permissionschemes(self, expand=None):
37123714
params = {}
37133715
if expand:
37143716
params["expand"] = expand
3715-
return (self.get(url, params=params) or {}).get("permissionSchemes")
3717+
return self._get_response_content(url, params=params, fields=[("permissionSchemes",)])
37163718

37173719
def get_permissionscheme(self, permission_id, expand=None):
37183720
"""
@@ -3768,7 +3770,7 @@ def get_issue_security_schemes(self):
37683770
:return: list
37693771
"""
37703772
url = self.resource_url("issuesecurityschemes")
3771-
return self.get(url).get("issueSecuritySchemes")
3773+
return self._get_response_content(url, fields=[("issueSecuritySchemes",)])
37723774

37733775
def get_issue_security_scheme(self, scheme_id, only_levels=False):
37743776
"""
@@ -3785,7 +3787,7 @@ def get_issue_security_scheme(self, scheme_id, only_levels=False):
37853787
url = "{base_url}/{scheme_id}".format(base_url=base_url, scheme_id=scheme_id)
37863788

37873789
if only_levels is True:
3788-
return self.get(url).get("levels")
3790+
return self._get_response_content(url, fields=[("levels",)])
37893791
else:
37903792
return self.get(url)
37913793

atlassian/rest_client.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,34 @@ def get(
362362
log.error(e)
363363
return response.text
364364

365+
def _get_response_content(
366+
self,
367+
*args,
368+
fields,
369+
**kwargs,
370+
):
371+
"""
372+
:param fields: list of tuples in the form (field_name, default value (optional)).
373+
Used for chaining dictionary value accession.
374+
E.g. [("field1", "default1"), ("field2", "default2"), ("field3", )]
375+
"""
376+
response = self.get(*args, **kwargs)
377+
if "advanced_mode" in kwargs:
378+
advanced_mode = kwargs["advanced_mode"]
379+
else:
380+
advanced_mode = self.advanced_mode
381+
382+
if not advanced_mode: # dict
383+
for field in fields:
384+
response = response.get(*field)
385+
else: # requests.Response
386+
first_field = fields[0]
387+
response = response.json().get(*first_field)
388+
for field in fields[1:]:
389+
response = response.get(*field)
390+
391+
return response
392+
365393
def post(
366394
self,
367395
path,

0 commit comments

Comments
 (0)