Source code for ewoksbm29.models.ispyb

import datetime
import os
from typing import List
from typing import Optional
from typing import Union

from pydantic import BaseModel
from pydantic import field_validator


[docs] class ISPyBMetadata(BaseModel): experiment_id: Optional[int] = None run_number: Union[int, List[int], None] = None proposal_name: Optional[str] = None proposal_session_name: Optional[str] = None beamline: Optional[str] = None sample_name: Optional[str] = None archive_root_directory: str = "/data/pyarch" @property def ispyb_parameters(self) -> dict: return { "experiment_id": self.experiment_id, "run_number": self.run_number, "pyarch": self.archive_directory, }
[docs] @field_validator("proposal_session_name") @classmethod def check_date(cls, value: Optional[str]) -> Optional[str]: if value is None: return try: datetime.datetime.strptime(value, "%Y%m%d") except ValueError: raise ValueError("proposal_session_name must be in YYYYmmdd format") return value
[docs] @field_validator("proposal_name", "beamline") @classmethod def lower(cls, value: Optional[str]) -> Optional[str]: if value is None: return return value.lower()
@property def archive_directory(self) -> Optional[str]: args = ( self.archive_root_directory, self.year, self.beamline, self.proposal_name, self.proposal_session_name, self.sample_name, ) if any(p is None for p in args): return return os.path.join(*args) @property def year(self) -> Optional[str]: if self.proposal_session_name is None: return return self.proposal_session_name[:4]