Source code for xnatctl.models.base

"""Base model with common fields for all XNAT resources."""

from __future__ import annotations

from datetime import datetime
from typing import Any

from pydantic import BaseModel as PydanticBaseModel
from pydantic import ConfigDict, Field


[docs] class BaseModel(PydanticBaseModel): """Base model with common configuration.""" model_config = ConfigDict( populate_by_name=True, extra="ignore", str_strip_whitespace=True, )
[docs] def to_dict(self) -> dict[str, Any]: """Convert model to dictionary.""" return self.model_dump(exclude_none=True)
[docs] def to_row(self, columns: list[str]) -> dict[str, Any]: """Convert model to row dict for table output.""" data = self.to_dict() return {col: data.get(col, "") for col in columns}
[docs] class XNATResource(BaseModel): """Base model for XNAT resources with common fields.""" id: str = Field(..., alias="ID", description="XNAT resource ID") label: str | None = Field(None, description="Human-readable label") uri: str | None = Field(None, alias="URI", description="REST API URI") xsi_type: str | None = Field(None, alias="xsiType", description="XSI type") insert_date: datetime | None = Field( None, alias="insert_date", description="Creation timestamp" ) insert_user: str | None = Field( None, alias="insert_user", description="User who created resource" ) @property def display_id(self) -> str: """Return label if available, otherwise ID.""" return self.label or self.id