1- from github import Github , Repository , GithubException
21import csv
32import requests
43import json
54
5+ from github import Github , Repository , GithubException , PullRequest
6+
67EMPTY_FIELD = 'Empty field'
78
89
@@ -34,8 +35,27 @@ def get_next_repo(client: Github, repositories):
3435 yield repo
3536
3637
38+ def get_assignee_story (github_object ):
39+ assignee_result = ""
40+ events = github_object .get_issue_events () if type (
41+ github_object ) is PullRequest .PullRequest else github_object .get_events ()
42+ for event in events :
43+ if event .event == "assigned" or event .event == "unassigned" :
44+ date = event .created_at
45+ if event .event == "assigned" :
46+ assigner = github_object .user .login
47+ assignee = event .assignee .login
48+ assignee_result += f"{ date } : { assigner } -> { assignee } ; "
49+ else :
50+ assigner = github_object .user .login
51+ assignee = event .assignee .login
52+ assignee_result += f"{ date } : { assigner } -/> { assignee } ; "
53+ return assignee_result
54+
55+
3756def log_commit_to_csv (info , csv_name ):
38- fieldnames = ['repository name' , 'author name' , 'author login' , 'author email' , 'date and time' , 'changed files' , 'commit id' ]
57+ fieldnames = ['repository name' , 'commit id' , 'author name' , 'author login' , 'author email' , 'date and time' ,
58+ 'changed files' ]
3959 with open (csv_name , 'a' , newline = '' ) as file :
4060 writer = csv .DictWriter (file , fieldnames = fieldnames )
4161 writer .writerow (info )
@@ -69,7 +89,9 @@ def log_repository_commits(repository: Repository, csv_name):
6989def log_issue_to_csv (info , csv_name ):
7090 fieldnames = ['repository name' , 'number' , 'title' , 'state' , 'task' , 'created at' , 'creator name' , 'creator login' ,
7191 'creator email' , 'closer name' , 'closer login' , 'closer email' , 'closed at' , 'comment body' ,
72- 'comment created at' , 'comment author name' , 'comment author login' , 'comment author email' ,'connected pull requests' ]
92+ 'comment created at' , 'comment author name' , 'comment author login' , 'comment author email' ,
93+ 'assignee story' , 'connected pull requests' ]
94+
7395 with open (csv_name , 'a' , newline = '' ) as file :
7496 writer = csv .DictWriter (file , fieldnames = fieldnames )
7597 writer .writerow (info )
@@ -78,7 +100,8 @@ def log_issue_to_csv(info, csv_name):
78100def log_issue_to_stdout (info ):
79101 print (info )
80102
81- def get_connected_pulls (issue_number ,repo_owner ,repo_name ,token ):
103+
104+ def get_connected_pulls (issue_number , repo_owner , repo_name , token ):
82105 access_token = token
83106 repo_owner = repo_owner .login
84107 # Формирование запроса GraphQL
@@ -124,16 +147,20 @@ def get_connected_pulls(issue_number,repo_owner,repo_name,token):
124147 response_data = response .json ()
125148 # Обработка полученных данных
126149 pull_request_data = response_data ["data" ]["repository" ]["issue" ]
127- if (pull_request_data is not None ):
150+ list_url = []
151+ if (pull_request_data is not None ):
128152 issues_data = pull_request_data ["timelineItems" ]["nodes" ]
129- list_url = []
130153 for pulls in issues_data :
131- if (pulls .get ("CrossReferencedEvent" ) != None ) :
154+ if (pulls .get ("CrossReferencedEvent" ) != None and pulls . get ( "CrossReferencedEvent" ). get ( "url" ) not in list_url ) :
132155 list_url .append (pulls .get ("CrossReferencedEvent" ).get ("url" ))
133- if (pulls .get ("ConnectedEvent" ) != None ):
156+ if (pulls .get ("ConnectedEvent" ) != None and pulls . get ( "ConnectedEvent" ). get ( "url" ) not in list_url ):
134157 list_url .append (pulls .get ("ConnectedEvent" ).get ("url" ))
135- return list_url
136- return None
158+ if (list_url == []):
159+ return 'Empty field'
160+ else :
161+ return list_url
162+ return 'Empty field'
163+
137164
138165
139166def log_repository_issues (repository : Repository , csv_name , token ):
@@ -154,19 +181,23 @@ def log_repository_issues(repository: Repository, csv_name, token):
154181 'comment author name' : EMPTY_FIELD ,
155182 'comment author login' : EMPTY_FIELD ,
156183 'comment author email' : EMPTY_FIELD ,
157- 'connected pull requests' : EMPTY_FIELD
184+ 'assignee story' : EMPTY_FIELD ,
185+ 'connected pull requests' : EMPTY_FIELD
158186 }
159187 if issue .number is not None :
160- info_tmp ['connected pull requests' ] = get_connected_pulls (issue .number , repository .owner , repository .name , token )
188+ info_tmp ['connected pull requests' ] = get_connected_pulls (issue .number , repository .owner , repository .name ,
189+ token )
190+
191+ info_tmp ['assignee story' ] = get_assignee_story (issue )
161192
162193 if issue .user is not None :
163194 info_tmp ['creator name' ] = issue .user .name
164195 info_tmp ['creator login' ] = issue .user .login
165196
166197 if issue .closed_by is not None :
167198 info_tmp ['closed at' ] = issue .closed_at
168- info_tmp ['creator name' ] = issue .closed_by .name
169- info_tmp ['creator login' ] = issue .user .login
199+ info_tmp ['closer name' ] = issue .closed_by .name
200+ info_tmp ['closer login' ] = issue .user .login
170201
171202 if issue .get_comments ().totalCount > 0 :
172203 for comment in issue .get_comments ():
@@ -187,7 +218,8 @@ def log_pr_to_csv(info, csv_name):
187218 fieldnames = ['repository name' , 'title' , 'state' , 'commit into' , 'commit from' , 'created at' , 'creator name' ,
188219 'creator login' , 'creator email' ,
189220 'changed files' , 'comment body' , 'comment created at' , 'comment author name' , 'comment author login' ,
190- 'comment author email' , 'merger name' , 'merger login' , 'merger email' ,'source branch' , 'target branch' ,'related issues' ]
221+ 'comment author email' , 'merger name' , 'merger login' , 'merger email' , 'source branch' ,
222+ 'target branch' , 'assignee story' , 'related issues' ]
191223 with open (csv_name , 'a' , newline = '' ) as file :
192224 writer = csv .DictWriter (file , fieldnames = fieldnames )
193225 writer .writerow (info )
@@ -196,7 +228,8 @@ def log_pr_to_csv(info, csv_name):
196228def log_pr_to_stdout (info ):
197229 print (info )
198230
199- def get_related_issues (pull_request_number ,repo_owner ,repo_name ,token ):
231+
232+ def get_related_issues (pull_request_number , repo_owner , repo_name , token ):
200233 access_token = token
201234 repo_owner = repo_owner .login
202235
@@ -242,7 +275,7 @@ def get_related_issues(pull_request_number,repo_owner,repo_name,token):
242275 return list_issues_url
243276
244277
245- def log_repositories_pr (repository : Repository , csv_name ,token ):
278+ def log_repositories_pr (repository : Repository , csv_name , token ):
246279 for pull in repository .get_pulls (state = 'all' ):
247280 info_tmp = {
248281 'repository name' : repository .full_name ,
@@ -263,8 +296,9 @@ def log_repositories_pr(repository: Repository, csv_name,token):
263296 'merger name' : EMPTY_FIELD ,
264297 'merger login' : EMPTY_FIELD ,
265298 'merger email' : EMPTY_FIELD ,
266- 'source branch' : pull .head .ref ,
299+ 'source branch' : pull .head .ref ,
267300 'target branch' : pull .base .ref ,
301+ 'assignee story' : EMPTY_FIELD ,
268302 'related issues' : EMPTY_FIELD
269303 }
270304 if pull .issue_url is not None :
@@ -275,6 +309,8 @@ def log_repositories_pr(repository: Repository, csv_name,token):
275309 info_tmp ['merger login' ] = pull .merged_by .login
276310 info_tmp ['merger email' ] = pull .merged_by .email
277311
312+ info_tmp ['assignee story' ] = get_assignee_story (pull )
313+
278314 if pull .get_comments ().totalCount > 0 :
279315 for comment in pull .get_comments ():
280316 info = info_tmp
@@ -290,7 +326,7 @@ def log_repositories_pr(repository: Repository, csv_name,token):
290326 log_pr_to_stdout (info_tmp )
291327
292328
293- def log_pull_requests (client : Github , repositories , csv_name ,token ):
329+ def log_pull_requests (client : Github , repositories , csv_name , token ):
294330 with open (csv_name , 'w' , newline = '' ) as file :
295331 writer = csv .writer (file )
296332 writer .writerow (
@@ -313,9 +349,11 @@ def log_pull_requests(client: Github, repositories, csv_name,token):
313349 'merger name' ,
314350 'merger login' ,
315351 'merger email' ,
316- 'source branch' ,
352+ 'source branch' ,
317353 'target branch' ,
318354 'related issues'
355+ 'assignee story' ,
356+ 'related issues'
319357 )
320358 )
321359
@@ -335,8 +373,10 @@ def log_issues(client: Github, repositories, csv_name, token):
335373 'task' ,
336374 'created at' ,
337375 'creator name' ,
376+ 'creator login' ,
338377 'creator email' ,
339378 'closer name' ,
379+ 'closer login' ,
340380 'closer email' ,
341381 'closed at' ,
342382 'comment body' ,
@@ -345,6 +385,8 @@ def log_issues(client: Github, repositories, csv_name, token):
345385 'comment author login' ,
346386 'comment author email' ,
347387 'connected pull requests'
388+ 'assignee story' ,
389+ 'connected pull requests'
348390 )
349391 )
350392
0 commit comments