orchestrator-core 3.2.0rc1__py3-none-any.whl → 3.2.2__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.
orchestrator/__init__.py CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "3.2.0rc1"
16
+ __version__ = "3.2.2"
17
17
 
18
18
  from orchestrator.app import OrchestratorCore
19
19
  from orchestrator.settings import app_settings
@@ -128,7 +128,7 @@ def delete(process_id: UUID) -> None:
128
128
  status_code=HTTPStatus.CREATED,
129
129
  dependencies=[Depends(check_global_lock, use_cache=False)],
130
130
  )
131
- async def new_process(
131
+ def new_process(
132
132
  workflow_key: str,
133
133
  request: Request,
134
134
  json_data: list[dict[str, Any]] | None = Body(...),
@@ -10,12 +10,13 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
-
14
13
  from collections.abc import Callable
15
14
  from functools import partial, wraps
15
+ from importlib import metadata
16
16
  from pathlib import Path
17
17
  from typing import Any
18
18
 
19
+ import semver
19
20
  import structlog
20
21
  from jinja2 import Environment
21
22
 
@@ -123,7 +124,17 @@ def get_product_workflow_path(config: dict, workflow_type: str) -> Path:
123
124
  return product_workflow_folder(config) / Path(f"{workflow_type}_{file_name}").with_suffix(".py")
124
125
 
125
126
 
127
+ def eval_pydantic_forms_version() -> bool:
128
+ updated_version = semver.Version.parse("2.0.0")
129
+
130
+ installed_version = metadata.version("pydantic-forms")
131
+ installed_semver = semver.Version.parse(installed_version)
132
+
133
+ return installed_semver >= updated_version
134
+
135
+
126
136
  def render_template(environment: Environment, config: dict, template: str, workflow: str = "") -> str:
137
+ use_updated_readonly_field = eval_pydantic_forms_version()
127
138
  product_block = root_product_block(config)
128
139
  types_to_import = get_name_spaced_types_to_import(product_block["fields"])
129
140
  fields = get_input_fields(product_block)
@@ -152,6 +163,7 @@ def render_template(environment: Environment, config: dict, template: str, workf
152
163
  product_types_module=get_product_types_module(),
153
164
  workflows_module=get_workflows_module(),
154
165
  workflow_validations=workflow_validations if workflow else [],
166
+ use_updated_readonly_field=use_updated_readonly_field,
155
167
  )
156
168
 
157
169
 
@@ -7,7 +7,12 @@ from typing import Annotated
7
7
  import structlog
8
8
  from pydantic import AfterValidator, ConfigDict, model_validator
9
9
  from pydantic_forms.types import FormGenerator, State, UUIDstr
10
+
11
+ {%- if use_updated_readonly_field is true %}
12
+ from pydantic_forms.validators import read_only_field
13
+ {%- else %}
10
14
  from pydantic_forms.validators import ReadOnlyField
15
+ {%- endif %}
11
16
 
12
17
  from orchestrator.forms import FormPage
13
18
  from orchestrator.forms.validators import CustomerId, Divider
@@ -52,7 +57,11 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
52
57
  divider_1: Divider
53
58
 
54
59
  {% for field in fields if not field.modifiable is defined -%}
60
+ {% if use_updated_readonly_field is true -%}
61
+ {{ field.name }}: read_only_field({{ product_block.name }}.{{ field.name }})
62
+ {% else -%}
55
63
  {{ field.name }}: ReadOnlyField({{ product_block.name }}.{{ field.name }})
64
+ {% endif -%}
56
65
  {% endfor -%}
57
66
 
58
67
  {% for field in fields if field.modifiable is defined -%}
@@ -38,6 +38,13 @@ def cache_subscription_models() -> Iterator:
38
38
  with cache_subscription_models():
39
39
  subscription_dict = subscription.model_dump()
40
40
  """
41
+ if __subscription_model_cache.get() is not None:
42
+ # If it's already active in the current context, we do nothing.
43
+ # This makes the contextmanager reentrant.
44
+ # The outermost contextmanager will eventually reset the context.
45
+ yield
46
+ return
47
+
41
48
  before = __subscription_model_cache.set({})
42
49
  try:
43
50
  yield
@@ -0,0 +1,29 @@
1
+ # Copyright 2022-2025 SURF.
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ from collections.abc import Iterator
14
+
15
+ from strawberry.extensions import SchemaExtension
16
+
17
+ from orchestrator.domain.context_cache import cache_subscription_models
18
+
19
+
20
+ class ModelCacheExtension(SchemaExtension):
21
+ """Wraps the GraphQL operation in a cache_subscription_models context.
22
+
23
+ For more background, please refer to the documentation of the contextmanager.
24
+ """
25
+
26
+ def on_operation(self, *args, **kwargs) -> Iterator[None]: # type: ignore
27
+
28
+ with cache_subscription_models():
29
+ yield
@@ -1,4 +1,4 @@
1
- # Copyright 2022-2023 SURF, GÉANT.
1
+ # Copyright 2022-2025 SURF, GÉANT.
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -32,6 +32,7 @@ from oauth2_lib.fastapi import AuthManager
32
32
  from oauth2_lib.strawberry import authenticated_field
33
33
  from orchestrator.domain.base import SubscriptionModel
34
34
  from orchestrator.graphql.autoregistration import create_subscription_strawberry_type, register_domain_models
35
+ from orchestrator.graphql.extensions.model_cache import ModelCacheExtension
35
36
  from orchestrator.graphql.extensions.stats import StatsExtension
36
37
  from orchestrator.graphql.mutations.customer_description import CustomerSubscriptionDescriptionMutation
37
38
  from orchestrator.graphql.mutations.start_process import ProcessMutation
@@ -160,6 +161,7 @@ def default_context_getter(
160
161
 
161
162
 
162
163
  def get_extensions(mutation: Any, query: Any) -> Iterable[type[SchemaExtension]]:
164
+ yield ModelCacheExtension
163
165
  yield ErrorHandlerExtension
164
166
  if app_settings.ENABLE_GRAPHQL_DEPRECATION_CHECKER:
165
167
  yield make_deprecation_checker_extension(query=query, mutation=mutation)
@@ -101,9 +101,9 @@ class SubscriptionInterface:
101
101
 
102
102
  @strawberry.field(description="Return all products block instances of a subscription") # type: ignore
103
103
  async def product_block_instances(
104
- self, tags: list[str] | None = None, resource_types: list[str] | None = None
104
+ self, info: OrchestratorInfo, tags: list[str] | None = None, resource_types: list[str] | None = None
105
105
  ) -> list[ProductBlockInstance]:
106
- return await get_subscription_product_blocks(self.subscription_id, tags, resource_types)
106
+ return await get_subscription_product_blocks(info, self.subscription_id, tags, resource_types)
107
107
 
108
108
  @strawberry.field(description="Return fixed inputs") # type: ignore
109
109
  async def fixed_inputs(self) -> strawberry.scalars.JSON:
@@ -21,6 +21,8 @@ from pydantic.alias_generators import to_camel as to_lower_camel
21
21
  from strawberry.scalars import JSON
22
22
 
23
23
  from orchestrator.graphql.schemas.product_block import owner_subscription_resolver
24
+ from orchestrator.graphql.types import OrchestratorInfo
25
+ from orchestrator.graphql.utils.get_selected_paths import get_selected_paths
24
26
  from orchestrator.utils.get_subscription_dict import get_subscription_dict
25
27
 
26
28
  if TYPE_CHECKING:
@@ -81,9 +83,13 @@ pb_instance_property_keys = (
81
83
 
82
84
 
83
85
  async def get_subscription_product_blocks(
84
- subscription_id: UUID, tags: list[str] | None = None, product_block_instance_values: list[str] | None = None
86
+ info: OrchestratorInfo,
87
+ subscription_id: UUID,
88
+ tags: list[str] | None = None,
89
+ product_block_instance_values: list[str] | None = None,
85
90
  ) -> list[ProductBlockInstance]:
86
- subscription, _ = await get_subscription_dict(subscription_id)
91
+ inject_inuseby = "in_use_by_relations" in get_selected_paths(info)
92
+ subscription, _ = await get_subscription_dict(subscription_id, inject_inuseby=inject_inuseby)
87
93
 
88
94
  def to_product_block(product_block: dict[str, Any]) -> ProductBlockInstance:
89
95
  def is_resource_type(candidate: Any) -> bool:
@@ -52,5 +52,5 @@ def upgrade() -> None:
52
52
  def downgrade() -> None:
53
53
  # ### commands auto generated by Alembic - please adjust! ###
54
54
  op.drop_index(op.f("ix_input_state_input_state_id"), table_name="input_states")
55
- op.drop_table("input_statse")
55
+ op.drop_table("input_states")
56
56
  # ### end Alembic commands ###
@@ -0,0 +1,44 @@
1
+ """add cascade constraint on processes input state.
2
+
3
+ Revision ID: fc5c993a4b4a
4
+ Revises: 42b3d076a85b
5
+ Create Date: 2025-04-09 18:27:31.922214
6
+
7
+ """
8
+
9
+ from alembic import op
10
+
11
+ # revision identifiers, used by Alembic.
12
+ revision = "fc5c993a4b4a"
13
+ down_revision = "42b3d076a85b"
14
+ branch_labels = None
15
+ depends_on = None
16
+
17
+
18
+ def upgrade() -> None:
19
+ # Drop the existing foreign key constraint
20
+ op.drop_constraint("input_states_pid_fkey", "input_states", type_="foreignkey")
21
+
22
+ # Add a new foreign key constraint with cascade delete
23
+ op.create_foreign_key(
24
+ "input_states_pid_fkey",
25
+ "input_states",
26
+ "processes",
27
+ ["pid"],
28
+ ["pid"],
29
+ ondelete="CASCADE",
30
+ )
31
+
32
+
33
+ def downgrade() -> None:
34
+ # Drop the cascade foreign key constraint
35
+ op.drop_constraint("input_states_pid_fkey", "input_states", type_="foreignkey")
36
+
37
+ # Recreate the original foreign key constraint without cascade
38
+ op.create_foreign_key(
39
+ "input_states_pid_fkey",
40
+ "input_states",
41
+ "processes",
42
+ ["pid"],
43
+ ["pid"],
44
+ )
@@ -597,6 +597,12 @@ def convert_to_in_use_by_relation(obj: Any) -> dict[str, str]:
597
597
  return {"subscription_instance_id": str(obj.subscription_instance_id), "subscription_id": str(obj.subscription_id)}
598
598
 
599
599
 
600
+ def build_domain_model(subscription_model: SubscriptionModel) -> dict:
601
+ """Create a subscription dict from the SubscriptionModel."""
602
+ with cache_subscription_models():
603
+ return subscription_model.model_dump()
604
+
605
+
600
606
  def build_extended_domain_model(subscription_model: SubscriptionModel) -> dict:
601
607
  """Create a subscription dict from the SubscriptionModel with additional keys."""
602
608
  from orchestrator.settings import app_settings
@@ -1,17 +1,21 @@
1
1
  from uuid import UUID
2
2
 
3
3
  from orchestrator.domain.base import SubscriptionModel
4
- from orchestrator.services.subscriptions import _generate_etag, build_extended_domain_model
4
+ from orchestrator.services.subscriptions import _generate_etag, build_domain_model, build_extended_domain_model
5
5
  from orchestrator.utils.redis import from_redis
6
6
 
7
7
 
8
- async def get_subscription_dict(subscription_id: UUID) -> tuple[dict, str]:
8
+ async def get_subscription_dict(subscription_id: UUID, inject_inuseby: bool = True) -> tuple[dict, str]:
9
9
  """Helper function to get subscription dict by uuid from db or cache."""
10
10
 
11
11
  if cached_model := from_redis(subscription_id):
12
12
  return cached_model # type: ignore
13
13
 
14
14
  subscription_model = SubscriptionModel.from_subscription(subscription_id)
15
- subscription = build_extended_domain_model(subscription_model)
15
+
16
+ if not inject_inuseby:
17
+ subscription = build_domain_model(subscription_model)
18
+ else:
19
+ subscription = build_extended_domain_model(subscription_model)
16
20
  etag = _generate_etag(subscription)
17
21
  return subscription, etag
@@ -58,7 +58,7 @@ def from_redis(subscription_id: UUID) -> tuple[PY_JSON_TYPES, str] | None:
58
58
 
59
59
  if app_settings.ENABLE_SUBSCRIPTION_MODEL_OPTIMIZATIONS:
60
60
  # TODO #900 remove toggle and remove usage of this function in get_subscription_dict
61
- log.warning("Using SubscriptionModel optimization, not loading subscription from cache")
61
+ log.info("Using SubscriptionModel optimization, not loading subscription from redis cache")
62
62
  return None
63
63
 
64
64
  if caching_models_enabled():
orchestrator/workflow.py CHANGED
@@ -223,7 +223,11 @@ def step(name: str) -> Callable[[StepFunc], Step]:
223
223
  def decorator(func: StepFunc) -> Step:
224
224
  @functools.wraps(func)
225
225
  def wrapper(state: State) -> Process:
226
- with bound_contextvars(func=func.__qualname__):
226
+ with bound_contextvars(
227
+ func=func.__qualname__,
228
+ workflow_name=state.get("workflow_name"),
229
+ process_id=state.get("process_id"),
230
+ ):
227
231
  step_in_inject_args = inject_args(func)
228
232
  try:
229
233
  with transactional(db, logger):
@@ -248,7 +252,11 @@ def retrystep(name: str) -> Callable[[StepFunc], Step]:
248
252
  def decorator(func: StepFunc) -> Step:
249
253
  @functools.wraps(func)
250
254
  def wrapper(state: State) -> Process:
251
- with bound_contextvars(func=func.__qualname__):
255
+ with bound_contextvars(
256
+ func=func.__qualname__,
257
+ workflow_name=state.get("workflow_name"),
258
+ process_id=state.get("process_id"),
259
+ ):
252
260
  step_in_inject_args = inject_args(func)
253
261
  try:
254
262
  with transactional(db, logger):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 3.2.0rc1
3
+ Version: 3.2.2
4
4
  Summary: This is the orchestrator workflow engine.
5
5
  Requires-Python: >=3.11,<3.14
6
6
  Classifier: Intended Audience :: Information Technology
@@ -47,6 +47,7 @@ Requires-Dist: python-rapidjson>=1.18,<1.21
47
47
  Requires-Dist: pytz==2025.2
48
48
  Requires-Dist: redis==5.1.1
49
49
  Requires-Dist: schedule==1.1.0
50
+ Requires-Dist: semver==3.0.4
50
51
  Requires-Dist: sentry-sdk[fastapi]~=2.25.1
51
52
  Requires-Dist: SQLAlchemy==2.0.40
52
53
  Requires-Dist: SQLAlchemy-Utils==0.41.2
@@ -57,8 +58,8 @@ Requires-Dist: nwa-stdlib~=1.9.0
57
58
  Requires-Dist: oauth2-lib~=2.4.0
58
59
  Requires-Dist: tabulate==0.9.0
59
60
  Requires-Dist: strawberry-graphql>=0.246.2
60
- Requires-Dist: pydantic-forms~=1.4.0
61
- Requires-Dist: celery~=5.4.0 ; extra == "celery"
61
+ Requires-Dist: pydantic-forms>=1.4.0, <=2.0.0
62
+ Requires-Dist: celery~=5.5.1 ; extra == "celery"
62
63
  Requires-Dist: toml ; extra == "dev"
63
64
  Requires-Dist: bumpversion ; extra == "dev"
64
65
  Requires-Dist: mypy_extensions ; extra == "dev"
@@ -1,4 +1,4 @@
1
- orchestrator/__init__.py,sha256=DaljR2yKiWNT76zKyWAG4RD4RQ8cmT64er6J5BXvgOE,1066
1
+ orchestrator/__init__.py,sha256=mMFQmoeaP3qy5_hoq-R3v0-C8-hJNlXSTQb79ERXOKk,1063
2
2
  orchestrator/app.py,sha256=VN54_Zsx5x_3ym8aFadATg67a4J5lv8H-pxnPlR3RkM,11668
3
3
  orchestrator/exception_handlers.py,sha256=UsW3dw8q0QQlNLcV359bIotah8DYjMsj2Ts1LfX4ClY,1268
4
4
  orchestrator/log_config.py,sha256=1tPRX5q65e57a6a_zEii_PFK8SzWT0mnA5w2sKg4hh8,1853
@@ -8,7 +8,7 @@ orchestrator/settings.py,sha256=MTG7gnmbQYwUjAnhvX4Y3MEqmX8vIpAEC0lhDafa1zw,4039
8
8
  orchestrator/targets.py,sha256=ykjTGK7CozFaltNaxQcK90P4Cc1Qvf-W8dFztxtZhRQ,776
9
9
  orchestrator/types.py,sha256=qzs7xx5AYRmKbpYRyJJP3wuDb0W0bcAzefCN0RWLAco,15459
10
10
  orchestrator/version.py,sha256=b58e08lxs47wUNXv0jXFO_ykpksmytuzEXD4La4W-NQ,1366
11
- orchestrator/workflow.py,sha256=BITGaV8Pw4d9F-XCkaNGt7qoKO1fhklCq-SPmhgWdKI,43781
11
+ orchestrator/workflow.py,sha256=T_3Z1PrlF70C16ehAthKRF1hd3jpwV-MREDVxSLfxOw,44063
12
12
  orchestrator/api/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
13
13
  orchestrator/api/error_handling.py,sha256=YrPCxSa-DSa9KwqIMlXI-KGBGnbGIW5ukOPiikUH9E4,1502
14
14
  orchestrator/api/helpers.py,sha256=s0QRHYw8AvEmlkmRhuEzz9xixaZKUF3YuPzUVHkcoXk,6933
@@ -17,7 +17,7 @@ orchestrator/api/api_v1/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n
17
17
  orchestrator/api/api_v1/api.py,sha256=m4iDktsSpzxUDaudkdgXeZ83a6B4wfc3pczQsa-Pb-8,2866
18
18
  orchestrator/api/api_v1/endpoints/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
19
19
  orchestrator/api/api_v1/endpoints/health.py,sha256=iaxs1XX1_250_gKNsspuULCV2GEMBjbtjsmfQTOvMAI,1284
20
- orchestrator/api/api_v1/endpoints/processes.py,sha256=UDYr7c9ypY_GS3jL_6vL1sRpTDCCSRyBa0XkgRVGZJs,13570
20
+ orchestrator/api/api_v1/endpoints/processes.py,sha256=i5GRoszvdmpZqOxSqON83DNuc0UIV-ohOqbAa0OhESE,13564
21
21
  orchestrator/api/api_v1/endpoints/product_blocks.py,sha256=kZ6ywIOsS_S2qGq7RvZ4KzjvaS1LmwbGWR37AKRvWOw,2146
22
22
  orchestrator/api/api_v1/endpoints/products.py,sha256=BfFtwu9dZXEQbtKxYj9icc73GKGvAGMR5ytyf41nQlQ,3081
23
23
  orchestrator/api/api_v1/endpoints/resource_types.py,sha256=gGyuaDyOD0TAVoeFGaGmjDGnQ8eQQArOxKrrk4MaDzA,2145
@@ -65,7 +65,7 @@ orchestrator/cli/generator/generator/settings.py,sha256=_IhRnQ7bpGjqYtFo-OiLky25
65
65
  orchestrator/cli/generator/generator/translations.py,sha256=ip0RghW2bY7CoemEab9SxSgjizI44G35AoNHuBsgvrU,1878
66
66
  orchestrator/cli/generator/generator/unittest.py,sha256=cLbPRjBQyKFLDNABoTR3WQ21EisAodHs5Q3EGx4VQ6c,4541
67
67
  orchestrator/cli/generator/generator/validations.py,sha256=yLv_S_ZBOc_z5DNjz4JY50A4ErWeOk8rk5orty9hwbM,1815
68
- orchestrator/cli/generator/generator/workflow.py,sha256=IHjF4XSlfveQlwWZqoQne6Y7tua4-QdqaR_UV4HhLDc,7968
68
+ orchestrator/cli/generator/generator/workflow.py,sha256=8mkb0a2zisb6iUFq8ICrOm2D3I_6fxxrit_LPxViSzk,8406
69
69
  orchestrator/cli/generator/products/workshop/circuit.yaml,sha256=AyRUWj61GUBoW9k9z1yfn9vZYXy52PiDMOayAr_FUdE,759
70
70
  orchestrator/cli/generator/products/workshop/node.yaml,sha256=4498iAjH6wHQAiRqsvczpgjJnyO8iCLokT6MgKwlxXQ,538
71
71
  orchestrator/cli/generator/products/workshop/user.yaml,sha256=92VrWlU1-C6KI8iONO-LGWt-U45rbZpCxhzF2Ags3iw,532
@@ -82,7 +82,7 @@ orchestrator/cli/generator/templates/enums.j2,sha256=pmx7_DeoE4X9u83_In18C97XqZP
82
82
  orchestrator/cli/generator/templates/lazy_workflow_instance.j2,sha256=BYB6LwE19OarY7_7Ovej5rqppZWtjiDkG7TDK5dYU7Y,523
83
83
  orchestrator/cli/generator/templates/list_definitions.j2,sha256=XS-F5XXy4HOdsZ-xahprwxfhU0UaiF4VeopkIxfoado,277
84
84
  orchestrator/cli/generator/templates/macros.j2,sha256=fEODRym4gLfL40w9OelXFMDtAjtzmN5nccWDk86oTNI,904
85
- orchestrator/cli/generator/templates/modify_product.j2,sha256=we2TqyHD5L8dprnOitmwBT8MU7PzVG8iMrzdxXquDfM,4751
85
+ orchestrator/cli/generator/templates/modify_product.j2,sha256=M1WDMmPwfXpUcuZUa-H5GnlKAr1t_xCQliLa66FI-YU,5057
86
86
  orchestrator/cli/generator/templates/new_product_migration.j2,sha256=d67I9haNkKdzWzNT0f1S6-UhG86fOWEohF0Al7NmXmA,3023
87
87
  orchestrator/cli/generator/templates/product.j2,sha256=gcN1poWRuGWbsLrQv0Z8SXO6MGuXBHBr33UvQtqsF8E,1241
88
88
  orchestrator/cli/generator/templates/product_block.j2,sha256=X5ynyBG39UiYekPHms7IkSHmxq2j-2OrhAYsFaRqktU,2454
@@ -143,7 +143,7 @@ orchestrator/distlock/managers/memory_distlock_manager.py,sha256=HWQafcVKBF-Cka_
143
143
  orchestrator/distlock/managers/redis_distlock_manager.py,sha256=DXtMhC8qtxiFO6xU9qYXHZQnCLjlmGBpeyfLA0vbRP0,3369
144
144
  orchestrator/domain/__init__.py,sha256=20DhXQPKY0g3rTgCkRlNDY58sLviToOVF8NPoex9WJc,936
145
145
  orchestrator/domain/base.py,sha256=26UbHKXqI99w8SyS-Kjj4DF8IbgPNOh8iDPP6e3GEsA,70996
146
- orchestrator/domain/context_cache.py,sha256=eIOP0xESBdNSPw3DMWxxSOzpUzVVgnMMyMhGkl99-Xc,2228
146
+ orchestrator/domain/context_cache.py,sha256=vT1a01MBSBIaokoShK9KwjItd7abNmz7cXaF67VRZK8,2508
147
147
  orchestrator/domain/customer_description.py,sha256=v7o6TTN4oc6bWHZU-jCT-fUYvkeYahbpXOwlKXofuI8,3360
148
148
  orchestrator/domain/helpers.py,sha256=D9O2duhCAZGmm39u-9ggvU-X2JsCbIS607kF77-r8QM,2549
149
149
  orchestrator/domain/lifecycle.py,sha256=kGR0AFVOSUBlzdhgRr11CUnF26wbBYIjz8uKb_qPCg0,2922
@@ -158,9 +158,10 @@ orchestrator/forms/validators/product_id.py,sha256=u5mURLT0pOhbFLdwvYcy2_2fXMt35
158
158
  orchestrator/graphql/__init__.py,sha256=avq8Yg3Jr_9pJqh7ClyIAOX7YSg1eM_AWmt5C3FRYUY,1440
159
159
  orchestrator/graphql/autoregistration.py,sha256=pF2jbMKG26MvYoMSa6ZpqpHjVks7_NvSRFymHTgmfjs,6342
160
160
  orchestrator/graphql/pagination.py,sha256=iqVDn3GPZpiQhEydfwkBJLURY-X8wwUphS8Lkeg0BOc,2413
161
- orchestrator/graphql/schema.py,sha256=uAD7cPqjxhHGDTilTLqmovtQsm7nnv-9adLk7YHPt4I,9098
161
+ orchestrator/graphql/schema.py,sha256=gwZ3nAgKL0zlpc-aK58hSUAGPVD11Tb3aRSSK9hC39I,9204
162
162
  orchestrator/graphql/types.py,sha256=tF3B2n_4AmNIpNuA4Xg-kB-q9Xy7HU8opfDDPSX26nw,5045
163
163
  orchestrator/graphql/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
164
+ orchestrator/graphql/extensions/model_cache.py,sha256=1uhMRjBs9eK7zJ1Y6P6BopX06822w2Yh9jliwYvG6yQ,1085
164
165
  orchestrator/graphql/extensions/stats.py,sha256=pGhEBQg45XvqZhRobcrCSGwt5AGmR3gflsm1dYiIg5g,2018
165
166
  orchestrator/graphql/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
167
  orchestrator/graphql/loaders/subscriptions.py,sha256=31zE2WC7z-tPIUmVpU1QWOJvNbLvF7sYgY7JAQ6OPJg,1856
@@ -189,7 +190,7 @@ orchestrator/graphql/schemas/product_block.py,sha256=Qk9cbA6vm7ZPrhdgPHatKRuy6Ty
189
190
  orchestrator/graphql/schemas/resource_type.py,sha256=s5d_FwQXL2-Sc-IDUxTJun5qFQ4zOP4-XcHF9ql-t1g,898
190
191
  orchestrator/graphql/schemas/settings.py,sha256=drhm5VcLmUbiYAk6WUSJcyJqjNM96E6GvpxVdPAobnA,999
191
192
  orchestrator/graphql/schemas/strawberry_pydantic_patch.py,sha256=CjNUhTKdYmLiaem-WY_mzw4HASIeaZitxGF8pPocqVw,1602
192
- orchestrator/graphql/schemas/subscription.py,sha256=_ra7MG9P2w7_WMiMx-zTOaAMinGlTKN4gwE9vej-5V8,9573
193
+ orchestrator/graphql/schemas/subscription.py,sha256=RnnxPgha_7D4Ii87cp3eyBV93_RZIryzWyVHZwyn3eA,9603
193
194
  orchestrator/graphql/schemas/version.py,sha256=HSzVg_y4Sjd5_H5rRUtu3FJKOG_8ifhvBNt_qjOtC-E,92
194
195
  orchestrator/graphql/schemas/workflow.py,sha256=0UWU0HGTiAC_5Wzh16clBd74JoYHrr38YIGV86q-si0,1276
195
196
  orchestrator/graphql/utils/__init__.py,sha256=1JvenzEVW1CBa1sGVI9I8IWnnoXIkb1hneDqph9EEZY,524
@@ -197,7 +198,7 @@ orchestrator/graphql/utils/create_resolver_error_handler.py,sha256=PpQMVwGrE9t0n
197
198
  orchestrator/graphql/utils/get_query_loaders.py,sha256=abS_HJ7K9een78gMiGq3IhwGwxQXHvZygExe0h_t9ns,815
198
199
  orchestrator/graphql/utils/get_selected_fields.py,sha256=0hBcQkU-7TNVO_KG-MmLItKm0O3gmbqoxXNkLHO-wHo,1002
199
200
  orchestrator/graphql/utils/get_selected_paths.py,sha256=H0btESeOr3_VB7zy5Cx25OS0uzBcg2Y1I-arAmSOnsQ,1382
200
- orchestrator/graphql/utils/get_subscription_product_blocks.py,sha256=U_WJfi1GWTIK373q8qLVPfYD1zhso-TjyMk3awizx3A,4818
201
+ orchestrator/graphql/utils/get_subscription_product_blocks.py,sha256=NReel2uZuiretN62xEXUIFVXgJZUIKSQ3dUsSWCCzT4,5090
201
202
  orchestrator/graphql/utils/is_query_detailed.py,sha256=ESQiM8OyhGF5vEE__cLV61oEIfnFvznoNCxi02rMTsE,2156
202
203
  orchestrator/graphql/utils/override_class.py,sha256=blwPXVHxLyXQga3KjiDzWozmMhHEWNrhLL_GDmoj6y0,1373
203
204
  orchestrator/graphql/utils/to_graphql_result_page.py,sha256=8ObkJP8reVf-TQOQVPKv1mNdfmSEMS1sG7s_-T7-pUU,902
@@ -229,9 +230,10 @@ orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_
229
230
  orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.sql,sha256=mhPnqjG5H3W8_BD7w5tYzXUQSxFOM7Rahn_MudEPTIE,5383
230
231
  orchestrator/migrations/versions/schema/2025-01-08_4c5859620539_add_version_column_to_subscription.py,sha256=xAhe74U0ZiVRo9Z8Uq7491RBbATMMUnYpTBjbG-BYL0,1690
231
232
  orchestrator/migrations/versions/schema/2025-01-19_4fjdn13f83ga_add_validate_product_type_task.py,sha256=O0GfCISIDnyohGf3Ot_2HKedGRbMqLVox6t7Wd3PMvo,894
232
- orchestrator/migrations/versions/schema/2025-02-12_bac6be6f2b4f_added_input_state_table.py,sha256=0vBDGltmOs_gcTTYlWBNOgItzqCXm8qqT02jZfTpL5c,1753
233
+ orchestrator/migrations/versions/schema/2025-02-12_bac6be6f2b4f_added_input_state_table.py,sha256=RZpLkWP1yekeZ68feO5v4LZYluKvnnIKRNDCE4tI9HM,1753
233
234
  orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.py,sha256=jtwDFOh-NlE31aH5dFmbynb23TZN6Mkzevxx-KLP7KE,776
234
235
  orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.sql,sha256=hPldk0DAesUbHv3Qd_N7U-cAk-t1wIgxt4FOA120gQ8,1776
236
+ orchestrator/migrations/versions/schema/2025-04-09_fc5c993a4b4a_add_cascade_constraint_on_processes_.py,sha256=6kHRNSZxUze2jy7b8uRvkt5mzsax10Z-Z3lsACtPLRM,1067
235
237
  orchestrator/schedules/__init__.py,sha256=JnnaglfK1qYUBKI6Dd9taV-tCZIPlAdAkHtnkJDMXxY,1066
236
238
  orchestrator/schedules/resume_workflows.py,sha256=kSotzTAXjX7p9fpSYiGOpuxuTQfv54eRFAe0YSG0DHc,832
237
239
  orchestrator/schedules/scheduling.py,sha256=ehtwgpbvMOk1jhn-hHgVzg_9wLJkI6l3mRY3DcO9ZVY,1526
@@ -260,7 +262,7 @@ orchestrator/services/products.py,sha256=BP4KyE8zO-8z7Trrs5T6zKBOw53S9BfBJnHWI3p
260
262
  orchestrator/services/resource_types.py,sha256=_QBy_JOW_X3aSTqH0CuLrq4zBJL0p7Q-UDJUcuK2_qc,884
261
263
  orchestrator/services/settings.py,sha256=u-834F4KWloXS8zi7R9mp-D3cjl-rbVjKJRU35IqhXo,2723
262
264
  orchestrator/services/subscription_relations.py,sha256=9C126TUfFvyBe7y4x007kH_dvxJ9pZ1zSnaWeH6HC5k,12261
263
- orchestrator/services/subscriptions.py,sha256=Mb1GvtpU5QQkyxB4leh5xMkbuBdKWr-CVNNbHyUj5qE,27845
265
+ orchestrator/services/subscriptions.py,sha256=u1qkCk7FuniJseQjnuDWiIlqy9ok4SY8nWUyLeJ11No,28068
264
266
  orchestrator/services/tasks.py,sha256=NjPkuauQoh9UJDcjA7OcKFgPk0i6NoKdDO7HlpGbBJ8,6575
265
267
  orchestrator/services/translations.py,sha256=GyP8soUFGej8AS8uulBsk10CCK6Kwfjv9AHMFm3ElQY,1713
266
268
  orchestrator/services/workflows.py,sha256=oH7klit4kv2NGo-BACWA0ZtajVMSJAxG5m-kM6TXIMI,3742
@@ -273,11 +275,11 @@ orchestrator/utils/enrich_process.py,sha256=o_QSy5Q4wn1SMHhzVOw6bp7uhDXr7GhAIWRD
273
275
  orchestrator/utils/errors.py,sha256=6FxvXrITmRjP5bYnJJ3CxjAwA5meNjRAVYouz4TWKkU,4653
274
276
  orchestrator/utils/fixed_inputs.py,sha256=pnL6I_19VMp_Bny8SYjSzVFNvTFDyeCxFFOWGhTnDiQ,2665
275
277
  orchestrator/utils/functional.py,sha256=X1MDNwHmkU3-8mFb21m31HGlcfc5TygliXR0sXN3-rU,8304
276
- orchestrator/utils/get_subscription_dict.py,sha256=fkgDM54hn5YGUP9_2MOcJApJK1Z6c_Rl6sJERsrOy6M,686
278
+ orchestrator/utils/get_subscription_dict.py,sha256=EoSlFUXer_Kc5G0PjDPeujugZ76kKoPrjRr4Mg4HrzY,839
277
279
  orchestrator/utils/get_updated_properties.py,sha256=egVZ0R5LNJ4e51Z8SXlU8cmb4tXxG-xb1d7OKwh-7xI,1322
278
280
  orchestrator/utils/helpers.py,sha256=NjUF3IvWdnLulliP8-JQvGGGpHrh0vs0Vm092ynw-ss,3212
279
281
  orchestrator/utils/json.py,sha256=7386sdqkrKYyy4sbn5NscwctH_v1hLyw5172P__rU3g,8341
280
- orchestrator/utils/redis.py,sha256=AGWVPt83fjRz0If0PLMlEshUYiDaJXKJdiocIr5__1s,7300
282
+ orchestrator/utils/redis.py,sha256=E5uPFCOlS1n_jv0xoaS1fuLnVv-shQn0K1hzpVwUWZY,7303
281
283
  orchestrator/utils/redis_client.py,sha256=9rhsvedjK_CyClAjUicQyge0mVIViATqKFGZyjBY3XA,1384
282
284
  orchestrator/utils/search_query.py,sha256=ji5LHtrzohGz6b1IG41cnPdpWXzLEzz4SGWgHly_yfU,16205
283
285
  orchestrator/utils/state.py,sha256=RYKVlvKDBfsBdDk9wHjZKBTlQJbV4SqtCotAlTA2-bI,14021
@@ -298,7 +300,7 @@ orchestrator/workflows/tasks/resume_workflows.py,sha256=MzJqlSXUvKStkT7NGzxZyRlf
298
300
  orchestrator/workflows/tasks/validate_product_type.py,sha256=UVX_6Kh8ueQs8ujLawnKVDdNc8UhWp_u69aNA8okR_w,3184
299
301
  orchestrator/workflows/tasks/validate_products.py,sha256=i6jQME9N8sZZWo4pkNOS1Zgwh3eB2w66DnJi9k93yNk,8521
300
302
  orchestrator/workflows/translations/en-GB.json,sha256=ST53HxkphFLTMjFHonykDBOZ7-P_KxksktZU3GbxLt0,846
301
- orchestrator_core-3.2.0rc1.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
302
- orchestrator_core-3.2.0rc1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
303
- orchestrator_core-3.2.0rc1.dist-info/METADATA,sha256=FwPfK9U6vXuYqVzjbf7ObcO3HtBfCktD58FXTvM0gJw,4994
304
- orchestrator_core-3.2.0rc1.dist-info/RECORD,,
303
+ orchestrator_core-3.2.2.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
304
+ orchestrator_core-3.2.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
305
+ orchestrator_core-3.2.2.dist-info/METADATA,sha256=OAszxQW45Nht7C2FhlviZ1H85z2LGfjFePbrkeKWmeY,5029
306
+ orchestrator_core-3.2.2.dist-info/RECORD,,