Jira

Jira and Confluence Markup

h1. Biggest heading
h3. Big heading
h5. Small heading

- some
- bullet
- points

* some
* bullet
** indented
** bullets
* points

# a
# numbered
# list

||heading 1||heading 2||heading 3||
|cell A1|cell A2|cell A3|
|cell B1|cell B2|cell B3|

*bold text*
_italics_

[title | http://confluence.atlassian.com]

!screenshot-1.png! 
!screenshot-2.png|thumbnail!

JQL (Jira Query Language)

  (assignee = bob OR assignee = alice) AND (type = "Issue" OR type = Epic) ORDER BY issuetype DESC

  labels in (Labelxyz)

getWorklog.py

   1 #!/usr/bin/python3
   2 """
   3 JIRA_USERS=alice,bob JIRA_URL=https://example.org JIRA_USER=userx JIRA_PASS=xxxxx python3 getWorklog.py 
   4 """
   5 import sys
   6 import os
   7 import requests
   8 import json
   9 #import utils
  10 
  11 URL_SESSION="/rest/auth/1/session"
  12 
  13 def loginJira(url,user,passw):
  14     sessionUrl = '%s%s'%(url,URL_SESSION)
  15     jsonRequest={'username':'','password':''}
  16     jsonRequest['username']=user
  17     jsonRequest['password']=passw
  18     response = requests.post(sessionUrl,json=jsonRequest)
  19     rsp = json.loads(response.text)
  20     return response.cookies
  21 
  22 def current_user(url,cookies):
  23     sessionUrl = '%s%s'%(url,URL_SESSION)
  24     response = requests.get(sessionUrl,cookies=cookies)
  25     return json.loads(response.text)
  26 
  27 def logout(url,cookies):
  28     sessionUrl = '%s%s'%(url,URL_SESSION)
  29     response = requests.delete(sessionUrl,cookies=cookies)
  30     return response.status_code
  31 
  32 def get_issue(url,cookies,issue):
  33     sessionUrl = '%s/rest/api/2/issue/%s'%(url,issue)
  34     print('Using %s'%(sessionUrl))
  35     response = requests.get(sessionUrl, cookies=cookies )
  36     rsp=json.loads(response.text)
  37     key = rsp['key']
  38     summary = rsp['fields']['summary']
  39     print('%s -> %s'%(key,summary))
  40 
  41 def get_assigned_issues(url,cookies,user):
  42     sessionUrl = '%s/rest/api/2/search?maxResults=1000&jql=assignee=%s'%(url,user)
  43     response = requests.get(sessionUrl, cookies=cookies )
  44     rsp=json.loads(response.text)
  45     for issue in rsp["issues"]:
  46         issue_key=issue["key"]
  47         issue_fields=issue["fields"]
  48         print("\nIssue: " + issue_key )
  49         print("Type: " + issue_fields["issuetype"]["name"] )
  50         print("Assignee: " + issue_fields["assignee"]["key"] )
  51         print("Labels: " + str(issue_fields["labels"]) )
  52         print("Project: " + issue_fields["project"]["key"] )
  53         print("Summary: %s"%( issue_fields["summary"].encode('latin1','ignore') )  )
  54         print("Status: " + issue_fields["status"]["name"] )
  55         get_issue_worklog(url,cookies, issue_key, str(issue_fields["labels"]))
  56 
  57 def get_worklog_per_user(url,cookies,user):
  58     sessionUrl = '%s/rest/api/2/search?maxResults=1000&jql=worklogAuthor=%s'%(url,user)
  59     response = requests.get(sessionUrl, cookies=cookies )
  60     rsp=json.loads(response.text)
  61 
  62     for issue in rsp["issues"]:
  63         issue_key=issue["key"]
  64         issue_fields=issue["fields"]
  65         labels=""
  66         for label in issue_fields["labels"]:
  67             labels = labels + " " + label
  68         issue_type = issue_fields["issuetype"]["name"]
  69         #issue_assignee = issue_fields["assignee"]["name"]#["emailAddress"]
  70         issue_project=issue_fields["project"]["key"]
  71         issue_summary=issue_fields["summary"].encode('latin1','ignore')
  72         issue_status=issue_fields["status"]["name"]
  73         print("\n%s %s %s %s %s %s"%(issue_project,issue_type,issue_key,labels,issue_summary,issue_status) )       
  74         #print("Assignee: " + issue_assignee )
  75         get_issue_worklog(url,cookies, issue_key,str(issue_fields["labels"]))
  76 
  77 def get_issue_worklog(url,cookies,issue,labels):
  78     sessionUrl = '%s/rest/api/2/issue/%s/worklog?maxResults=1000'%(url,issue)
  79     response = requests.get(sessionUrl, cookies=cookies )
  80     rsp=json.loads(response.text)
  81 
  82     for worklog in rsp["worklogs"]:
  83         author = worklog["author"]["emailAddress"]
  84         started = worklog["started"]
  85         timeSpent =  worklog["timeSpent"]
  86         print("  %s %s %s %s %s " %(author,started,issue,labels,timeSpent) )
  87 
  88 if __name__=='__main__':
  89     jiraUrl=os.environ['JIRA_URL'] 
  90     jiraUser=os.environ['JIRA_USER']
  91     jiraPass=os.environ['JIRA_PASS']
  92     jiraUsers=os.environ['JIRA_USERS']
  93 
  94     cookies=loginJira(jiraUrl, jiraUser, jiraPass )
  95     current_user(jiraUrl,cookies)
  96     splitted = jiraUsers.split(",")
  97     for user in splitted:
  98         get_worklog_per_user(jiraUrl,cookies,user)
  99     logout(jiraUrl,cookies)    

getWorklogApiToken.py

   1 #!/usr/bin/python3
   2 """
   3 Uses an API token generated using an Atlassian user account.
   4 JIRA_URL=https://xyz.atlassian.net JIRA_USER=user@example.org JIRA_API_TOKEN=xxx TEAM_USERS=Alice,Bob,Mallory python3 getWorklogApiToken.py
   5 """
   6 import sys
   7 import os
   8 import requests
   9 import json
  10 import base64
  11 
  12 def get_assigned_issues(url,authorization,user):
  13     headers={
  14         "Authorization":"Basic %s"%(authorization),
  15         "Content-Type":'application/json'
  16         }
  17     full_url = '%s/rest/api/2/search?maxResults=1000&jql=assignee=%s'%(url,user)
  18     response = requests.get(full_url,headers=headers)
  19     rsp=json.loads(response.text)
  20 
  21     for issue in rsp["issues"]:
  22         issue_key=issue["key"]
  23         issue_fields=issue["fields"]
  24         issue_type = issue_fields["issuetype"]["name"]
  25         issue_assignee = issue_fields["assignee"]["displayName"] 
  26         summary = str( issue_fields["summary"].encode('latin1','ignore')  , 'utf-8')
  27         status = issue_fields["status"]["name"]
  28         print("%8s - %32s - %48s"%(issue_key, status, summary[:48]))
  29 
  30 def get_worklog_per_user(url,authorization,user):
  31     headers={
  32         "Authorization":"Basic %s"%(authorization),
  33         "Content-Type":'application/json'
  34         }
  35     full_url = '%s/rest/api/2/search?maxResults=10000&jql=worklogAuthor=%s'%(url,user)
  36     response = requests.get(full_url,headers=headers)
  37     rsp=json.loads(response.text)
  38 
  39     for issue in rsp["issues"]:
  40         issue_key=issue["key"]
  41         issue_fields=issue["fields"]
  42         labels=""
  43         for label in issue_fields["labels"]:
  44             labels = labels + " " + label
  45         issue_type = issue_fields["issuetype"]["name"]
  46         issue_summary=str( issue_fields["summary"].encode('utf-8','ignore') , encoding='utf-8')
  47         issue_status=issue_fields["status"]["name"]
  48         print("\n%s %s %s %s %s"%(issue_type,issue_key,labels,issue_status,issue_summary[:32]) )       
  49         get_issue_worklog(url,authorization, issue_key,str(issue_fields["labels"]),user,issue_summary)
  50 
  51 def get_issue_worklog(url,authorization,issue,labels,user,issue_summary):
  52     headers={
  53         "Authorization":"Basic %s"%(authorization),
  54         "Content-Type":'application/json'
  55         }
  56     full_url = '%s/rest/api/2/issue/%s/worklog?maxResults=1000'%(url,issue)
  57     response = requests.get(full_url,headers=headers)
  58     rsp=json.loads(response.text)
  59 
  60     for worklog in rsp["worklogs"]:
  61         if worklog["author"]["accountId"]==user:
  62             author = user + " " + worklog["author"]["displayName"]
  63             started = worklog["started"]
  64             timeSpent =  worklog["timeSpent"]
  65             print("  %s %s %s %s %s" %(author, started[0:10] ,issue,labels, timeSpent) )
  66 
  67 def get_users(url,authorization,filter_users):
  68     headers={
  69         "Authorization":"Basic %s"%(authorization),
  70         "Content-Type":'application/json'
  71         }
  72     full_url = "%s/rest/api/2/users?maxResults=10000"%(url)
  73     reply = requests.get(full_url,headers=headers)
  74     users = json.loads(reply.text)
  75     res=[]
  76     for u in users:
  77         for fu in filter_users:
  78             if fu in u["displayName"]:
  79                 res.append({
  80                     'user':u["displayName"] , 
  81                     'accountId':u["accountId"] , 
  82                     'active': u["active"] 
  83                     })
  84     return res
  85 if __name__=='__main__':
  86     jiraUrl = os.environ['JIRA_URL'] 
  87     jiraUser = os.environ['JIRA_USER']
  88     jiraApiToken = os.environ['JIRA_API_TOKEN']
  89     team_users = os.environ['TEAM_USERS'].split(',')
  90 
  91     authorization = str(base64.b64encode(bytes("%s:%s"%(jiraUser,jiraApiToken),'utf-8')),'utf-8')
  92 
  93     users = get_users(jiraUrl,authorization,team_users)
  94     for user in users:
  95         print("\n\n### %s - %s ###"%(user["user"], user["accountId"]))
  96         get_assigned_issues(jiraUrl,authorization,user["accountId"])
  97         get_worklog_per_user(jiraUrl,authorization,user["accountId"])        

Jira (last edited 2021-08-21 15:05:37 by localhost)