Source code for simstack.core.process_results
from typing import Any, Tuple, List, Union
from odmantic import ObjectId, Model
from simstack.core.simstack_result import SimstackResult
from simstack.models import BooleanData
from simstack.models.files import FileStack
from simstack.core.context import context
from simstack.models import ModelMapping
from simstack.models.file_list import FileListModel
from simstack.models.simstack_model import is_simstack_model
from simstack.models.named_data_reference import NamedDataReference
import logging
logger = logging.getLogger("process_results")
[docs]
async def process_result_helper(
result: Union[SimstackResult,Model, bool, BooleanData], task_id: str = "NA"
) -> Tuple[List[NamedDataReference], List[Model]]:
"""
Computes the results_references and returns a List[Model].
It works if the result is a SimstackResult, a single Model or a bool.
"""
results_references: List[NamedDataReference] = []
result_models: List[Model] = []
if isinstance(result, bool) or isinstance(result, BooleanData) :
# Convert bool to BooleanData
if isinstance(result, bool):
boolean_data = BooleanData(value=result)
else:
boolean_data = result
result_model = await context.db.save(boolean_data)
result_models.append(result_model)
results_references.append(NamedDataReference.from_variable(
boolean_data,
variable_name="value",
task_id=task_id
))
return results_references, result_models
if isinstance(result, SimstackResult):
# check if there are files in the result
if len(result.files) > 0:
file_list_model = FileListModel()
# this goes into the results must be a model
for file_stack in result.files:
if file_stack:
if isinstance(file_stack, FileStack):
logger.info(f"Task task_id: {task_id} saving file: {file_stack.name} {file_stack.id}")
file_list_model.append(file_stack)
else:
logger.error(f"Task task_id: {task_id} cannot save file: FileStack expected but got {file_stack}")
raise ValueError(
f"Task task_id: {task_id} cannot save file: FileStack expected but got {type(file_stack)}"
)
else:
logger.error(f"Task task_id: {task_id} saving file is NONE")
raise ValueError("saving file is NONE")
saved = await context.db.save(file_list_model)
results_references.append(NamedDataReference.from_variable(
saved,
variable_name="files",
task_id=task_id
))
result_models.append(saved)
extra = getattr(result, "__pydantic_extra__", {})
if extra is None:
extra = {}
for key, value in extra.items():
# gather only non-callable public attributes
if (
not key.startswith("_")
and not callable(value)
and is_simstack_model(value)
):
if isinstance(value, Model):
result_model = await context.db.save(value)
result_models.append(result_model)
results_references.append(NamedDataReference.from_variable(
result_model,
variable_name=key,
task_id=task_id
))
else:
raise ValueError(
f"task_id: {task_id} cannot save model: {key} is not a model"
)
elif is_simstack_model(result) and isinstance(result, Model):
result_model = await context.db.save(result)
result_models.append(result_model)
results_references.append(NamedDataReference.from_variable(
result_model,
variable_name=result.__class__.__name__,
task_id=task_id
))
return results_references, result_models