Source code for ionworks.project

"""Project client for managing projects within organizations.

This module provides the :class:`ProjectClient` for creating, reading,
updating, and deleting projects, which organize resources (studies,
simulations, pipelines, etc.) within an organization.
"""

from __future__ import annotations

from typing import Any

from .models import (
    PaginatedList,
    Project,
    _build_endpoint,
    _build_filter_params,
    _parse_list_response,
)


[docs] class ProjectClient: """Client for managing projects within organizations. Projects group resources like studies, simulations, pipelines, and optimizations within an organization. """ _BASE = "/projects"
[docs] def __init__(self, client: Any) -> None: """Initialize the ProjectClient. Parameters ---------- client : Any The HTTP client instance for making API requests. """ self.client = client
[docs] def get(self, project_id: str) -> Project: """Get a specific project by ID. Parameters ---------- project_id : str The ID of the project to retrieve. Returns ------- Project The requested project object. """ endpoint = f"{self._BASE}/{project_id}" response_data = self.client.get(endpoint) return Project(**response_data)
[docs] def list( self, limit: int | None = None, offset: int | None = None, *, name: str | None = None, name_exact: str | None = None, created_after: str | None = None, created_before: str | None = None, updated_after: str | None = None, updated_before: str | None = None, order_by: str | None = None, order: str | None = None, ) -> PaginatedList[Project]: """List projects with optional filtering. Parameters ---------- limit : int | None, optional Maximum number of projects to return per page. offset : int | None, optional Number of projects to skip for pagination. name : str | None, optional Case-insensitive substring match on project name. name_exact : str | None, optional Exact match on project name. created_after : str | None, optional ISO datetime; return projects created after this time. created_before : str | None, optional ISO datetime; return projects created before this time. updated_after : str | None, optional ISO datetime; return projects updated after this time. updated_before : str | None, optional ISO datetime; return projects updated before this time. order_by : str | None, optional Column to sort by. order : str | None, optional Sort direction: ``"asc"`` or ``"desc"``. Returns ------- PaginatedList[Project] A list of project objects. """ filter_params = _build_filter_params( name=name, name_exact=name_exact, created_after=created_after, created_before=created_before, updated_after=updated_after, updated_before=updated_before, order_by=order_by, order=order, ) endpoint = _build_endpoint( self._BASE, {"limit": limit, "offset": offset, **filter_params}, ) response_data = self.client.get(endpoint) return _parse_list_response(response_data, Project)
[docs] def create(self, data: dict[str, Any] | None = None) -> Project: """Create a new project. Parameters ---------- data : dict[str, Any] Dictionary containing the project data. Required fields: ``name``. Optional fields: ``description``. Returns ------- Project The newly created project object. """ endpoint = self._BASE response_data = self.client.post(endpoint, data) return Project(**response_data)
[docs] def update( self, project_id: str, data: dict[str, Any] | None = None, ) -> Project: """Update an existing project. Parameters ---------- project_id : str The ID of the project to update. data : dict[str, Any] Dictionary containing the fields to update. Supports ``name`` and ``description``. Returns ------- Project The updated project object. """ endpoint = f"{self._BASE}/{project_id}" response_data = self.client.patch(endpoint, data) return Project(**response_data)
[docs] def delete(self, project_id: str) -> None: """Delete a project by ID. Parameters ---------- project_id : str The ID of the project to delete. """ endpoint = f"{self._BASE}/{project_id}" self.client.delete(endpoint)