# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: MIT
from __future__ import annotations
from dataclasses import dataclass, field
from datetime import datetime
from http import HTTPStatus
from typing import Any
from air_sdk.air_model import AirModel, BaseEndpointAPI, PrimaryKey
from air_sdk.bc import (
BaseCompatMixin,
BaseEndpointAPICompatMixin,
MarketplaceDemoCompatMixin,
MarketplaceDemoEndpointAPICompatMixin,
)
from air_sdk.endpoints import mixins
# Import Simulation at runtime (not just TYPE_CHECKING) because get_type_hints() needs it
from air_sdk.endpoints.simulations import Simulation
from air_sdk.utils import join_urls, raise_if_invalid_response, validate_payload_types
[docs]
@dataclass(eq=False)
class MarketplaceDemo(BaseCompatMixin, MarketplaceDemoCompatMixin, AirModel):
id: str
name: str
demo: Simulation = field(metadata=AirModel.FIELD_FOREIGN_KEY)
created: datetime = field(repr=False)
modified: datetime = field(repr=False)
creator: str = field(repr=False)
documentation: str | None = field(repr=False)
tags: list[str] = field(repr=False)
like_count: int = field(repr=False)
liked_by_client: bool = field(repr=False)
published: bool = field(repr=False)
description: str | None
repo: str | None
icon: str | None
[docs]
@classmethod
def get_model_api(cls) -> type[MarketplaceDemoEndpointAPI]:
"""Returns the respective `AirModelAPI` type for this model"""
return MarketplaceDemoEndpointAPI
@property
def model_api(self) -> MarketplaceDemoEndpointAPI:
"""The current model API instance."""
return self.get_model_api()(self.__api__)
[docs]
def publish(self, **kwargs: Any) -> None:
self.model_api.publish(marketplace_demo=self, **kwargs)
[docs]
def unpublish(self, **kwargs: Any) -> None:
self.model_api.unpublish(marketplace_demo=self, **kwargs)
[docs]
def provision(self, **kwargs: Any) -> Simulation:
return self.model_api.provision(marketplace_demo=self, **kwargs)
[docs]
class MarketplaceDemoEndpointAPI(
MarketplaceDemoEndpointAPICompatMixin,
BaseEndpointAPICompatMixin,
mixins.ListApiMixin[MarketplaceDemo],
mixins.CreateApiMixin[MarketplaceDemo],
mixins.GetApiMixin[MarketplaceDemo],
mixins.PatchApiMixin[MarketplaceDemo],
mixins.DeleteApiMixin,
BaseEndpointAPI[MarketplaceDemo],
):
API_PATH = 'marketplace/demos'
API_PUBLISH_PATH = 'publish'
API_UNPUBLISH_PATH = 'unpublish'
API_PROVISION_PATH = 'provision'
model = MarketplaceDemo
[docs]
@validate_payload_types
def publish(
self, *, marketplace_demo: MarketplaceDemo | PrimaryKey, **kwargs: Any
) -> None:
marketplace_demo_id = (
marketplace_demo.id
if isinstance(marketplace_demo, MarketplaceDemo)
else marketplace_demo
)
url = join_urls(self.url, str(marketplace_demo_id), self.API_PUBLISH_PATH)
response = self.__api__.client.patch(url, data=mixins.serialize_payload(kwargs))
raise_if_invalid_response(
response, status_code=HTTPStatus.NO_CONTENT, data_type=None
)
if isinstance(marketplace_demo, MarketplaceDemo):
marketplace_demo.refresh()
[docs]
@validate_payload_types
def unpublish(
self, *, marketplace_demo: MarketplaceDemo | PrimaryKey, **kwargs: Any
) -> None:
marketplace_demo_id = (
marketplace_demo.id
if isinstance(marketplace_demo, MarketplaceDemo)
else marketplace_demo
)
url = join_urls(self.url, str(marketplace_demo_id), self.API_UNPUBLISH_PATH)
response = self.__api__.client.patch(url, data=mixins.serialize_payload(kwargs))
raise_if_invalid_response(
response, status_code=HTTPStatus.NO_CONTENT, data_type=None
)
if isinstance(marketplace_demo, MarketplaceDemo):
marketplace_demo.refresh()
[docs]
@validate_payload_types
def provision(
self, *, marketplace_demo: MarketplaceDemo | PrimaryKey, **kwargs: Any
) -> Simulation:
marketplace_demo_id = (
marketplace_demo.id
if isinstance(marketplace_demo, MarketplaceDemo)
else marketplace_demo
)
url = join_urls(self.url, str(marketplace_demo_id), self.API_PROVISION_PATH)
response = self.__api__.client.post(url, data=mixins.serialize_payload(kwargs))
raise_if_invalid_response(response, status_code=HTTPStatus.CREATED)
if isinstance(marketplace_demo, MarketplaceDemo):
marketplace_demo.refresh()
# The API returns a Simulation object
return self.__api__.simulations.load_model(response.json())