1
1
import logging
2
+ from requests .exceptions import HTTPError
2
3
from atlassian import AtlassianRestAPI
3
4
4
5
@@ -28,14 +29,14 @@ def user(self, username):
28
29
def project (self , key ):
29
30
return self .get ('/rest/api/2/project/{0}' .format (key ))
30
31
31
- def issue (self , key ):
32
- return self .get ('/rest/api/2/issue/{0}' .format (key ))
32
+ def issue (self , key , fields = '*all' ):
33
+ return self .get ('/rest/api/2/issue/{0}?fields={1} ' .format (key , fields ))
33
34
34
35
def issue_field_value (self , key , field ):
35
36
issue = self .get ('/rest/api/2/issue/{0}?fields={1}' .format (key , field ))
36
37
return issue ['fields' ][field ]
37
38
38
- def update_issue_field (self , key , fields ):
39
+ def update_issue_field (self , key , fields = '*all' ):
39
40
return self .put ('/rest/api/2/issue/{0}' .format (key ), data = {'fields' : fields })
40
41
41
42
def project_leaders (self ):
@@ -55,3 +56,92 @@ def rename_sprint(self, sprint_id, name, start_date, end_date):
55
56
'name' : name ,
56
57
'startDate' : start_date ,
57
58
'endDate' : end_date })
59
+
60
+ def get_project_issuekey_last (self , project ):
61
+ jql = 'project = {project} ORDER BY issuekey DESC' .format (project = project )
62
+ return self .jql (jql )['issues' ][0 ]['key' ]
63
+
64
+ def get_project_issuekey_all (self , project ):
65
+ jql = 'project = {project} ORDER BY issuekey ASC' .format (project = project )
66
+ return [issue ['key' ] for issue in self .jql (jql )['issues' ]]
67
+
68
+ def get_project_issues_count (self , project ):
69
+ jql = 'project = {project}' .format (project = project )
70
+ return self .jql (jql , fields = '*none' )['total' ]
71
+
72
+ def get_all_project_issues (self , project , fields = '*all' ):
73
+ jql = 'project = {project} ORDER BY key' .format (project = project )
74
+ return self .jql (jql , fields = fields )['issues' ]
75
+
76
+ def issue_exists (self , issuekey ):
77
+ try :
78
+ self .issue (issuekey , fields = '*none' )
79
+ log .info ('Issue "{issuekey}" exists' .format (issuekey = issuekey ))
80
+ return True
81
+ except HTTPError as e :
82
+ if e .response .status_code == 404 :
83
+ log .info ('Issue "{issuekey}" does not exists' .format (issuekey = issuekey ))
84
+ return False
85
+ else :
86
+ log .info ('Issue "{issuekey}" existsted, but now it\' s deleted' .format (issuekey = issuekey ))
87
+ return True
88
+
89
+ def issue_deleted (self , issuekey ):
90
+ try :
91
+ self .issue (issuekey , fields = '*none' )
92
+ log .info ('Issue "{issuekey}" is not deleted' .format (issuekey = issuekey ))
93
+ return False
94
+ except HTTPError :
95
+ log .info ('Issue "{issuekey}" is deleted' .format (issuekey = issuekey ))
96
+ return True
97
+
98
+ def issue_update (self , issuekey , fields ):
99
+ log .warning ('Updating issue "{issuekey}" with "{summary}"' .format (issuekey = issuekey , summary = fields ['summary' ]))
100
+ url = '/rest/api/2/issue/{0}' .format (issuekey )
101
+ return self .put (url , data = {'fields' : fields })
102
+
103
+ def issue_create (self , fields ):
104
+ log .warning ('Creating issue "{summary}"' .format (summary = fields ['summary' ]))
105
+ url = '/rest/api/2/issue/'
106
+ return self .post (url , data = {'fields' : fields })
107
+
108
+ def issue_create_or_update (self , fields ):
109
+ issuekey = fields .get ('issuekey' , None )
110
+
111
+ if not issuekey or not self .issue_exists (issuekey ):
112
+ log .info ('Issuekey is not provided or does not exists in destination. Will attempt to create an issue' )
113
+ del fields ['issuekey' ]
114
+ return self .issue_create (fields )
115
+
116
+ if self .issue_deleted (issuekey ):
117
+ log .warning ('Issue "{issuekey}" deleted, skipping' .format (issuekey = issuekey ))
118
+ return None
119
+
120
+ log .info ('Issue "{issuekey}" exists, will update' .format (issuekey = issuekey ))
121
+ del fields ['issuekey' ]
122
+ return self .issue_update (issuekey , fields )
123
+
124
+ def get_issue_transitions (self , issuekey ):
125
+ url = '/rest/api/2/issue/{issuekey}?expand=transitions.fields&fields=status' .format (issuekey = issuekey )
126
+ return [{'name' : transition ['name' ], 'id' : int (transition ['id' ]), 'to' : transition ['to' ]['name' ]} for transition in self .get (url )['transitions' ]]
127
+
128
+ def get_status_id_from_name (self , status_name ):
129
+ url = '/rest/api/2/status/{name}' .format (name = status_name )
130
+ return int (self .get (url )['id' ])
131
+
132
+ def get_transition_id_to_status_name (self , issuekey , status_name ):
133
+ for transition in self .get_issue_transitions (issuekey ):
134
+ if status_name == transition ['to' ]:
135
+ return int (transition ['id' ])
136
+
137
+ def issue_transition (self , issuekey , status ):
138
+ return self .set_issue_status (issuekey , status )
139
+
140
+ def set_issue_status (self , issuekey , status_name ):
141
+ url = '/rest/api/2/issue/{issuekey}/transitions' .format (issuekey = issuekey )
142
+ transition_id = self .get_transition_id_to_status_name (issuekey , status_name )
143
+ return self .post (url , data = {'transition' : {'id' : transition_id }})
144
+
145
+ def get_issue_status (self , issuekey ):
146
+ url = '/rest/api/2/issue/{issuekey}?fields=status' .format (issuekey = issuekey )
147
+ return self .get (url )['fields' ]['status' ]['name' ]
0 commit comments