Source code for qcportal.tasks.models

from pydantic import Field, model_validator, field_validator

from qcportal.base_models import RestModelBase
from qcportal.common_types import LowerStr, QCPortalBytes
from qcportal.managers import ManagerName


[docs] class TaskClaimBody(RestModelBase): name_data: ManagerName """Name information about this manager""" programs: dict[LowerStr, list[str]] """Subset of programs to claim tasks for""" compute_tags: list[str] """Subset of tags to claim tasks from""" limit: int """Limit on the number of tasks to claim"""
[docs] @field_validator("compute_tags", mode="after") @classmethod def validate_tags(cls, v): v = [x for x in v if len(x) > 0] if len(v) == 0: raise ValueError("'tags' field contains no non-zero-length tags") return list(dict.fromkeys(v)) # remove duplicates, maintaining order (in python 3.6+)
[docs] @field_validator("programs", mode="after") @classmethod def validate_programs(cls, v): # Remove programs of zero length v = {x: y for x, y in v.items() if len(x) > 0} if len(v) == 0: raise ValueError("'programs' field contains no non-zero-length programs") return v
@model_validator(mode="before") @classmethod def _old_tags(cls, values): if isinstance(values, dict): if "tags" in values: values["compute_tags"] = values.pop("tags") return values
[docs] class TaskReturnBody(RestModelBase): name_data: ManagerName """Name information about this manager""" results_compressed: dict[int, QCPortalBytes] """Compressed results of the completed computations, keyed by task id"""