zenml-nightly 0.82.1.dev20250527__py3-none-any.whl → 0.83.0.dev20250529__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 (316) hide show
  1. zenml/VERSION +1 -1
  2. zenml/cli/base.py +6 -1
  3. zenml/cli/model.py +16 -36
  4. zenml/cli/server.py +8 -3
  5. zenml/client.py +20 -4
  6. zenml/client_lazy_loader.py +2 -0
  7. zenml/config/docker_settings.py +15 -2
  8. zenml/enums.py +3 -0
  9. zenml/event_hub/event_hub.py +1 -1
  10. zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +1 -1
  11. zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +1 -1
  12. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +3 -0
  13. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +37 -26
  14. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +45 -4
  15. zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +92 -84
  16. zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +207 -179
  17. zenml/integrations/skypilot/utils.py +273 -0
  18. zenml/integrations/skypilot_aws/__init__.py +1 -2
  19. zenml/integrations/skypilot_azure/__init__.py +1 -2
  20. zenml/integrations/skypilot_gcp/__init__.py +9 -1
  21. zenml/integrations/skypilot_kubernetes/__init__.py +2 -3
  22. zenml/integrations/skypilot_lambda/__init__.py +1 -2
  23. zenml/login/web_login.py +1 -1
  24. zenml/model/model.py +13 -23
  25. zenml/models/__init__.py +39 -2
  26. zenml/models/v2/base/scoped.py +34 -15
  27. zenml/models/v2/core/artifact.py +10 -9
  28. zenml/models/v2/core/artifact_version.py +16 -16
  29. zenml/models/v2/core/logs.py +8 -50
  30. zenml/models/v2/core/model.py +10 -10
  31. zenml/models/v2/core/model_version.py +155 -88
  32. zenml/models/v2/core/pipeline.py +10 -11
  33. zenml/models/v2/core/pipeline_deployment.py +1 -9
  34. zenml/models/v2/core/pipeline_run.py +10 -17
  35. zenml/models/v2/core/run_template.py +10 -10
  36. zenml/models/v2/core/step_run.py +100 -16
  37. zenml/models/v2/core/tag.py +5 -4
  38. zenml/models/v2/misc/pipeline_run_dag.py +46 -0
  39. zenml/orchestrators/base_orchestrator.py +8 -19
  40. zenml/orchestrators/cache_utils.py +48 -1
  41. zenml/orchestrators/input_utils.py +35 -39
  42. zenml/orchestrators/step_launcher.py +1 -1
  43. zenml/orchestrators/step_run_utils.py +26 -10
  44. zenml/pipelines/pipeline_definition.py +3 -3
  45. zenml/pipelines/run_utils.py +2 -3
  46. zenml/service_connectors/service_connector.py +5 -1
  47. zenml/stack/stack_component.py +1 -4
  48. zenml/steps/step_context.py +1 -1
  49. zenml/utils/dashboard_utils.py +3 -3
  50. zenml/zen_server/auth.py +6 -3
  51. zenml/zen_server/dashboard/assets/{404-_AtuLtaX.js → 404-DmJUgorp.js} +1 -1
  52. zenml/zen_server/dashboard/assets/{@radix-C7hRs6Kx.js → @radix-Cdvw4jJ8.js} +1 -1
  53. zenml/zen_server/dashboard/assets/{@react-router-CNP6g_RL.js → @react-router-DeDfXbUF.js} +5 -5
  54. zenml/zen_server/dashboard/assets/{@reactflow-CQi1Z1Wq.js → @reactflow-8OCk19Fi.js} +1 -1
  55. zenml/zen_server/dashboard/assets/{@tanstack-CSxjHCME.js → @tanstack-5gTMR7G2.js} +4 -4
  56. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-CZW4QyWn.js +1 -0
  57. zenml/zen_server/dashboard/assets/ButtonGroup-DFWWFGUE.js +1 -0
  58. zenml/zen_server/dashboard/assets/{CodeSnippet-CvI6D0wx.js → CodeSnippet-D2HkkAGr.js} +1 -1
  59. zenml/zen_server/dashboard/assets/CollapsibleCard-CnS09ljw.js +1 -0
  60. zenml/zen_server/dashboard/assets/{ComponentBadge-DKw7Gndh.js → ComponentBadge-CDgdd0Ks.js} +1 -1
  61. zenml/zen_server/dashboard/assets/ComponentIcon-CbbOc7lb.js +1 -0
  62. zenml/zen_server/dashboard/assets/{DeleteAlertDialog-DVvXt-S6.js → DeleteAlertDialog-VIOMDLmx.js} +1 -1
  63. zenml/zen_server/dashboard/assets/DialogItem-ClFCqxEp.js +1 -0
  64. zenml/zen_server/dashboard/assets/{DisplayDate-CYVBBSgr.js → DisplayDate-8RESqe5H.js} +1 -1
  65. zenml/zen_server/dashboard/assets/{EmptyState-M1jafpg6.js → EmptyState-CjrgDtVk.js} +1 -1
  66. zenml/zen_server/dashboard/assets/{Error-BWaXP0VK.js → Error-CQzjbDcN.js} +1 -1
  67. zenml/zen_server/dashboard/assets/ExecutionStatus-CWreILP0.js +1 -0
  68. zenml/zen_server/dashboard/assets/{Helpbox-iE1xLmiZ.js → Helpbox-CiKxG5_X.js} +1 -1
  69. zenml/zen_server/dashboard/assets/Infobox-CGxFvqzi.js +1 -0
  70. zenml/zen_server/dashboard/assets/LeftSideMenu-DCsKdIjC.js +1 -0
  71. zenml/zen_server/dashboard/assets/{Lock-DW-0_M0o.js → Lock-CrIAdQo6.js} +1 -1
  72. zenml/zen_server/dashboard/assets/NestedCollapsible-3M4llYtH.js +1 -0
  73. zenml/zen_server/dashboard/assets/NumberBox-C0mQktmV.js +1 -0
  74. zenml/zen_server/dashboard/assets/Partials-DSjkttlz.js +1 -0
  75. zenml/zen_server/dashboard/assets/{PasswordChecker-lYTOtNom.js → PasswordChecker-B88WjuCe.js} +1 -1
  76. zenml/zen_server/dashboard/assets/ProCta-Dm5cWKpS.js +1 -0
  77. zenml/zen_server/dashboard/assets/{ProviderIcon-DLo7t1lo.js → ProviderIcon-DPwMR6nF.js} +1 -1
  78. zenml/zen_server/dashboard/assets/ProviderRadio-DEDNRgAb.js +1 -0
  79. zenml/zen_server/dashboard/assets/RunsBody-BRBn1e2O.js +1 -0
  80. zenml/zen_server/dashboard/assets/SearchField-DY6-UbRT.js +1 -0
  81. zenml/zen_server/dashboard/assets/SecretTooltip-CZTRnaCV.js +1 -0
  82. zenml/zen_server/dashboard/assets/{SetPassword-DR-EiLI5.js → SetPassword-BjNGDC5e.js} +1 -1
  83. zenml/zen_server/dashboard/assets/SheetHeader-CASpN2Lz.js +1 -0
  84. zenml/zen_server/dashboard/assets/StackComponentList-Be1pQt9m.js +1 -0
  85. zenml/zen_server/dashboard/assets/StackList-BdiR5DvR.js +1 -0
  86. zenml/zen_server/dashboard/assets/StackName-ojLC6xdl.js +1 -0
  87. zenml/zen_server/dashboard/assets/Tabs-DNSKblCM.js +1 -0
  88. zenml/zen_server/dashboard/assets/Tick-BPrWnNlN.js +1 -0
  89. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DbFEaezI.js → UpdatePasswordSchemas-CNfKDo2Q.js} +1 -1
  90. zenml/zen_server/dashboard/assets/UsageReason-Cb-mpV8M.js +1 -0
  91. zenml/zen_server/dashboard/assets/{Wizard-CMI6Ksgz.js → Wizard-Dg8Pmn5A.js} +1 -1
  92. zenml/zen_server/dashboard/assets/WizardFooter-BcNDIvlQ.js +1 -0
  93. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-BGASHYtF.js → all-pipeline-runs-query-DCdax7I5.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{arrow-left-CwgF2MEM.js → arrow-left-MRXv5pAH.js} +1 -1
  95. zenml/zen_server/dashboard/assets/bulk-delete-C_kpIB9A.js +3 -0
  96. zenml/zen_server/dashboard/assets/{check-DK77doTf.js → check-B9QMTa3f.js} +1 -1
  97. zenml/zen_server/dashboard/assets/{check-circle-mvyzYvIW.js → check-circle-C4tYvbtw.js} +1 -1
  98. zenml/zen_server/dashboard/assets/{chevron-down-A-rmltmI.js → chevron-down-jbbQh82s.js} +1 -1
  99. zenml/zen_server/dashboard/assets/{chevron-right-double-uNWbJT-C.js → chevron-right-double-Dgp_gEsp.js} +1 -1
  100. zenml/zen_server/dashboard/assets/{clock-CPA5cYxq.js → clock-B_mTG8PH.js} +1 -1
  101. zenml/zen_server/dashboard/assets/{code-browser-j2EpcxIA.js → code-browser-CiD8qkBx.js} +1 -1
  102. zenml/zen_server/dashboard/assets/configuration-form-B2hmKGnF.js +1 -0
  103. zenml/zen_server/dashboard/assets/connectivity-4UKGMYnr.webp +0 -0
  104. zenml/zen_server/dashboard/assets/constants-1EZZxtay.js +1 -0
  105. zenml/zen_server/dashboard/assets/create-stack-TKmMtrkQ.js +1 -0
  106. zenml/zen_server/dashboard/assets/dates-Buh6SMo7.js +1 -0
  107. zenml/zen_server/dashboard/assets/delete-run-CCR9md_s.js +1 -0
  108. zenml/zen_server/dashboard/assets/eye-CbVlAYty.js +1 -0
  109. zenml/zen_server/dashboard/assets/{file-text-BdxZdjP_.js → file-text-Cd8wVfq5.js} +1 -1
  110. zenml/zen_server/dashboard/assets/form-DFJkaFDX.js +1 -0
  111. zenml/zen_server/dashboard/assets/form-schemas-CrznJVzA.js +1 -0
  112. zenml/zen_server/dashboard/assets/{gcp-CHNvgEss.js → gcp-B1I3Qvcx.js} +1 -1
  113. zenml/zen_server/dashboard/assets/{help-DyMolRxD.js → help-Co6aedki.js} +1 -1
  114. zenml/zen_server/dashboard/assets/index-BFqbGSck.js +308 -0
  115. zenml/zen_server/dashboard/assets/{index-CrhdX_qG.js → index-BjUu1mP4.js} +1 -1
  116. zenml/zen_server/dashboard/assets/{index-DR30v9MZ.js → index-DWpiv-Ft.js} +1 -1
  117. zenml/zen_server/dashboard/assets/index-DuhuqTCI.css +1 -0
  118. zenml/zen_server/dashboard/assets/index-U992soPJ.js +1 -0
  119. zenml/zen_server/dashboard/assets/index.es-C1gfATPn.js +14 -0
  120. zenml/zen_server/dashboard/assets/{index.esm-D7jFlf5N.js → index.esm-DhJo3mA6.js} +1 -1
  121. zenml/zen_server/dashboard/assets/info-QkbQz4QU.js +1 -0
  122. zenml/zen_server/dashboard/assets/{key-icon-DO4DPJHZ.js → key-icon-C07HKw8z.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{layout-h3cbx8WZ.js → layout-DBbfEFBe.js} +1 -1
  124. zenml/zen_server/dashboard/assets/layout-Do9YI4QX.js +1 -0
  125. zenml/zen_server/dashboard/assets/login-mutation-D3tFP6Wm.js +1 -0
  126. zenml/zen_server/dashboard/assets/{logs-B5n0U7tB.js → logs-CQKlJjo0.js} +1 -1
  127. zenml/zen_server/dashboard/assets/{package-D1Mhqeh8.js → package-miExReQl.js} +1 -1
  128. zenml/zen_server/dashboard/assets/page-9RjCitFH.js +1 -0
  129. zenml/zen_server/dashboard/assets/page-B0PsXWiT.js +1 -0
  130. zenml/zen_server/dashboard/assets/page-BCrKmYIZ.js +1 -0
  131. zenml/zen_server/dashboard/assets/page-BcRI3-aR.js +29 -0
  132. zenml/zen_server/dashboard/assets/page-Be3R2uYn.js +1 -0
  133. zenml/zen_server/dashboard/assets/page-BgknnddT.js +1 -0
  134. zenml/zen_server/dashboard/assets/page-BrT0_zSJ.js +40 -0
  135. zenml/zen_server/dashboard/assets/page-Bs3W2FDi.js +1 -0
  136. zenml/zen_server/dashboard/assets/page-C210HcBA.js +1 -0
  137. zenml/zen_server/dashboard/assets/page-C6KaiZ_W.js +1 -0
  138. zenml/zen_server/dashboard/assets/page-CAJ8B0vb.js +1 -0
  139. zenml/zen_server/dashboard/assets/page-CAUYrfui.js +1 -0
  140. zenml/zen_server/dashboard/assets/page-CHxVhF3x.js +1 -0
  141. zenml/zen_server/dashboard/assets/{page-CSwZxZMQ.js → page-CN7lkvXr.js} +1 -1
  142. zenml/zen_server/dashboard/assets/page-CUaMMoPG.js +1 -0
  143. zenml/zen_server/dashboard/assets/page-Cal6XQ4U.js +1 -0
  144. zenml/zen_server/dashboard/assets/page-CdZCmszX.js +1 -0
  145. zenml/zen_server/dashboard/assets/page-ChGcZI_6.js +1 -0
  146. zenml/zen_server/dashboard/assets/page-CktmtZ8Z.js +1 -0
  147. zenml/zen_server/dashboard/assets/page-ClvmVesa.js +1 -0
  148. zenml/zen_server/dashboard/assets/page-CnbIYE80.js +1 -0
  149. zenml/zen_server/dashboard/assets/page-CoXzjeEY.js +1 -0
  150. zenml/zen_server/dashboard/assets/page-CtiuMP_r.js +1 -0
  151. zenml/zen_server/dashboard/assets/page-D9Hfx6GV.js +1 -0
  152. zenml/zen_server/dashboard/assets/page-D9iuB88h.js +1 -0
  153. zenml/zen_server/dashboard/assets/page-DCcuPZ8P.js +1 -0
  154. zenml/zen_server/dashboard/assets/page-DEohTSz6.js +1 -0
  155. zenml/zen_server/dashboard/assets/page-DJIGaUQ9.js +1 -0
  156. zenml/zen_server/dashboard/assets/page-DKK6ulgy.js +1 -0
  157. zenml/zen_server/dashboard/assets/page-DNjKHjnH.js +1 -0
  158. zenml/zen_server/dashboard/assets/page-DUK0Nd_1.js +1 -0
  159. zenml/zen_server/dashboard/assets/page-DUKbOhaD.js +1 -0
  160. zenml/zen_server/dashboard/assets/page-DYOucPtA.js +1 -0
  161. zenml/zen_server/dashboard/assets/page-DpqRelAy.js +1 -0
  162. zenml/zen_server/dashboard/assets/{page-ZfTtFicG.js → page-DwVPpCFg.js} +2 -2
  163. zenml/zen_server/dashboard/assets/page-XURWnYZP.js +1 -0
  164. zenml/zen_server/dashboard/assets/page-abw-2oeW.js +1 -0
  165. zenml/zen_server/dashboard/assets/page-akLcPcKw.js +1 -0
  166. zenml/zen_server/dashboard/assets/page-n9ejQ2V3.js +2 -0
  167. zenml/zen_server/dashboard/assets/page-sJjNT9xA.js +6 -0
  168. zenml/zen_server/dashboard/assets/{persist-UUym702q.js → persist-DWMWVP-y.js} +1 -1
  169. zenml/zen_server/dashboard/assets/{persist-D87V82eO.js → persist-Dec_w7aB.js} +1 -1
  170. zenml/zen_server/dashboard/assets/pipeline-CSUlkd50.js +1 -0
  171. zenml/zen_server/dashboard/assets/{plus-COjQg3AG.js → plus-Cl0_rCVF.js} +1 -1
  172. zenml/zen_server/dashboard/assets/{react-error-boundary.esm-fyoUBS25.js → react-error-boundary.esm-7_MuhCay.js} +1 -1
  173. zenml/zen_server/dashboard/assets/{refresh-CM5T3QeU.js → refresh-BcTM09NW.js} +1 -1
  174. zenml/zen_server/dashboard/assets/resource-tyes-list-o2LXiMay.js +1 -0
  175. zenml/zen_server/dashboard/assets/resource-type-tooltip-DwHrJstL.js +1 -0
  176. zenml/zen_server/dashboard/assets/service-connectors-DSEMwJ5A.js +1 -0
  177. zenml/zen_server/dashboard/assets/{service-BQ9KIhls.js → service-jxtvgks0.js} +2 -2
  178. zenml/zen_server/dashboard/assets/sharedSchema-BXzg0EZz.js +1 -0
  179. zenml/zen_server/dashboard/assets/stack-detail-query-Cm0fsgo-.js +1 -0
  180. zenml/zen_server/dashboard/assets/{terminal-square-DMtel8mb.js → terminal-XFL_4QN-.js} +1 -1
  181. zenml/zen_server/dashboard/assets/terminal-square-XFL_4QN-.js +1 -0
  182. zenml/zen_server/dashboard/assets/transform-CeZdrxDZ.js +1 -0
  183. zenml/zen_server/dashboard/assets/{trash-BWSZ7NRK.js → trash-DP6Tpp_E.js} +1 -1
  184. zenml/zen_server/dashboard/assets/type-guards-CNgPYg8l.js +1 -0
  185. zenml/zen_server/dashboard/assets/update-current-user-mutation-D5MjcQ6F.js +1 -0
  186. zenml/zen_server/dashboard/assets/update-server-settings-mutation-CmnxdxiK.js +1 -0
  187. zenml/zen_server/dashboard/assets/{zod-C0xYeTvL.js → zod-XdS2h1ws.js} +1 -1
  188. zenml/zen_server/dashboard/index.html +7 -7
  189. zenml/zen_server/rbac/utils.py +2 -2
  190. zenml/zen_server/routers/auth_endpoints.py +2 -2
  191. zenml/zen_server/routers/devices_endpoints.py +8 -5
  192. zenml/zen_server/routers/pipeline_deployments_endpoints.py +1 -1
  193. zenml/zen_server/routers/pipelines_endpoints.py +1 -1
  194. zenml/zen_server/routers/run_templates_endpoints.py +3 -3
  195. zenml/zen_server/routers/runs_endpoints.py +35 -0
  196. zenml/zen_server/template_execution/utils.py +6 -6
  197. zenml/zen_stores/dag_generator.py +171 -0
  198. zenml/zen_stores/migrations/versions/0.83.0_release.py +23 -0
  199. zenml/zen_stores/rest_zen_store.py +17 -3
  200. zenml/zen_stores/schemas/action_schemas.py +40 -4
  201. zenml/zen_stores/schemas/api_key_schemas.py +29 -1
  202. zenml/zen_stores/schemas/artifact_schemas.py +168 -48
  203. zenml/zen_stores/schemas/base_schemas.py +26 -1
  204. zenml/zen_stores/schemas/code_repository_schemas.py +46 -5
  205. zenml/zen_stores/schemas/component_schemas.py +44 -3
  206. zenml/zen_stores/schemas/device_schemas.py +43 -2
  207. zenml/zen_stores/schemas/event_source_schemas.py +41 -5
  208. zenml/zen_stores/schemas/flavor_schemas.py +42 -2
  209. zenml/zen_stores/schemas/model_schemas.py +113 -77
  210. zenml/zen_stores/schemas/pipeline_build_schemas.py +53 -4
  211. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +53 -4
  212. zenml/zen_stores/schemas/pipeline_run_schemas.py +111 -47
  213. zenml/zen_stores/schemas/pipeline_schemas.py +41 -9
  214. zenml/zen_stores/schemas/run_template_schemas.py +75 -11
  215. zenml/zen_stores/schemas/schedule_schema.py +50 -5
  216. zenml/zen_stores/schemas/secret_schemas.py +39 -2
  217. zenml/zen_stores/schemas/service_connector_schemas.py +39 -2
  218. zenml/zen_stores/schemas/service_schemas.py +39 -4
  219. zenml/zen_stores/schemas/stack_schemas.py +47 -2
  220. zenml/zen_stores/schemas/step_run_schemas.py +89 -26
  221. zenml/zen_stores/schemas/tag_schemas.py +69 -5
  222. zenml/zen_stores/schemas/trigger_schemas.py +44 -5
  223. zenml/zen_stores/schemas/utils.py +25 -4
  224. zenml/zen_stores/sql_zen_store.py +471 -28
  225. zenml/zen_stores/zen_store_interface.py +9 -1
  226. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/METADATA +2 -2
  227. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/RECORD +230 -222
  228. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-BG7-Ki1L.js +0 -1
  229. zenml/zen_server/dashboard/assets/CollapsibleCard-D20FtrzC.js +0 -1
  230. zenml/zen_server/dashboard/assets/Commands-DGbAvMDk.js +0 -1
  231. zenml/zen_server/dashboard/assets/ComponentIcon-ils7uNAk.js +0 -1
  232. zenml/zen_server/dashboard/assets/CsvVizualization-DVN541XF.js +0 -15
  233. zenml/zen_server/dashboard/assets/DialogItem-BHWf3sIB.js +0 -1
  234. zenml/zen_server/dashboard/assets/ExecutionStatus-XrvT2r65.js +0 -1
  235. zenml/zen_server/dashboard/assets/Infobox-D9k5TFH4.js +0 -1
  236. zenml/zen_server/dashboard/assets/InlineAvatar-Cfz4WSLK.js +0 -1
  237. zenml/zen_server/dashboard/assets/MarkdownVisualization-URCyUPcZ.js +0 -14
  238. zenml/zen_server/dashboard/assets/NestedCollapsible-Dor-bi98.js +0 -1
  239. zenml/zen_server/dashboard/assets/NumberBox-D2A7ENHb.js +0 -1
  240. zenml/zen_server/dashboard/assets/Partials-DQJFw1yW.js +0 -1
  241. zenml/zen_server/dashboard/assets/ProBadge-Cp4hb1YT.js +0 -1
  242. zenml/zen_server/dashboard/assets/ProCta-EYoV9CvK.js +0 -1
  243. zenml/zen_server/dashboard/assets/ProviderRadio-BVDA-fAr.js +0 -1
  244. zenml/zen_server/dashboard/assets/RunSelector-BLuBYNJt.js +0 -1
  245. zenml/zen_server/dashboard/assets/RunsBody-W4WHf-sq.js +0 -1
  246. zenml/zen_server/dashboard/assets/SearchField-D-h6jXyg.js +0 -1
  247. zenml/zen_server/dashboard/assets/SecretTooltip-CePCL8kd.js +0 -1
  248. zenml/zen_server/dashboard/assets/StackList-CgmN5H-i.js +0 -1
  249. zenml/zen_server/dashboard/assets/Tabs-DxQ8PDOD.js +0 -1
  250. zenml/zen_server/dashboard/assets/Tick-CEsT3HPR.js +0 -1
  251. zenml/zen_server/dashboard/assets/UsageReason-DjI5qMje.js +0 -1
  252. zenml/zen_server/dashboard/assets/WizardFooter-CFBHFZas.js +0 -1
  253. zenml/zen_server/dashboard/assets/cloud-squares-DeRLMopf.svg +0 -43
  254. zenml/zen_server/dashboard/assets/configuration-form-BtI2Y4eX.js +0 -1
  255. zenml/zen_server/dashboard/assets/connectors-video-C9qY4syJ.svg +0 -21
  256. zenml/zen_server/dashboard/assets/constants-DP3ZEnXH.js +0 -1
  257. zenml/zen_server/dashboard/assets/create-stack-BJ6x5rzj.js +0 -1
  258. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +0 -1
  259. zenml/zen_server/dashboard/assets/delete-run-DlSLEl5T.js +0 -1
  260. zenml/zen_server/dashboard/assets/docker-BuDBFEDL.js +0 -1
  261. zenml/zen_server/dashboard/assets/dots-horizontal-BGRJCPCs.js +0 -1
  262. zenml/zen_server/dashboard/assets/flavor-select-BnPxvQDN.js +0 -1
  263. zenml/zen_server/dashboard/assets/form-schemas-CbvoEUHr.js +0 -1
  264. zenml/zen_server/dashboard/assets/index-CFESYpe4.js +0 -1
  265. zenml/zen_server/dashboard/assets/index-CmLcvK2z.js +0 -1
  266. zenml/zen_server/dashboard/assets/index-CzX3ZYlI.css +0 -1
  267. zenml/zen_server/dashboard/assets/index-D2iSHVZq.js +0 -64
  268. zenml/zen_server/dashboard/assets/kubernetes-D6OUjwSK.js +0 -1
  269. zenml/zen_server/dashboard/assets/link-external-DUhCSKNm.js +0 -1
  270. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +0 -1
  271. zenml/zen_server/dashboard/assets/login-mutation-CXc-Klim.js +0 -1
  272. zenml/zen_server/dashboard/assets/not-found-olRU3fnu.js +0 -1
  273. zenml/zen_server/dashboard/assets/page-7keIM1V3.js +0 -1
  274. zenml/zen_server/dashboard/assets/page-B31neFwG.js +0 -1
  275. zenml/zen_server/dashboard/assets/page-B3zo4KYS.js +0 -1
  276. zenml/zen_server/dashboard/assets/page-BN3MHq1a.js +0 -1
  277. zenml/zen_server/dashboard/assets/page-BNgVExjN.js +0 -1
  278. zenml/zen_server/dashboard/assets/page-BPtvu74G.js +0 -1
  279. zenml/zen_server/dashboard/assets/page-BTIuG0ki.js +0 -2
  280. zenml/zen_server/dashboard/assets/page-BcQzleH6.js +0 -1
  281. zenml/zen_server/dashboard/assets/page-C05Jw4M2.js +0 -1
  282. zenml/zen_server/dashboard/assets/page-C28a7K8h.js +0 -1
  283. zenml/zen_server/dashboard/assets/page-C9WLk0X-.js +0 -1
  284. zenml/zen_server/dashboard/assets/page-CINMx64X.js +0 -1
  285. zenml/zen_server/dashboard/assets/page-CYrJbk7P.js +0 -1
  286. zenml/zen_server/dashboard/assets/page-Ce0cqLo3.js +0 -1
  287. zenml/zen_server/dashboard/assets/page-CgNsEkw-.js +0 -1
  288. zenml/zen_server/dashboard/assets/page-Ct2FUYuR.js +0 -1
  289. zenml/zen_server/dashboard/assets/page-D8G2B3Bu.js +0 -1
  290. zenml/zen_server/dashboard/assets/page-DL8a4_lg.js +0 -3
  291. zenml/zen_server/dashboard/assets/page-DMhYn1cF.js +0 -1
  292. zenml/zen_server/dashboard/assets/page-Dd_Yq-Uf.js +0 -6
  293. zenml/zen_server/dashboard/assets/page-DfSvqT8g.js +0 -1
  294. zenml/zen_server/dashboard/assets/page-Dt6ANUTx.js +0 -1
  295. zenml/zen_server/dashboard/assets/page-DtvTleaT.js +0 -1
  296. zenml/zen_server/dashboard/assets/page-DwfGTiVs.js +0 -1
  297. zenml/zen_server/dashboard/assets/page-JgomSTDc.js +0 -1
  298. zenml/zen_server/dashboard/assets/page-L84ig6HB.js +0 -1
  299. zenml/zen_server/dashboard/assets/page-Mabsn4QJ.js +0 -1
  300. zenml/zen_server/dashboard/assets/page-P04L5cm9.js +0 -1
  301. zenml/zen_server/dashboard/assets/page-PfhAnvq4.js +0 -1
  302. zenml/zen_server/dashboard/assets/page-WdRrlNt_.js +0 -1
  303. zenml/zen_server/dashboard/assets/page-cqJDDDeK.js +0 -1
  304. zenml/zen_server/dashboard/assets/page-k-Wxh9L_.js +0 -1
  305. zenml/zen_server/dashboard/assets/page-y-zV4n0c.js +0 -1
  306. zenml/zen_server/dashboard/assets/rocket-Cf-B-XOR.js +0 -1
  307. zenml/zen_server/dashboard/assets/settings_preview-0JLrRgHP.webp +0 -0
  308. zenml/zen_server/dashboard/assets/sharedSchema-Bse2agAf.js +0 -14
  309. zenml/zen_server/dashboard/assets/stack-detail-query-BAcZJrN3.js +0 -1
  310. zenml/zen_server/dashboard/assets/tick-circle-m94Aa6Zt.js +0 -1
  311. zenml/zen_server/dashboard/assets/tour-cover-BYfeen6M.webp +0 -0
  312. zenml/zen_server/dashboard/assets/type-guards-CaeD8wHO.js +0 -1
  313. zenml/zen_server/dashboard/assets/update-server-settings-mutation-DwMM1LJz.js +0 -1
  314. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/LICENSE +0 -0
  315. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/WHEEL +0 -0
  316. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/entry_points.txt +0 -0
@@ -13,12 +13,13 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQLModel implementation of run template tables."""
15
15
 
16
- from typing import TYPE_CHECKING, Any, List, Optional
16
+ from typing import TYPE_CHECKING, Any, List, Optional, Sequence
17
17
  from uuid import UUID
18
18
 
19
19
  from sqlalchemy import Column, String, UniqueConstraint
20
20
  from sqlalchemy.dialects.mysql import MEDIUMTEXT
21
- from sqlalchemy.orm import object_session
21
+ from sqlalchemy.orm import joinedload, object_session
22
+ from sqlalchemy.sql.base import ExecutableOption
22
23
  from sqlmodel import Field, Relationship, col, desc, select
23
24
 
24
25
  from zenml.constants import MEDIUMTEXT_MAX_LENGTH
@@ -36,6 +37,7 @@ from zenml.zen_stores.schemas.base_schemas import NamedSchema
36
37
  from zenml.zen_stores.schemas.project_schemas import ProjectSchema
37
38
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
38
39
  from zenml.zen_stores.schemas.user_schemas import UserSchema
40
+ from zenml.zen_stores.schemas.utils import jl_arg
39
41
 
40
42
  if TYPE_CHECKING:
41
43
  from zenml.zen_stores.schemas.pipeline_deployment_schemas import (
@@ -116,6 +118,68 @@ class RunTemplateSchema(NamedSchema, table=True):
116
118
  ),
117
119
  )
118
120
 
121
+ @classmethod
122
+ def get_query_options(
123
+ cls,
124
+ include_metadata: bool = False,
125
+ include_resources: bool = False,
126
+ **kwargs: Any,
127
+ ) -> Sequence[ExecutableOption]:
128
+ """Get the query options for the schema.
129
+
130
+ Args:
131
+ include_metadata: Whether metadata will be included when converting
132
+ the schema to a model.
133
+ include_resources: Whether resources will be included when
134
+ converting the schema to a model.
135
+ **kwargs: Keyword arguments to allow schema specific logic
136
+
137
+ Returns:
138
+ A list of query options.
139
+ """
140
+ from zenml.zen_stores.schemas import PipelineDeploymentSchema
141
+
142
+ options = [
143
+ joinedload(jl_arg(RunTemplateSchema.source_deployment)).joinedload(
144
+ jl_arg(PipelineDeploymentSchema.build)
145
+ ),
146
+ ]
147
+
148
+ if include_metadata or include_resources:
149
+ options.extend(
150
+ [
151
+ joinedload(
152
+ jl_arg(RunTemplateSchema.source_deployment)
153
+ ).joinedload(jl_arg(PipelineDeploymentSchema.pipeline)),
154
+ joinedload(
155
+ jl_arg(RunTemplateSchema.source_deployment)
156
+ ).joinedload(
157
+ jl_arg(PipelineDeploymentSchema.code_reference)
158
+ ),
159
+ ]
160
+ )
161
+ if include_metadata:
162
+ options.extend(
163
+ [
164
+ joinedload(
165
+ jl_arg(RunTemplateSchema.source_deployment)
166
+ ).joinedload(jl_arg(PipelineDeploymentSchema.stack)),
167
+ joinedload(
168
+ jl_arg(RunTemplateSchema.source_deployment)
169
+ ).joinedload(jl_arg(PipelineDeploymentSchema.schedule)),
170
+ ]
171
+ )
172
+
173
+ if include_resources:
174
+ options.extend(
175
+ [
176
+ joinedload(jl_arg(RunTemplateSchema.user)),
177
+ # joinedload(jl_arg(RunTemplateSchema.tags)),
178
+ ]
179
+ )
180
+
181
+ return options
182
+
119
183
  @property
120
184
  def latest_run(self) -> Optional["PipelineRunSchema"]:
121
185
  """Fetch the latest run for this template.
@@ -216,20 +280,17 @@ class RunTemplateSchema(NamedSchema, table=True):
216
280
  self.source_deployment
217
281
  and self.source_deployment.build
218
282
  and not self.source_deployment.build.is_local
219
- and self.source_deployment.build.stack
283
+ and self.source_deployment.build.stack_id
220
284
  ):
221
285
  runnable = True
222
286
 
223
- latest_run = self.latest_run
224
-
225
287
  body = RunTemplateResponseBody(
226
- user=self.user.to_model() if self.user else None,
288
+ user_id=self.user_id,
289
+ project_id=self.project_id,
227
290
  created=self.created,
228
291
  updated=self.updated,
229
292
  runnable=runnable,
230
293
  hidden=self.hidden,
231
- latest_run_id=latest_run.id if latest_run else None,
232
- latest_run_status=latest_run.status if latest_run else None,
233
294
  )
234
295
 
235
296
  metadata = None
@@ -247,7 +308,7 @@ class RunTemplateSchema(NamedSchema, table=True):
247
308
 
248
309
  if (
249
310
  self.source_deployment.build
250
- and self.source_deployment.build.stack
311
+ and self.source_deployment.build.stack_id
251
312
  ):
252
313
  config_template = template_utils.generate_config_template(
253
314
  deployment=self.source_deployment
@@ -257,7 +318,6 @@ class RunTemplateSchema(NamedSchema, table=True):
257
318
  )
258
319
 
259
320
  metadata = RunTemplateResponseMetadata(
260
- project=self.project.to_model(),
261
321
  description=self.description,
262
322
  pipeline_spec=pipeline_spec,
263
323
  config_template=config_template,
@@ -287,7 +347,10 @@ class RunTemplateSchema(NamedSchema, table=True):
287
347
  build = None
288
348
  code_reference = None
289
349
 
350
+ latest_run = self.latest_run
351
+
290
352
  resources = RunTemplateResponseResources(
353
+ user=self.user.to_model() if self.user else None,
291
354
  source_deployment=self.source_deployment.to_model()
292
355
  if self.source_deployment
293
356
  else None,
@@ -295,11 +358,12 @@ class RunTemplateSchema(NamedSchema, table=True):
295
358
  build=build,
296
359
  code_reference=code_reference,
297
360
  tags=[tag.to_model() for tag in self.tags],
361
+ latest_run_id=latest_run.id if latest_run else None,
362
+ latest_run_status=latest_run.status if latest_run else None,
298
363
  )
299
364
 
300
365
  return RunTemplateResponse(
301
366
  id=self.id,
302
- project_id=self.project_id,
303
367
  name=self.name,
304
368
  body=body,
305
369
  metadata=metadata,
@@ -14,10 +14,12 @@
14
14
  """SQL Model Implementations for Pipeline Schedules."""
15
15
 
16
16
  from datetime import datetime, timedelta
17
- from typing import TYPE_CHECKING, Any, List, Optional
17
+ from typing import TYPE_CHECKING, Any, List, Optional, Sequence
18
18
  from uuid import UUID
19
19
 
20
20
  from sqlalchemy import UniqueConstraint
21
+ from sqlalchemy.orm import joinedload
22
+ from sqlalchemy.sql.base import ExecutableOption
21
23
  from sqlmodel import Field, Relationship
22
24
 
23
25
  from zenml.enums import MetadataResourceTypes
@@ -26,6 +28,7 @@ from zenml.models import (
26
28
  ScheduleResponse,
27
29
  ScheduleResponseBody,
28
30
  ScheduleResponseMetadata,
31
+ ScheduleResponseResources,
29
32
  ScheduleUpdate,
30
33
  )
31
34
  from zenml.utils.time_utils import utc_now
@@ -35,7 +38,10 @@ from zenml.zen_stores.schemas.pipeline_schemas import PipelineSchema
35
38
  from zenml.zen_stores.schemas.project_schemas import ProjectSchema
36
39
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
37
40
  from zenml.zen_stores.schemas.user_schemas import UserSchema
38
- from zenml.zen_stores.schemas.utils import RunMetadataInterface
41
+ from zenml.zen_stores.schemas.utils import (
42
+ RunMetadataInterface,
43
+ jl_arg,
44
+ )
39
45
 
40
46
  if TYPE_CHECKING:
41
47
  from zenml.zen_stores.schemas.pipeline_deployment_schemas import (
@@ -120,6 +126,39 @@ class ScheduleSchema(NamedSchema, RunMetadataInterface, table=True):
120
126
  catchup: bool
121
127
  run_once_start_time: Optional[datetime] = Field(nullable=True)
122
128
 
129
+ @classmethod
130
+ def get_query_options(
131
+ cls,
132
+ include_metadata: bool = False,
133
+ include_resources: bool = False,
134
+ **kwargs: Any,
135
+ ) -> Sequence[ExecutableOption]:
136
+ """Get the query options for the schema.
137
+
138
+ Args:
139
+ include_metadata: Whether metadata will be included when converting
140
+ the schema to a model.
141
+ include_resources: Whether resources will be included when
142
+ converting the schema to a model.
143
+ **kwargs: Keyword arguments to allow schema specific logic
144
+
145
+ Returns:
146
+ A list of query options.
147
+ """
148
+ options = []
149
+
150
+ # if include_metadata:
151
+ # options.extend(
152
+ # [
153
+ # joinedload(jl_arg(ScheduleSchema.run_metadata)),
154
+ # ]
155
+ # )
156
+
157
+ if include_resources:
158
+ options.extend([joinedload(jl_arg(ScheduleSchema.user))])
159
+
160
+ return options
161
+
123
162
  @classmethod
124
163
  def from_request(
125
164
  cls, schedule_request: ScheduleRequest
@@ -189,7 +228,8 @@ class ScheduleSchema(NamedSchema, RunMetadataInterface, table=True):
189
228
  interval_second = None
190
229
 
191
230
  body = ScheduleResponseBody(
192
- user=self.user.to_model() if self.user else None,
231
+ user_id=self.user_id,
232
+ project_id=self.project_id,
193
233
  active=self.active,
194
234
  cron_expression=self.cron_expression,
195
235
  start_time=self.start_time,
@@ -203,16 +243,21 @@ class ScheduleSchema(NamedSchema, RunMetadataInterface, table=True):
203
243
  metadata = None
204
244
  if include_metadata:
205
245
  metadata = ScheduleResponseMetadata(
206
- project=self.project.to_model(),
207
246
  pipeline_id=self.pipeline_id,
208
247
  orchestrator_id=self.orchestrator_id,
209
248
  run_metadata=self.fetch_metadata(),
210
249
  )
211
250
 
251
+ resources = None
252
+ if include_resources:
253
+ resources = ScheduleResponseResources(
254
+ user=self.user.to_model() if self.user else None,
255
+ )
256
+
212
257
  return ScheduleResponse(
213
258
  id=self.id,
214
- project_id=self.project_id,
215
259
  name=self.name,
216
260
  body=body,
217
261
  metadata=metadata,
262
+ resources=resources,
218
263
  )
@@ -15,10 +15,12 @@
15
15
 
16
16
  import base64
17
17
  import json
18
- from typing import Any, Dict, Optional, cast
18
+ from typing import Any, Dict, Optional, Sequence, cast
19
19
  from uuid import UUID
20
20
 
21
21
  from sqlalchemy import TEXT, Column, UniqueConstraint
22
+ from sqlalchemy.orm import joinedload
23
+ from sqlalchemy.sql.base import ExecutableOption
22
24
  from sqlalchemy_utils.types.encrypted.encrypted_type import (
23
25
  AesGcmEngine,
24
26
  InvalidCiphertextError,
@@ -31,12 +33,14 @@ from zenml.models import (
31
33
  SecretResponse,
32
34
  SecretResponseBody,
33
35
  SecretResponseMetadata,
36
+ SecretResponseResources,
34
37
  SecretUpdate,
35
38
  )
36
39
  from zenml.utils.time_utils import utc_now
37
40
  from zenml.zen_stores.schemas.base_schemas import NamedSchema
38
41
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
39
42
  from zenml.zen_stores.schemas.user_schemas import UserSchema
43
+ from zenml.zen_stores.schemas.utils import jl_arg
40
44
 
41
45
 
42
46
  class SecretDecodeError(Exception):
@@ -75,6 +79,32 @@ class SecretSchema(NamedSchema, table=True):
75
79
  )
76
80
  user: "UserSchema" = Relationship(back_populates="secrets")
77
81
 
82
+ @classmethod
83
+ def get_query_options(
84
+ cls,
85
+ include_metadata: bool = False,
86
+ include_resources: bool = False,
87
+ **kwargs: Any,
88
+ ) -> Sequence[ExecutableOption]:
89
+ """Get the query options for the schema.
90
+
91
+ Args:
92
+ include_metadata: Whether metadata will be included when converting
93
+ the schema to a model.
94
+ include_resources: Whether resources will be included when
95
+ converting the schema to a model.
96
+ **kwargs: Keyword arguments to allow schema specific logic
97
+
98
+ Returns:
99
+ A list of query options.
100
+ """
101
+ options = []
102
+
103
+ if include_resources:
104
+ options.extend([joinedload(jl_arg(SecretSchema.user))])
105
+
106
+ return options
107
+
78
108
  @classmethod
79
109
  def _dump_secret_values(
80
110
  cls, values: Dict[str, str], encryption_engine: Optional[AesGcmEngine]
@@ -225,11 +255,17 @@ class SecretSchema(NamedSchema, table=True):
225
255
  if include_metadata:
226
256
  metadata = SecretResponseMetadata()
227
257
 
258
+ resources = None
259
+ if include_resources:
260
+ resources = SecretResponseResources(
261
+ user=self.user.to_model() if self.user else None,
262
+ )
263
+
228
264
  # Don't load the secret values implicitly in the secret. The
229
265
  # SQL secret store will call `get_secret_values` to load the
230
266
  # values separately if SQL is used as the secrets store.
231
267
  body = SecretResponseBody(
232
- user=self.user.to_model() if self.user else None,
268
+ user_id=self.user_id,
233
269
  created=self.created,
234
270
  updated=self.updated,
235
271
  private=self.private,
@@ -239,6 +275,7 @@ class SecretSchema(NamedSchema, table=True):
239
275
  name=self.name,
240
276
  body=body,
241
277
  metadata=metadata,
278
+ resources=resources,
242
279
  )
243
280
 
244
281
  def get_secret_values(
@@ -16,10 +16,12 @@
16
16
  import base64
17
17
  import json
18
18
  from datetime import datetime
19
- from typing import TYPE_CHECKING, Any, Dict, List, Optional, cast
19
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, cast
20
20
  from uuid import UUID
21
21
 
22
22
  from sqlalchemy import TEXT, Column, UniqueConstraint
23
+ from sqlalchemy.orm import joinedload
24
+ from sqlalchemy.sql.base import ExecutableOption
23
25
  from sqlmodel import Field, Relationship
24
26
 
25
27
  from zenml.models import (
@@ -27,12 +29,14 @@ from zenml.models import (
27
29
  ServiceConnectorResponse,
28
30
  ServiceConnectorResponseBody,
29
31
  ServiceConnectorResponseMetadata,
32
+ ServiceConnectorResponseResources,
30
33
  ServiceConnectorUpdate,
31
34
  )
32
35
  from zenml.utils.time_utils import utc_now
33
36
  from zenml.zen_stores.schemas.base_schemas import NamedSchema
34
37
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
35
38
  from zenml.zen_stores.schemas.user_schemas import UserSchema
39
+ from zenml.zen_stores.schemas.utils import jl_arg
36
40
 
37
41
  if TYPE_CHECKING:
38
42
  from zenml.zen_stores.schemas.component_schemas import StackComponentSchema
@@ -77,6 +81,32 @@ class ServiceConnectorSchema(NamedSchema, table=True):
77
81
  back_populates="connector",
78
82
  )
79
83
 
84
+ @classmethod
85
+ def get_query_options(
86
+ cls,
87
+ include_metadata: bool = False,
88
+ include_resources: bool = False,
89
+ **kwargs: Any,
90
+ ) -> Sequence[ExecutableOption]:
91
+ """Get the query options for the schema.
92
+
93
+ Args:
94
+ include_metadata: Whether metadata will be included when converting
95
+ the schema to a model.
96
+ include_resources: Whether resources will be included when
97
+ converting the schema to a model.
98
+ **kwargs: Keyword arguments to allow schema specific logic
99
+
100
+ Returns:
101
+ A list of query options.
102
+ """
103
+ options = []
104
+
105
+ if include_resources:
106
+ options.extend([joinedload(jl_arg(ServiceConnectorSchema.user))])
107
+
108
+ return options
109
+
80
110
  @property
81
111
  def resource_types_list(self) -> List[str]:
82
112
  """Returns the resource types as a list.
@@ -241,7 +271,7 @@ class ServiceConnectorSchema(NamedSchema, table=True):
241
271
  A `ServiceConnectorModel`
242
272
  """
243
273
  body = ServiceConnectorResponseBody(
244
- user=self.user.to_model() if self.user else None,
274
+ user_id=self.user_id,
245
275
  created=self.created,
246
276
  updated=self.updated,
247
277
  description=self.description,
@@ -265,9 +295,16 @@ class ServiceConnectorSchema(NamedSchema, table=True):
265
295
  expiration_seconds=self.expiration_seconds,
266
296
  labels=self.labels_dict,
267
297
  )
298
+ resources = None
299
+ if include_resources:
300
+ resources = ServiceConnectorResponseResources(
301
+ user=self.user.to_model() if self.user else None,
302
+ )
303
+
268
304
  return ServiceConnectorResponse(
269
305
  id=self.id,
270
306
  name=self.name,
271
307
  body=body,
272
308
  metadata=metadata,
309
+ resources=resources,
273
310
  )
@@ -15,11 +15,13 @@
15
15
 
16
16
  import base64
17
17
  import json
18
- from typing import Any, Optional
18
+ from typing import Any, Optional, Sequence
19
19
  from uuid import UUID
20
20
 
21
21
  from pydantic import ConfigDict
22
22
  from sqlalchemy import TEXT, Column
23
+ from sqlalchemy.orm import joinedload
24
+ from sqlalchemy.sql.base import ExecutableOption
23
25
  from sqlmodel import Field, Relationship
24
26
 
25
27
  from zenml.models.v2.core.service import (
@@ -38,6 +40,7 @@ from zenml.zen_stores.schemas.pipeline_run_schemas import PipelineRunSchema
38
40
  from zenml.zen_stores.schemas.project_schemas import ProjectSchema
39
41
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
40
42
  from zenml.zen_stores.schemas.user_schemas import UserSchema
43
+ from zenml.zen_stores.schemas.utils import jl_arg
41
44
 
42
45
 
43
46
  class ServiceSchema(NamedSchema, table=True):
@@ -117,6 +120,38 @@ class ServiceSchema(NamedSchema, table=True):
117
120
  # careful we might overwrite some fields protected by pydantic.
118
121
  model_config = ConfigDict(protected_namespaces=()) # type: ignore[assignment]
119
122
 
123
+ @classmethod
124
+ def get_query_options(
125
+ cls,
126
+ include_metadata: bool = False,
127
+ include_resources: bool = False,
128
+ **kwargs: Any,
129
+ ) -> Sequence[ExecutableOption]:
130
+ """Get the query options for the schema.
131
+
132
+ Args:
133
+ include_metadata: Whether metadata will be included when converting
134
+ the schema to a model.
135
+ include_resources: Whether resources will be included when
136
+ converting the schema to a model.
137
+ **kwargs: Keyword arguments to allow schema specific logic
138
+
139
+ Returns:
140
+ A list of query options.
141
+ """
142
+ options = []
143
+
144
+ if include_resources:
145
+ options.extend(
146
+ [
147
+ joinedload(jl_arg(ServiceSchema.user)),
148
+ joinedload(jl_arg(ServiceSchema.model_version)),
149
+ joinedload(jl_arg(ServiceSchema.pipeline_run)),
150
+ ]
151
+ )
152
+
153
+ return options
154
+
120
155
  def to_model(
121
156
  self,
122
157
  include_metadata: bool = False,
@@ -134,7 +169,8 @@ class ServiceSchema(NamedSchema, table=True):
134
169
  The created `ServiceResponse`.
135
170
  """
136
171
  body = ServiceResponseBody(
137
- user=self.user.to_model() if self.user else None,
172
+ user_id=self.user_id,
173
+ project_id=self.project_id,
138
174
  created=self.created,
139
175
  updated=self.updated,
140
176
  service_type=json.loads(self.service_type),
@@ -146,7 +182,6 @@ class ServiceSchema(NamedSchema, table=True):
146
182
  metadata = None
147
183
  if include_metadata:
148
184
  metadata = ServiceResponseMetadata(
149
- project=self.project.to_model(),
150
185
  service_source=self.service_source,
151
186
  config=json.loads(base64.b64decode(self.config).decode()),
152
187
  status=json.loads(base64.b64decode(self.status).decode())
@@ -162,6 +197,7 @@ class ServiceSchema(NamedSchema, table=True):
162
197
  resources = None
163
198
  if include_resources:
164
199
  resources = ServiceResponseResources(
200
+ user=self.user.to_model() if self.user else None,
165
201
  model_version=self.model_version.to_model()
166
202
  if self.model_version
167
203
  else None,
@@ -171,7 +207,6 @@ class ServiceSchema(NamedSchema, table=True):
171
207
  )
172
208
  return ServiceResponse(
173
209
  id=self.id,
174
- project_id=self.project_id,
175
210
  name=self.name,
176
211
  body=body,
177
212
  metadata=metadata,
@@ -15,22 +15,26 @@
15
15
 
16
16
  import base64
17
17
  import json
18
- from typing import TYPE_CHECKING, Any, List, Optional
18
+ from typing import TYPE_CHECKING, Any, List, Optional, Sequence
19
19
  from uuid import UUID
20
20
 
21
21
  from sqlalchemy import UniqueConstraint
22
+ from sqlalchemy.orm import joinedload
23
+ from sqlalchemy.sql.base import ExecutableOption
22
24
  from sqlmodel import Field, Relationship, SQLModel
23
25
 
24
26
  from zenml.models import (
25
27
  StackResponse,
26
28
  StackResponseBody,
27
29
  StackResponseMetadata,
30
+ StackResponseResources,
28
31
  StackUpdate,
29
32
  )
30
33
  from zenml.utils.time_utils import utc_now
31
34
  from zenml.zen_stores.schemas.base_schemas import NamedSchema
32
35
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
33
36
  from zenml.zen_stores.schemas.user_schemas import UserSchema
37
+ from zenml.zen_stores.schemas.utils import jl_arg
34
38
 
35
39
  if TYPE_CHECKING:
36
40
  from zenml.zen_stores.schemas.component_schemas import (
@@ -106,6 +110,41 @@ class StackSchema(NamedSchema, table=True):
106
110
  back_populates="stack",
107
111
  )
108
112
 
113
+ @classmethod
114
+ def get_query_options(
115
+ cls,
116
+ include_metadata: bool = False,
117
+ include_resources: bool = False,
118
+ **kwargs: Any,
119
+ ) -> Sequence[ExecutableOption]:
120
+ """Get the query options for the schema.
121
+
122
+ Args:
123
+ include_metadata: Whether metadata will be included when converting
124
+ the schema to a model.
125
+ include_resources: Whether resources will be included when
126
+ converting the schema to a model.
127
+ **kwargs: Keyword arguments to allow schema specific logic
128
+
129
+ Returns:
130
+ A list of query options.
131
+ """
132
+ options = []
133
+
134
+ # if include_metadata:
135
+ # options.extend(
136
+ # [
137
+ # joinedload(jl_arg(StackSchema.components)).joinedload(
138
+ # jl_arg(StackComponentSchema.flavor_schema)
139
+ # ),
140
+ # ]
141
+ # )
142
+
143
+ if include_resources:
144
+ options.extend([joinedload(jl_arg(StackSchema.user))])
145
+
146
+ return options
147
+
109
148
  def update(
110
149
  self,
111
150
  stack_update: "StackUpdate",
@@ -152,7 +191,7 @@ class StackSchema(NamedSchema, table=True):
152
191
  The converted model.
153
192
  """
154
193
  body = StackResponseBody(
155
- user=self.user.to_model() if self.user else None,
194
+ user_id=self.user_id,
156
195
  created=self.created,
157
196
  updated=self.updated,
158
197
  )
@@ -166,10 +205,16 @@ class StackSchema(NamedSchema, table=True):
166
205
  else None,
167
206
  description=self.description,
168
207
  )
208
+ resources = None
209
+ if include_resources:
210
+ resources = StackResponseResources(
211
+ user=self.user.to_model() if self.user else None,
212
+ )
169
213
 
170
214
  return StackResponse(
171
215
  id=self.id,
172
216
  name=self.name,
173
217
  body=body,
174
218
  metadata=metadata,
219
+ resources=resources,
175
220
  )