88
99from urllib .parse import urlparse
1010
11- from django .conf import settings
12-
13- import requests
11+ from workflow .integrations import BaseIntegration
1412
1513GITHUB_API_URL = "https://api.github.com"
16- DEJACODE_SITE_URL = settings .SITE_URL .rstrip ("/" )
1714
1815
19- class GitHubIntegration :
16+ class GitHubIntegration ( BaseIntegration ) :
2017 """
2118 A class for managing GitHub issue creation, updates, and comments
2219 from DejaCode requests.
2320 """
2421
2522 api_url = GITHUB_API_URL
26- default_timeout = 10
27-
28- def __init__ (self , dataspace ):
29- if not dataspace :
30- raise ValueError ("Dataspace must be provided." )
31- self .dataspace = dataspace
32- self .session = self .get_session ()
33-
34- def get_session (self ):
35- session = requests .Session ()
36- session .headers .update (self .get_headers ())
37- return session
3823
3924 def get_headers (self ):
4025 github_token = self .dataspace .get_configuration (field_name = "github_token" )
@@ -61,6 +46,7 @@ def sync(self, request):
6146 title = self .make_issue_title (request ),
6247 body = self .make_issue_body (request ),
6348 state = "closed" if request .is_closed else "open" ,
49+ labels = labels ,
6450 )
6551 else :
6652 issue = self .create_issue (
@@ -93,7 +79,7 @@ def create_issue(self, repo_id, title, body="", labels=None):
9379 response .raise_for_status ()
9480 return response .json ()
9581
96- def update_issue (self , repo_id , issue_id , title = None , body = None , state = None ):
82+ def update_issue (self , repo_id , issue_id , title = None , body = None , state = None , labels = None ):
9783 """Update an existing GitHub issue."""
9884 url = f"{ self .api_url } /repos/{ repo_id } /issues/{ issue_id } "
9985 data = {}
@@ -103,6 +89,8 @@ def update_issue(self, repo_id, issue_id, title=None, body=None, state=None):
10389 data ["body" ] = body
10490 if state :
10591 data ["state" ] = state
92+ if labels :
93+ data ["labels" ] = labels
10694
10795 response = self .session .patch (
10896 url ,
@@ -137,40 +125,3 @@ def extract_github_repo_path(url):
137125 raise ValueError ("Incomplete GitHub repository path." )
138126
139127 return f"{ path_parts [0 ]} /{ path_parts [1 ]} "
140-
141- @staticmethod
142- def make_issue_title (request ):
143- return f"[DEJACODE] { request .title } "
144-
145- @staticmethod
146- def make_issue_body (request ):
147- request_url = f"{ DEJACODE_SITE_URL } { request .get_absolute_url ()} "
148- label_fields = [
149- ("📝 Request Template" , request .request_template ),
150- ("📦 Product Context" , request .product_context ),
151- ("📌 Applies To" , request .content_object ),
152- ("🙋 Submitted By" , request .requester ),
153- ("👤 Assigned To" , request .assignee ),
154- ("🚨 Priority" , request .priority ),
155- ("🗒️ Notes" , request .notes ),
156- ("🔗️ DejaCode URL" , request_url ),
157- ]
158-
159- lines = []
160- for label , value in label_fields :
161- if value :
162- lines .append (f"### { label } \n { value } " )
163-
164- lines .append ("----" )
165-
166- for question in request .get_serialized_data_as_list ():
167- label = question .get ("label" )
168- value = question .get ("value" )
169- input_type = question .get ("input_type" )
170-
171- if input_type == "BooleanField" :
172- value = "Yes" if str (value ).lower () in ("1" , "true" , "yes" ) else "No"
173-
174- lines .append (f"### { label } \n { value } " )
175-
176- return "\n \n " .join (lines )
0 commit comments