1+ import os
2+ import argparse
3+ from dotenv import load_dotenv
4+ from atlassian import Jira
5+ from date_time import date_time
6+
7+
8+ def create_story_under_epic (epic_key : str , summary :str , description :str , jira_board :str ):
9+ """
10+ create a story (Task) attaching it to a specific epic
11+ :param epic_key:
12+ :param summary:
13+ :param description:
14+ :param jira_board:
15+ :return:
16+ """
17+ # Initialize Jira
18+ JIRA_URL = os .getenv ('JIRA_URL' )
19+ JIRA_USERNAME = os .getenv ('JIRA_USERNAME' )
20+ JIRA_PASSWORD = os .getenv ('JIRA_PASSWORD' )
21+ jira = Jira (url = os .getenv ('JIRA_URL' ), username = os .getenv ('JIRA_USERNAME' ), password = os .getenv ('JIRA_PASSWORD' ),
22+ cloud = True )
23+
24+ issue_dict = {
25+ 'project' : {'key' : jira_board },
26+ 'summary' : summary ,
27+ 'description' : description ,
28+ 'issuetype' : {'name' : 'Task' },
29+ 'parent' : {
30+ "key" : epic_key
31+ }
32+ }
33+ new_issue = jira .issue_create (fields = issue_dict )
34+
35+ return new_issue
36+
37+ def create_epic (summary :str , description :str , jira_board :str ):
38+ """
39+ Create an Epic under a specific Jira board
40+ :param summary:
41+ :param description:
42+ :param jira_board:
43+ :return:
44+ """
45+ # Initialize Jira
46+ JIRA_URL = os .getenv ('JIRA_URL' )
47+ JIRA_USERNAME = os .getenv ('JIRA_USERNAME' )
48+ JIRA_PASSWORD = os .getenv ('JIRA_PASSWORD' )
49+ jira = Jira (url = os .getenv ('JIRA_URL' ), username = os .getenv ('JIRA_USERNAME' ), password = os .getenv ('JIRA_PASSWORD' ),
50+ cloud = True )
51+
52+ issue_dict = {
53+ 'project' : {'key' : jira_board },
54+ 'summary' : summary ,
55+ 'description' : description ,
56+ 'issuetype' : {'name' : 'Epic' }
57+ }
58+ new_issue = jira .issue_create (fields = issue_dict )
59+
60+ return new_issue
61+
62+
63+ def create_subtask_under_story ( summary :str , description :str , jira_board :str , story_key :str ):
64+ """
65+ Create a sub task on a Jira story
66+ :param summary:
67+ :param description:
68+ :param jira_board:
69+ :param story_key:
70+ :return:
71+ """
72+ # Initialize Jira
73+ JIRA_URL = os .getenv ('JIRA_URL' )
74+ JIRA_USERNAME = os .getenv ('JIRA_USERNAME' )
75+ JIRA_PASSWORD = os .getenv ('JIRA_PASSWORD' )
76+ jira = Jira (url = os .getenv ('JIRA_URL' ), username = os .getenv ('JIRA_USERNAME' ), password = os .getenv ('JIRA_PASSWORD' ),
77+ cloud = True )
78+
79+ issue_dict = {
80+ 'project' : {'key' : jira_board },
81+ 'summary' : summary ,
82+ 'description' : description ,
83+ 'issuetype' : {'name' : 'Subtask' },
84+ 'parent' : {
85+ "key" : story_key
86+ }
87+ }
88+ new_issue = jira .issue_create (fields = issue_dict )
89+
90+ return new_issue
91+
92+
93+ def main ():
94+ """testing script"""
95+ # Initializing jira client
96+ load_dotenv ()
97+ parser = argparse .ArgumentParser ("Programatically create Jira Issues" )
98+ parser .add_argument ("--type_of_issue" , help = "Type of Jira issue to be created" , choices = ["Epic" , "Task" , "Subtask" ], required = True )
99+ parser .add_argument ("--jira_board" , help = "Your Jira board Key" , required = True , type = str )
100+ parser .add_argument ("--epic_key" , help = "Jira EPIC id to attach issue" , required = False , type = str )
101+ parser .add_argument ("--summary" , help = "Issue summary" , required = True , type = str )
102+ parser .add_argument ("--description" , help = "Issue description" , required = True , type = str )
103+ parser .add_argument ("--story_key" , help = "Jira story key to attach sub task" , type = str , required = False )
104+
105+ args = parser .parse_args ()
106+ jira_board = args .jira_board
107+ epic_key = args .epic_key
108+ summary = args .summary
109+ description = args .description
110+ story_key = args .story_key
111+ type_of_issue = args .type_of_issue
112+
113+ if type_of_issue == 'Epic' :
114+ # Create Epic
115+ epic = create_epic (summary , description , jira_board )
116+ print (f"Created Epic { epic ['key' ]} on jira board { jira_board } at { date_time ()} IST" )
117+ elif type_of_issue == "Task" :
118+ if not epic_key :
119+ raise ValueError ("epic_key is required for creating a Task" )
120+ # Create the story attaching to an epic
121+ story = create_story_under_epic (epic_key , summary , description , jira_board )
122+ print (f"Created story { story ['key' ]} with epic { epic_key } at { date_time ()} IST" )
123+ else :
124+ if not story_key :
125+ raise ValueError ("story_key is required for creating a Subtask" )
126+ # Create Sub task under a story
127+ sub_task = create_subtask_under_story (summary , description , jira_board , story_key = story_key )
128+ print (f"Created story { sub_task ['key' ]} under epic { epic_key } at { date_time ()} IST" )
129+
130+
131+
132+ if __name__ == "__main__" :
133+ main ()
0 commit comments