Skip to content

Commit f894c95

Browse files
committed
Map default values to new model data during migration
1 parent 0b89e1c commit f894c95

File tree

3 files changed

+30
-10
lines changed

3 files changed

+30
-10
lines changed

ayon_server/addons/addon.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,9 @@ async def get_studio_overrides(
266266
)
267267

268268
try:
269-
return target_addon.convert_settings_overrides(self.version, data)
269+
return await target_addon.convert_settings_overrides(
270+
self.version, overrides=data
271+
)
270272
except Exception:
271273
log_traceback(f"Unable to migrate {self} settings to {as_version}")
272274
return {}
@@ -305,7 +307,9 @@ async def get_project_overrides(
305307
)
306308

307309
try:
308-
return target_addon.convert_settings_overrides(self.version, data)
310+
return await target_addon.convert_settings_overrides(
311+
self.version, overrides=data
312+
)
309313
except Exception:
310314
log_traceback(f"Unable to migrate {self} settings to {as_version}")
311315
return {}
@@ -346,7 +350,9 @@ async def get_project_site_overrides(
346350
)
347351

348352
try:
349-
return target_addon.convert_settings_overrides(self.version, data)
353+
return await target_addon.convert_settings_overrides(
354+
self.version, overrides=data
355+
)
350356
except Exception:
351357
log_traceback(f"Unable to migrate {self} settings to {as_version}")
352358
return {}
@@ -487,7 +493,7 @@ async def get_default_settings(self) -> BaseSettingsModel | None:
487493
return None
488494
return model()
489495

490-
def convert_settings_overrides(
496+
async def convert_settings_overrides(
491497
self,
492498
source_version: str,
493499
overrides: dict[str, Any],
@@ -507,7 +513,7 @@ def convert_settings_overrides(
507513
has been changed from `str` to `list[str]`, you may use:
508514
509515
```python
510-
def convert_str_to_list_str(value: str | list[str]) -> list[str]:
516+
await def convert_str_to_list_str(value: str | list[str]) -> list[str]:
511517
if isinstance(value, str):
512518
return [value]
513519
elif isinstance(value, list):
@@ -527,5 +533,8 @@ def convert_str_to_list_str(value: str | list[str]) -> list[str]:
527533
model_class = self.get_settings_model()
528534
if model_class is None:
529535
return {}
530-
result = migrate_settings(overrides, new_model_class=model_class)
536+
defaults = await self.get_default_settings()
537+
result = migrate_settings(
538+
overrides, new_model_class=model_class, defaults=defaults.dict()
539+
)
531540
return result.dict(exclude_unset=True, exclude_none=True, exclude_defaults=True)

ayon_server/settings/common.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import re
33
from typing import Any, Callable, Type
44

5+
from nxtools import logging
56
from pydantic import BaseModel, ValidationError, parse_obj_as
67

78
from ayon_server.utils import json_dumps, json_loads
@@ -28,6 +29,7 @@ class Config:
2829
def migrate_settings(
2930
old_data: dict[str, Any],
3031
new_model_class: Type[BaseSettingsModel],
32+
defaults: dict[str, Any],
3133
custom_conversions: dict[str, Callable[[Any], Any]] = {},
3234
parent_key: str = "",
3335
) -> Any:
@@ -51,27 +53,36 @@ def migrate_settings(
5153
migrate_settings(
5254
old_value,
5355
field_type.type_,
56+
defaults.get(field_name, []),
5457
custom_conversions,
5558
key_path,
5659
)
5760
for old_value in old_value
5861
]
59-
else:
62+
elif isinstance(old_value, dict):
6063
new_instance_data[field_name] = migrate_settings(
6164
old_value,
6265
field_type.outer_type_,
66+
defaults.get(field_name, {}),
6367
custom_conversions,
6468
key_path,
6569
)
70+
else:
71+
logging.warning(
72+
f"Unsupported type for {key_path} model: {old_value}"
73+
)
6674
else:
6775
try:
6876
validated_value = parse_obj_as(field_type.outer_type_, old_value)
6977
new_instance_data[field_name] = validated_value
7078
except ValidationError:
79+
logging.warning(
80+
f"Failed to validate {field_name} with value {old_value}"
81+
)
7182
# Skip incompatible fields
7283
continue
7384
else:
74-
# Skip fields not in the old data, allowing new model's defaults to apply
75-
continue
85+
if field_name in defaults:
86+
new_instance_data[field_name] = defaults.get(field_name, None)
7687

7788
return new_model_class.parse_obj(new_instance_data)

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "ayon-server"
3-
version = "1.0.5"
3+
version = "1.0.6"
44
description = ""
55
authors = ["Ynput <info@ynput.io>"]
66

0 commit comments

Comments
 (0)