Code source de pygroundedweb.client.analysis

"""Client pour gérer les analyses (création, lecture, mise à jour, suppression).

Fournit des helpers pour créer une analyse à partir d'une configuration et d'un dataset.
"""

from typing import Optional, List

from .base import APIModelClient
from ..models.analysis import Analysis
from ..models.configuration import Configuration
from ..models.dataset import Dataset


[docs] class AnalysisClient(APIModelClient): """Client CRUD pour les ressources `Analysis` côté API. Les méthodes exposées effectuent les appels réseau via `BaseAPIClient` et peuvent propager `APIError`, `NetworkError`, `PermissionDenied` ou `pydantic.ValidationError` en cas d'erreur. """ def _parse_json(self, analysis_json: str) -> Analysis: """Convertit le JSON renvoyé par l'API en instance `Analysis` et attache le client.""" instance = Analysis.model_validate(analysis_json) object.__setattr__(instance, "_client", self) return instance
[docs] def create( self, analysis_name: str, configuration: Configuration, dataset: Optional[Dataset] = None, dataset_id: Optional[int] = None, selected_photos_id: Optional[List[int]] = None, notify_by_email: Optional[bool] = False, ) -> Analysis: """Crée une analyse côté API. Args: analysis_name: nom de l'analyse. configuration: instance de `Configuration` à utiliser. dataset: (optionnel) instance de `Dataset`. dataset_id: (optionnel) identifiant du dataset (alternative à dataset). selected_photos_id: liste d'IDs de photos sélectionnées pour l'analyse. notify_by_email: si True, le serveur enverra une notification par e-mail en fin de traitement. Returns: Instance `Analysis` correspondant à la ressource créée. Raises: ValueError: si ni dataset ni dataset_id ne sont fournis ou si les deux le sont. APIError, NetworkError, PermissionDenied, pydantic.ValidationError """ if not ((dataset is None) ^ (dataset_id is None)): raise ValueError("You must provide either 'dataset' or 'dataset_id', but not both.") if dataset is not None: dataset_id = dataset.pk data_analysis = { "name": analysis_name, "notify_by_email": notify_by_email, "configuration": configuration.model_dump(), "selection": { "dataset_id": dataset_id, **({"photos_ids": selected_photos_id} if selected_photos_id is not None else {}) } } analysis_json = self._client.create("analyzes", data_analysis) analysis_json["mutable_fields"] = ["name", "notify_by_email"] return self._parse_json(analysis_json)
[docs] def retrieve(self, analysis_id: int): """Récupère une analyse par son identifiant et renvoie une instance `Analysis`. Raises: APIError, NetworkError, PermissionDenied, pydantic.ValidationError """ analysis_json = self._client.get_by_id("analyzes", analysis_id) analysis_json["mutable_fields"] = ["name", "notify_by_email"] return self._parse_json(analysis_json)
[docs] def update(self, analysis: Analysis) -> Analysis: """Met à jour une analyse existante et retourne l'objet mis à jour. Raises: APIError, NetworkError, PermissionDenied, pydantic.ValidationError """ analysis_json = self._client.update("analyzes", analysis) analysis_json["mutable_fields"] = ["name", "notify_by_email"] return self._parse_json(analysis_json)
[docs] def delete(self, analysis_id: int): """Supprime une analyse par identifiant. Raises: APIError, NetworkError, PermissionDenied """ self._client.delete_by_id("analyzes", analysis_id)