Jira module¶
Get issues from jql search result with all related fields¶
jql_request = 'project = DEMO AND status NOT IN (Closed, Resolved) ORDER BY issuekey' issues = jira.jql(jql_request) print(issues)
Reindex Jira¶
# Reindexing Jira jira.reindex() # Reindex status jira.reindex_status() # Reindex type jira.reindex_with_type(indexing_type="BACKGROUND_PREFERRED") """ FOREGROUND - runs a lock/full reindexing BACKGROUND - runs a background reindexing. If JIRA fails to finish the background reindexing, respond with 409 Conflict (error message). BACKGROUND_PREFERRED - If possible do a background reindexing. If it's not possible (due to an inconsistent index), do a foreground reindexing. """
Manage users¶
# Get user jira.user(account_id) # Remove user jira.user_remove(username) # Deactivate user. Works from 8.3.0 release jira.user_deactivate(username) # Get web sudo cookies using normal http request jira.user_get_websudo() # Fuzzy search using emailAddress or displayName jira.user_find_by_user_string(query, start=0, limit=50, include_inactive_users=False) # Get groups of a user. This API is only available for Jira Cloud platform. jira.get_user_groups(account_id)
Manage groups¶
# Create a group jira.create_group(name) # Delete a group # If you delete a group and content is restricted to that group, the content will be hidden from all users # To prevent this, use this parameter to specify a different group to transfer the restrictions # (comments and worklogs only) to jira.remove_group(name, swap_group=None) # Get all users from group jira.get_all_users_from_group(group, include_inactive_users=False, start=0, limit=50) # Add given user to a group jira.add_user_to_group(username=None, group_name=None, account_id=None) # Remove given user from a group jira.remove_user_from_group(username=None, group_name=None, account_id=None)
Manage projects¶
# Get all projects # Returns all projects which are visible for the currently logged in user. jira.projects(included_archived=None) # Get all project alternative call # Returns all projects which are visible for the currently logged in user. jira.get_all_projects(included_archived=None) # Delete project jira.delete_project(key) # Archive Project jira.archive_project(key) # Get project jira.project(key, expand=None) # Get project info jira.get_project(key, expand=None) # Get project components using project key jira.get_project_components(key) # Get a full representation of a the specified project's versions jira.get_project_versions(key, expand=None) # Returns all versions for the specified project. Results are paginated. # Results can be ordered by the following fields: sequence, name, startDate, releaseDate. # Results can be filtered by the following fields: query, status. jira.get_project_versions_paginated(key, start=None, limit=None, order_by=None, expand=None, query=None, status=None) # Add missing version to project jira.add_version(key, project_id, version, is_archived=False, is_released=False) # Update an existing version jira.update_version(version, name=None, description=None, is_archived=None, is_released=None, start_date=None, release_date=None) # Get project leaders jira.project_leaders() # Get last project issuekey jira.get_project_issuekey_last(project) # Get all project issue keys. # JIRA Cloud API can return up to 100 results in one API call. # If your project has more than 100 issues see following community discussion: # https://community.atlassian.com/t5/Jira-Software-questions/Is-there-a-limit-to-the-number-of-quot-items-quot-returned-from/qaq-p/1317195 jira.get_project_issuekey_all(project) # Get project issues count jira.get_project_issues_count(project) # Get all project issues jira.get_all_project_issues(project, fields='*all', start=100, limit=500) # Get all assignable users for project jira.get_all_assignable_users_for_project(project_key, start=0, limit=50) # Update a project jira.update_project(project_key, data, expand='lead,description') # Get project permission scheme # Use 'expand' to get details (default is None) jira.get_project_permission_scheme(project_id_or_key, expand='permissions,user,group,projectRole,field,all') # Get the issue security scheme for project. # Returned if the user has the administrator permission or if the scheme is used in a project in which the # user has the administrative permission. # Use only_levels=True for get the only levels entries jira.get_project_issue_security_scheme(project_id_or_key, only_levels=False) # Resource for associating notification schemes and projects. # Gets a notification scheme associated with the project. # Follow the documentation of /notificationscheme/ resource for all details about returned value. # Use 'expand' to get details (default is None) possible values are notificationSchemeEvents,user,group,projectRole,field,all jira.get_priority_scheme_of_project(project_key_or_id, expand=None) # Returns a list of active users who have browse permission for a project that matches the search string for username. # Using " " string (space) for username gives All the active users who have browse permission for a project jira.get_users_with_browse_permission_to_a_project(self, username, issue_key=None, project_key=None, start=0, limit=100)
Manage issues¶
# Get issue by key jira.issue(key) # Get issue field value jira.issue_field_value(key, field) # Update issue field fields = 'summary': 'New summary'> jira.update_issue_field(key, fields) # Get existing custom fields or find by filter jira.get_custom_fields(self, search=None, start=1, limit=50): # Check issue exists jira.issue_exists(issue_key) # Check issue deleted jira.issue_deleted(issue_key) # Update issue jira.issue_update(issue_key, fields) # Assign issue to user jira.assign_issue(issue_key, account_id) # Create issue jira.issue_create(fields) # Issue create or update jira.issue_create_or_update(fields) # Get issue transitions jira.get_issue_transitions(issue_key) # Get status ID from name jira.get_status_id_from_name(status_name) # Get transition id to status name jira.get_transition_id_to_status_name(issue_key, status_name) # Transition issue jira.issue_transition(issue_key, status) # Set issue status jira.set_issue_status(issue_key, status_name, fields=None) # Set issue status by transition_id jira.set_issue_status_by_transition_id(issue_key, transition_id) # Get issue status jira.get_issue_status(issue_key) # Get Issue Link jira.get_issue_link(link_id) # Get Issue Edit Meta jira.issue_editmeta(issue_key) # Create Issue Link data = "type": "name": "Duplicate" >, "inwardIssue": "key": "HSP-1">, "outwardIssue": "key": "MKY-1">, "comment": "body": "Linked related issue!", "visibility": "type": "group", "value": "jira-software-users" > > > jira.create_issue_link(data) # Remove Issue Link jira.remove_issue_link(link_id) # Create or Update Issue Remote Links jira.create_or_update_issue_remote_links(issue_key, link_url, title, global_id=None, relationship=None, icon_url=None, icon_title=None) # Get Issue Remote Link by link ID jira.get_issue_remote_link_by_id(issue_key, link_id) # Update Issue Remote Link by link ID jira.update_issue_remote_link_by_id(issue_key, link_id, url, title, global_id=None, relationship=None) # Delete Issue Remote Links jira.delete_issue_remote_link_by_id(issue_key, link_id) # Export Issues to csv jira.csv(jql, all_fields=False) # Add watcher to an issue jira.issue_add_watcher(issue_key, user) # Remove watcher from an issue jira.issue_delete_watcher(issue_key, user) # Get watchers for an issue jira.issue_get_watchers(issue_key) # Archive an issue jira.issue_archive(issue_id_or_key) # Restore an issue jira.issue_restore(issue_id_or_key) # Issue Comments jira.issue_get_comments(issue_id_or_key) # Get issue comment by id jira.issue_get_comment(issue_id_or_key, comment_id) # Get comments over all issues by ids jira.issues_get_comments_by_id(comment_id, [comment_id. ]) # Get change history for an issue jira.get_issue_changelog(issue_key) # Get worklog for an issue jira.issue_get_worklog(issue_key) # Create a new worklog entry for an issue # started is a date string in the format %Y-%m-%dT%H:%M:%S.000+0000%z jira.issue_worklog(issue_key, started, time_in_sec)
Epic Issues¶
# Issues within an Epic jira.epic_issues(epic_key)
sandipb.net
© 2004-2023.
Content licensed under CC-By 4.0.
Blog generated by Hugo using the Hyde theme.
Using Python to update a required field while performing a transition in Jira
Fri, Feb 19, 2016
This might be a very esoteric topic for most people, but since I could not find information about this anywhere, I decided to document this in a post.
Here is the problem. I use Jira at work, and today, I needed to close a bunch of tickets based on a search result. Now, searching or doing batch operations is simple enough from the browser, but a small detail made the exercise impossible via the web UI.
Our Jira project requires a field to be filled while closing the ticket — the time spent in the ticket. This breaks Jira in all sorts of ways — the batch operation doesn’t work, some of the email-to-jira interface at work breaks as well.
So I looked at doing this via the Jira Python library. But it didn’t work as expected.
>>> from jira import JIRA >>> jira = JIRA("https://JIRA_URL", basic_auth=('USER_NAME', 'Password')) >>> >>> issue = jira.issue("ISSUE-123") >>> >>> [(t['id'], t['name']) for t in jira.transitions(issue)] # What are the workflows available? [(u'4', u'Start Progress'), (u'5', u'Resolve Issue'), (u'2', u'Close Issue'), (u'711', u'Planning'), (u'751', u'Blocked'), (u'801', u'To Monitor') >>> >>> jira.transition_issue(issue, '2') Traceback (most recent call last): File "", line 1, in . jira.exceptions.JIRAError: JiraError HTTP 400 text: Time Spent is required url: . response headers = response text = <"errorMessages":["Time Spent is required"],"errors":<>>
The documentation on transitions mentioned that we could add fields in the call to jira.transitions() . That didn’t work as well.
>>> jira.transition_issue(issue, '2', timespent="1h") Traceback (most recent call last): File "", line 1, in . jira.exceptions.JIRAError: JiraError HTTP 400 text: Field 'timespent' cannot be set. It is not on the appropriate screen, or unknown. url: . response headers = . response text = <"errorMessages":[],"errors":<"timespent":"Field 'timespent' cannot be set. It is not on the appropriate screen, or unknown.">>
So I scoured the Internet for a long time, till I found this post about how to do it via the REST API — the only official interface to Jira. Here is what needs to be sent as the body to the POST request.
"transition": "id": "2" >, "update": "worklog": [ "add": "timeSpent": "2m" > > ] > >
I felt that to be odd, till I looked at both the api documentation for transition and the doc for transition using the python library and I found out why I have not been successful till now.
The REST api supports two ways to update the issue while doing a transition — you can set certain fields using the fields option, or you can use the update option to do more complex changes.
The comment in the Python code revealed that the update method has not yet been implemented.
def transition_issue(self, issue, transition, fields=None, comment=None, **fieldargs): # TODO: Support update verbs (same as issue.update())
That put me in a bind. I had only one way to hack around this problem now — using the REST api for the specific operation I wanted, and the Python library for the rest of the work — ugly, but works for now, till the Python library is complete.
So here was the final solution that did what I wanted.
from jira import JIRA import requests jira = JIRA("https://JIRA_URL", basic_auth=('USER_NAME', 'PASSWORD')) d = <> d["transition"]="id": "2"> d["update"]="worklog": ["add": "timeSpent": "1h">>]> s = requests.Session() s.auth = ("USER", "PASSWORD") s.headers.update("Content-Type": "application/json">) j="https://JIRA_URL" issue_list = jira.search_issues("assignee = currentUser() AND resolution = Unresolved and status != Closed and updatedDate < '2015-10-01' and project='PROJECT' ORDER BY updatedDate DESC") for i in issue_list: print i s.post(j+"/rest/api/2/issue/"+i.key+"/transitions", data=json.dumps(d))