"""CVAT API list request and response schemas. This module contains Pydantic models for CVAT API list/filter operations, including request parameters and paginated responses. """ from typing import Any, Literal from pydantic import BaseModel, ConfigDict from .job import CvatApiJobRead class CvatApiJobsListRequest(BaseModel): """Represents the request parameters for listing jobs. This model is used to construct query parameters for the /api/jobs endpoint. All fields are optional to allow flexible filtering. Attributes: task_id: Filter by task ID project_id: Filter by project ID stage: Filter by workflow stage state: Filter by job state type: Filter by job type (default: "annotation") assignee: Filter by assignee username dimension: Filter by dimension ("2d" or "3d") filter: Custom filter expression org: Filter by organization name org_id: Filter by organization ID page: Page number for pagination page_size: Number of results per page parent_job_id: Filter by parent job ID project_name: Filter by project name search: Search query string sort: Sort order specification task_name: Filter by task name """ task_id: int | None = None project_id: int | None = None stage: Literal["annotation", "validation", "acceptance"] | None = None state: Literal["new", "in progress", "completed", "rejected"] | None = None type: Literal["annotation", "ground_truth", "consensus_replica"] = "annotation" assignee: str | None = None dimension: Literal["2d", "3d"] | None = None filter: str | None = None org: str | None = None org_id: int | None = None page: int | None = None page_size: int | None = None parent_job_id: int | None = None project_name: str | None = None search: str | None = None sort: str | None = None task_name: str | None = None model_config = ConfigDict(extra="allow") def to_query_params(self) -> dict[str, Any]: """Convert the request model to query parameters, excluding None values. Returns: Dictionary of query parameters with non-None values """ params = {} for field_name, field_value in self.model_dump().items(): if field_value is not None: params[field_name] = field_value return params class CvatApiJobsListResponse(BaseModel): """Represents the paginated response for listing jobs. This is the response model from the /api/jobs endpoint. Attributes: count: Total number of jobs matching the filter next: URL for the next page of results (optional) previous: URL for the previous page of results (optional) results: List of jobs in the current page """ count: int next: str | None = None previous: str | None = None results: list[CvatApiJobRead] model_config = ConfigDict(extra="allow")