Source code for ab.api.endpoints.jobs.parcel_items

"""Job-scoped parcel-item operations — swagger tag ``JobParcelItems`` (4 routes).

Exposed as ``api.jobs.parcel_items``. Old names on
:class:`~ab.api.endpoints.jobs.JobsEndpoint` remain as deprecation shims.

Method renames (``_parcel_items?`` suffix dropped):

* :meth:`list`                  (was ``get_parcel_items``)
* :meth:`create`                (was ``create_parcel_item``)
* :meth:`delete`                (was ``delete_parcel_item``)
* :meth:`list_with_materials`   (was ``get_parcel_items_with_materials``)

Note: ``get_packaging_containers`` (``/packagingcontainers``),
``update_item`` (``/item/{id}``), and ``add_item_notes``
(``/item/notes``) are tagged ``Job`` in swagger, not
``JobParcelItems``, so they remain on :class:`JobsEndpoint`.
"""

from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from ab.api.models.jobs import (
        ParcelItem,
        ParcelItemCreateRequest,
        ParcelItemWithMaterials,
    )
    from ab.api.models.shared import ServiceBaseResponse

from ab.api.base import BaseEndpoint
from ab.api.route import Route

_LIST = Route("GET", "/job/{jobDisplayId}/parcelitems", response_model="List[ParcelItem]")
_CREATE = Route(
    "POST",
    "/job/{jobDisplayId}/parcelitems",
    request_model="ParcelItemCreateRequest",
    response_model="ParcelItem",
)
_DELETE = Route(
    "DELETE",
    "/job/{jobDisplayId}/parcelitems/{parcelItemId}",
    response_model="ServiceBaseResponse",
)
_LIST_WITH_MATERIALS = Route(
    "GET",
    "/job/{jobDisplayId}/parcel-items-with-materials",
    response_model="List[ParcelItemWithMaterials]",
)


[docs] class JobParcelItemsEndpoint(BaseEndpoint): """Job-scoped parcel-item operations (ACPortal API)."""
[docs] def list(self, job_display_id: int) -> list[ParcelItem]: """``GET /job/{jobDisplayId}/parcelitems`` Docs: https://ab-sdk.readthedocs.io/en/latest/api/jobs/parcel_items.list.html Response model: List[ParcelItem] """ return self._request(_LIST.bind(jobDisplayId=job_display_id))
[docs] def create( self, job_display_id: int, *, data: ParcelItemCreateRequest | dict, ) -> ParcelItem: """``POST /job/{jobDisplayId}/parcelitems`` Request model: :class:`ParcelItemCreateRequest`. Docs: https://ab-sdk.readthedocs.io/en/latest/api/jobs/parcel_items.create.html Request model: ParcelItemCreateRequest Response model: ParcelItem """ return self._request(_CREATE.bind(jobDisplayId=job_display_id), json=data)
[docs] def delete(self, job_display_id: int, parcel_item_id: str) -> ServiceBaseResponse: """``DELETE /job/{jobDisplayId}/parcelitems/{parcelItemId}`` Docs: https://ab-sdk.readthedocs.io/en/latest/api/jobs/parcel_items.delete.html Response model: ServiceBaseResponse """ return self._request( _DELETE.bind(jobDisplayId=job_display_id, parcelItemId=parcel_item_id), )
[docs] def list_with_materials(self, job_display_id: int) -> list[ParcelItemWithMaterials]: """``GET /job/{jobDisplayId}/parcel-items-with-materials`` Docs: https://ab-sdk.readthedocs.io/en/latest/api/jobs/parcel_items.list_with_materials.html Response model: List[ParcelItemWithMaterials] """ return self._request(_LIST_WITH_MATERIALS.bind(jobDisplayId=job_display_id))