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