66# See https://aboutcode.org for more information about AboutCode FOSS projects.
77#
88
9-
109from urllib .parse import urlparse
1110
1211from django .conf import settings
1312
14- from github import Github
13+ import requests
1514
15+ GITHUB_API_URL = "https://api.github.com"
1616
17- def handle_integration (request ):
17+
18+ def get_headers ():
1819 github_token = settings .DEJACODE_GITHUB_INTEGRATION_TOKEN
1920 if not github_token :
2021 raise Exception ("DEJACODE_GITHUB_INTEGRATION_TOKEN is not set." )
2122
22- github_api = Github (github_token )
23+ return {
24+ "Authorization" : f"token { github_token } " ,
25+ }
26+
27+
28+ def handle_integration (request ):
2329 repo_id = extract_github_repo_path (request .request_template .issue_tracker_id )
24- repo = github_api .get_repo (repo_id )
2530
2631 labels = []
2732 if request .priority :
@@ -30,21 +35,52 @@ def handle_integration(request):
3035 external_issue = request .external_issue
3136
3237 if external_issue : # Update existing issue on GitHib
33- issue = repo . get_issue ( number = int ( external_issue . issue_id ))
34- state = "closed" if request . is_closed else "open"
35- issue . edit (
38+ update_issue (
39+ repo_id = repo_id ,
40+ issue_number = external_issue . issue_id ,
3641 title = make_issue_title (request ),
3742 body = make_issue_body (request ),
38- state = state ,
43+ state = "closed" if request . is_closed else "open" ,
3944 )
4045 else :
41- issue = repo .create_issue (
46+ issue = create_issue (
47+ repo_id = repo_id ,
4248 title = make_issue_title (request ),
4349 body = make_issue_body (request ),
4450 labels = labels ,
4551 )
4652 # Create an ExternalIssueLink instance and assign to the Request.
47- request .link_external_issue (platform = "github" , repo = repo_id , issue_id = issue .number )
53+ request .link_external_issue (
54+ platform = "github" ,
55+ repo = repo_id ,
56+ issue_id = issue ["number" ],
57+ )
58+
59+
60+ def create_issue (repo_id , title , body = None , labels = None ):
61+ url = f"{ GITHUB_API_URL } /repos/{ repo_id } /issues"
62+ data = {"title" : title }
63+ if body :
64+ data ["body" ] = body
65+ if labels :
66+ data ["labels" ] = labels
67+
68+ response = requests .post (url , json = data , headers = get_headers (), timeout = 10 )
69+ return response .json ()
70+
71+
72+ def update_issue (repo_id , issue_number , title = None , body = None , state = None ):
73+ url = f"{ GITHUB_API_URL } /repos/{ repo_id } /issues/{ issue_number } "
74+ data = {}
75+ if title :
76+ data ["title" ] = title
77+ if body :
78+ data ["body" ] = body
79+ if state :
80+ data ["state" ] = state
81+
82+ response = requests .patch (url , json = data , headers = get_headers (), timeout = 10 )
83+ return response .json ()
4884
4985
5086def make_issue_title (request ):
@@ -65,8 +101,8 @@ def make_issue_body(request):
65101
66102 for question in request .get_serialized_data_as_list ():
67103 value = question .get ("value" )
68- if question .get ("input_type" ) == ' BooleanField' :
69- value = "Yes" if value in [1 , '1' ] else "No"
104+ if question .get ("input_type" ) == " BooleanField" :
105+ value = "Yes" if value in [1 , "1" ] else "No"
70106 lines .append (f"### { question .get ('label' )} \n { value } " )
71107
72108 return "\n \n " .join (lines )
0 commit comments