Skip to content

Commit 6a14b06

Browse files
committed
fix: Use field translation in Jira.issue method
1 parent 9900396 commit 6a14b06

File tree

2 files changed

+68
-17
lines changed

2 files changed

+68
-17
lines changed

jira/client.py

+48-17
Original file line numberDiff line numberDiff line change
@@ -1800,12 +1800,15 @@ def issue(
18001800

18011801
params = {}
18021802
if fields is not None:
1803-
params["fields"] = fields
1803+
fields_list = self._translate_fields_name_to_id(fields)
1804+
params["fields"] = ",".join(fields_list)
18041805
if expand is not None:
18051806
params["expand"] = expand
18061807
if properties is not None:
18071808
params["properties"] = properties
1809+
18081810
issue.find(id, params=params)
1811+
self._untranslate_issues_fields_id_to_fields_name([issue])
18091812
return issue
18101813

18111814
def create_issue(
@@ -3547,14 +3550,7 @@ def search_issues(
35473550
elif fields is None:
35483551
fields = ["*all"]
35493552

3550-
# this will translate JQL field names to REST API Name
3551-
# most people do know the JQL names so this will help them use the API easier
3552-
untranslate = {} # use to add friendly aliases when we get the results back
3553-
if self._fields_cache:
3554-
for i, field in enumerate(fields):
3555-
if field in self._fields_cache:
3556-
untranslate[self._fields_cache[field]] = fields[i]
3557-
fields[i] = self._fields_cache[field]
3553+
fields = self._translate_fields_name_to_id(fields)
35583554

35593555
search_params = {
35603556
"jql": jql_str,
@@ -3590,16 +3586,51 @@ def search_issues(
35903586
use_post=use_post,
35913587
)
35923588

3593-
if untranslate:
3594-
iss: Issue
3595-
for iss in issues:
3596-
for k, v in untranslate.items():
3597-
if iss.raw:
3598-
if k in iss.raw.get("fields", {}):
3599-
iss.raw["fields"][v] = iss.raw["fields"][k]
3600-
3589+
self._untranslate_issues_fields_id_to_fields_name(issues)
36013590
return issues
36023591

3592+
def _translate_fields_name_to_id(self, fields: list[str] | str) -> list[str]:
3593+
"""Translate fields names to JIRA's REST API field id.
3594+
3595+
Args:
3596+
fields (list[str] | str): comma-separated string or list of issue fields to be translated
3597+
3598+
Returns:
3599+
tuple[list[str], dict[str, str]]: Returns translated fields and dictionary {field_id: field_name}
3600+
with translation needed to decode ids into names.
3601+
Translated fields variable is always List type
3602+
"""
3603+
translated_fields: list[str]
3604+
if isinstance(fields, str):
3605+
translated_fields = fields.split(",")
3606+
elif isinstance(fields, list):
3607+
translated_fields = fields.copy()
3608+
else:
3609+
raise NotImplementedError(
3610+
"Translating fields for <%s> type is unsupported", type(fields)
3611+
)
3612+
3613+
if self._fields_cache:
3614+
for i, field_name in enumerate(translated_fields):
3615+
if field_name in self._fields_cache:
3616+
translated_fields[i] = self._fields_cache[field_name]
3617+
3618+
return translated_fields
3619+
3620+
def _untranslate_issues_fields_id_to_fields_name(self, issues: list[Issue]) -> None:
3621+
"""Untranslate issues fields names from JIRA's REST API field id.
3622+
3623+
Args:
3624+
issues (list[Issue]): list of issues to be untranslated
3625+
"""
3626+
for issue in issues:
3627+
if not issue.raw:
3628+
return
3629+
for field_name, field_id in self._fields_cache.items():
3630+
if field_id in issue.raw.get("fields", {}):
3631+
issue.raw["fields"][field_name] = issue.raw["fields"][field_id]
3632+
setattr(issue.fields, field_name, issue.raw["fields"][field_id])
3633+
36033634
# Security levels
36043635
def security_level(self, id: str) -> SecurityLevel:
36053636
"""Get a security level Resource.

tests/resources/test_issue.py

+20
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ def test_issue_search_only_includes_provided_fields(self):
3838
self.assertTrue(hasattr(issues[0].fields, "assignee"))
3939
self.assertFalse(hasattr(issues[0].fields, "reporter"))
4040

41+
def test_find_issue_fields_translating(self):
42+
issues = self.jira.search_issues(f"key={self.issue_1}", fields="due")
43+
issue = issues[0]
44+
self.assertTrue(hasattr(issue.fields, "due"))
45+
self.assertTrue(hasattr(issue.fields, "duedate"))
46+
self.assertTrue(issue.fields.due == issue.fields.duedate)
47+
4148
def test_issue_search_default_behaviour_included_fields(self):
4249
search_str = f"key={self.issue_1}"
4350
issues = self.jira.search_issues(search_str)
@@ -91,6 +98,19 @@ def test_issue_expand(self):
9198
# testing for changelog is not reliable because it may exist or not based on test order
9299
# self.assertFalse(hasattr(issue, 'changelog'))
93100

101+
def test_find_issue_fields_limiting(self):
102+
issue = self.jira.issue(self.issue_1, fields="summary, comment")
103+
self.assertTrue(hasattr(issue.fields, "summary"))
104+
self.assertTrue(hasattr(issue.fields, "comment"))
105+
self.assertFalse(hasattr(issue.fields, "reporter"))
106+
self.assertFalse(hasattr(issue.fields, "progress"))
107+
108+
def test_search_issues_fields_translating(self):
109+
issue = self.jira.issue(self.issue_1, fields="due")
110+
self.assertTrue(hasattr(issue.fields, "due"))
111+
self.assertTrue(hasattr(issue.fields, "duedate"))
112+
self.assertTrue(issue.fields.due == issue.fields.duedate)
113+
94114
def test_create_issue_with_fieldargs(self):
95115
issue = self.jira.create_issue(
96116
summary="Test issue created",

0 commit comments

Comments
 (0)