From 413524b807cb7e0221e91dd94d32f40ff210937d Mon Sep 17 00:00:00 2001 From: gkowalc Date: Fri, 29 Mar 2024 16:01:50 +0100 Subject: [PATCH] [WIP] [JIRA] new method get_issue_status_changelog + docs + example +small improvement get_issue (#1357) * fixing minor issue in scrap_regex_from_issue method * new Confluence method scrap_regex_from_page+ docs + examples * added method get_attachments_ids_from_page to jira.py --- atlassian/jira.py | 31 ++++++++++++------- docs/jira.rst | 3 ++ .../jira/jira_get_issue_status_changelog.py | 9 ++++++ 3 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 examples/jira/jira_get_issue_status_changelog.py diff --git a/atlassian/jira.py b/atlassian/jira.py index 776bf3f2a..bd24798a6 100644 --- a/atlassian/jira.py +++ b/atlassian/jira.py @@ -1082,13 +1082,7 @@ def issue(self, key, fields="*all", expand=None): params["expand"] = expand return self.get(url, params=params) - def get_issue( - self, - issue_id_or_key, - fields=None, - properties=None, - update_history=True, - ): + def get_issue(self, issue_id_or_key, fields=None, properties=None, update_history=True, expand=None): """ Returns a full representation of the issue for the given issue key By default, all fields are returned in this get-issue resource @@ -1097,6 +1091,7 @@ def get_issue( :param fields: str :param properties: str :param update_history: bool + :param expand: str :return: issue """ base_url = self.resource_url("issue") @@ -1109,11 +1104,9 @@ def get_issue( params["fields"] = fields if properties is not None: params["properties"] = properties - if update_history is True: - params["updateHistory"] = "true" - if update_history is False: - params["updateHistory"] = "false" - + if expand: + params["expand"] = expand + params["updateHistory"] = str(update_history).lower() return self.get(url, params=params) def epic_issues(self, epic, fields="*all", expand=None): @@ -1867,6 +1860,20 @@ def set_issue_status(self, issue_key, status_name, fields=None, update=None): data["update"] = update return self.post(url, data=data) + def get_issue_status_changelog(self, issue_id): + # Get the issue details with changelog + response_get_issue = self.get_issue(issue_id, expand="changelog") + status_change_history = [] + for history in response_get_issue["changelog"]["histories"]: + for item in history["items"]: + # Check if the item is a status change + if item["field"] == "status": + status_change_history.append( + {"from": item["fromString"], "to": item["toString"], "date": history["created"]} + ) + + return status_change_history + def set_issue_status_by_transition_id(self, issue_key, transition_id): """ Setting status by transition_id diff --git a/docs/jira.rst b/docs/jira.rst index ec961e466..c5af95be4 100644 --- a/docs/jira.rst +++ b/docs/jira.rst @@ -248,6 +248,9 @@ Manage issues # Get issue transitions jira.get_issue_transitions(issue_key) + # Get issue status change log + jira.get_issue_status_changelog(issue_key) + # Get status ID from name jira.get_status_id_from_name(status_name) diff --git a/examples/jira/jira_get_issue_status_changelog.py b/examples/jira/jira_get_issue_status_changelog.py new file mode 100644 index 000000000..94fcff55d --- /dev/null +++ b/examples/jira/jira_get_issue_status_changelog.py @@ -0,0 +1,9 @@ +from atlassian import Jira + +jira_cloud = Jira(url="", username="username", password="password") +jira_dc = Jira(url="url", token=">") + +# example use +jira_cloud.get_issue_status_changelog("TEST-1") +# example output: +# [{'from': 'Closed', 'to': 'In Progress', 'date': '2024-03-17T17:22:29.524-0500'}, {'from': 'In Progress', 'to': 'Closed', 'date': '2024-03-17T14:33:07.317-0500'}, {'from': 'In Progress', 'to': 'In Progress', 'date': '2024-03-16T09:25:52.033-0500'}, {'from': 'To Do', 'to': 'In Progress', 'date': '2024-03-14T19:25:02.511-0500'}]