"""Views API endpoints (8 routes)."""
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from ab.api.models.shared import ServiceBaseResponse
from ab.api.models.views import GridViewAccess, GridViewCreateRequest, GridViewDetails, StoredProcedureColumn
from ab.api.base import BaseEndpoint
from ab.api.route import Route
_LIST = Route("GET", "/views/all", response_model="List[GridViewDetails]")
_GET = Route("GET", "/views/{viewId}", response_model="GridViewDetails")
_CREATE = Route("POST", "/views", request_model="GridViewCreateRequest", response_model="GridViewDetails")
_DELETE = Route("DELETE", "/views/{viewId}", response_model="ServiceBaseResponse")
_GET_ACCESS_INFO = Route("GET", "/views/{viewId}/accessinfo", response_model="GridViewAccess")
_UPDATE_ACCESS = Route("PUT", "/views/{viewId}/access", request_model="GridViewAccess")
_GET_DATASET_SPS = Route("GET", "/views/datasetsps", response_model="List[StoredProcedureColumn]")
_GET_DATASET_SP = Route("GET", "/views/datasetsp/{spName}", response_model="List[StoredProcedureColumn]")
[docs]
class ViewsEndpoint(BaseEndpoint):
"""Saved view management (ACPortal API)."""
[docs]
def list(self) -> list[GridViewDetails]:
"""GET /views/all
Docs: https://ab-sdk.readthedocs.io/en/latest/api/views/list.html
Response model: List[GridViewDetails]
"""
return self._request(_LIST)
[docs]
def get(self, view_id: str) -> GridViewDetails:
"""GET /views/{viewId}
Docs: https://ab-sdk.readthedocs.io/en/latest/api/views/get.html
Response model: GridViewDetails
"""
return self._request(_GET.bind(viewId=view_id))
[docs]
def create(self, *, data: GridViewCreateRequest | dict) -> GridViewDetails:
"""POST /views.
Args:
data: View creation payload with name, dataset_sp, and columns.
Accepts a :class:`GridViewCreateRequest` instance or a dict.
Request model: :class:`GridViewCreateRequest`
Docs: https://ab-sdk.readthedocs.io/en/latest/api/views/create.html
Request model: GridViewCreateRequest
Response model: GridViewDetails
"""
return self._request(_CREATE, json=data)
[docs]
def delete(self, view_id: str) -> ServiceBaseResponse:
"""DELETE /views/{viewId}
Docs: https://ab-sdk.readthedocs.io/en/latest/api/views/delete.html
Response model: ServiceBaseResponse
"""
return self._request(_DELETE.bind(viewId=view_id))
[docs]
def get_access_info(self, view_id: str) -> GridViewAccess:
"""GET /views/{viewId}/accessinfo
Docs: https://ab-sdk.readthedocs.io/en/latest/api/views/get_access_info.html
Response model: GridViewAccess
"""
return self._request(_GET_ACCESS_INFO.bind(viewId=view_id))
[docs]
def update_access(self, view_id: str, *, data: GridViewAccess | dict) -> None:
"""PUT /views/{viewId}/access.
Args:
view_id: View identifier.
data: Access control payload with users and roles.
Accepts a :class:`GridViewAccess` instance or a dict.
Request model: :class:`GridViewAccess`
Docs: https://ab-sdk.readthedocs.io/en/latest/api/views/update_access.html
Request model: GridViewAccess
"""
return self._request(_UPDATE_ACCESS.bind(viewId=view_id), json=data)
[docs]
def get_dataset_sps(self) -> list[StoredProcedureColumn]:
"""GET /views/datasetsps
Docs: https://ab-sdk.readthedocs.io/en/latest/api/views/get_dataset_sps.html
Response model: List[StoredProcedureColumn]
"""
return self._request(_GET_DATASET_SPS)
[docs]
def get_dataset_sp(self, sp_name: str) -> list[StoredProcedureColumn]:
"""GET /views/datasetsp/{spName}
Docs: https://ab-sdk.readthedocs.io/en/latest/api/views/get_dataset_sp.html
Response model: List[StoredProcedureColumn]
"""
return self._request(_GET_DATASET_SP.bind(spName=sp_name))