zenml-nightly 0.62.0.dev20240729__py3-none-any.whl → 0.64.0.dev20240809__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 (240) hide show
  1. README.md +2 -2
  2. RELEASE_NOTES.md +120 -0
  3. zenml/VERSION +1 -1
  4. zenml/__init__.py +0 -4
  5. zenml/actions/pipeline_run/pipeline_run_action.py +19 -17
  6. zenml/analytics/enums.py +4 -6
  7. zenml/cli/__init__.py +28 -76
  8. zenml/cli/base.py +2 -2
  9. zenml/cli/pipeline.py +54 -61
  10. zenml/cli/stack.py +6 -8
  11. zenml/cli/web_login.py +8 -0
  12. zenml/client.py +232 -103
  13. zenml/config/build_configuration.py +43 -17
  14. zenml/config/compiler.py +14 -22
  15. zenml/config/docker_settings.py +80 -57
  16. zenml/config/pipeline_run_configuration.py +3 -0
  17. zenml/config/server_config.py +3 -0
  18. zenml/config/source.py +60 -1
  19. zenml/constants.py +11 -2
  20. zenml/entrypoints/base_entrypoint_configuration.py +53 -8
  21. zenml/enums.py +4 -1
  22. zenml/environment.py +25 -9
  23. zenml/image_builders/base_image_builder.py +1 -1
  24. zenml/image_builders/build_context.py +25 -72
  25. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +13 -4
  26. zenml/integrations/azure/__init__.py +4 -0
  27. zenml/integrations/azure/flavors/__init__.py +11 -0
  28. zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +263 -0
  29. zenml/{_hub → integrations/azure/orchestrators}/__init__.py +7 -2
  30. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +544 -0
  31. zenml/integrations/azure/orchestrators/azureml_orchestrator_entrypoint_config.py +86 -0
  32. zenml/integrations/azure/step_operators/azureml_step_operator.py +3 -0
  33. zenml/integrations/databricks/flavors/databricks_orchestrator_flavor.py +20 -2
  34. zenml/integrations/databricks/orchestrators/databricks_orchestrator.py +19 -13
  35. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +7 -2
  36. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +123 -6
  37. zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +1 -1
  38. zenml/integrations/mlflow/__init__.py +1 -1
  39. zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +3 -1
  40. zenml/integrations/mlflow/flavors/mlflow_experiment_tracker_flavor.py +3 -0
  41. zenml/logger.py +13 -0
  42. zenml/models/__init__.py +26 -22
  43. zenml/models/v2/base/filter.py +32 -0
  44. zenml/models/v2/core/pipeline.py +73 -89
  45. zenml/models/v2/core/pipeline_build.py +15 -11
  46. zenml/models/v2/core/pipeline_deployment.py +72 -24
  47. zenml/models/v2/core/pipeline_run.py +65 -1
  48. zenml/models/v2/core/run_template.py +393 -0
  49. zenml/models/v2/core/server_settings.py +12 -0
  50. zenml/models/v2/core/user.py +0 -21
  51. zenml/models/v2/misc/server_models.py +7 -1
  52. zenml/models/v2/misc/stack_deployment.py +5 -0
  53. zenml/models/v2/misc/user_auth.py +0 -7
  54. zenml/new/pipelines/build_utils.py +220 -89
  55. zenml/new/pipelines/code_archive.py +157 -0
  56. zenml/new/pipelines/pipeline.py +46 -78
  57. zenml/new/pipelines/run_utils.py +79 -1
  58. zenml/post_execution/pipeline.py +1 -4
  59. zenml/service_connectors/service_connector_utils.py +18 -2
  60. zenml/stack_deployments/aws_stack_deployment.py +32 -8
  61. zenml/stack_deployments/azure_stack_deployment.py +122 -10
  62. zenml/stack_deployments/gcp_stack_deployment.py +36 -7
  63. zenml/stack_deployments/stack_deployment.py +23 -7
  64. zenml/steps/base_step.py +3 -0
  65. zenml/steps/utils.py +0 -4
  66. zenml/utils/archivable.py +149 -0
  67. zenml/utils/code_utils.py +244 -0
  68. zenml/utils/notebook_utils.py +122 -0
  69. zenml/utils/package_utils.py +39 -0
  70. zenml/utils/pipeline_docker_image_builder.py +3 -96
  71. zenml/utils/source_utils.py +109 -1
  72. zenml/zen_server/dashboard/assets/{404-B_YdvmwS.js → 404-CRAA_Lew.js} +1 -1
  73. zenml/zen_server/dashboard/assets/@radix-BXWm7HOa.js +85 -0
  74. zenml/zen_server/dashboard/assets/{@react-router-CO-OsFwI.js → @react-router-l3lMcXA2.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{@reactflow-l_1hUr1S.js → @reactflow-CeVxyqYT.js} +2 -2
  76. zenml/zen_server/dashboard/assets/{@tanstack-DYiOyJUL.js → @tanstack-FmcYZMuX.js} +4 -4
  77. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-ErO9aOgK.js +1 -0
  78. zenml/zen_server/dashboard/assets/{AwarenessChannel-CFg5iX4Z.js → AwarenessChannel-CLXo5rKM.js} +1 -1
  79. zenml/zen_server/dashboard/assets/{CodeSnippet-Dvkx_82E.js → CodeSnippet-D0VLxT2A.js} +2 -2
  80. zenml/zen_server/dashboard/assets/CollapsibleCard-BaUPiVg0.js +1 -0
  81. zenml/zen_server/dashboard/assets/{Commands-DoN1xrEq.js → Commands-JrcZK-3j.js} +1 -1
  82. zenml/zen_server/dashboard/assets/CopyButton-Dbo52T1K.js +2 -0
  83. zenml/zen_server/dashboard/assets/{CsvVizualization-Ck-nZ43m.js → CsvVizualization-D3kAypDj.js} +3 -3
  84. zenml/zen_server/dashboard/assets/DisplayDate-DizbSeT-.js +1 -0
  85. zenml/zen_server/dashboard/assets/EditSecretDialog-Bd7mFLS4.js +1 -0
  86. zenml/zen_server/dashboard/assets/{EmptyState-BMLnFVlB.js → EmptyState-BHblM39I.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{Error-kLtljEOM.js → Error-C6LeJSER.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{ExecutionStatus-DguLLgTK.js → ExecutionStatus-jH4OrWBq.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{Helpbox-BXUMP21n.js → Helpbox-aAB2XP-z.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{Infobox-DSt0O-dm.js → Infobox-BQ0aty32.js} +1 -1
  91. zenml/zen_server/dashboard/assets/{InlineAvatar-xsrsIGE-.js → InlineAvatar-DpTLgM3Q.js} +1 -1
  92. zenml/zen_server/dashboard/assets/Lock-CNyJvf2r.js +1 -0
  93. zenml/zen_server/dashboard/assets/{MarkdownVisualization-xp3hhULl.js → MarkdownVisualization-Bajxn0HY.js} +1 -1
  94. zenml/zen_server/dashboard/assets/NumberBox-BmKE0qnO.js +1 -0
  95. zenml/zen_server/dashboard/assets/{PasswordChecker-DUveqlva.js → PasswordChecker-yGGoJSB-.js} +1 -1
  96. zenml/zen_server/dashboard/assets/ProviderRadio-BBqkIuTd.js +1 -0
  97. zenml/zen_server/dashboard/assets/RadioItem-xLhXoiFV.js +1 -0
  98. zenml/zen_server/dashboard/assets/SearchField-C9R0mdaX.js +1 -0
  99. zenml/zen_server/dashboard/assets/{SetPassword-BXGTWiwj.js → SetPassword-52sNxNiO.js} +1 -1
  100. zenml/zen_server/dashboard/assets/{SuccessStep-DZC60t0x.js → SuccessStep-DlkItqYG.js} +1 -1
  101. zenml/zen_server/dashboard/assets/Tick-uxv80Q6a.js +1 -0
  102. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DGvwFWO1.js → UpdatePasswordSchemas-oN4G3sKz.js} +1 -1
  103. zenml/zen_server/dashboard/assets/{aws-BgKTfTfx.js → aws-0_3UsPif.js} +1 -1
  104. zenml/zen_server/dashboard/assets/{check-circle-i56092KI.js → check-circle-1_I207rW.js} +1 -1
  105. zenml/zen_server/dashboard/assets/chevron-down-BpaF8JqM.js +1 -0
  106. zenml/zen_server/dashboard/assets/{chevron-right-double-CZBOf6JM.js → chevron-right-double-Dk8e2L99.js} +1 -1
  107. zenml/zen_server/dashboard/assets/{cloud-only-C_yFCAkP.js → cloud-only-BkUuI0lZ.js} +1 -1
  108. zenml/zen_server/dashboard/assets/components-Br2ezRib.js +1 -0
  109. zenml/zen_server/dashboard/assets/{copy-BXNk6BjL.js → copy-f3XGPPxt.js} +1 -1
  110. zenml/zen_server/dashboard/assets/{database-1xWSgZfO.js → database-cXYNX9tt.js} +1 -1
  111. zenml/zen_server/dashboard/assets/{docker-CQMVm_4d.js → docker-8uj__HHK.js} +1 -1
  112. zenml/zen_server/dashboard/assets/dots-horizontal-sKQlWEni.js +1 -0
  113. zenml/zen_server/dashboard/assets/edit-C0MVvPD2.js +1 -0
  114. zenml/zen_server/dashboard/assets/{file-text-CqD_iu6l.js → file-text-B9JibxTs.js} +1 -1
  115. zenml/zen_server/dashboard/assets/{help-bu_DgLKI.js → help-FuHlZwn0.js} +1 -1
  116. zenml/zen_server/dashboard/assets/{index-rK_Wuy2W.js → index-Bd1xgUQG.js} +1 -1
  117. zenml/zen_server/dashboard/assets/index-DaGknux4.css +1 -0
  118. zenml/zen_server/dashboard/assets/{index-BczVOqUf.js → index-DhIZtpxB.js} +5 -5
  119. zenml/zen_server/dashboard/assets/index.esm-DT4uyn2i.js +1 -0
  120. zenml/zen_server/dashboard/assets/layout-D6oiSbfd.js +1 -0
  121. zenml/zen_server/dashboard/assets/{login-mutation-CrHrndTI.js → login-mutation-13A_JSVA.js} +1 -1
  122. zenml/zen_server/dashboard/assets/{logs-D8k8BVFf.js → logs-CgeE2vZP.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{not-found-DYa4pC-C.js → not-found-B0Mmb90p.js} +1 -1
  124. zenml/zen_server/dashboard/assets/package-DdkziX79.js +1 -0
  125. zenml/zen_server/dashboard/assets/page-7-v2OBm-.js +1 -0
  126. zenml/zen_server/dashboard/assets/{page-MFQyIJd3.js → page-B3ozwdD1.js} +1 -1
  127. zenml/zen_server/dashboard/assets/{page-BkuQDIf-.js → page-BGwA9B1M.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{page-1iL8aMqs.js → page-BkjAUyTA.js} +1 -1
  129. zenml/zen_server/dashboard/assets/page-BnacgBiy.js +1 -0
  130. zenml/zen_server/dashboard/assets/page-BxF_KMQ3.js +2 -0
  131. zenml/zen_server/dashboard/assets/page-C4POHC0K.js +1 -0
  132. zenml/zen_server/dashboard/assets/page-C9kudd44.js +9 -0
  133. zenml/zen_server/dashboard/assets/page-CA1j3GpJ.js +1 -0
  134. zenml/zen_server/dashboard/assets/page-CCY6yfmu.js +1 -0
  135. zenml/zen_server/dashboard/assets/page-CgTe7Bme.js +1 -0
  136. zenml/zen_server/dashboard/assets/{page-8a4UMKXZ.js → page-Cgn-6v2Y.js} +1 -1
  137. zenml/zen_server/dashboard/assets/page-CxQmQqDw.js +1 -0
  138. zenml/zen_server/dashboard/assets/page-D2Goey3H.js +1 -0
  139. zenml/zen_server/dashboard/assets/page-DLpOnf7u.js +1 -0
  140. zenml/zen_server/dashboard/assets/{page-BhgCDInH.js → page-DSTQnBk-.js} +1 -1
  141. zenml/zen_server/dashboard/assets/{page-1h_sD1jz.js → page-DTysUGOy.js} +1 -1
  142. zenml/zen_server/dashboard/assets/{page-2grKx_MY.js → page-D_EXUFJb.js} +1 -1
  143. zenml/zen_server/dashboard/assets/page-Db15QzsM.js +1 -0
  144. zenml/zen_server/dashboard/assets/{page-BDns21Iz.js → page-DugsjcQ_.js} +1 -1
  145. zenml/zen_server/dashboard/assets/{page-C6-UGEbH.js → page-OFKSPyN7.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{page-BkeAAYwp.js → page-RnG-qhv9.js} +1 -1
  147. zenml/zen_server/dashboard/assets/{page-CCNRIt_f.js → page-T2BtjwPl.js} +1 -1
  148. zenml/zen_server/dashboard/assets/page-TXe1Eo3Z.js +1 -0
  149. zenml/zen_server/dashboard/assets/{page-BnaevhnB.js → page-YiF_fNbe.js} +1 -1
  150. zenml/zen_server/dashboard/assets/{page-uA5prJGY.js → page-hQaiQXfg.js} +1 -1
  151. zenml/zen_server/dashboard/assets/persist-3-5nOJ6m.js +1 -0
  152. zenml/zen_server/dashboard/assets/{play-circle-CNtZKDnW.js → play-circle-XSkLR12B.js} +1 -1
  153. zenml/zen_server/dashboard/assets/plus-FB9-lEq_.js +1 -0
  154. zenml/zen_server/dashboard/assets/refresh-COb6KYDi.js +1 -0
  155. zenml/zen_server/dashboard/assets/sharedSchema-BoYx_B_L.js +14 -0
  156. zenml/zen_server/dashboard/assets/{stack-detail-query-Cficsl6d.js → stack-detail-query-B-US_-wa.js} +1 -1
  157. zenml/zen_server/dashboard/assets/{terminal-By9cErXc.js → terminal-grtjrIEJ.js} +1 -1
  158. zenml/zen_server/dashboard/assets/trash-Cd5CSFqA.js +1 -0
  159. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-7d8xi1tS.js → update-server-settings-mutation-B8GB_ubU.js} +1 -1
  160. zenml/zen_server/dashboard/assets/{url-D7mAQGUM.js → url-hcMJkz8p.js} +1 -1
  161. zenml/zen_server/dashboard/assets/{zod-BhoGpZ63.js → zod-CnykDKJj.js} +1 -1
  162. zenml/zen_server/dashboard/index.html +7 -7
  163. zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
  164. zenml/zen_server/dashboard_legacy/index.html +1 -1
  165. zenml/zen_server/dashboard_legacy/{precache-manifest.12246c7548e71e2c4438e496360de80c.js → precache-manifest.9c473c96a43298343a7ce1256183123b.js} +4 -4
  166. zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
  167. zenml/zen_server/dashboard_legacy/static/js/{main.3b27024b.chunk.js → main.463c90b9.chunk.js} +2 -2
  168. zenml/zen_server/dashboard_legacy/static/js/{main.3b27024b.chunk.js.map → main.463c90b9.chunk.js.map} +1 -1
  169. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  170. zenml/zen_server/deploy/helm/README.md +2 -2
  171. zenml/zen_server/rbac/models.py +1 -0
  172. zenml/zen_server/rbac/utils.py +4 -0
  173. zenml/zen_server/routers/pipeline_builds_endpoints.py +2 -66
  174. zenml/zen_server/routers/pipeline_deployments_endpoints.py +2 -53
  175. zenml/zen_server/routers/pipelines_endpoints.py +1 -74
  176. zenml/zen_server/routers/run_templates_endpoints.py +212 -0
  177. zenml/zen_server/routers/stack_deployment_endpoints.py +6 -0
  178. zenml/zen_server/routers/users_endpoints.py +0 -7
  179. zenml/zen_server/routers/workspaces_endpoints.py +79 -0
  180. zenml/zen_server/{pipeline_deployment → template_execution}/runner_entrypoint_configuration.py +1 -8
  181. zenml/zen_server/{pipeline_deployment → template_execution}/utils.py +214 -92
  182. zenml/zen_server/utils.py +77 -2
  183. zenml/zen_server/zen_server_api.py +54 -2
  184. zenml/zen_stores/base_zen_store.py +7 -1
  185. zenml/zen_stores/migrations/versions/0.63.0_release.py +23 -0
  186. zenml/zen_stores/migrations/versions/0.64.0_release.py +23 -0
  187. zenml/zen_stores/migrations/versions/026d4577b6a0_add_code_path.py +39 -0
  188. zenml/zen_stores/migrations/versions/3dcc5d20e82f_add_last_user_activity.py +51 -0
  189. zenml/zen_stores/migrations/versions/7d1919bb1ef0_add_run_templates.py +100 -0
  190. zenml/zen_stores/migrations/versions/909550c7c4da_remove_user_hub_token.py +36 -0
  191. zenml/zen_stores/migrations/versions/b59aa68fdb1f_simplify_pipelines.py +139 -0
  192. zenml/zen_stores/rest_zen_store.py +112 -39
  193. zenml/zen_stores/schemas/__init__.py +2 -0
  194. zenml/zen_stores/schemas/pipeline_build_schemas.py +3 -3
  195. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +32 -2
  196. zenml/zen_stores/schemas/pipeline_run_schemas.py +29 -3
  197. zenml/zen_stores/schemas/pipeline_schemas.py +29 -30
  198. zenml/zen_stores/schemas/run_template_schemas.py +264 -0
  199. zenml/zen_stores/schemas/server_settings_schemas.py +2 -0
  200. zenml/zen_stores/schemas/step_run_schemas.py +11 -4
  201. zenml/zen_stores/schemas/user_schemas.py +0 -2
  202. zenml/zen_stores/sql_zen_store.py +389 -151
  203. zenml/zen_stores/template_utils.py +261 -0
  204. zenml/zen_stores/zen_store_interface.py +93 -20
  205. {zenml_nightly-0.62.0.dev20240729.dist-info → zenml_nightly-0.64.0.dev20240809.dist-info}/METADATA +3 -3
  206. {zenml_nightly-0.62.0.dev20240729.dist-info → zenml_nightly-0.64.0.dev20240809.dist-info}/RECORD +211 -184
  207. zenml/_hub/client.py +0 -289
  208. zenml/_hub/constants.py +0 -21
  209. zenml/_hub/utils.py +0 -79
  210. zenml/cli/hub.py +0 -1116
  211. zenml/models/v2/core/pipeline_namespace.py +0 -113
  212. zenml/models/v2/misc/hub_plugin_models.py +0 -79
  213. zenml/new/pipelines/deserialization_utils.py +0 -292
  214. zenml/zen_server/dashboard/assets/@radix-CFOkMR_E.js +0 -85
  215. zenml/zen_server/dashboard/assets/CollapsibleCard-opiuBHHc.js +0 -1
  216. zenml/zen_server/dashboard/assets/CopyButton-Cr7xYEPb.js +0 -2
  217. zenml/zen_server/dashboard/assets/DisplayDate-DYgIjlDF.js +0 -1
  218. zenml/zen_server/dashboard/assets/Pagination-C6X-mifw.js +0 -1
  219. zenml/zen_server/dashboard/assets/index-EpMIKgrI.css +0 -1
  220. zenml/zen_server/dashboard/assets/index.esm-Corw4lXQ.js +0 -1
  221. zenml/zen_server/dashboard/assets/package-B3fWP-Dh.js +0 -1
  222. zenml/zen_server/dashboard/assets/page-5NCOHOsy.js +0 -1
  223. zenml/zen_server/dashboard/assets/page-B6h3iaHJ.js +0 -1
  224. zenml/zen_server/dashboard/assets/page-Bi-wtWiO.js +0 -5
  225. zenml/zen_server/dashboard/assets/page-Bq0YxkLV.js +0 -1
  226. zenml/zen_server/dashboard/assets/page-Bs2F4eoD.js +0 -2
  227. zenml/zen_server/dashboard/assets/page-CHNxpz3n.js +0 -1
  228. zenml/zen_server/dashboard/assets/page-DgorQFqi.js +0 -1
  229. zenml/zen_server/dashboard/assets/page-K8ebxVIs.js +0 -1
  230. zenml/zen_server/dashboard/assets/page-TgCF0P_U.js +0 -1
  231. zenml/zen_server/dashboard/assets/page-ZnCEe-eK.js +0 -9
  232. zenml/zen_server/dashboard/assets/persist-D7HJNBWx.js +0 -1
  233. zenml/zen_server/dashboard/assets/plus-C8WOyCzt.js +0 -1
  234. zenml/zen_server/dashboard/assets/secrets-video-OBJ6irhH.svg +0 -21
  235. zenml/zen_server/dashboard/assets/stacks-video-7gfxpAq4.svg +0 -21
  236. /zenml/zen_server/{pipeline_deployment → template_execution}/__init__.py +0 -0
  237. /zenml/zen_server/{pipeline_deployment → template_execution}/workload_manager_interface.py +0 -0
  238. {zenml_nightly-0.62.0.dev20240729.dist-info → zenml_nightly-0.64.0.dev20240809.dist-info}/LICENSE +0 -0
  239. {zenml_nightly-0.62.0.dev20240729.dist-info → zenml_nightly-0.64.0.dev20240809.dist-info}/WHEEL +0 -0
  240. {zenml_nightly-0.62.0.dev20240729.dist-info → zenml_nightly-0.64.0.dev20240809.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,264 @@
1
+ # Copyright (c) ZenML GmbH 2024. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at:
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12
+ # or implied. See the License for the specific language governing
13
+ # permissions and limitations under the License.
14
+ """SQLModel implementation of run template tables."""
15
+
16
+ from datetime import datetime
17
+ from typing import TYPE_CHECKING, Any, List, Optional
18
+ from uuid import UUID
19
+
20
+ from sqlalchemy import Column, String, UniqueConstraint
21
+ from sqlalchemy.dialects.mysql import MEDIUMTEXT
22
+ from sqlmodel import Field, Relationship
23
+
24
+ from zenml.constants import MEDIUMTEXT_MAX_LENGTH
25
+ from zenml.enums import TaggableResourceTypes
26
+ from zenml.models import (
27
+ RunTemplateRequest,
28
+ RunTemplateResponse,
29
+ RunTemplateResponseBody,
30
+ RunTemplateResponseMetadata,
31
+ RunTemplateResponseResources,
32
+ RunTemplateUpdate,
33
+ )
34
+ from zenml.zen_stores.schemas.base_schemas import BaseSchema
35
+ from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
36
+ from zenml.zen_stores.schemas.user_schemas import UserSchema
37
+ from zenml.zen_stores.schemas.workspace_schemas import WorkspaceSchema
38
+
39
+ if TYPE_CHECKING:
40
+ from zenml.zen_stores.schemas.pipeline_deployment_schemas import (
41
+ PipelineDeploymentSchema,
42
+ )
43
+ from zenml.zen_stores.schemas.pipeline_run_schemas import PipelineRunSchema
44
+ from zenml.zen_stores.schemas.tag_schemas import TagResourceSchema
45
+
46
+
47
+ class RunTemplateSchema(BaseSchema, table=True):
48
+ """SQL Model for run templates."""
49
+
50
+ __tablename__ = "run_template"
51
+ __table_args__ = (
52
+ UniqueConstraint(
53
+ "name",
54
+ "workspace_id",
55
+ name="unique_template_name_in_workspace",
56
+ ),
57
+ )
58
+
59
+ name: str = Field(nullable=False)
60
+ description: Optional[str] = Field(
61
+ sa_column=Column(
62
+ String(length=MEDIUMTEXT_MAX_LENGTH).with_variant(
63
+ MEDIUMTEXT, "mysql"
64
+ ),
65
+ nullable=True,
66
+ )
67
+ )
68
+
69
+ user_id: Optional[UUID] = build_foreign_key_field(
70
+ source=__tablename__,
71
+ target=UserSchema.__tablename__,
72
+ source_column="user_id",
73
+ target_column="id",
74
+ ondelete="SET NULL",
75
+ nullable=True,
76
+ )
77
+ workspace_id: UUID = build_foreign_key_field(
78
+ source=__tablename__,
79
+ target=WorkspaceSchema.__tablename__,
80
+ source_column="workspace_id",
81
+ target_column="id",
82
+ ondelete="CASCADE",
83
+ nullable=False,
84
+ )
85
+ source_deployment_id: Optional[UUID] = build_foreign_key_field(
86
+ source=__tablename__,
87
+ target="pipeline_deployment",
88
+ source_column="source_deployment_id",
89
+ target_column="id",
90
+ ondelete="SET NULL",
91
+ nullable=True,
92
+ )
93
+
94
+ user: Optional["UserSchema"] = Relationship()
95
+ workspace: "WorkspaceSchema" = Relationship()
96
+ source_deployment: Optional["PipelineDeploymentSchema"] = Relationship(
97
+ sa_relationship_kwargs={
98
+ "foreign_keys": "RunTemplateSchema.source_deployment_id",
99
+ }
100
+ )
101
+
102
+ runs: List["PipelineRunSchema"] = Relationship(
103
+ sa_relationship_kwargs={
104
+ "primaryjoin": "RunTemplateSchema.id==PipelineDeploymentSchema.template_id",
105
+ "secondaryjoin": "PipelineDeploymentSchema.id==PipelineRunSchema.deployment_id",
106
+ "secondary": "pipeline_deployment",
107
+ "cascade": "delete",
108
+ "viewonly": True,
109
+ "order_by": "PipelineRunSchema.created",
110
+ }
111
+ )
112
+
113
+ tags: List["TagResourceSchema"] = Relationship(
114
+ sa_relationship_kwargs=dict(
115
+ primaryjoin=f"and_(TagResourceSchema.resource_type=='{TaggableResourceTypes.RUN_TEMPLATE.value}', foreign(TagResourceSchema.resource_id)==RunTemplateSchema.id)",
116
+ cascade="delete",
117
+ overlaps="tags",
118
+ ),
119
+ )
120
+
121
+ @classmethod
122
+ def from_request(
123
+ cls,
124
+ request: RunTemplateRequest,
125
+ ) -> "RunTemplateSchema":
126
+ """Create a schema from a request.
127
+
128
+ Args:
129
+ request: The request to convert.
130
+
131
+
132
+ Returns:
133
+ The created schema.
134
+ """
135
+ return cls(
136
+ user_id=request.user,
137
+ workspace_id=request.workspace,
138
+ name=request.name,
139
+ description=request.description,
140
+ source_deployment_id=request.source_deployment_id,
141
+ )
142
+
143
+ def update(self, update: RunTemplateUpdate) -> "RunTemplateSchema":
144
+ """Update the schema.
145
+
146
+ Args:
147
+ update: The update model.
148
+
149
+ Returns:
150
+ The updated schema.
151
+ """
152
+ for field, value in update.model_dump(
153
+ exclude_unset=True, exclude_none=True
154
+ ).items():
155
+ setattr(self, field, value)
156
+
157
+ self.updated = datetime.utcnow()
158
+ return self
159
+
160
+ def to_model(
161
+ self,
162
+ include_metadata: bool = False,
163
+ include_resources: bool = False,
164
+ **kwargs: Any,
165
+ ) -> RunTemplateResponse:
166
+ """Convert the schema to a response model.
167
+
168
+ Args:
169
+ include_metadata: Whether the metadata will be filled.
170
+ include_resources: Whether the resources will be filled.
171
+ **kwargs: Keyword arguments to allow schema specific logic
172
+
173
+ Returns:
174
+ Model representing this schema.
175
+ """
176
+ runnable = False
177
+ if (
178
+ self.source_deployment
179
+ and self.source_deployment.build
180
+ and self.source_deployment.build.stack
181
+ ):
182
+ runnable = True
183
+
184
+ body = RunTemplateResponseBody(
185
+ user=self.user.to_model() if self.user else None,
186
+ created=self.created,
187
+ updated=self.updated,
188
+ runnable=runnable,
189
+ latest_run_id=self.runs[-1].id if self.runs else None,
190
+ latest_run_status=self.runs[-1].status if self.runs else None,
191
+ )
192
+
193
+ metadata = None
194
+ if include_metadata:
195
+ pipeline_spec = None
196
+ config_template = None
197
+ config_schema = None
198
+
199
+ if self.source_deployment:
200
+ from zenml.zen_stores import template_utils
201
+
202
+ pipeline_spec = self.source_deployment.to_model(
203
+ include_metadata=True, include_resources=True
204
+ ).pipeline_spec
205
+
206
+ if (
207
+ self.source_deployment.build
208
+ and self.source_deployment.build.stack
209
+ ):
210
+ config_template = template_utils.generate_config_template(
211
+ deployment=self.source_deployment
212
+ )
213
+ config_schema = template_utils.generate_config_schema(
214
+ deployment=self.source_deployment
215
+ )
216
+
217
+ metadata = RunTemplateResponseMetadata(
218
+ workspace=self.workspace.to_model(),
219
+ description=self.description,
220
+ pipeline_spec=pipeline_spec,
221
+ config_template=config_template,
222
+ config_schema=config_schema,
223
+ )
224
+
225
+ resources = None
226
+ if include_resources:
227
+ if self.source_deployment:
228
+ pipeline = (
229
+ self.source_deployment.pipeline.to_model()
230
+ if self.source_deployment.pipeline
231
+ else None
232
+ )
233
+ build = (
234
+ self.source_deployment.build.to_model()
235
+ if self.source_deployment.build
236
+ else None
237
+ )
238
+ code_reference = (
239
+ self.source_deployment.code_reference.to_model()
240
+ if self.source_deployment.code_reference
241
+ else None
242
+ )
243
+ else:
244
+ pipeline = None
245
+ build = None
246
+ code_reference = None
247
+
248
+ resources = RunTemplateResponseResources(
249
+ source_deployment=self.source_deployment.to_model()
250
+ if self.source_deployment
251
+ else None,
252
+ pipeline=pipeline,
253
+ build=build,
254
+ code_reference=code_reference,
255
+ tags=[t.tag.to_model() for t in self.tags],
256
+ )
257
+
258
+ return RunTemplateResponse(
259
+ id=self.id,
260
+ name=self.name,
261
+ body=body,
262
+ metadata=metadata,
263
+ resources=resources,
264
+ )
@@ -42,6 +42,7 @@ class ServerSettingsSchema(SQLModel, table=True):
42
42
  display_announcements: Optional[bool] = Field(nullable=True)
43
43
  display_updates: Optional[bool] = Field(nullable=True)
44
44
  onboarding_state: Optional[str] = Field(nullable=True)
45
+ last_user_activity: datetime = Field(default_factory=datetime.utcnow)
45
46
  updated: datetime = Field(default_factory=datetime.utcnow)
46
47
 
47
48
  def update(
@@ -111,6 +112,7 @@ class ServerSettingsSchema(SQLModel, table=True):
111
112
  display_updates=self.display_updates,
112
113
  active=self.active,
113
114
  updated=self.updated,
115
+ last_user_activity=self.last_user_activity,
114
116
  )
115
117
 
116
118
  metadata = None
@@ -274,11 +274,18 @@ class StepRunSchema(NamedSchema, table=True):
274
274
  if include_resources:
275
275
  model_version = None
276
276
  if full_step_config.config.model:
277
- model_version = (
278
- full_step_config.config.model._get_model_version(
279
- hydrate=False
277
+ # TODO: Why is there no ID check similar to
278
+ # PipelineRunSchema.to_model()?
279
+ try:
280
+ model_version = (
281
+ full_step_config.config.model._get_model_version(
282
+ hydrate=False
283
+ )
280
284
  )
281
- )
285
+ except KeyError:
286
+ # Unable to find the model version, it was probably deleted
287
+ pass
288
+
282
289
  resources = StepRunResponseResources(model_version=model_version)
283
290
 
284
291
  return StepRunResponse(
@@ -77,7 +77,6 @@ class UserSchema(NamedSchema, table=True):
77
77
  active: bool
78
78
  password: Optional[str] = Field(nullable=True)
79
79
  activation_token: Optional[str] = Field(nullable=True)
80
- hub_token: Optional[str] = Field(nullable=True)
81
80
  email_opted_in: Optional[bool] = Field(nullable=True)
82
81
  external_user_id: Optional[UUID] = Field(nullable=True)
83
82
  is_admin: bool = Field(default=False)
@@ -281,7 +280,6 @@ class UserSchema(NamedSchema, table=True):
281
280
  if include_metadata:
282
281
  metadata = UserResponseMetadata(
283
282
  email=self.email if include_private else None,
284
- hub_token=self.hub_token if include_private else None,
285
283
  external_user_id=self.external_user_id,
286
284
  user_metadata=json.loads(self.user_metadata)
287
285
  if self.user_metadata