Coverage for mindsdb / integrations / handlers / confluence_handler / confluence_api_client.py: 92%
110 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
1from typing import List
3import requests
6class ConfluenceAPIClient:
7 def __init__(self, url: str, username: str, password: str):
8 self.url = url
9 self.username = username
10 self.password = password
11 self.session = requests.Session()
12 self.session.auth = (self.username, self.password)
13 self.session.headers.update({"Accept": "application/json"})
15 def get_spaces(
16 self,
17 ids: List[int] = None,
18 keys: List[str] = None,
19 space_type: str = None,
20 status: str = None,
21 sort_condition: str = None,
22 limit: int = None,
23 ):
24 url = f"{self.url}/wiki/api/v2/spaces"
25 params = {
26 "description-format": "view",
27 }
28 if ids:
29 params["ids"] = ids
30 if keys:
31 params["keys"] = keys
32 if space_type:
33 params["type"] = space_type
34 if status:
35 params["status"] = status
36 if sort_condition: 36 ↛ 37line 36 didn't jump to line 37 because the condition on line 36 was never true
37 params["sort"] = sort_condition
38 if limit:
39 params["limit"] = limit
41 return self._paginate(url, params)
43 def get_pages(
44 self,
45 page_ids: List[int] = None,
46 space_ids: List[int] = None,
47 statuses: List[str] = None,
48 title: str = None,
49 sort_condition: str = None,
50 limit: int = None,
51 ) -> List[dict]:
52 url = f"{self.url}/wiki/api/v2/pages"
53 params = {
54 "body-format": "storage",
55 }
56 if page_ids:
57 params["id"] = page_ids
58 if space_ids:
59 params["space-id"] = space_ids
60 if statuses:
61 params["status"] = statuses
62 if title:
63 params["title"] = title
64 if sort_condition:
65 params["sort"] = sort_condition
66 if limit: 66 ↛ 67line 66 didn't jump to line 67 because the condition on line 66 was never true
67 params["limit"] = limit
69 return self._paginate(url, params)
71 def get_blogposts(
72 self,
73 post_ids: List[int] = None,
74 space_ids: List[str] = None,
75 statuses: List[str] = None,
76 title: str = None,
77 sort_condition: str = None,
78 limit: int = None,
79 ) -> List[dict]:
80 url = f"{self.url}/wiki/api/v2/blogposts"
81 params = {
82 "body-format": "storage",
83 }
84 if post_ids:
85 params["id"] = post_ids
86 if space_ids:
87 params["space-id"] = space_ids
88 if statuses:
89 params["status"] = statuses
90 if title:
91 params["title"] = title
92 if sort_condition: 92 ↛ 93line 92 didn't jump to line 93 because the condition on line 92 was never true
93 params["sort"] = sort_condition
94 if limit: 94 ↛ 95line 94 didn't jump to line 95 because the condition on line 94 was never true
95 params["limit"] = limit
97 return self._paginate(url, params)
99 def get_whiteboard_by_id(self, whiteboard_id: int) -> dict:
100 url = f"{self.url}/wiki/api/v2/whiteboards/{whiteboard_id}"
102 return self._make_request("GET", url)
104 def get_database_by_id(self, database_id: int) -> dict:
105 url = f"{self.url}/wiki/api/v2/databases/{database_id}"
107 return self._make_request("GET", url)
109 def get_tasks(
110 self,
111 task_ids: List[int] = None,
112 space_ids: List[str] = None,
113 page_ids: List[str] = None,
114 blogpost_ids: List[str] = None,
115 created_by_ids: List[str] = None,
116 assigned_to_ids: List[str] = None,
117 completed_by_ids: List[str] = None,
118 status: str = None,
119 limit: int = None,
120 ) -> List[dict]:
121 url = f"{self.url}/wiki/api/v2/tasks"
122 params = {
123 "body-format": "storage",
124 }
125 if task_ids:
126 params["id"] = task_ids
127 if space_ids:
128 params["space-id"] = space_ids
129 if page_ids:
130 params["page-id"] = page_ids
131 if blogpost_ids: 131 ↛ 132line 131 didn't jump to line 132 because the condition on line 131 was never true
132 params["blogpost-id"] = blogpost_ids
133 if created_by_ids:
134 params["created-by"] = created_by_ids
135 if assigned_to_ids:
136 params["assigned-to"] = assigned_to_ids
137 if completed_by_ids:
138 params["completed-by"] = completed_by_ids
139 if status:
140 params["status"] = status
141 if limit: 141 ↛ 142line 141 didn't jump to line 142 because the condition on line 141 was never true
142 params["limit"] = limit
144 return self._paginate(url, params)
146 def _paginate(self, url: str, params: dict = None) -> List[dict]:
147 results = []
148 response = self._make_request("GET", url, params)
149 results.extend(response["results"])
151 while response["_links"].get("next"):
152 next_url = response["_links"].get("next")
153 next_params = {}
154 if params: 154 ↛ 156line 154 didn't jump to line 156 because the condition on line 154 was always true
155 next_params.update(params)
156 if "cursor=" in next_url:
157 # cursor= is 7 characters long
158 cursor_start = next_url.find("cursor=") + 7
159 cursor_value = next_url[cursor_start:]
160 if "&" in cursor_value: 160 ↛ 162line 160 didn't jump to line 162 because the condition on line 160 was always true
161 cursor_value = cursor_value.split("&")[0]
162 next_params["cursor"] = cursor_value
163 response = self._make_request("GET", url, next_params)
164 else:
165 response = self._make_request("GET", next_url)
166 results.extend(response["results"])
168 return results
170 def _make_request(self, method: str, url: str, params: dict = None, data: dict = None) -> dict:
171 response = self.session.request(method, url, params=params, json=data)
173 if response.status_code != 200:
174 raise Exception(f"Request failed with status code {response.status_code}: {response.text}")
176 return response.json()