diff --git a/src/py/mat3ra/mode/method.py b/src/py/mat3ra/mode/method.py index 67ad8c2..b43124e 100644 --- a/src/py/mat3ra/mode/method.py +++ b/src/py/mat3ra/mode/method.py @@ -9,6 +9,14 @@ class Method(BaseMethod, InMemoryEntityPydantic): data: Dict[str, Any] = Field(default_factory=dict, exclude=True) + @classmethod + def get_default_config(cls) -> Dict[str, Any]: + """Return the default configuration for a Method.""" + return { + "type": "pseudopotential", + "subtype": "us", + } + def clone_without_data(self) -> "Method": cloned = self.clone() cloned.data = {} diff --git a/src/py/mat3ra/mode/models/dft.py b/src/py/mat3ra/mode/models/dft.py index 0f681df..83185d6 100644 --- a/src/py/mat3ra/mode/models/dft.py +++ b/src/py/mat3ra/mode/models/dft.py @@ -1,8 +1,8 @@ -from typing import List, Union +from typing import Any, List, Union from mat3ra.esse.models.core.primitive.slugified_entry import SlugifiedEntry from mat3ra.esse.models.model.mixins.dft.gga_functional import Functional -from pydantic import Field +from pydantic import Field, field_validator from ..model import Model @@ -12,3 +12,35 @@ class DFTModel(Model): refiners: List[SlugifiedEntry] = Field(default_factory=list) modifiers: List[SlugifiedEntry] = Field(default_factory=list) + @field_validator("functional", mode="before") + @classmethod + def _coerce_functional(cls, value: Any) -> Union[SlugifiedEntry, None]: + """Convert string to SlugifiedEntry if needed.""" + if value is None: + return None + if isinstance(value, SlugifiedEntry): + return value + if isinstance(value, str): + return SlugifiedEntry(name=value, slug=value) + if isinstance(value, dict): + return SlugifiedEntry(**value) + return value + + @field_validator("refiners", "modifiers", mode="before") + @classmethod + def _coerce_list_of_entries(cls, value: Any) -> List[SlugifiedEntry]: + """Convert list of strings to list of SlugifiedEntry if needed.""" + if not value: + return [] + result = [] + for item in value: + if isinstance(item, SlugifiedEntry): + result.append(item) + elif isinstance(item, str): + result.append(SlugifiedEntry(name=item, slug=item)) + elif isinstance(item, dict): + result.append(SlugifiedEntry(**item)) + else: + result.append(item) + return result +