pyxecm 1.6__py3-none-any.whl → 2.0.1__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.

Potentially problematic release.


This version of pyxecm might be problematic. Click here for more details.

Files changed (78) hide show
  1. pyxecm/__init__.py +7 -4
  2. pyxecm/avts.py +727 -254
  3. pyxecm/coreshare.py +686 -467
  4. pyxecm/customizer/__init__.py +16 -4
  5. pyxecm/customizer/__main__.py +58 -0
  6. pyxecm/customizer/api/__init__.py +5 -0
  7. pyxecm/customizer/api/__main__.py +6 -0
  8. pyxecm/customizer/api/app.py +163 -0
  9. pyxecm/customizer/api/auth/__init__.py +1 -0
  10. pyxecm/customizer/api/auth/functions.py +92 -0
  11. pyxecm/customizer/api/auth/models.py +13 -0
  12. pyxecm/customizer/api/auth/router.py +78 -0
  13. pyxecm/customizer/api/common/__init__.py +1 -0
  14. pyxecm/customizer/api/common/functions.py +47 -0
  15. pyxecm/customizer/api/common/metrics.py +92 -0
  16. pyxecm/customizer/api/common/models.py +21 -0
  17. pyxecm/customizer/api/common/payload_list.py +870 -0
  18. pyxecm/customizer/api/common/router.py +72 -0
  19. pyxecm/customizer/api/settings.py +128 -0
  20. pyxecm/customizer/api/terminal/__init__.py +1 -0
  21. pyxecm/customizer/api/terminal/router.py +87 -0
  22. pyxecm/customizer/api/v1_csai/__init__.py +1 -0
  23. pyxecm/customizer/api/v1_csai/router.py +87 -0
  24. pyxecm/customizer/api/v1_maintenance/__init__.py +1 -0
  25. pyxecm/customizer/api/v1_maintenance/functions.py +100 -0
  26. pyxecm/customizer/api/v1_maintenance/models.py +12 -0
  27. pyxecm/customizer/api/v1_maintenance/router.py +76 -0
  28. pyxecm/customizer/api/v1_otcs/__init__.py +1 -0
  29. pyxecm/customizer/api/v1_otcs/functions.py +61 -0
  30. pyxecm/customizer/api/v1_otcs/router.py +179 -0
  31. pyxecm/customizer/api/v1_payload/__init__.py +1 -0
  32. pyxecm/customizer/api/v1_payload/functions.py +179 -0
  33. pyxecm/customizer/api/v1_payload/models.py +51 -0
  34. pyxecm/customizer/api/v1_payload/router.py +499 -0
  35. pyxecm/customizer/browser_automation.py +721 -286
  36. pyxecm/customizer/customizer.py +1076 -1425
  37. pyxecm/customizer/exceptions.py +35 -0
  38. pyxecm/customizer/guidewire.py +1186 -0
  39. pyxecm/customizer/k8s.py +901 -379
  40. pyxecm/customizer/log.py +107 -0
  41. pyxecm/customizer/m365.py +2967 -920
  42. pyxecm/customizer/nhc.py +1169 -0
  43. pyxecm/customizer/openapi.py +258 -0
  44. pyxecm/customizer/payload.py +18228 -7820
  45. pyxecm/customizer/pht.py +717 -286
  46. pyxecm/customizer/salesforce.py +516 -342
  47. pyxecm/customizer/sap.py +58 -41
  48. pyxecm/customizer/servicenow.py +611 -372
  49. pyxecm/customizer/settings.py +445 -0
  50. pyxecm/customizer/successfactors.py +408 -346
  51. pyxecm/customizer/translate.py +83 -48
  52. pyxecm/helper/__init__.py +5 -2
  53. pyxecm/helper/assoc.py +83 -43
  54. pyxecm/helper/data.py +2406 -870
  55. pyxecm/helper/logadapter.py +27 -0
  56. pyxecm/helper/web.py +229 -101
  57. pyxecm/helper/xml.py +596 -171
  58. pyxecm/maintenance_page/__init__.py +5 -0
  59. pyxecm/maintenance_page/__main__.py +6 -0
  60. pyxecm/maintenance_page/app.py +51 -0
  61. pyxecm/maintenance_page/settings.py +28 -0
  62. pyxecm/maintenance_page/static/favicon.avif +0 -0
  63. pyxecm/maintenance_page/templates/maintenance.html +165 -0
  64. pyxecm/otac.py +235 -141
  65. pyxecm/otawp.py +2668 -1220
  66. pyxecm/otca.py +569 -0
  67. pyxecm/otcs.py +7956 -3237
  68. pyxecm/otds.py +2178 -925
  69. pyxecm/otiv.py +36 -21
  70. pyxecm/otmm.py +1272 -325
  71. pyxecm/otpd.py +231 -127
  72. pyxecm-2.0.1.dist-info/METADATA +122 -0
  73. pyxecm-2.0.1.dist-info/RECORD +76 -0
  74. {pyxecm-1.6.dist-info → pyxecm-2.0.1.dist-info}/WHEEL +1 -1
  75. pyxecm-1.6.dist-info/METADATA +0 -53
  76. pyxecm-1.6.dist-info/RECORD +0 -32
  77. {pyxecm-1.6.dist-info → pyxecm-2.0.1.dist-info/licenses}/LICENSE +0 -0
  78. {pyxecm-1.6.dist-info → pyxecm-2.0.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,445 @@
1
+ """Settings for Customizer execution."""
2
+
3
+ import os
4
+ import tempfile
5
+ from typing import Self
6
+
7
+ from pydantic import AliasChoices, BaseModel, Field, HttpUrl, SecretStr, model_validator
8
+ from pydantic_settings import (
9
+ BaseSettings,
10
+ PydanticBaseSettingsSource,
11
+ SettingsConfigDict,
12
+ TomlConfigSettingsSource,
13
+ )
14
+
15
+
16
+ class CustomizerSettingsOTDS(BaseModel):
17
+ """Class for OTDS related settings."""
18
+
19
+ username: str = Field(default="admin", description="Username for the OTDS admin user")
20
+ password: SecretStr = Field(default=None, description="Password for the OTDS admin user")
21
+ ticket: str | None = Field(None, description="Ticket for the OTDS admin user")
22
+ admin_partition: str = Field(default="otds.admin", description="Name of the admin partition in OTDS")
23
+ enable_audit: bool = Field(default=True, description="Enable the OTDS Audit")
24
+ disable_password_policy: bool = Field(
25
+ default=True,
26
+ description="Switch to disable the default OTDS password policy",
27
+ )
28
+
29
+ url: HttpUrl | None = Field(default=None, description="URL of the OTDS service")
30
+ url_internal: HttpUrl | None = Field(default=None, description="Internal URL of the OTDS service")
31
+
32
+ bind_password: SecretStr = Field(default=None, description="Password for the OTDS bind user to LDAP")
33
+
34
+ @model_validator(mode="after")
35
+ def fallback(self) -> Self:
36
+ """Fallback implementation to read the URL from the environment."""
37
+
38
+ if not self.url:
39
+ self.url = HttpUrl(
40
+ os.environ.get("OTDS_PUBLIC_PROTOCOL", "http") + "://" + os.environ.get("OTDS_PUBLIC_URL", "otds"),
41
+ )
42
+
43
+ # Set url_internal to the same value as url if only that one is set
44
+ elif not self.url_internal:
45
+ self.url_internal = self.url
46
+
47
+ if not self.url_internal:
48
+ self.url_internal = HttpUrl(
49
+ os.environ.get("OTDS_PUBLIC_PROTOCOL", "http")
50
+ + "://"
51
+ + os.environ.get("OTDS_HOSTNAME", "otds")
52
+ + ":"
53
+ + os.environ.get("OTDS_SERVICE_PORT", "80"),
54
+ )
55
+
56
+ self.password = SecretStr(os.environ.get("OTDS_PASSWORD")) if self.password is None else self.password
57
+ self.bind_password = (
58
+ SecretStr(os.environ.get("BIND_PASSWORD")) if self.bind_password is None else self.bind_password
59
+ )
60
+
61
+ return self
62
+
63
+
64
+ class CustomizerSettingsOTCS(BaseModel):
65
+ """Class for OTCS related settings."""
66
+
67
+ # Content Server Endpoints:
68
+ username: str = Field(default="admin", description="Username for the OTCS admin user")
69
+ password: SecretStr = Field(default=None, description="Password for the OTCS admin user")
70
+ base_path: str = Field(default="/cs/cs", description="Base path of the OTCS installation")
71
+ support_path: str = Field(default="/cssupport", description="Support path of the OTCS installation")
72
+ url: HttpUrl | None = Field(default=None, description="URL of the OTCS service")
73
+ url_frontend: HttpUrl | None = Field(
74
+ default=None,
75
+ description="URL of the OTCS frontend service, if not specified, it will be set to the same value as url",
76
+ )
77
+ url_backend: HttpUrl | None = Field(
78
+ default=None,
79
+ description="URL of the OTCS backend service, if not specified, it will be set to the same value as url",
80
+ )
81
+
82
+ partition: str = Field(default="Content Server Members", description="Name of the default Partition in OTDS")
83
+ resource_name: str = Field(default="cs", description="Name of the OTCS resource in OTDS")
84
+
85
+ maintenance_mode: bool = Field(
86
+ default=False,
87
+ description="Enable/Disable maintenance mode during payload processing.",
88
+ )
89
+ license_feature: str = Field(default="X3", description="Default license feature to be added to Users in OTDS")
90
+ download_dir: str = Field(
91
+ default=tempfile.gettempdir(),
92
+ description="temporary download directory for payload processing",
93
+ )
94
+
95
+ # FEME endpoint for additional embedding supporting Content Aviator:
96
+ feme_uri: str = Field(default="ws://feme:4242", description="URL of the FEME endpoint")
97
+
98
+ # Add configuration options for Customizer behaviour
99
+ update_admin_user: bool = Field(
100
+ default=True,
101
+ description="Update the OTCS Admin user and rename to Terrarium Admin.",
102
+ )
103
+ upload_config_files: bool = Field(
104
+ default=True,
105
+ description="Upload the configuration files of the payload to OTCS.",
106
+ )
107
+ upload_status_files: bool = Field(default=True, description="Upload the status files of the payload to OTCS.")
108
+ upload_log_file: bool = Field(default=True, description="Upload the log file of the payload to OTCS.")
109
+
110
+ @model_validator(mode="after")
111
+ def fallback(self) -> Self:
112
+ """Fallback implementation to read the URL from the environment."""
113
+
114
+ if not self.url:
115
+ self.url = HttpUrl(
116
+ os.environ.get("OTCS_PUBLIC_PROTOCOL", "https")
117
+ + "://"
118
+ + os.environ.get("OTCS_PUBLIC_URL", "otcs.public-url.undefined")
119
+ + ":"
120
+ + os.environ.get("OTCS_SERVICE_PORT_OTCS", "8080"),
121
+ )
122
+ else:
123
+ if not self.url_frontend:
124
+ self.url_frontend = self.url
125
+
126
+ if not self.url_backend:
127
+ self.url_backend = self.url
128
+
129
+ if not self.url_frontend:
130
+ self.url_frontend = HttpUrl(
131
+ os.environ.get("OTCS_PROTOCOL", "http")
132
+ + "://"
133
+ + os.environ.get("OTCS_HOSTNAME_FRONTEND", "otcs-frontend"),
134
+ )
135
+
136
+ if not self.url_backend:
137
+ self.url_backend = HttpUrl(
138
+ os.environ.get("OTCS_PROTOCOL", "http")
139
+ + "://"
140
+ + os.environ.get("OTCS_HOSTNAME", "otcs-admin-0")
141
+ + ":"
142
+ + os.environ.get("OTCS_SERVICE_PORT_OTCS", "8080"),
143
+ )
144
+
145
+ self.password = SecretStr(os.environ.get("OTCS_PASSWORD", "")) if self.password is None else self.password
146
+
147
+ return self
148
+
149
+
150
+ class CustomizerSettingsOTAC(BaseModel):
151
+ """Class for OTAC related settings."""
152
+
153
+ enabled: bool = Field(
154
+ default=False,
155
+ description="Enable/Disable OTAC integration",
156
+ )
157
+ username: str = Field(
158
+ default="dsadmin",
159
+ description="Admin account for OTAC",
160
+ )
161
+ password: SecretStr | None = Field(default=None, description="Password of the Admin Account")
162
+ url: HttpUrl | None = Field(default=None, description="URL of the OTAC service")
163
+ url_internal: HttpUrl | None = Field(default=None, description="Internal URL of the OTAC service")
164
+
165
+ known_server: str = Field(default="", description="Known OTAC servers to add to OTAC")
166
+
167
+ @model_validator(mode="after")
168
+ def fallback(self) -> Self:
169
+ """Fallback implementation to read the URL from the environment."""
170
+
171
+ if not self.url:
172
+ self.url = HttpUrl(
173
+ os.environ.get("OTAC_PROTOCOL", "https")
174
+ + "://"
175
+ + os.environ.get("OTAC_PUBLIC_URL", "otac-0")
176
+ + ":"
177
+ + os.environ.get("OTAC_SERVICE_PORT", "443"),
178
+ )
179
+
180
+ if not self.url_internal:
181
+ self.url_internal = HttpUrl(
182
+ os.environ.get("OTAC_PROTOCOL", "http")
183
+ + "://"
184
+ + os.environ.get("OTAC_SERVICE_HOST", "otac-0")
185
+ + ":"
186
+ + os.environ.get("OTAC_SERVICE_PORT", "8080"),
187
+ )
188
+
189
+ self.password = SecretStr(os.environ.get("OTAC_PASSWORD", "")) if self.password is None else self.password
190
+
191
+ return self
192
+
193
+
194
+ class CustomizerSettingsOTPD(BaseModel):
195
+ """Class for OTPD related settings."""
196
+
197
+ enabled: bool = Field(default=False, description="Enable/Disable the OTPD integration")
198
+ username: str = Field(
199
+ default="powerdocsapiuser",
200
+ description="Username of the API user to configure OTPD",
201
+ validation_alias=AliasChoices("username", "user"),
202
+ )
203
+ password: str = Field(default="", description="Password of the API user to configure OTPD")
204
+ url: HttpUrl | None = Field(default=None, description="URL of the OTPD service")
205
+
206
+ db_importfile: str = Field(default="", description="Path to the OTPD import file")
207
+ tenant: str = Field(default="Successfactors")
208
+
209
+ @model_validator(mode="after")
210
+ def fallback(self) -> Self:
211
+ """Fallback implementation to read the URL from the environment."""
212
+
213
+ if not self.url:
214
+ self.url = HttpUrl(
215
+ os.environ.get("OTPD_PROTOCOL", "http")
216
+ + "://"
217
+ + os.environ.get("OTPD_SERVICE_HOST", "otpd-0")
218
+ + ":"
219
+ + os.environ.get("OTPD_SERVICE_PORT", "8080"),
220
+ )
221
+
222
+ return self
223
+
224
+
225
+ class CustomizerSettingsOTIV(BaseModel):
226
+ """Class for OTIV related settings."""
227
+
228
+ enabled: bool = Field(default=False, description="Enable/Disable the OTIV integration")
229
+ license_file: str = Field(default="/payload/otiv-license.lic", description="Path to the OTIV license file.")
230
+ license_feature: str = Field(default="FULLTIME_USERS_REGULAR", description="Name of the license feature.")
231
+ product_name: str = Field(default="Viewing", description="Name of the product for the license.")
232
+ product_description: str = Field(
233
+ default="OpenText Intelligent Viewing",
234
+ description="Description of the product for the license.",
235
+ )
236
+ resource_name: str = Field(default="iv", description="Name of the resource for OTIV")
237
+
238
+
239
+ class CustomizerSettingsOTMM(BaseModel):
240
+ """Class for OTMM related settings."""
241
+
242
+ enabled: bool = Field(default=False, description="Enable/Disable the OTMM integration")
243
+ username: str = Field(default="", description="Username of the API user to connect to OTMM")
244
+ password: SecretStr = Field(default=None, description="Password of the API user to connect to OTMM")
245
+ client_id: str | None = Field(default=None, description="Client ID of the API user to connect to OTMM")
246
+ client_secret: str | None = Field(default=None, description="Client Secret of the API user to connect to OTMM")
247
+ url: HttpUrl | None = Field(default=None, description="URL of the OTMM service")
248
+
249
+
250
+ class CustomizerSettingsK8S(BaseModel):
251
+ """Class for K8s related settings."""
252
+
253
+ enabled: bool = Field(default=True, description="Enable/Disable the K8s integration")
254
+ kubeconfig_file: str = Field(
255
+ default=os.path.expanduser("~/.kube/config"),
256
+ description="Path to the kubeconfig file",
257
+ )
258
+ namespace: str = Field(default="default", description="Name of the namespace")
259
+
260
+ sts_otawp: str = Field(default="appworks", description="Name of the OTAWP statefulset")
261
+ cm_otawp: str = Field(default="appworks-config-ymls", description="Name of the OTAWP configmap")
262
+ pod_otpd: str = Field(default="otpd-0", description="Name of the OTPD pod")
263
+ pod_otac: str = Field(default="otac-0", description="Name of the OTAC pod")
264
+ sts_otcs_frontend: str = Field(default="otcs-frontend", description="Name of the OTCS-FRONTEND statefulset")
265
+ sts_otcs_frontend_replicas: int = Field(None)
266
+ sts_otcs_admin: str = Field(default="otcs-admin", description="Name of the OTCS-ADMIN statefulset")
267
+ sts_otcs_admin_replicas: int = Field(default=None)
268
+ ingress_otxecm: str = Field(default="otxecm-ingress", description="Name of the otxecm ingress")
269
+
270
+ maintenance_service_name: str = Field(default="customizer")
271
+ maintenance_service_port: int = Field(default=5555)
272
+
273
+
274
+ class CustomizerSettingsOTAWP(BaseModel):
275
+ """Class for OTAWP related settings."""
276
+
277
+ enabled: bool = Field(default=False, description="Enable/Disable the OTAWP integration")
278
+ username: str = Field(
279
+ default="sysadmin",
280
+ description="Username of the OTAWP Admin user",
281
+ )
282
+ password: SecretStr = Field(default=None, description="Password of the OTAWP Admin user")
283
+ organization: str = Field(default="system", description="The name of the organization (kind of tenant in AppWorks)")
284
+ license_file: str = Field(default="/payload/otawp-license.lic", description="Path to the OTAWP license file.")
285
+ product_name: str = Field(default="APPWORKS_PLATFORM", description="Name of the Product for the license")
286
+ product_description: str = Field(
287
+ default="OpenText Appworks Platform",
288
+ description="Product desciption to be added in OTDS.",
289
+ )
290
+ resource_name: str = Field(default="awp", description="Name of the Resource for OTAWP")
291
+ access_role_name: str = Field(default="Access to awp", description="Name of the Access Role for OTAWP")
292
+ public_protocol: str = Field(default="https", description="Protocol of the public OTAWP endpoint.")
293
+ public_url: str = Field("", description="Public URL address of the OTAWP service")
294
+ port: int = int(os.environ.get("OTAWP_SERVICE_PORT", "8080"))
295
+ protocol: str = Field(default="http", description="Protocol for the OTAWP service.")
296
+
297
+
298
+ class CustomizerSettingsM365(BaseModel):
299
+ """Class for M365 related settings."""
300
+
301
+ username: str = Field(
302
+ default="",
303
+ description="Username of the M365 tenant Admin.",
304
+ validation_alias=AliasChoices("username", "user"),
305
+ )
306
+ password: str = Field(default="", description="Password of the M365 tenant Admin.")
307
+ enabled: bool = Field(default=False, description="Enable/Disable the Microsoft 365 integration.")
308
+ tenant_id: str = Field(default="", description="TennantID of the Microsoft 365 tenant")
309
+ client_id: str = Field(default="", description="Client ID for the Microsoft 365 tenant.")
310
+ client_secret: str = Field(default="", description="Client Secret for the Microsoft 365 tenant.")
311
+ domain: str = Field(default="O365_DOMAIN", description="Base domain for the Microsoft 365 tenant.")
312
+ sku_id: str = Field(default="c7df2760-2c81-4ef7-b578-5b5392b571df")
313
+ update_teams_app: bool = Field(
314
+ default=False,
315
+ description="Automatically update the Teams App to the latest version if already exists.",
316
+ )
317
+ teams_app_name: str = Field(default="OpenText Extended ECM", description="Name of the Teams App")
318
+ teams_app_external_id: str = Field(
319
+ default="dd4af790-d8ff-47a0-87ad-486318272c7a",
320
+ description="External ID of the Teams App",
321
+ )
322
+ sharepoint_app_root_site: str = Field(default="")
323
+ sharepoint_app_client_id: str = Field(default="")
324
+ sharepoint_app_client_secret: str = Field(default="")
325
+
326
+ azure_storage_account: str | None = Field(default=None)
327
+ azure_storage_access_key: str | None = Field(default=None)
328
+ azure_function_url: str | None = Field(default=None)
329
+ azure_function_url_notification: str | None = Field(default=None)
330
+
331
+
332
+ class CustomizerSettingsCoreShare(BaseModel):
333
+ """Class for Core Share related settings."""
334
+
335
+ enabled: bool = Field(default=False, description="Enable/Disable Core Share integration")
336
+ username: str = Field(default="", description="Admin username for Core Share")
337
+ password: SecretStr = Field(default=None, description="Admin username for Core Share")
338
+ base_url: str = Field(default="https://core.opentext.com", description="Base URL of the Core Share Instance")
339
+ sso_url: str = Field(default="https://sso.core.opentext.com", description="OTDS URL of the Core Share Instance")
340
+ client_id: str = Field(default="", description="Client ID for the Core Share integration")
341
+ client_secret: str = Field(default="", description="Client Secret for the Core Share integration")
342
+
343
+
344
+ class CustomizerSettingsAviator(BaseModel):
345
+ """Class for Aviator related settings."""
346
+
347
+ enabled: bool = Field(default=False, description="Content Aviator enabled")
348
+
349
+
350
+ class CustomizerSettingsAVTS(BaseModel):
351
+ """Class for Aviator Search (AVTS) related settings."""
352
+
353
+ enabled: bool = Field(default=False, description="Enable Aviator Search configuration")
354
+ username: str = Field(default="", description="Admin username for Aviator Search")
355
+ password: str = Field(default="", description="Admin password for Aviator Search")
356
+ client_id: str = Field(default="", description="OTDS Client ID for Aviator Search")
357
+ client_secret: str = Field(default="", description="OTDS Client Secret for Aviator Search")
358
+ base_url: HttpUrl | None = Field(
359
+ default=None,
360
+ validate_default=True,
361
+ )
362
+
363
+
364
+ class Settings(BaseSettings):
365
+ """Class for all settings."""
366
+
367
+ cust_log_file: str = Field(
368
+ default=os.path.join(tempfile.gettempdir(), "customizing.log"),
369
+ description="Logfile for Customizer execution",
370
+ )
371
+
372
+ # The following CUST artifacts are created by the main.tf in the python module:
373
+ cust_settings_dir: str = Field(
374
+ default="/settings/",
375
+ description="Location where AdminSettings xml files are located",
376
+ )
377
+ cust_payload_dir: str = Field(default="/payload/", deprecated=True)
378
+ cust_payload: str = Field(
379
+ default=f"{cust_payload_dir}payload.yaml",
380
+ description="Location of the payload file. File can be in YAML or in Terraform TFVARS Format.",
381
+ )
382
+ cust_payload_gz: str = Field(
383
+ default=f"{cust_payload_dir}payload.yml.gz.b64",
384
+ description="Location of the payload file in gz format, unzip format must bei either YAML or Terraform TFVARS.",
385
+ )
386
+ cust_payload_external: str = Field(default="/payload-external/", deprecated=True)
387
+
388
+ cust_target_folder_nickname: str = Field(
389
+ default="deployment",
390
+ description="Nickname of folder to upload payload and log files",
391
+ )
392
+
393
+ cust_rm_settings_dir: str = Field(default="/settings/")
394
+ stop_on_error: bool = Field(
395
+ default=False,
396
+ description="Stop the payload processing when an error during the transport package deployment occours. This can be useful for debugging, to identify missing dependencies.",
397
+ )
398
+
399
+ placeholder_values: dict = Field(default={})
400
+
401
+ profiling: bool = Field(
402
+ default=False,
403
+ description="Profiling can only be enabled when using the CustomizerAPI. Switch to enable python profiling using pyinstrument. Result is a html file showing the execution of payload broken down into functions and their duration. The files are located in the logdir. Profiling is disabled by default.",
404
+ )
405
+ cprofiling: bool = Field(
406
+ default=False,
407
+ description="Profiling can only be enabled when using the CustomizerAPI. Switch to enable python profiling using cProfile. Result is a log file with the cProfile results, as well as a dump of the profiling session. The files are located in the logdir. The files are located in the logdir. Profilig is disabled by default.",
408
+ )
409
+
410
+ headless_browser: bool = Field(default=True, description="Headless Browser for the BrowserAutomation")
411
+
412
+ otds: CustomizerSettingsOTDS = CustomizerSettingsOTDS()
413
+ otcs: CustomizerSettingsOTCS = CustomizerSettingsOTCS()
414
+ otac: CustomizerSettingsOTAC = CustomizerSettingsOTAC()
415
+ otpd: CustomizerSettingsOTPD = CustomizerSettingsOTPD()
416
+ otiv: CustomizerSettingsOTIV = CustomizerSettingsOTIV()
417
+ k8s: CustomizerSettingsK8S = CustomizerSettingsK8S()
418
+ otawp: CustomizerSettingsOTAWP = CustomizerSettingsOTAWP()
419
+ m365: CustomizerSettingsM365 = CustomizerSettingsM365()
420
+ coreshare: CustomizerSettingsCoreShare = CustomizerSettingsCoreShare()
421
+ aviator: CustomizerSettingsAviator = CustomizerSettingsAviator()
422
+ avts: CustomizerSettingsAVTS = CustomizerSettingsAVTS()
423
+ otmm: CustomizerSettingsOTMM = CustomizerSettingsOTMM()
424
+
425
+ model_config = SettingsConfigDict(
426
+ toml_file="config.toml",
427
+ env_nested_delimiter="__",
428
+ case_sensitive=False,
429
+ )
430
+
431
+ @classmethod
432
+ def settings_customise_sources( # noqa: D102
433
+ cls,
434
+ settings_cls: type[BaseSettings],
435
+ init_settings: PydanticBaseSettingsSource,
436
+ env_settings: PydanticBaseSettingsSource,
437
+ dotenv_settings: PydanticBaseSettingsSource,
438
+ file_secret_settings: PydanticBaseSettingsSource, # noqa: ARG003
439
+ ) -> tuple[PydanticBaseSettingsSource, ...]:
440
+ return (
441
+ init_settings,
442
+ env_settings,
443
+ dotenv_settings,
444
+ TomlConfigSettingsSource(settings_cls),
445
+ )