js7-client-python 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.
Files changed (389) hide show
  1. js7/__init__.py +8 -0
  2. js7/api/joc/http/v_2_8_2/agent/cluster/confirm_node_loss.py +36 -0
  3. js7/api/joc/http/v_2_8_2/agent/cluster/switchover.py +36 -0
  4. js7/api/joc/http/v_2_8_2/agent/delete.py +36 -0
  5. js7/api/joc/http/v_2_8_2/agents/agents.py +36 -0
  6. js7/api/joc/http/v_2_8_2/agents/cluster/delete.py +36 -0
  7. js7/api/joc/http/v_2_8_2/agents/cluster/deploy.py +36 -0
  8. js7/api/joc/http/v_2_8_2/agents/cluster/revoke.py +36 -0
  9. js7/api/joc/http/v_2_8_2/agents/cluster/store.py +36 -0
  10. js7/api/joc/http/v_2_8_2/agents/export.py +36 -0
  11. js7/api/joc/http/v_2_8_2/agents/import.py +74 -0
  12. js7/api/joc/http/v_2_8_2/agents/inventory/cluster/deploy.py +36 -0
  13. js7/api/joc/http/v_2_8_2/agents/inventory/cluster/revoke.py +36 -0
  14. js7/api/joc/http/v_2_8_2/agents/inventory/cluster/store.py +36 -0
  15. js7/api/joc/http/v_2_8_2/agents/inventory/cluster/subagents/delete.py +36 -0
  16. js7/api/joc/http/v_2_8_2/agents/inventory/cluster/subagents/disable.py +36 -0
  17. js7/api/joc/http/v_2_8_2/agents/inventory/cluster/subagents/enable.py +36 -0
  18. js7/api/joc/http/v_2_8_2/agents/inventory/cluster/subagents/reset.py +36 -0
  19. js7/api/joc/http/v_2_8_2/agents/inventory/cluster/subagents/store.py +36 -0
  20. js7/api/joc/http/v_2_8_2/agents/inventory/deploy.py +36 -0
  21. js7/api/joc/http/v_2_8_2/agents/inventory/disable.py +36 -0
  22. js7/api/joc/http/v_2_8_2/agents/inventory/enable.py +36 -0
  23. js7/api/joc/http/v_2_8_2/agents/inventory/revoke.py +36 -0
  24. js7/api/joc/http/v_2_8_2/agents/inventory/store.py +36 -0
  25. js7/api/joc/http/v_2_8_2/agents/reset.py +36 -0
  26. js7/api/joc/http/v_2_8_2/authentication/auth.py +32 -0
  27. js7/api/joc/http/v_2_8_2/authentication/joc_cockpit_permissions.py +28 -0
  28. js7/api/joc/http/v_2_8_2/authentication/login.py +35 -0
  29. js7/api/joc/http/v_2_8_2/authentication/logout.py +28 -0
  30. js7/api/joc/http/v_2_8_2/configuration/configuration.py +36 -0
  31. js7/api/joc/http/v_2_8_2/configuration/save.py +36 -0
  32. js7/api/joc/http/v_2_8_2/controller/abort.py +36 -0
  33. js7/api/joc/http/v_2_8_2/controller/abort_and_restart.py +36 -0
  34. js7/api/joc/http/v_2_8_2/controller/cluster/appoint_nodes.py +36 -0
  35. js7/api/joc/http/v_2_8_2/controller/cluster/confirm_node_loss.py +36 -0
  36. js7/api/joc/http/v_2_8_2/controller/cluster/switchover.py +36 -0
  37. js7/api/joc/http/v_2_8_2/controller/components.py +36 -0
  38. js7/api/joc/http/v_2_8_2/controller/controller.py +36 -0
  39. js7/api/joc/http/v_2_8_2/controller/register.py +42 -0
  40. js7/api/joc/http/v_2_8_2/controller/restart.py +36 -0
  41. js7/api/joc/http/v_2_8_2/controller/terminate.py +36 -0
  42. js7/api/joc/http/v_2_8_2/controller/test.py +36 -0
  43. js7/api/joc/http/v_2_8_2/controller/unregister.py +36 -0
  44. js7/api/joc/http/v_2_8_2/daily_plan/orders/cancel.py +36 -0
  45. js7/api/joc/http/v_2_8_2/daily_plan/orders/copy.py +36 -0
  46. js7/api/joc/http/v_2_8_2/daily_plan/orders/delete.py +36 -0
  47. js7/api/joc/http/v_2_8_2/daily_plan/orders/generate.py +36 -0
  48. js7/api/joc/http/v_2_8_2/daily_plan/orders/modify.py +36 -0
  49. js7/api/joc/http/v_2_8_2/daily_plan/orders/orders.py +36 -0
  50. js7/api/joc/http/v_2_8_2/daily_plan/orders/submit.py +36 -0
  51. js7/api/joc/http/v_2_8_2/daily_plan/projections/calendar.py +36 -0
  52. js7/api/joc/http/v_2_8_2/daily_plan/projections/dates.py +36 -0
  53. js7/api/joc/http/v_2_8_2/daily_plan/projections/recreate.py +28 -0
  54. js7/api/joc/http/v_2_8_2/daily_plan/submissions/delete.py +36 -0
  55. js7/api/joc/http/v_2_8_2/iam/account/change_password.py +36 -0
  56. js7/api/joc/http/v_2_8_2/iam/account/permissions.py +36 -0
  57. js7/api/joc/http/v_2_8_2/iam/account/rename.py +36 -0
  58. js7/api/joc/http/v_2_8_2/iam/account/store.py +36 -0
  59. js7/api/joc/http/v_2_8_2/iam/accounts/accounts.py +36 -0
  60. js7/api/joc/http/v_2_8_2/iam/accounts/delete.py +36 -0
  61. js7/api/joc/http/v_2_8_2/iam/accounts/disable.py +36 -0
  62. js7/api/joc/http/v_2_8_2/iam/accounts/enable.py +36 -0
  63. js7/api/joc/http/v_2_8_2/iam/accounts/reset_password.py +36 -0
  64. js7/api/joc/http/v_2_8_2/iam/blocked_account/store.py +36 -0
  65. js7/api/joc/http/v_2_8_2/iam/blocked_accounts/blocked_accounts.py +36 -0
  66. js7/api/joc/http/v_2_8_2/iam/blocked_accounts/delete.py +36 -0
  67. js7/api/joc/http/v_2_8_2/iam/folder/folder.py +36 -0
  68. js7/api/joc/http/v_2_8_2/iam/folder/rename.py +36 -0
  69. js7/api/joc/http/v_2_8_2/iam/folders/delete.py +36 -0
  70. js7/api/joc/http/v_2_8_2/iam/folders/folders.py +36 -0
  71. js7/api/joc/http/v_2_8_2/iam/folders/store.py +36 -0
  72. js7/api/joc/http/v_2_8_2/iam/identity_service/delete.py +36 -0
  73. js7/api/joc/http/v_2_8_2/iam/identity_service/identity_service.py +36 -0
  74. js7/api/joc/http/v_2_8_2/iam/identity_service/rename.py +36 -0
  75. js7/api/joc/http/v_2_8_2/iam/identity_service/store.py +42 -0
  76. js7/api/joc/http/v_2_8_2/iam/identity_services/identity_services.py +36 -0
  77. js7/api/joc/http/v_2_8_2/iam/permission/permission.py +36 -0
  78. js7/api/joc/http/v_2_8_2/iam/permission/rename.py +36 -0
  79. js7/api/joc/http/v_2_8_2/iam/permissions/delete.py +36 -0
  80. js7/api/joc/http/v_2_8_2/iam/permissions/permissions.py +36 -0
  81. js7/api/joc/http/v_2_8_2/iam/permissions/store.py +36 -0
  82. js7/api/joc/http/v_2_8_2/iam/role/rename.py +36 -0
  83. js7/api/joc/http/v_2_8_2/iam/role/role.py +36 -0
  84. js7/api/joc/http/v_2_8_2/iam/role/store.py +36 -0
  85. js7/api/joc/http/v_2_8_2/iam/roles/delete.py +36 -0
  86. js7/api/joc/http/v_2_8_2/iam/roles/roles.py +36 -0
  87. js7/api/joc/http/v_2_8_2/inventory/changes/changes.py +36 -0
  88. js7/api/joc/http/v_2_8_2/inventory/dependencies.py +33 -0
  89. js7/api/joc/http/v_2_8_2/inventory/deployment/deploy.py +36 -0
  90. js7/api/joc/http/v_2_8_2/inventory/deployment/import_deploy.py +66 -0
  91. js7/api/joc/http/v_2_8_2/inventory/deployment/revoke.py +36 -0
  92. js7/api/joc/http/v_2_8_2/inventory/export/export.py +36 -0
  93. js7/api/joc/http/v_2_8_2/inventory/export/folder.py +36 -0
  94. js7/api/joc/http/v_2_8_2/inventory/import_objects.py +88 -0
  95. js7/api/joc/http/v_2_8_2/inventory/releasables/recall/folder.py +36 -0
  96. js7/api/joc/http/v_2_8_2/inventory/releasables/recall/recall.py +36 -0
  97. js7/api/joc/http/v_2_8_2/inventory/release.py +36 -0
  98. js7/api/joc/http/v_2_8_2/inventory/remove/folder.py +36 -0
  99. js7/api/joc/http/v_2_8_2/inventory/remove/remove.py +36 -0
  100. js7/api/joc/http/v_2_8_2/inventory/repository/delete.py +36 -0
  101. js7/api/joc/http/v_2_8_2/inventory/repository/git/add.py +36 -0
  102. js7/api/joc/http/v_2_8_2/inventory/repository/git/checkout.py +36 -0
  103. js7/api/joc/http/v_2_8_2/inventory/repository/git/clone.py +36 -0
  104. js7/api/joc/http/v_2_8_2/inventory/repository/git/commit.py +36 -0
  105. js7/api/joc/http/v_2_8_2/inventory/repository/git/credentials/add.py +36 -0
  106. js7/api/joc/http/v_2_8_2/inventory/repository/git/credentials/credentials.py +28 -0
  107. js7/api/joc/http/v_2_8_2/inventory/repository/git/credentials/remove.py +36 -0
  108. js7/api/joc/http/v_2_8_2/inventory/repository/git/pull.py +36 -0
  109. js7/api/joc/http/v_2_8_2/inventory/repository/git/push.py +36 -0
  110. js7/api/joc/http/v_2_8_2/inventory/repository/read.py +36 -0
  111. js7/api/joc/http/v_2_8_2/inventory/repository/store.py +36 -0
  112. js7/api/joc/http/v_2_8_2/inventory/repository/update.py +36 -0
  113. js7/api/joc/http/v_2_8_2/inventory/revalidate/folder.py +36 -0
  114. js7/api/joc/http/v_2_8_2/inventory/store.py +36 -0
  115. js7/api/joc/http/v_2_8_2/inventory/trash/delete/delete.py +36 -0
  116. js7/api/joc/http/v_2_8_2/inventory/trash/delete/folder.py +36 -0
  117. js7/api/joc/http/v_2_8_2/inventory/trash/restore.py +36 -0
  118. js7/api/joc/http/v_2_8_2/inventory/validate.py +42 -0
  119. js7/api/joc/http/v_2_8_2/joc/cluster/restart.py +36 -0
  120. js7/api/joc/http/v_2_8_2/joc/cluster/run.py +36 -0
  121. js7/api/joc/http/v_2_8_2/joc/cluster/switch_member.py +36 -0
  122. js7/api/joc/http/v_2_8_2/joc/license.py +28 -0
  123. js7/api/joc/http/v_2_8_2/joc/proxies/restart.py +36 -0
  124. js7/api/joc/http/v_2_8_2/joc/version.py +28 -0
  125. js7/api/joc/http/v_2_8_2/joc/versions.py +36 -0
  126. js7/api/joc/http/v_2_8_2/orders/add.py +33 -0
  127. js7/api/joc/http/v_2_8_2/orders/cancel.py +33 -0
  128. js7/api/joc/http/v_2_8_2/orders/confirm.py +36 -0
  129. js7/api/joc/http/v_2_8_2/orders/continue.py +36 -0
  130. js7/api/joc/http/v_2_8_2/orders/history.py +36 -0
  131. js7/api/joc/http/v_2_8_2/orders/orders.py +36 -0
  132. js7/api/joc/http/v_2_8_2/orders/remove_when_terminated.py +33 -0
  133. js7/api/joc/http/v_2_8_2/orders/resume.py +36 -0
  134. js7/api/joc/http/v_2_8_2/orders/suspend.py +36 -0
  135. js7/api/joc/http/v_2_8_2/settings/settings.py +28 -0
  136. js7/api/joc/http/v_2_8_2/settings/store.py +36 -0
  137. js7/api/joc/http/v_2_8_2/tasks/history.py +36 -0
  138. js7/api/joc/http/v_2_8_2/workflow/transition.py +36 -0
  139. js7/api/joc/http/v_2_8_2/workflow/workflow.py +36 -0
  140. js7/api/joc/http/v_2_8_2/workflows/resume.py +36 -0
  141. js7/api/joc/http/v_2_8_2/workflows/skip.py +36 -0
  142. js7/api/joc/http/v_2_8_2/workflows/stop.py +36 -0
  143. js7/api/joc/http/v_2_8_2/workflows/suspend.py +36 -0
  144. js7/api/joc/http/v_2_8_2/workflows/unskip.py +36 -0
  145. js7/api/joc/http/v_2_8_2/workflows/unstop.py +36 -0
  146. js7/api/joc/http/v_2_8_2/workflows/workflows.py +36 -0
  147. js7/api/joc/interface/dispatcher.py +76 -0
  148. js7/api/joc/interface/interface.py +8 -0
  149. js7/api/joc/interface/resolver.py +75 -0
  150. js7/client/action/agent/confirm_node_loss_agent_action.py +75 -0
  151. js7/client/action/agent/delete_subagent_action.py +77 -0
  152. js7/client/action/agent/delete_subagent_clusters_action.py +75 -0
  153. js7/client/action/agent/deploy_cluster_agents_action.py +75 -0
  154. js7/client/action/agent/deploy_standalone_agents_action.py +75 -0
  155. js7/client/action/agent/deploy_subagent_clusters_action.py +75 -0
  156. js7/client/action/agent/disable_standalone_agents_action.py +75 -0
  157. js7/client/action/agent/disable_subagents_action.py +75 -0
  158. js7/client/action/agent/enable_standalone_agents_action.py +75 -0
  159. js7/client/action/agent/enable_subagents_action.py +75 -0
  160. js7/client/action/agent/export_agents_action.py +101 -0
  161. js7/client/action/agent/get_agents_status_action.py +55 -0
  162. js7/client/action/agent/import_agents_action.py +139 -0
  163. js7/client/action/agent/remove_agent_action.py +79 -0
  164. js7/client/action/agent/reset_agents_action.py +79 -0
  165. js7/client/action/agent/reset_subagent_action.py +79 -0
  166. js7/client/action/agent/revoke_cluster_agents_action.py +75 -0
  167. js7/client/action/agent/revoke_standalone_agents_action.py +75 -0
  168. js7/client/action/agent/revoke_subagent_clusters_action.py +75 -0
  169. js7/client/action/agent/store_cluster_agents_action.py +99 -0
  170. js7/client/action/agent/store_standalone_agents_action.py +87 -0
  171. js7/client/action/agent/store_subagent_clusters_action.py +83 -0
  172. js7/client/action/agent/store_subagents_action.py +97 -0
  173. js7/client/action/agent/switchover_agent_action.py +75 -0
  174. js7/client/action/controller/appoint_nodes_controller_action.py +67 -0
  175. js7/client/action/controller/cancel_and_restart_controller_action.py +72 -0
  176. js7/client/action/controller/cancel_controller_action.py +71 -0
  177. js7/client/action/controller/confirm_cluster_node_loss_action.py +68 -0
  178. js7/client/action/controller/get_controller_components_action.py +41 -0
  179. js7/client/action/controller/get_controller_status_action.py +72 -0
  180. js7/client/action/controller/register_controller_action.py +93 -0
  181. js7/client/action/controller/restart_controller_action.py +72 -0
  182. js7/client/action/controller/switchover_controller_cluster_action.py +67 -0
  183. js7/client/action/controller/terminate_controller_action.py +72 -0
  184. js7/client/action/controller/test_controller_instance_action.py +65 -0
  185. js7/client/action/controller/unregister_controller_action.py +68 -0
  186. js7/client/action/daily_plan/cancel_orders_action.py +59 -0
  187. js7/client/action/daily_plan/copy_orders_action.py +108 -0
  188. js7/client/action/daily_plan/create_projections_action.py +24 -0
  189. js7/client/action/daily_plan/delete_orders_action.py +80 -0
  190. js7/client/action/daily_plan/delete_submissions_action.py +83 -0
  191. js7/client/action/daily_plan/generate_orders_action.py +121 -0
  192. js7/client/action/daily_plan/get_calendar_projections_action.py +59 -0
  193. js7/client/action/daily_plan/get_orders_action.py +70 -0
  194. js7/client/action/daily_plan/get_projection_dates_action.py +59 -0
  195. js7/client/action/daily_plan/modify_orders_action.py +130 -0
  196. js7/client/action/daily_plan/submit_orders_action.py +79 -0
  197. js7/client/action/helper/decrypt_action.py +82 -0
  198. js7/client/action/helper/encrypt_action.py +87 -0
  199. js7/client/action/iam/block_account_action.py +71 -0
  200. js7/client/action/iam/change_account_password_action.py +96 -0
  201. js7/client/action/iam/disable_accounts_action.py +75 -0
  202. js7/client/action/iam/enable_accounts_action.py +75 -0
  203. js7/client/action/iam/get_account_permissions_action.py +75 -0
  204. js7/client/action/iam/get_accounts_action.py +76 -0
  205. js7/client/action/iam/get_blocked_accounts_action.py +76 -0
  206. js7/client/action/iam/get_folder_permissions_action.py +112 -0
  207. js7/client/action/iam/get_identity_service_settings_action.py +70 -0
  208. js7/client/action/iam/get_identity_services_action.py +102 -0
  209. js7/client/action/iam/get_permissions_action.py +113 -0
  210. js7/client/action/iam/get_roles_action.py +57 -0
  211. js7/client/action/iam/remove_accounts_action.py +75 -0
  212. js7/client/action/iam/remove_folder_permissions_action.py +91 -0
  213. js7/client/action/iam/remove_identity_service_action.py +67 -0
  214. js7/client/action/iam/remove_permissions_action.py +88 -0
  215. js7/client/action/iam/remove_roles_action.py +75 -0
  216. js7/client/action/iam/rename_account_action.py +83 -0
  217. js7/client/action/iam/rename_folder_permissions_action.py +100 -0
  218. js7/client/action/iam/rename_identity_service_action.py +75 -0
  219. js7/client/action/iam/rename_permission_action.py +103 -0
  220. js7/client/action/iam/rename_role_action.py +83 -0
  221. js7/client/action/iam/reset_account_passwords_action.py +75 -0
  222. js7/client/action/iam/set_folder_permissions_action.py +96 -0
  223. js7/client/action/iam/set_permissions_action.py +91 -0
  224. js7/client/action/iam/store_account_action.py +69 -0
  225. js7/client/action/iam/store_identity_service_action.py +75 -0
  226. js7/client/action/iam/store_identity_service_settings_action.py +74 -0
  227. js7/client/action/iam/store_role_action.py +79 -0
  228. js7/client/action/iam/unblock_accounts_action.py +67 -0
  229. js7/client/action/inventory/deploy_configurations_action.py +138 -0
  230. js7/client/action/inventory/export_configurations_action.py +203 -0
  231. js7/client/action/inventory/export_folders_action.py +160 -0
  232. js7/client/action/inventory/get_change_dependencies_action.py +161 -0
  233. js7/client/action/inventory/get_changes_action.py +59 -0
  234. js7/client/action/inventory/get_git_credentials_action.py +29 -0
  235. js7/client/action/inventory/git_add_action.py +72 -0
  236. js7/client/action/inventory/git_checkout_action.py +88 -0
  237. js7/client/action/inventory/git_clone_action.py +84 -0
  238. js7/client/action/inventory/git_commit_action.py +80 -0
  239. js7/client/action/inventory/git_pull_action.py +72 -0
  240. js7/client/action/inventory/git_push_action.py +76 -0
  241. js7/client/action/inventory/import_configurations_action.py +153 -0
  242. js7/client/action/inventory/import_deploy_configurations_action.py +188 -0
  243. js7/client/action/inventory/read_from_local_repository_action.py +67 -0
  244. js7/client/action/inventory/recall_folder_action.py +89 -0
  245. js7/client/action/inventory/recall_released_configuration_action.py +75 -0
  246. js7/client/action/inventory/release_configuartions_action.py +89 -0
  247. js7/client/action/inventory/remove_configurations_action.py +77 -0
  248. js7/client/action/inventory/remove_configurations_from_trash_action.py +80 -0
  249. js7/client/action/inventory/remove_folder_action.py +67 -0
  250. js7/client/action/inventory/remove_folder_from_trash_action.py +69 -0
  251. js7/client/action/inventory/remove_git_credentials_action.py +53 -0
  252. js7/client/action/inventory/remove_repository_configuration_action.py +84 -0
  253. js7/client/action/inventory/restore_configuration_from_trash_action.py +84 -0
  254. js7/client/action/inventory/revalidate_folder_action.py +46 -0
  255. js7/client/action/inventory/revoke_configurations_action.py +86 -0
  256. js7/client/action/inventory/store_configuration_action.py +79 -0
  257. js7/client/action/inventory/store_git_credentials_action.py +99 -0
  258. js7/client/action/inventory/store_repository_configuration_action.py +124 -0
  259. js7/client/action/inventory/update_repository_configuration_action.py +85 -0
  260. js7/client/action/inventory/validate_configuration_action.py +58 -0
  261. js7/client/action/joc/get_components_versions_action.py +57 -0
  262. js7/client/action/joc/get_license_info_action.py +22 -0
  263. js7/client/action/joc/get_settings_action.py +19 -0
  264. js7/client/action/joc/get_version_action.py +17 -0
  265. js7/client/action/joc/restart_proxies_action.py +50 -0
  266. js7/client/action/joc/restart_service_action.py +74 -0
  267. js7/client/action/joc/run_service_action.py +74 -0
  268. js7/client/action/joc/store_settings_action.py +62 -0
  269. js7/client/action/joc/switch_over_action.py +89 -0
  270. js7/client/action/order/add_orders_action.py +115 -0
  271. js7/client/action/order/cancel_orders_action.py +93 -0
  272. js7/client/action/order/confirm_orders_action.py +86 -0
  273. js7/client/action/order/continue_orders_action.py +86 -0
  274. js7/client/action/order/get_order_history_action.py +84 -0
  275. js7/client/action/order/get_orders_action.py +83 -0
  276. js7/client/action/order/remove_terminated_orders_action.py +86 -0
  277. js7/client/action/order/resume_orders_action.py +102 -0
  278. js7/client/action/order/suspend_orders_action.py +97 -0
  279. js7/client/action/task/get_task_history_info_action.py +88 -0
  280. js7/client/action/workflow/get_workflow_versions_action.py +131 -0
  281. js7/client/action/workflow/resume_workflows_action.py +76 -0
  282. js7/client/action/workflow/set_workflow_version_as_current_action.py +86 -0
  283. js7/client/action/workflow/skip_job_instructions_action.py +83 -0
  284. js7/client/action/workflow/stop_job_instructions_action.py +83 -0
  285. js7/client/action/workflow/suspend_workflows_action.py +76 -0
  286. js7/client/action/workflow/unskip_job_instructions_action.py +83 -0
  287. js7/client/action/workflow/unstop_job_instructions_action.py +79 -0
  288. js7/client/auth/auth_provider.py +109 -0
  289. js7/client/auth/login.py +34 -0
  290. js7/client/auth/logout.py +22 -0
  291. js7/client/client.py +250 -0
  292. js7/client/context.py +40 -0
  293. js7/client/feature/agent/agent.py +26 -0
  294. js7/client/feature/agent/deploy.py +134 -0
  295. js7/client/feature/agent/manage.py +363 -0
  296. js7/client/feature/agent/operate.py +577 -0
  297. js7/client/feature/controller/controller.py +19 -0
  298. js7/client/feature/controller/manage.py +214 -0
  299. js7/client/feature/controller/operate.py +274 -0
  300. js7/client/feature/daily_plan/daily_plan.py +14 -0
  301. js7/client/feature/daily_plan/manage.py +179 -0
  302. js7/client/feature/daily_plan/operate.py +354 -0
  303. js7/client/feature/iam/iam.py +14 -0
  304. js7/client/feature/iam/manage.py +1311 -0
  305. js7/client/feature/inventory/inventory.py +13 -0
  306. js7/client/feature/inventory/manage.py +943 -0
  307. js7/client/feature/inventory/manage_repository.py +533 -0
  308. js7/client/feature/joc/joc.py +18 -0
  309. js7/client/feature/joc/manage.py +102 -0
  310. js7/client/feature/joc/operate.py +185 -0
  311. js7/client/feature/order/manage.py +79 -0
  312. js7/client/feature/order/operate.py +346 -0
  313. js7/client/feature/order/order.py +18 -0
  314. js7/client/feature/task/task.py +54 -0
  315. js7/client/feature/workflow/manage.py +54 -0
  316. js7/client/feature/workflow/operate.py +336 -0
  317. js7/client/feature/workflow/workflow.py +19 -0
  318. js7/java/lib/3rd-party/bcpg-jdk15to18-1.78.1.jar +0 -0
  319. js7/java/lib/3rd-party/bcpkix-jdk15to18-1.78.1.jar +0 -0
  320. js7/java/lib/3rd-party/bcprov-jdk15to18-1.78.1.jar +0 -0
  321. js7/java/lib/3rd-party/bcutil-jdk15to18-1.78.1.jar +0 -0
  322. js7/java/lib/3rd-party/commons-io-2.15.1.jar +0 -0
  323. js7/java/lib/3rd-party/commons-lang3-3.14.0.jar +0 -0
  324. js7/java/lib/3rd-party/jackson-core-2.14.2.jar +0 -0
  325. js7/java/lib/3rd-party/jackson-databind-2.14.2.jar +0 -0
  326. js7/java/lib/3rd-party/jackson-dataformat-xml-2.14.2.jar +0 -0
  327. js7/java/lib/3rd-party/jakarta.annotation-api-2.1.1.jar +0 -0
  328. js7/java/lib/3rd-party/javax.activation-api-1.2.0.jar +0 -0
  329. js7/java/lib/3rd-party/jaxb-api-2.4.0-b180830.0359.jar +0 -0
  330. js7/java/lib/3rd-party/org.apache.logging.log4j.log4j-api-2.23.1.jar +0 -0
  331. js7/java/lib/3rd-party/org.apache.logging.log4j.log4j-core-2.23.1.jar +0 -0
  332. js7/java/lib/3rd-party/org.apache.logging.log4j.log4j-slf4j2-impl-2.23.1.jar +0 -0
  333. js7/java/lib/3rd-party/org.slf4j.slf4j-api-2.0.13.jar +0 -0
  334. js7/java/lib/3rd-party/stax2-api-4.2.1.jar +0 -0
  335. js7/java/lib/3rd-party/woodstox-core-6.5.0.jar +0 -0
  336. js7/java/lib/sos/sos-commons-encryption-2.7.3.jar +0 -0
  337. js7/java/lib/sos/sos-commons-exception-2.7.3.jar +0 -0
  338. js7/java/lib/sos/sos-commons-sign-2.7.3.jar +0 -0
  339. js7/java/lib/sos/sos-webservices-json-2.7.3.jar +0 -0
  340. js7/model/__init__.py +132 -0
  341. js7/model/configuration/auth_configuration.py +24 -0
  342. js7/model/configuration/client_configuration.py +6 -0
  343. js7/model/configuration/http_configuration.py +10 -0
  344. js7/model/error/http/joc_exceptions.py +151 -0
  345. js7/model/private/api/endpoint.py +30 -0
  346. js7/model/private/http/joc/joc_v_2_8_2.py +3666 -0
  347. js7/model/public/client/common/__init__.py +27 -0
  348. js7/model/public/client/common/accounts.py +21 -0
  349. js7/model/public/client/common/audit_log.py +8 -0
  350. js7/model/public/client/common/changes.py +18 -0
  351. js7/model/public/client/common/configurations.py +53 -0
  352. js7/model/public/client/common/cycle.py +12 -0
  353. js7/model/public/client/common/git_credentials.py +12 -0
  354. js7/model/public/client/common/identity_service.py +14 -0
  355. js7/model/public/client/common/schedule_time.py +50 -0
  356. js7/model/public/client/common/store_agents.py +96 -0
  357. js7/model/public/client/enum/__init__.py +19 -0
  358. js7/model/public/client/enum/object_types.py +48 -0
  359. js7/model/public/client/enum/operation_type.py +11 -0
  360. js7/model/public/client/enum/order_priority.py +9 -0
  361. js7/model/public/client/filter/__init__.py +35 -0
  362. js7/model/public/client/filter/daily_plan_order_filters.py +255 -0
  363. js7/model/public/client/filter/element/__init__.py +3 -0
  364. js7/model/public/client/filter/element/folder.py +6 -0
  365. js7/model/public/client/filter/element/workflow_id.py +10 -0
  366. js7/model/public/client/filter/export_filter.py +52 -0
  367. js7/model/public/client/filter/export_folders_filter.py +34 -0
  368. js7/model/public/client/filter/get_order_filter.py +59 -0
  369. js7/model/public/client/filter/order_history_filter.py +113 -0
  370. js7/model/public/client/filter/resume_order_filter.py +45 -0
  371. js7/model/public/client/filter/suspend_order_filter.py +44 -0
  372. js7/model/public/client/filter/tasks_filter.py +50 -0
  373. js7/model/public/client/input/__init__.py +2 -0
  374. js7/model/public/client/input/add_order.py +50 -0
  375. js7/service/http_service.py +206 -0
  376. js7/util/bytes_converter/bytes_to_archive_bytes.py +52 -0
  377. js7/util/bytes_converter/bytes_to_file.py +12 -0
  378. js7/util/bytes_converter/files_to_bytes.py +52 -0
  379. js7/util/bytes_converter/read_bytes_archive_files_to_bytes.py +69 -0
  380. js7/util/bytes_converter/sign_to_bytes.py +106 -0
  381. js7/util/check_matching_version.py +20 -0
  382. js7/util/detect_archive_type.py +37 -0
  383. js7/util/str_converter/order_id_to_order_name.py +5 -0
  384. js7/validator/http/joc_http_status_validator.py +155 -0
  385. js7_client_python-2.0.1.0.dist-info/LICENSE +674 -0
  386. js7_client_python-2.0.1.0.dist-info/METADATA +763 -0
  387. js7_client_python-2.0.1.0.dist-info/RECORD +389 -0
  388. js7_client_python-2.0.1.0.dist-info/WHEEL +5 -0
  389. js7_client_python-2.0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,86 @@
1
+ from typing import Optional
2
+
3
+ from ...context import Context
4
+ from ....model.public.client.common.audit_log import AuditLog
5
+ from ....model.private.api.endpoint import EndpointCall
6
+ from ....model.private.http.joc.joc_v_2_8_2 import (
7
+ OK as OK_V_2_8_2,
8
+ AuditParams as AuditParams_V_2_8_2,
9
+ ModifyWorkflow as ModifyWorkflow_V_2_8_2,
10
+ WorkflowID as WorkflowID_V_2_8_2
11
+ )
12
+
13
+ from ....util.check_matching_version import check_matching_version
14
+
15
+
16
+ def set_workflow_version_as_current_action(
17
+ *,
18
+ context: Context,
19
+ controller_id: str,
20
+ workflow_path: str,
21
+ workflow_version_id: str,
22
+ audit_log: Optional[AuditLog]
23
+ ) -> bool:
24
+
25
+ if check_matching_version(min="2.6.5", max="2.8.3", check=context.version):
26
+ request_data = _build_v_2_8_2_request(
27
+ controller_id=controller_id,
28
+ workflow_path=workflow_path,
29
+ workflow_version_id=workflow_version_id,
30
+ audit_log=audit_log
31
+ )
32
+ else:
33
+ raise RuntimeError(f"Version {context.version} is not compatible with building the request.")
34
+
35
+ # Calls the dispatcher for the matching JOC version
36
+ result = context.joc_api.dispatch(endpoint_id="workflow/transition", call=EndpointCall(
37
+ http_service=context.http_service,
38
+ access_token=context.auth_provider.login(),
39
+ payload=request_data,
40
+ options=None,
41
+ ))
42
+
43
+ if isinstance(result, OK_V_2_8_2):
44
+ return bool(result.ok)
45
+
46
+ raise RuntimeError(f"Unexpected response type: {type(result).__name__}")
47
+
48
+ #---------------------#
49
+ # Build 2.8.2 request #
50
+ #---------------------#
51
+ def _build_v_2_8_2_request(
52
+ *,
53
+ controller_id: str,
54
+ workflow_path: str,
55
+ workflow_version_id: str,
56
+ audit_log: Optional[AuditLog]
57
+ ) -> ModifyWorkflow_V_2_8_2:
58
+
59
+ # Validate: controller_id
60
+ if not controller_id:
61
+ raise ValueError("'controller_id' is required")
62
+
63
+ # Validate: workflow_version_id
64
+ if not workflow_version_id:
65
+ raise ValueError("'workflow_version_id' is required")
66
+
67
+ # Validate: workflow_path
68
+ if not workflow_path:
69
+ raise ValueError("'workflow_path' is required")
70
+
71
+ # Build: audit_log
72
+ res_audit_log = AuditParams_V_2_8_2(
73
+ ticket_link=audit_log.ticket_link,
74
+ comment=audit_log.comment,
75
+ time_spent=audit_log.time_spent
76
+ ) if audit_log else None
77
+
78
+ # Result
79
+ return ModifyWorkflow_V_2_8_2(
80
+ controller_id=controller_id,
81
+ workflow_id=WorkflowID_V_2_8_2(
82
+ path=workflow_path,
83
+ version_id=workflow_version_id
84
+ ),
85
+ audit_log=res_audit_log
86
+ )
@@ -0,0 +1,83 @@
1
+ from typing import List, Optional
2
+
3
+ from ...context import Context
4
+ from ....model.public.client.common.audit_log import AuditLog
5
+ from ....model.private.api.endpoint import EndpointCall
6
+ from ....model.private.http.joc.joc_v_2_8_2 import (
7
+ OK as OK_V_2_8_2,
8
+ AuditParams as AuditParams_V_2_8_2,
9
+ ModifyWorkflowLabels as ModifyWorkflowLabels_V_2_8_2
10
+ )
11
+
12
+ from ....util.check_matching_version import check_matching_version
13
+
14
+
15
+ def skip_job_instructions_action(
16
+ *,
17
+ context: Context,
18
+ controller_id: str,
19
+ workflow_path: str,
20
+ labels: List[str],
21
+ audit_log: Optional[AuditLog]
22
+ ) -> bool:
23
+
24
+ if check_matching_version(min="2.6.5", max="2.8.3", check=context.version):
25
+ request_data = _build_v_2_8_2_request(
26
+ controller_id=controller_id,
27
+ workflow_path=workflow_path,
28
+ labels=labels,
29
+ audit_log=audit_log
30
+ )
31
+ else:
32
+ raise RuntimeError(f"Version {context.version} is not compatible with building the request.")
33
+
34
+ # Calls the dispatcher for the matching JOC version
35
+ result = context.joc_api.dispatch(endpoint_id="workflow/skip", call=EndpointCall(
36
+ http_service=context.http_service,
37
+ access_token=context.auth_provider.login(),
38
+ payload=request_data,
39
+ options=None,
40
+ ))
41
+
42
+ if isinstance(result, OK_V_2_8_2):
43
+ return bool(result.ok)
44
+
45
+ raise RuntimeError(f"Unexpected response type: {type(result).__name__}")
46
+
47
+ #---------------------#
48
+ # Build 2.8.2 request #
49
+ #---------------------#
50
+ def _build_v_2_8_2_request(
51
+ *,
52
+ controller_id: str,
53
+ workflow_path: str,
54
+ labels: List[str],
55
+ audit_log: Optional[AuditLog]
56
+ ) -> ModifyWorkflowLabels_V_2_8_2:
57
+
58
+ # Validate: controller_id
59
+ if not controller_id:
60
+ raise ValueError("'controller_id' is required.")
61
+
62
+ # Validate: workflow_path
63
+ if not workflow_path:
64
+ raise ValueError("'workflow_path' is required.")
65
+
66
+ # Validate: labels
67
+ if not labels:
68
+ raise ValueError("At least one label in 'labels' is required.")
69
+
70
+ # Build: audit_log
71
+ res_audit_log = AuditParams_V_2_8_2(
72
+ ticket_link=audit_log.ticket_link,
73
+ comment=audit_log.comment,
74
+ time_spent=audit_log.time_spent
75
+ ) if audit_log else None
76
+
77
+ # Result
78
+ return ModifyWorkflowLabels_V_2_8_2(
79
+ controller_id=controller_id,
80
+ workflow_path=workflow_path,
81
+ labels=labels,
82
+ audit_log=res_audit_log
83
+ )
@@ -0,0 +1,83 @@
1
+ from typing import List, Optional
2
+
3
+ from ...context import Context
4
+ from ....model.public.client.common.audit_log import AuditLog
5
+ from ....model.private.api.endpoint import EndpointCall
6
+ from ....model.private.http.joc.joc_v_2_8_2 import (
7
+ OK as OK_V_2_8_2,
8
+ AuditParams as AuditParams_V_2_8_2,
9
+ ModifyWorkflowPositions as ModifyWorkflowPositions_V_2_8_2
10
+ )
11
+
12
+ from ....util.check_matching_version import check_matching_version
13
+
14
+
15
+ def stop_job_instructions_action(
16
+ *,
17
+ context: Context,
18
+ controller_id: str,
19
+ workflow_path: str,
20
+ labels: List[str],
21
+ audit_log: Optional[AuditLog]
22
+ ) -> bool:
23
+
24
+ if check_matching_version(min="2.6.5", max="2.8.3", check=context.version):
25
+ request_data = _build_v_2_8_2_request(
26
+ controller_id=controller_id,
27
+ workflow_path=workflow_path,
28
+ labels=labels,
29
+ audit_log=audit_log
30
+ )
31
+ else:
32
+ raise RuntimeError(f"Version {context.version} is not compatible with building the request.")
33
+
34
+ # Calls the dispatcher for the matching JOC version
35
+ result = context.joc_api.dispatch(endpoint_id="workflow/stop", call=EndpointCall(
36
+ http_service=context.http_service,
37
+ access_token=context.auth_provider.login(),
38
+ payload=request_data,
39
+ options=None,
40
+ ))
41
+
42
+ if isinstance(result, OK_V_2_8_2):
43
+ return bool(result.ok)
44
+
45
+ raise RuntimeError(f"Unexpected response type: {type(result).__name__}")
46
+
47
+ #---------------------#
48
+ # Build 2.8.2 request #
49
+ #---------------------#
50
+ def _build_v_2_8_2_request(
51
+ *,
52
+ controller_id: str,
53
+ workflow_path: str,
54
+ labels: List[str],
55
+ audit_log: Optional[AuditLog]
56
+ ) -> ModifyWorkflowPositions_V_2_8_2:
57
+
58
+ # Validate: controller_id
59
+ if not controller_id:
60
+ raise ValueError("'controller_id' is required")
61
+
62
+ # Validate: workflow_path
63
+ if not workflow_path:
64
+ raise ValueError("'workflow_path' is required")
65
+
66
+ # Validate: labels
67
+ if not labels:
68
+ raise ValueError("At least one label in 'labels' is required.")
69
+
70
+ # Build: audit_log
71
+ res_audit_log = AuditParams_V_2_8_2(
72
+ ticket_link=audit_log.ticket_link,
73
+ comment=audit_log.comment,
74
+ time_spent=audit_log.time_spent
75
+ ) if audit_log else None
76
+
77
+ # Result
78
+ return ModifyWorkflowPositions_V_2_8_2(
79
+ controller_id=controller_id,
80
+ workflow_paths=[workflow_path],
81
+ positions=[label for label in labels], # Type checker trick.
82
+ audit_log=res_audit_log
83
+ )
@@ -0,0 +1,76 @@
1
+ from typing import List, Optional
2
+
3
+ from ...context import Context
4
+ from ....model.public.client.common.audit_log import AuditLog
5
+ from ....model.private.api.endpoint import EndpointCall
6
+ from ....model.private.http.joc.joc_v_2_8_2 import (
7
+ OK as OK_V_2_8_2,
8
+ AuditParams as AuditParams_V_2_8_2,
9
+ ModifyWorkflows as ModifyWorkflows_V_2_8_2
10
+ )
11
+
12
+ from ....util.check_matching_version import check_matching_version
13
+
14
+
15
+ def suspend_workflows_action(
16
+ *,
17
+ context: Context,
18
+ controller_id: str,
19
+ workflow_paths: List[str],
20
+ audit_log: Optional[AuditLog]
21
+ ) -> bool:
22
+
23
+ if check_matching_version(min="2.6.5", max="2.8.3", check=context.version):
24
+ request_data = _build_v_2_8_2_request(
25
+ controller_id=controller_id,
26
+ workflow_paths=workflow_paths,
27
+ audit_log=audit_log
28
+ )
29
+ else:
30
+ raise RuntimeError(f"Version {context.version} is not compatible with building the request.")
31
+
32
+ # Calls the dispatcher for the matching JOC version
33
+ result = context.joc_api.dispatch(endpoint_id="workflows/suspend", call=EndpointCall(
34
+ http_service=context.http_service,
35
+ access_token=context.auth_provider.login(),
36
+ payload=request_data,
37
+ options=None,
38
+ ))
39
+
40
+ if isinstance(result, OK_V_2_8_2):
41
+ return bool(result.ok)
42
+
43
+ raise RuntimeError(f"Unexpected response type: {type(result).__name__}")
44
+
45
+ #---------------------#
46
+ # Build 2.8.2 request #
47
+ #---------------------#
48
+ def _build_v_2_8_2_request(
49
+ *,
50
+ controller_id: str,
51
+ workflow_paths: List[str],
52
+ audit_log: Optional[AuditLog]
53
+ ) -> ModifyWorkflows_V_2_8_2:
54
+
55
+ # Validate: controller_id
56
+ if not controller_id:
57
+ raise ValueError("'controller_id' is required")
58
+
59
+ # Validate: workflow_paths
60
+ if not workflow_paths:
61
+ raise ValueError("At least one workflow path in 'workflow_paths' is required.")
62
+
63
+ # Build: audit_log
64
+ res_audit_log = AuditParams_V_2_8_2(
65
+ ticket_link=audit_log.ticket_link,
66
+ comment=audit_log.comment,
67
+ time_spent=audit_log.time_spent
68
+ ) if audit_log else None
69
+
70
+ # Result
71
+ return ModifyWorkflows_V_2_8_2(
72
+ controller_id=controller_id,
73
+ workflow_paths=workflow_paths,
74
+ all=False,
75
+ audit_log=res_audit_log
76
+ )
@@ -0,0 +1,83 @@
1
+ from typing import List, Optional
2
+
3
+ from ...context import Context
4
+ from ....model.public.client.common.audit_log import AuditLog
5
+ from ....model.private.api.endpoint import EndpointCall
6
+ from ....model.private.http.joc.joc_v_2_8_2 import (
7
+ OK as OK_V_2_8_2,
8
+ AuditParams as AuditParams_V_2_8_2,
9
+ ModifyWorkflowLabels as ModifyWorkflowLabels_V_2_8_2
10
+ )
11
+
12
+ from ....util.check_matching_version import check_matching_version
13
+
14
+
15
+ def unskip_job_instructions_action(
16
+ *,
17
+ context: Context,
18
+ controller_id: str,
19
+ workflow_path: str,
20
+ labels: List[str],
21
+ audit_log: Optional[AuditLog]
22
+ ) -> bool:
23
+
24
+ if check_matching_version(min="2.6.5", max="2.8.3", check=context.version):
25
+ request_data = _build_v_2_8_2_request(
26
+ controller_id=controller_id,
27
+ workflow_path=workflow_path,
28
+ labels=labels,
29
+ audit_log=audit_log
30
+ )
31
+ else:
32
+ raise RuntimeError(f"Version {context.version} is not compatible with building the request.")
33
+
34
+ # Calls the dispatcher for the matching JOC version
35
+ result = context.joc_api.dispatch(endpoint_id="workflow/unskip", call=EndpointCall(
36
+ http_service=context.http_service,
37
+ access_token=context.auth_provider.login(),
38
+ payload=request_data,
39
+ options=None,
40
+ ))
41
+
42
+ if isinstance(result, OK_V_2_8_2):
43
+ return bool(result.ok)
44
+
45
+ raise RuntimeError(f"Unexpected response type: {type(result).__name__}")
46
+
47
+ #---------------------#
48
+ # Build 2.8.2 request #
49
+ #---------------------#
50
+ def _build_v_2_8_2_request(
51
+ *,
52
+ controller_id: str,
53
+ workflow_path: str,
54
+ labels: List[str],
55
+ audit_log: Optional[AuditLog]
56
+ ) -> ModifyWorkflowLabels_V_2_8_2:
57
+
58
+ # Validate: controller_id
59
+ if not controller_id:
60
+ raise ValueError("'controller_id' is required.")
61
+
62
+ # Validate: workflow_path
63
+ if not workflow_path:
64
+ raise ValueError("'workflow_path' is required.")
65
+
66
+ # Validate: labels
67
+ if not labels:
68
+ raise ValueError("At least one label in 'labels' is required.")
69
+
70
+ # Build: audit_log
71
+ res_audit_log = AuditParams_V_2_8_2(
72
+ ticket_link=audit_log.ticket_link,
73
+ comment=audit_log.comment,
74
+ time_spent=audit_log.time_spent
75
+ ) if audit_log else None
76
+
77
+ # Result
78
+ return ModifyWorkflowLabels_V_2_8_2(
79
+ controller_id=controller_id,
80
+ workflow_path=workflow_path,
81
+ labels=labels,
82
+ audit_log=res_audit_log
83
+ )
@@ -0,0 +1,79 @@
1
+ from typing import List, Optional
2
+
3
+ from ...context import Context
4
+ from ....model.public.client.common.audit_log import AuditLog
5
+ from ....model.private.api.endpoint import EndpointCall
6
+ from ....model.private.http.joc.joc_v_2_8_2 import (
7
+ OK as OK_V_2_8_2,
8
+ AuditParams as AuditParams_V_2_8_2,
9
+ ModifyWorkflowPositions as ModifyWorkflowPositions_V_2_8_2
10
+ )
11
+
12
+ from ....util.check_matching_version import check_matching_version
13
+
14
+
15
+ def unstop_job_instructions_action(
16
+ *,
17
+ context: Context,
18
+ controller_id: str,
19
+ workflow_path: str,
20
+ labels: List[str],
21
+ audit_log: Optional[AuditLog]
22
+ ) -> bool:
23
+
24
+ if check_matching_version(min="2.6.5", max="2.8.3", check=context.version):
25
+ request_data = _build_v_2_8_2_request(
26
+ controller_id=controller_id,
27
+ workflow_path=workflow_path,
28
+ labels=labels,
29
+ audit_log=audit_log
30
+ )
31
+ else:
32
+ raise RuntimeError(f"Version {context.version} is not compatible with building the request.")
33
+
34
+ # Calls the dispatcher for the matching JOC version
35
+ result = context.joc_api.dispatch(endpoint_id="workflow/unstop", call=EndpointCall(
36
+ http_service=context.http_service,
37
+ access_token=context.auth_provider.login(),
38
+ payload=request_data,
39
+ options=None,
40
+ ))
41
+
42
+ if isinstance(result, OK_V_2_8_2):
43
+ return bool(result.ok)
44
+
45
+ raise RuntimeError(f"Unexpected response type: {type(result).__name__}")
46
+
47
+ #---------------------#
48
+ # Build 2.8.2 request #
49
+ #---------------------#
50
+ def _build_v_2_8_2_request(
51
+ *,
52
+ controller_id: str,
53
+ workflow_path: str,
54
+ labels: List[str],
55
+ audit_log: Optional[AuditLog]
56
+ ) -> ModifyWorkflowPositions_V_2_8_2:
57
+
58
+ # Validate: controller_id
59
+ if not controller_id:
60
+ raise ValueError("'controller_id' is required")
61
+
62
+ # Validate: workflow_path
63
+ if not workflow_path:
64
+ raise ValueError("'workflow_path' is required")
65
+
66
+ # Build: audit_log
67
+ res_audit_log = AuditParams_V_2_8_2(
68
+ ticket_link=audit_log.ticket_link,
69
+ comment=audit_log.comment,
70
+ time_spent=audit_log.time_spent
71
+ ) if audit_log else None
72
+
73
+ # Result
74
+ return ModifyWorkflowPositions_V_2_8_2(
75
+ controller_id=controller_id,
76
+ workflow_paths=[workflow_path],
77
+ positions=[label for label in labels], # Type checker trick.
78
+ audit_log=res_audit_log
79
+ )
@@ -0,0 +1,109 @@
1
+ import base64, time
2
+ from typing import Optional
3
+
4
+ from ...service.http_service import HTTPService
5
+ from ...model.configuration.auth_configuration import AuthConfiguration
6
+
7
+ from .login import login as login_handler
8
+ from .logout import logout as logout_handler
9
+
10
+
11
+ class AuthProvider:
12
+ def __init__(self, http_service: HTTPService, joc_version: Optional[str]):
13
+ self._http_service = http_service
14
+ self._joc_version = joc_version
15
+
16
+ self._auth_cache: Optional[AuthConfiguration] = None
17
+ self._access_token: Optional[str] = None
18
+ self._access_token_expires_at: float = 0.0
19
+
20
+ def _basic_auth_header(self, username: str, password: str) -> str:
21
+ if not username or not password:
22
+ raise ValueError("'username' or 'password' must not be empty.")
23
+
24
+ token = f"{username}:{password}"
25
+ encoded_token = base64.b64encode(token.encode("utf-8")).decode("ascii")
26
+ return f"Basic {encoded_token}"
27
+
28
+ def login(self, auth_config: Optional[AuthConfiguration] = None, force_server_login: bool = False) -> str:
29
+ """Returns the access token"""
30
+
31
+ # Checks whether the access token is still valid
32
+ if self._access_token and self._access_token_expires_at > time.time():
33
+ # Returns the cached access token if no forced server login is required
34
+ if not force_server_login:
35
+ return self._access_token
36
+
37
+ # Return stored access token if no auth was provided
38
+ if self._access_token and not auth_config:
39
+ return self._access_token
40
+
41
+ if not auth_config:
42
+ self._auth_cache = None
43
+ raise ValueError("Authentication failed.")
44
+
45
+ # Performs certificate login
46
+ if auth_config.cert_auth:
47
+ # Sets cert file paths in server handler
48
+ self._http_service.auth_certfile_path = auth_config.cert_auth.certfile_path
49
+ self._http_service.auth_keyfile_path = auth_config.cert_auth.keyfile_path
50
+
51
+ login_response = login_handler(
52
+ http_service=self._http_service,
53
+ basic_auth=None
54
+ )
55
+
56
+ self._auth_cache = auth_config
57
+ self._access_token = login_response.access_token
58
+
59
+ if login_response.session_timeout:
60
+ self._access_token_expires_at = time.time() + login_response.session_timeout / 1000
61
+ else:
62
+ self._access_token_expires_at = 0
63
+
64
+ return self._access_token
65
+
66
+ elif auth_config.basic_auth: # Performs username & password login
67
+ if not auth_config.basic_auth.username or not auth_config.basic_auth.password:
68
+ raise ValueError("'username' and 'password' are required.")
69
+
70
+ basic_auth_str = self._basic_auth_header(auth_config.basic_auth.username, auth_config.basic_auth.password)
71
+
72
+ login_response = login_handler(
73
+ http_service=self._http_service,
74
+ basic_auth=basic_auth_str
75
+ )
76
+
77
+ self._access_token = login_response.access_token
78
+
79
+ if login_response.session_timeout:
80
+ self._access_token_expires_at = time.time() + login_response.session_timeout / 1000
81
+ else:
82
+ self._access_token_expires_at = 0
83
+
84
+ return self._access_token
85
+
86
+ else:
87
+ raise RuntimeError("Authentication failed. Neither certificate nor Basic Auth parameters are available.")
88
+
89
+ def logout(self) -> bool:
90
+ try:
91
+ access_token = self.login()
92
+
93
+ if not access_token:
94
+ return False
95
+
96
+ return logout_handler(
97
+ http_service=self._http_service,
98
+ access_token=access_token,
99
+ )
100
+ except Exception:
101
+ return False
102
+ finally:
103
+ # Always clean up local state
104
+ self._http_service.close()
105
+ self._joc_version = None
106
+ self._logger = None
107
+ self._auth_cache = None
108
+ self._access_token = None
109
+ self._access_token_expires_at = 0.0
@@ -0,0 +1,34 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional
3
+
4
+
5
+ from ...api.joc.interface.interface import Interface
6
+ from ...service.http_service import HTTPService
7
+ from ...model.private.http.joc.joc_v_2_8_2 import Authentication as Authentication_V_2_8_2
8
+ from ...model.private.api.endpoint import EndpointCall
9
+
10
+
11
+ @dataclass
12
+ class LoginResponse:
13
+ access_token: str
14
+ session_timeout: Optional[int]
15
+
16
+
17
+ def login(*, http_service: HTTPService, basic_auth: Optional[str]) -> LoginResponse:
18
+ joc_in = Interface(version=None)
19
+
20
+ result = joc_in.dispatch(endpoint_id="authentication/login", call=EndpointCall(
21
+ http_service=http_service,
22
+ access_token=None,
23
+ options={ "basic_auth": basic_auth }
24
+ ))
25
+
26
+ if isinstance(result, Authentication_V_2_8_2):
27
+ if not result.access_token:
28
+ raise ValueError("Authentication response does not contain an access token.")
29
+
30
+ if all([result.access_token, result.session_timeout]):
31
+ return LoginResponse(access_token=result.access_token, session_timeout=result.session_timeout)
32
+
33
+ raise RuntimeError("Response model is unknown")
34
+
@@ -0,0 +1,22 @@
1
+ from ...model.private.api.endpoint import EndpointCall
2
+ from ...service.http_service import HTTPService
3
+ from ...model.private.http.joc.joc_v_2_8_2 import Authentication as Authentication_V_2_8_2
4
+ from ...api.joc.interface.interface import Interface
5
+
6
+
7
+ def logout(*, http_service: HTTPService, access_token: str) -> bool:
8
+ joc_in = Interface(version=None)
9
+
10
+ result = joc_in.dispatch(endpoint_id="authentication/logout", call=EndpointCall(
11
+ http_service=http_service,
12
+ access_token=access_token,
13
+ options=None
14
+ ))
15
+
16
+ if isinstance(result, Authentication_V_2_8_2):
17
+ if not result.is_authenticated:
18
+ return True
19
+ else:
20
+ return False
21
+
22
+ raise RuntimeError("Response model is unknown")