python-alfresco-api 1.1.2__py3-none-any.whl → 1.1.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. python_alfresco_api/clients/__init__.py +5 -5
  2. python_alfresco_api/clients/auth/auth_client.py +1 -1
  3. python_alfresco_api/clients/auth/authentication/authentication_client.py +207 -25
  4. python_alfresco_api/clients/conversion_utils.py +2 -2
  5. python_alfresco_api/clients/core/actions/actions_client.py +26 -39
  6. python_alfresco_api/clients/core/activities/activities_client.py +14 -27
  7. python_alfresco_api/clients/core/audit/audit_client.py +375 -28
  8. python_alfresco_api/clients/core/comments/comments_client.py +26 -39
  9. python_alfresco_api/clients/core/content/content_client.py +9 -18
  10. python_alfresco_api/clients/core/core_client.py +40 -40
  11. python_alfresco_api/clients/core/downloads/downloads_client.py +23 -36
  12. python_alfresco_api/clients/core/favorites/favorites_client.py +195 -25
  13. python_alfresco_api/clients/core/groups/groups_client.py +247 -27
  14. python_alfresco_api/clients/core/networks/networks_client.py +141 -26
  15. python_alfresco_api/clients/core/nodes/copy_node.py +4 -4
  16. python_alfresco_api/clients/core/nodes/create_association.py +4 -4
  17. python_alfresco_api/clients/core/nodes/create_folder.py +4 -4
  18. python_alfresco_api/clients/core/nodes/create_node.py +4 -4
  19. python_alfresco_api/clients/core/nodes/create_secondary_child_association.py +4 -4
  20. python_alfresco_api/clients/core/nodes/delete_association.py +4 -4
  21. python_alfresco_api/clients/core/nodes/delete_node.py +4 -4
  22. python_alfresco_api/clients/core/nodes/delete_secondary_child_association.py +4 -4
  23. python_alfresco_api/clients/core/nodes/get_node.py +4 -4
  24. python_alfresco_api/clients/core/nodes/list_node_children.py +4 -4
  25. python_alfresco_api/clients/core/nodes/list_parents.py +4 -4
  26. python_alfresco_api/clients/core/nodes/list_secondary_children.py +4 -4
  27. python_alfresco_api/clients/core/nodes/list_source_associations.py +4 -4
  28. python_alfresco_api/clients/core/nodes/list_target_associations.py +4 -4
  29. python_alfresco_api/clients/core/nodes/lock_node.py +4 -4
  30. python_alfresco_api/clients/core/nodes/move_node.py +4 -4
  31. python_alfresco_api/clients/core/nodes/nodes_client.py +12 -6
  32. python_alfresco_api/clients/core/nodes/unlock_node.py +4 -4
  33. python_alfresco_api/clients/core/nodes/update_node.py +4 -4
  34. python_alfresco_api/clients/core/nodes/update_node_content.py +4 -4
  35. python_alfresco_api/clients/core/people/people_client.py +214 -24
  36. python_alfresco_api/clients/core/preferences/preferences_client.py +94 -24
  37. python_alfresco_api/clients/core/probes/probes_client.py +14 -27
  38. python_alfresco_api/clients/core/queries/queries_client.py +23 -37
  39. python_alfresco_api/clients/core/ratings/ratings_client.py +27 -40
  40. python_alfresco_api/clients/core/renditions/renditions_client.py +23 -36
  41. python_alfresco_api/clients/core/shared_links/shared_links_client.py +331 -28
  42. python_alfresco_api/clients/core/sites/sites_client.py +255 -27
  43. python_alfresco_api/clients/core/tags/tags_client.py +249 -27
  44. python_alfresco_api/clients/core/trashcan/trashcan_client.py +245 -28
  45. python_alfresco_api/clients/core/versions/versions_client.py +8 -17
  46. python_alfresco_api/clients/discovery/discovery/discovery_operations.py +15 -28
  47. python_alfresco_api/clients/discovery/discovery_client.py +1 -1
  48. python_alfresco_api/clients/model/aspects/aspects_client.py +99 -26
  49. python_alfresco_api/clients/model/model_client.py +4 -4
  50. python_alfresco_api/clients/model/types/types_client.py +99 -26
  51. python_alfresco_api/clients/search/search/search_operations.py +15 -28
  52. python_alfresco_api/clients/search/search_client.py +1 -1
  53. python_alfresco_api/clients/search_sql/search_sql_client.py +2 -1
  54. python_alfresco_api/clients/search_sql/sql/sql_client.py +132 -22
  55. python_alfresco_api/clients/workflow/deployments/deployments_client.py +256 -22
  56. python_alfresco_api/clients/workflow/process_definitions/process_definitions_client.py +26 -39
  57. python_alfresco_api/clients/workflow/processes/processes_client.py +55 -68
  58. python_alfresco_api/clients/workflow/tasks/tasks_client.py +64 -77
  59. python_alfresco_api/clients/workflow/workflow_client.py +8 -8
  60. python_alfresco_api/utils/search_utils.py +8 -8
  61. {python_alfresco_api-1.1.2.dist-info → python_alfresco_api-1.1.4.dist-info}/METADATA +1 -1
  62. {python_alfresco_api-1.1.2.dist-info → python_alfresco_api-1.1.4.dist-info}/RECORD +64 -64
  63. {python_alfresco_api-1.1.2.dist-info → python_alfresco_api-1.1.4.dist-info}/WHEEL +0 -0
  64. {python_alfresco_api-1.1.2.dist-info → python_alfresco_api-1.1.4.dist-info}/licenses/LICENSE +0 -0
@@ -9,11 +9,11 @@ This module provides a three-tier architecture:
9
9
  - Level 3: Operation-specific models for ONE operation
10
10
 
11
11
  Key Benefits:
12
- - 🚀 Better performance with lazy loading
13
- - 📦 Organized locality (models exactly where used)
14
- - 🔧 Structured imports and clear organization
15
- - 📋 Pydantic v2 models for better type checking in general and for AI/LLM integration
16
- - ⚡ Dual sync/async APIs (sync for simpler use, async for web apps)
12
+ - [PERFORMANCE] Better performance with lazy loading
13
+ - [ORGANIZATION] Organized locality (models exactly where used)
14
+ - [STRUCTURE] Structured imports and clear organization
15
+ - [MODELS] Pydantic v2 models for better type checking in general and for AI/LLM integration
16
+ - [ASYNC] Dual sync/async APIs (sync for simpler use, async for web apps)
17
17
  """
18
18
 
19
19
  # Modern clients with three-tier architecture and lazy loading
@@ -137,7 +137,7 @@ class AlfrescoAuthClient:
137
137
  if self._authentication is None:
138
138
  # Lazy load the authentication client
139
139
  from .authentication import AuthenticationClient
140
- self._authentication = AuthenticationClient(self._client_factory)
140
+ self._authentication = AuthenticationClient(self)
141
141
  return self._authentication
142
142
 
143
143
  # =================================================================
@@ -22,9 +22,9 @@ from ....raw_clients.alfresco_auth_client.auth_client.types import UNSET, Unset
22
22
  from httpx import Response
23
23
 
24
24
  # Import model types for proper parameter signatures
25
- from ....raw_clients.alfresco_auth_client.auth_client.models.ticketbody import TicketBody
26
- from ....raw_clients.alfresco_auth_client.auth_client.models.ticketentry import TicketEntry
27
- from ....raw_clients.alfresco_auth_client.auth_client.models.validticketentry import ValidTicketEntry
25
+ from ....raw_clients.alfresco_auth_client.auth_client.models.ticket_body import TicketBody
26
+ from ....raw_clients.alfresco_auth_client.auth_client.models.ticket_entry import TicketEntry
27
+ from ....raw_clients.alfresco_auth_client.auth_client.models.valid_ticket_entry import ValidTicketEntry
28
28
 
29
29
  # Import from Level 3 (operation-specific models)
30
30
  from .models import AuthenticationResponse, AuthenticationListResponse, CreateAuthenticationRequest
@@ -53,9 +53,9 @@ class AuthenticationClient:
53
53
  - Detailed sync/async for full HTTP response access
54
54
  """
55
55
 
56
- def __init__(self, client_factory):
56
+ def __init__(self, parent_client):
57
57
  """Initialize with client factory for raw client access."""
58
- self._client_factory = client_factory
58
+ self.parent_client = parent_client
59
59
  self._raw_client = None
60
60
 
61
61
  # Store raw operation references
@@ -64,31 +64,213 @@ class AuthenticationClient:
64
64
  self._delete_ticket = _delete_ticket
65
65
  self._validate_ticket = _validate_ticket
66
66
 
67
- def _get_raw_client(self):
68
- """Get or create the raw client."""
69
- if self._raw_client is None:
70
- # Import the raw auth client directly
71
- from ....raw_clients.alfresco_auth_client.auth_client.client import AuthenticatedClient
72
-
73
- # Create the raw client with same auth setup
74
- self._raw_client = AuthenticatedClient(
75
- base_url=f"{self._client_factory.base_url}/alfresco/api/-default-/public/authentication/versions/1",
76
- token=self._client_factory.auth.get_auth_token(),
77
- prefix=self._client_factory.auth.get_auth_prefix(),
78
- verify_ssl=self._client_factory.verify_ssl
79
- )
80
- return self._raw_client
67
+ @property
68
+ def raw_client(self):
69
+ """Delegate to parent client's raw client."""
70
+ return self.parent_client.raw_client
81
71
 
82
- def get_httpx_client(self):
72
+ @property
73
+ def httpx_client(self):
74
+ """Delegate to parent client's httpx client."""
75
+ return self.parent_client.httpx_client
76
+
77
+ # =================================================================
78
+ # AUTHENTICATION OPERATIONS - 4-PATTERN IMPLEMENTATION
79
+ # =================================================================
80
+
81
+ def create_ticket(
82
+ self,
83
+ username: str,
84
+ password: str
85
+ ) -> Optional[Any]:
86
+ """
87
+ Create authentication ticket (sync).
88
+
89
+ Creates a new authentication ticket for the given credentials.
90
+ """
91
+ if not RAW_OPERATIONS_AVAILABLE:
92
+ raise ImportError("Raw authentication operations not available")
93
+
94
+ from ....raw_clients.alfresco_auth_client.auth_client.models.ticket_body import TicketBody
95
+
96
+ ticket_body = TicketBody(user_id=username, password=password)
97
+
98
+ return self._create_ticket.sync(
99
+ client=self.raw_client,
100
+ body=ticket_body
101
+ )
102
+
103
+ async def create_ticket_async(
104
+ self,
105
+ username: str,
106
+ password: str
107
+ ) -> Optional[Any]:
108
+ """
109
+ Create authentication ticket (async).
110
+
111
+ Creates a new authentication ticket for the given credentials.
112
+ """
113
+ if not RAW_OPERATIONS_AVAILABLE:
114
+ raise ImportError("Raw authentication operations not available")
115
+
116
+ from ....raw_clients.alfresco_auth_client.auth_client.models.ticket_body import TicketBody
117
+
118
+ ticket_body = TicketBody(user_id=username, password=password)
119
+
120
+ return await self._create_ticket.asyncio(
121
+ client=self.raw_client,
122
+ body=ticket_body
123
+ )
124
+
125
+ def create_ticket_detailed(
126
+ self,
127
+ username: str,
128
+ password: str
129
+ ) -> Response:
130
+ """
131
+ Create authentication ticket (detailed sync).
132
+
133
+ Creates a new authentication ticket with full HTTP response.
134
+ """
135
+ if not RAW_OPERATIONS_AVAILABLE:
136
+ raise ImportError("Raw authentication operations not available")
137
+
138
+ from ....raw_clients.alfresco_auth_client.auth_client.models.ticket_body import TicketBody
139
+
140
+ ticket_body = TicketBody(user_id=username, password=password)
141
+
142
+ return self._create_ticket.sync_detailed(
143
+ client=self.raw_client,
144
+ body=ticket_body
145
+ )
146
+
147
+ async def create_ticket_detailed_async(
148
+ self,
149
+ username: str,
150
+ password: str
151
+ ) -> Response:
152
+ """
153
+ Create authentication ticket (detailed async).
154
+
155
+ Creates a new authentication ticket with full HTTP response.
156
+ """
157
+ if not RAW_OPERATIONS_AVAILABLE:
158
+ raise ImportError("Raw authentication operations not available")
159
+
160
+ from ....raw_clients.alfresco_auth_client.auth_client.models.ticket_body import TicketBody
161
+
162
+ ticket_body = TicketBody(user_id=username, password=password)
163
+
164
+ return await self._create_ticket.asyncio_detailed(
165
+ client=self.raw_client,
166
+ body=ticket_body
167
+ )
168
+
169
+ def validate_ticket(self) -> Optional[Any]:
170
+ """
171
+ Validate current authentication ticket (sync).
172
+
173
+ Validates the current authentication ticket.
174
+ """
175
+ if not RAW_OPERATIONS_AVAILABLE:
176
+ raise ImportError("Raw authentication operations not available")
177
+
178
+ return self._validate_ticket.sync(
179
+ client=self.raw_client
180
+ )
181
+
182
+ async def validate_ticket_async(self) -> Optional[Any]:
183
+ """
184
+ Validate current authentication ticket (async).
185
+
186
+ Validates the current authentication ticket.
187
+ """
188
+ if not RAW_OPERATIONS_AVAILABLE:
189
+ raise ImportError("Raw authentication operations not available")
190
+
191
+ return await self._validate_ticket.asyncio(
192
+ client=self.raw_client
193
+ )
194
+
195
+ def validate_ticket_detailed(self) -> Response:
196
+ """
197
+ Validate current authentication ticket (detailed sync).
198
+
199
+ Validates the current authentication ticket with full HTTP response.
200
+ """
201
+ if not RAW_OPERATIONS_AVAILABLE:
202
+ raise ImportError("Raw authentication operations not available")
203
+
204
+ return self._validate_ticket.sync_detailed(
205
+ client=self.raw_client
206
+ )
207
+
208
+ async def validate_ticket_detailed_async(self) -> Response:
209
+ """
210
+ Validate current authentication ticket (detailed async).
211
+
212
+ Validates the current authentication ticket with full HTTP response.
213
+ """
214
+ if not RAW_OPERATIONS_AVAILABLE:
215
+ raise ImportError("Raw authentication operations not available")
216
+
217
+ return await self._validate_ticket.asyncio_detailed(
218
+ client=self.raw_client
219
+ )
220
+
221
+ def delete_ticket(self) -> Optional[Any]:
83
222
  """
84
- Get direct access to raw httpx client for advanced operations.
223
+ Delete current authentication ticket (sync).
85
224
 
86
- Perfect for MCP servers that need raw HTTP access.
225
+ Deletes/invalidates the current authentication ticket.
87
226
  """
88
- return self._get_raw_client().get_httpx_client()
227
+ if not RAW_OPERATIONS_AVAILABLE:
228
+ raise ImportError("Raw authentication operations not available")
229
+
230
+ return self._delete_ticket.sync(
231
+ client=self.raw_client
232
+ )
233
+
234
+ async def delete_ticket_async(self) -> Optional[Any]:
235
+ """
236
+ Delete current authentication ticket (async).
237
+
238
+ Deletes/invalidates the current authentication ticket.
239
+ """
240
+ if not RAW_OPERATIONS_AVAILABLE:
241
+ raise ImportError("Raw authentication operations not available")
242
+
243
+ return await self._delete_ticket.asyncio(
244
+ client=self.raw_client
245
+ )
246
+
247
+ def delete_ticket_detailed(self) -> Response:
248
+ """
249
+ Delete current authentication ticket (detailed sync).
250
+
251
+ Deletes/invalidates the current authentication ticket with full HTTP response.
252
+ """
253
+ if not RAW_OPERATIONS_AVAILABLE:
254
+ raise ImportError("Raw authentication operations not available")
255
+
256
+ return self._delete_ticket.sync_detailed(
257
+ client=self.raw_client
258
+ )
259
+
260
+ async def delete_ticket_detailed_async(self) -> Response:
261
+ """
262
+ Delete current authentication ticket (detailed async).
263
+
264
+ Deletes/invalidates the current authentication ticket with full HTTP response.
265
+ """
266
+ if not RAW_OPERATIONS_AVAILABLE:
267
+ raise ImportError("Raw authentication operations not available")
268
+
269
+ return await self._delete_ticket.asyncio_detailed(
270
+ client=self.raw_client
271
+ )
89
272
 
90
- # Placeholder for authentication operations - will be populated from the original file
91
273
  def __repr__(self) -> str:
92
274
  """String representation for debugging."""
93
- base_url = getattr(self._client_factory, 'base_url', 'unknown')
275
+ base_url = getattr(self.parent_client._client_factory, 'base_url', 'unknown')
94
276
  return f"AlfrescoAuthenticationClient(base_url='{base_url}')"
@@ -184,7 +184,7 @@ def enhanced_search_example():
184
184
 
185
185
  if __name__ == "__main__":
186
186
  """Test the conversion utilities."""
187
- print("🔧 Testing Conversion Utilities")
187
+ print("[TESTING] Testing Conversion Utilities")
188
188
 
189
189
  # Test 1: Enhanced create node
190
190
  print("\n1. Enhanced create node conversion:")
@@ -194,4 +194,4 @@ if __name__ == "__main__":
194
194
  print("\n2. Enhanced search example:")
195
195
  enhanced_search_example()
196
196
 
197
- print("\n✅ Conversion utilities proof-of-concept complete!")
197
+ print("\n[SUCCESS] Conversion utilities proof-of-concept complete!")
@@ -45,9 +45,9 @@ class ActionsClient:
45
45
  - Detailed sync/async for full HTTP response access
46
46
  """
47
47
 
48
- def __init__(self, client_factory):
48
+ def __init__(self, parent_client):
49
49
  """Initialize with client factory for raw client access."""
50
- self._client_factory = client_factory
50
+ self.parent_client = parent_client
51
51
  self._raw_client = None
52
52
 
53
53
  # Store raw operation references
@@ -57,28 +57,15 @@ class ActionsClient:
57
57
  self._list_actions = _list_actions
58
58
  self._node_actions = _node_actions
59
59
 
60
- def _get_raw_client(self):
61
- """Get or create the raw client."""
62
- if self._raw_client is None:
63
- # Import the raw core client directly
64
- from ....raw_clients.alfresco_core_client.core_client.client import AuthenticatedClient
65
-
66
- # Create the raw client with same auth setup
67
- self._raw_client = AuthenticatedClient(
68
- base_url=f"{self._client_factory.base_url}/alfresco/api/-default-/public/alfresco/versions/1",
69
- token=self._client_factory.auth.get_auth_token(),
70
- prefix=self._client_factory.auth.get_auth_prefix(),
71
- verify_ssl=self._client_factory.verify_ssl
72
- )
73
- return self._raw_client
60
+ @property
61
+ def raw_client(self):
62
+ """Delegate to parent client's raw client."""
63
+ return self.parent_client.raw_client
74
64
 
75
- def get_httpx_client(self):
76
- """
77
- Get direct access to raw httpx client for advanced operations.
78
-
79
- Perfect for MCP servers that need raw HTTP access.
80
- """
81
- return self._get_raw_client().get_httpx_client()
65
+ @property
66
+ def httpx_client(self):
67
+ """Delegate to parent client's httpx client."""
68
+ return self.parent_client.httpx_client
82
69
 
83
70
  # ==================== 4-PATTERN OPERATIONS ====================
84
71
 
@@ -94,7 +81,7 @@ class ActionsClient:
94
81
  if not hasattr(self, '_action_details'):
95
82
  raise ImportError("Raw client operation not available")
96
83
 
97
- result = self._action_details.sync(client=self._get_raw_client(), action_definition_id=action_definition_id)
84
+ result = self._action_details.sync(client=self.raw_client, action_definition_id=action_definition_id)
98
85
 
99
86
  # Convert to standardized response
100
87
  from ..models import BaseEntry
@@ -110,7 +97,7 @@ class ActionsClient:
110
97
  if not hasattr(self, '_action_details'):
111
98
  raise ImportError("Raw client operation not available")
112
99
 
113
- result = await self._action_details.asyncio(client=self._get_raw_client(), action_definition_id=action_definition_id)
100
+ result = await self._action_details.asyncio(client=self.raw_client, action_definition_id=action_definition_id)
114
101
 
115
102
  # Convert to standardized response
116
103
  from ..models import BaseEntry
@@ -126,7 +113,7 @@ class ActionsClient:
126
113
  if not hasattr(self, '_action_details'):
127
114
  raise ImportError("Raw client operation not available")
128
115
 
129
- return self._action_details.sync_detailed(client=self._get_raw_client(), action_definition_id=action_definition_id)
116
+ return self._action_details.sync_detailed(client=self.raw_client, action_definition_id=action_definition_id)
130
117
 
131
118
  async def action_details_detailed_async(self, action_definition_id: Any):
132
119
  """
@@ -138,7 +125,7 @@ class ActionsClient:
138
125
  if not hasattr(self, '_action_details'):
139
126
  raise ImportError("Raw client operation not available")
140
127
 
141
- return await self._action_details.asyncio_detailed(client=self._get_raw_client(), action_definition_id=action_definition_id)
128
+ return await self._action_details.asyncio_detailed(client=self.raw_client, action_definition_id=action_definition_id)
142
129
 
143
130
  # ==================== ACTION_EXEC OPERATION ====================
144
131
 
@@ -152,7 +139,7 @@ class ActionsClient:
152
139
  if not hasattr(self, '_action_exec'):
153
140
  raise ImportError("Raw client operation not available")
154
141
 
155
- result = self._action_exec.sync(client=self._get_raw_client(), body=body)
142
+ result = self._action_exec.sync(client=self.raw_client, body=body)
156
143
 
157
144
  # Convert to standardized response
158
145
  from ..models import BaseEntry
@@ -168,7 +155,7 @@ class ActionsClient:
168
155
  if not hasattr(self, '_action_exec'):
169
156
  raise ImportError("Raw client operation not available")
170
157
 
171
- result = await self._action_exec.asyncio(client=self._get_raw_client(), body=body)
158
+ result = await self._action_exec.asyncio(client=self.raw_client, body=body)
172
159
 
173
160
  # Convert to standardized response
174
161
  from ..models import BaseEntry
@@ -184,7 +171,7 @@ class ActionsClient:
184
171
  if not hasattr(self, '_action_exec'):
185
172
  raise ImportError("Raw client operation not available")
186
173
 
187
- return self._action_exec.sync_detailed(client=self._get_raw_client(), body=body)
174
+ return self._action_exec.sync_detailed(client=self.raw_client, body=body)
188
175
 
189
176
  async def action_exec_detailed_async(self, body: Any):
190
177
  """
@@ -196,7 +183,7 @@ class ActionsClient:
196
183
  if not hasattr(self, '_action_exec'):
197
184
  raise ImportError("Raw client operation not available")
198
185
 
199
- return await self._action_exec.asyncio_detailed(client=self._get_raw_client(), body=body)
186
+ return await self._action_exec.asyncio_detailed(client=self.raw_client, body=body)
200
187
 
201
188
  # ==================== LIST_ACTIONS OPERATION ====================
202
189
 
@@ -210,7 +197,7 @@ class ActionsClient:
210
197
  if not hasattr(self, '_list_actions'):
211
198
  raise ImportError("Raw client operation not available")
212
199
 
213
- result = self._list_actions.sync(client=self._get_raw_client(), skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
200
+ result = self._list_actions.sync(client=self.raw_client, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
214
201
 
215
202
  # Convert to standardized response
216
203
  from ..models import BaseEntry
@@ -226,7 +213,7 @@ class ActionsClient:
226
213
  if not hasattr(self, '_list_actions'):
227
214
  raise ImportError("Raw client operation not available")
228
215
 
229
- result = await self._list_actions.asyncio(client=self._get_raw_client(), skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
216
+ result = await self._list_actions.asyncio(client=self.raw_client, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
230
217
 
231
218
  # Convert to standardized response
232
219
  from ..models import BaseEntry
@@ -242,7 +229,7 @@ class ActionsClient:
242
229
  if not hasattr(self, '_list_actions'):
243
230
  raise ImportError("Raw client operation not available")
244
231
 
245
- return self._list_actions.sync_detailed(client=self._get_raw_client(), skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
232
+ return self._list_actions.sync_detailed(client=self.raw_client, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
246
233
 
247
234
  async def list_actions_detailed_async(self, skip_count: Any, max_items: Any, order_by: Any, fields: Any):
248
235
  """
@@ -254,7 +241,7 @@ class ActionsClient:
254
241
  if not hasattr(self, '_list_actions'):
255
242
  raise ImportError("Raw client operation not available")
256
243
 
257
- return await self._list_actions.asyncio_detailed(client=self._get_raw_client(), skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
244
+ return await self._list_actions.asyncio_detailed(client=self.raw_client, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
258
245
 
259
246
  # ==================== NODE_ACTIONS OPERATION ====================
260
247
 
@@ -268,7 +255,7 @@ class ActionsClient:
268
255
  if not hasattr(self, '_node_actions'):
269
256
  raise ImportError("Raw client operation not available")
270
257
 
271
- result = self._node_actions.sync(client=self._get_raw_client(), node_id=node_id, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
258
+ result = self._node_actions.sync(client=self.raw_client, node_id=node_id, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
272
259
 
273
260
  # Convert to standardized response
274
261
  from ..models import BaseEntry
@@ -284,7 +271,7 @@ class ActionsClient:
284
271
  if not hasattr(self, '_node_actions'):
285
272
  raise ImportError("Raw client operation not available")
286
273
 
287
- result = await self._node_actions.asyncio(client=self._get_raw_client(), node_id=node_id, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
274
+ result = await self._node_actions.asyncio(client=self.raw_client, node_id=node_id, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
288
275
 
289
276
  # Convert to standardized response
290
277
  from ..models import BaseEntry
@@ -300,7 +287,7 @@ class ActionsClient:
300
287
  if not hasattr(self, '_node_actions'):
301
288
  raise ImportError("Raw client operation not available")
302
289
 
303
- return self._node_actions.sync_detailed(client=self._get_raw_client(), node_id=node_id, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
290
+ return self._node_actions.sync_detailed(client=self.raw_client, node_id=node_id, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
304
291
 
305
292
  async def node_actions_detailed_async(self, node_id: Any, skip_count: Any, max_items: Any, order_by: Any, fields: Any):
306
293
  """
@@ -312,7 +299,7 @@ class ActionsClient:
312
299
  if not hasattr(self, '_node_actions'):
313
300
  raise ImportError("Raw client operation not available")
314
301
 
315
- return await self._node_actions.asyncio_detailed(client=self._get_raw_client(), node_id=node_id, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
302
+ return await self._node_actions.asyncio_detailed(client=self.raw_client, node_id=node_id, skip_count=skip_count, max_items=max_items, order_by=order_by, fields=fields)
316
303
 
317
304
  def __repr__(self) -> str:
318
305
  """String representation for debugging."""
@@ -42,37 +42,24 @@ class ActivitiesClient:
42
42
  - Detailed sync/async for full HTTP response access
43
43
  """
44
44
 
45
- def __init__(self, client_factory):
45
+ def __init__(self, parent_client):
46
46
  """Initialize with client factory for raw client access."""
47
- self._client_factory = client_factory
47
+ self.parent_client = parent_client
48
48
  self._raw_client = None
49
49
 
50
50
  # Store raw operation references
51
51
  if RAW_OPERATIONS_AVAILABLE:
52
52
  self._list_activities_for_person = _list_activities_for_person
53
53
 
54
- def _get_raw_client(self):
55
- """Get or create the raw client."""
56
- if self._raw_client is None:
57
- # Import the raw core client directly
58
- from ....raw_clients.alfresco_core_client.core_client.client import AuthenticatedClient
59
-
60
- # Create the raw client with same auth setup
61
- self._raw_client = AuthenticatedClient(
62
- base_url=f"{self._client_factory.base_url}/alfresco/api/-default-/public/alfresco/versions/1",
63
- token=self._client_factory.auth.get_auth_token(),
64
- prefix=self._client_factory.auth.get_auth_prefix(),
65
- verify_ssl=self._client_factory.verify_ssl
66
- )
67
- return self._raw_client
54
+ @property
55
+ def raw_client(self):
56
+ """Delegate to parent client's raw client."""
57
+ return self.parent_client.raw_client
68
58
 
69
- def get_httpx_client(self):
70
- """
71
- Get direct access to raw httpx client for advanced operations.
72
-
73
- Perfect for MCP servers that need raw HTTP access.
74
- """
75
- return self._get_raw_client().get_httpx_client()
59
+ @property
60
+ def httpx_client(self):
61
+ """Delegate to parent client's httpx client."""
62
+ return self.parent_client.httpx_client
76
63
 
77
64
  # ==================== 4-PATTERN OPERATIONS ====================
78
65
 
@@ -88,7 +75,7 @@ class ActivitiesClient:
88
75
  if not hasattr(self, '_list_activities_for_person'):
89
76
  raise ImportError("Raw client operation not available")
90
77
 
91
- result = self._list_activities_for_person.sync(client=self._get_raw_client(), person_id=person_id, skip_count=skip_count, max_items=max_items, who=who, site_id=site_id, fields=fields)
78
+ result = self._list_activities_for_person.sync(client=self.raw_client, person_id=person_id, skip_count=skip_count, max_items=max_items, who=who, site_id=site_id, fields=fields)
92
79
 
93
80
  # Convert to standardized response
94
81
  from ..models import BaseEntry
@@ -104,7 +91,7 @@ class ActivitiesClient:
104
91
  if not hasattr(self, '_list_activities_for_person'):
105
92
  raise ImportError("Raw client operation not available")
106
93
 
107
- result = await self._list_activities_for_person.asyncio(client=self._get_raw_client(), person_id=person_id, skip_count=skip_count, max_items=max_items, who=who, site_id=site_id, fields=fields)
94
+ result = await self._list_activities_for_person.asyncio(client=self.raw_client, person_id=person_id, skip_count=skip_count, max_items=max_items, who=who, site_id=site_id, fields=fields)
108
95
 
109
96
  # Convert to standardized response
110
97
  from ..models import BaseEntry
@@ -120,7 +107,7 @@ class ActivitiesClient:
120
107
  if not hasattr(self, '_list_activities_for_person'):
121
108
  raise ImportError("Raw client operation not available")
122
109
 
123
- return self._list_activities_for_person.sync_detailed(client=self._get_raw_client(), person_id=person_id, skip_count=skip_count, max_items=max_items, who=who, site_id=site_id, fields=fields)
110
+ return self._list_activities_for_person.sync_detailed(client=self.raw_client, person_id=person_id, skip_count=skip_count, max_items=max_items, who=who, site_id=site_id, fields=fields)
124
111
 
125
112
  async def list_activities_for_person_detailed_async(self, person_id: Any, skip_count: Any, max_items: Any, who: Any, site_id: Any, fields: Any):
126
113
  """
@@ -132,7 +119,7 @@ class ActivitiesClient:
132
119
  if not hasattr(self, '_list_activities_for_person'):
133
120
  raise ImportError("Raw client operation not available")
134
121
 
135
- return await self._list_activities_for_person.asyncio_detailed(client=self._get_raw_client(), person_id=person_id, skip_count=skip_count, max_items=max_items, who=who, site_id=site_id, fields=fields)
122
+ return await self._list_activities_for_person.asyncio_detailed(client=self.raw_client, person_id=person_id, skip_count=skip_count, max_items=max_items, who=who, site_id=site_id, fields=fields)
136
123
 
137
124
 
138
125
  def __repr__(self) -> str: