Skip to content

Commit cea140d

Browse files
committed
Refactor parts of GitHubIntegration into BaseIntegration #346
Signed-off-by: tdruez <[email protected]>
1 parent e4a7d5f commit cea140d

File tree

2 files changed

+69
-54
lines changed

2 files changed

+69
-54
lines changed

workflow/integrations/__init__.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,70 @@
55
# See https://github.com/aboutcode-org/dejacode for support or download.
66
# See https://aboutcode.org for more information about AboutCode FOSS projects.
77
#
8+
9+
from django.conf import settings
10+
11+
import requests
12+
13+
DEJACODE_SITE_URL = settings.SITE_URL.rstrip("/")
14+
15+
16+
class BaseIntegration:
17+
"""Base class for managing issue tracker integrations from DejaCode requests."""
18+
19+
default_timeout = 10
20+
21+
def __init__(self, dataspace):
22+
if not dataspace:
23+
raise ValueError("Dataspace must be provided.")
24+
self.dataspace = dataspace
25+
self.session = self.get_session()
26+
27+
def get_session(self):
28+
session = requests.Session()
29+
session.headers.update(self.get_headers())
30+
return session
31+
32+
def get_headers(self):
33+
"""
34+
Return authentication headers specific to the integration.
35+
Must be implemented in subclasses.
36+
"""
37+
raise NotImplementedError
38+
39+
@staticmethod
40+
def make_issue_title(request):
41+
return f"[DEJACODE] {request.title}"
42+
43+
@staticmethod
44+
def make_issue_body(request):
45+
request_url = f"{DEJACODE_SITE_URL}{request.get_absolute_url()}"
46+
label_fields = [
47+
("📝 Request Template", request.request_template),
48+
("📦 Product Context", request.product_context),
49+
("📌 Applies To", request.content_object),
50+
("🙋 Submitted By", request.requester),
51+
("👤 Assigned To", request.assignee),
52+
("🚨 Priority", request.priority),
53+
("🗒️ Notes", request.notes),
54+
("🔗️ DejaCode URL", request_url),
55+
]
56+
57+
lines = []
58+
for label, value in label_fields:
59+
if value:
60+
lines.append(f"### {label}\n{value}")
61+
62+
lines.append("----")
63+
64+
for question in request.get_serialized_data_as_list():
65+
label = question.get("label")
66+
value = question.get("value")
67+
input_type = question.get("input_type")
68+
69+
if input_type == "BooleanField":
70+
value = "Yes" if str(value).lower() in ("1", "true", "yes") else "No"
71+
72+
lines.append(f"### {label}\n{value}")
73+
74+
return "\n\n".join(lines)

workflow/integrations/github.py

Lines changed: 2 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,18 @@
88

99
from urllib.parse import urlparse
1010

11-
from django.conf import settings
12-
13-
import requests
11+
from workflow.integrations import BaseIntegration
1412

1513
GITHUB_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")
@@ -137,40 +122,3 @@ def extract_github_repo_path(url):
137122
raise ValueError("Incomplete GitHub repository path.")
138123

139124
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

Comments
 (0)