diff --git a/rest/python/server/generated_routes/ucp_routes.py b/rest/python/server/generated_routes/ucp_routes.py index 5375d5d..f84918a 100644 --- a/rest/python/server/generated_routes/ucp_routes.py +++ b/rest/python/server/generated_routes/ucp_routes.py @@ -2,26 +2,26 @@ from typing import Annotated from fastapi import APIRouter, Body, Header -import ucp_sdk.models.schemas.shopping.checkout_create_req -import ucp_sdk.models.schemas.shopping.checkout_resp -import ucp_sdk.models.schemas.shopping.checkout_update_req +import ucp_sdk.models.schemas.shopping.checkout_create_request +import ucp_sdk.models.schemas.shopping.checkout +import ucp_sdk.models.schemas.shopping.checkout_update_request import ucp_sdk.models.schemas.shopping.order -import ucp_sdk.models.schemas.shopping.payment_create_req -import ucp_sdk.models.schemas.shopping.payment_resp +import ucp_sdk.models.schemas.shopping.payment_create_request +import ucp_sdk.models.schemas.shopping.payment router = APIRouter() @router.post( "/checkout-sessions", - response_model=ucp_sdk.models.schemas.shopping.checkout_resp.CheckoutResponse, + response_model=ucp_sdk.models.schemas.shopping.checkout.Checkout, status_code=201, operation_id="create_checkout", summary="Create Checkout", ) async def create_checkout( body: Annotated[ - ucp_sdk.models.schemas.shopping.checkout_create_req.CheckoutCreateRequest, + ucp_sdk.models.schemas.shopping.checkout_create_request.CheckoutCreateRequest, Body(...), ], authorization: str = Header(None, alias="Authorization"), @@ -42,7 +42,7 @@ async def create_checkout( @router.get( "/checkout-sessions/{id}", - response_model=ucp_sdk.models.schemas.shopping.checkout_resp.CheckoutResponse, + response_model=ucp_sdk.models.schemas.shopping.checkout.Checkout, status_code=200, operation_id="get_checkout", summary="Get Checkout", @@ -67,7 +67,7 @@ async def get_checkout( @router.put( "/checkout-sessions/{id}", - response_model=ucp_sdk.models.schemas.shopping.checkout_resp.CheckoutResponse, + response_model=ucp_sdk.models.schemas.shopping.checkout.Checkout, status_code=200, operation_id="update_checkout", summary="Update Checkout", @@ -75,7 +75,7 @@ async def get_checkout( async def update_checkout( id: str, body: Annotated[ - ucp_sdk.models.schemas.shopping.checkout_update_req.CheckoutUpdateRequest, + ucp_sdk.models.schemas.shopping.checkout_update_request.CheckoutUpdateRequest, Body(...), ], authorization: str = Header(None, alias="Authorization"), @@ -96,7 +96,7 @@ async def update_checkout( @router.post( "/checkout-sessions/{id}/complete", - response_model=ucp_sdk.models.schemas.shopping.checkout_resp.CheckoutResponse, + response_model=ucp_sdk.models.schemas.shopping.checkout.Checkout, status_code=200, operation_id="complete_checkout", summary="Complete Checkout", @@ -122,7 +122,7 @@ async def complete_checkout( @router.post( "/checkout-sessions/{id}/cancel", - response_model=ucp_sdk.models.schemas.shopping.checkout_resp.CheckoutResponse, + response_model=ucp_sdk.models.schemas.shopping.checkout.Checkout, status_code=200, operation_id="cancel_checkout", summary="Cancel Checkout", diff --git a/rest/python/server/models.py b/rest/python/server/models.py index 5b81efc..353d092 100644 --- a/rest/python/server/models.py +++ b/rest/python/server/models.py @@ -20,37 +20,16 @@ """ from ucp_sdk.models.schemas.shopping.ap2_mandate import ( - CheckoutResponseWithAp2 as Ap2Checkout, + Checkout as Ap2Checkout, ) -from ucp_sdk.models.schemas.shopping.buyer_consent_create_req import ( - Checkout as BuyerConsentCheckoutCreate, +from ucp_sdk.models.schemas.shopping.buyer_consent import ( + Checkout as BuyerConsentCheckout, ) -from ucp_sdk.models.schemas.shopping.buyer_consent_resp import ( - Checkout as BuyerConsentCheckoutResp, -) -from ucp_sdk.models.schemas.shopping.buyer_consent_update_req import ( - Checkout as BuyerConsentCheckoutUpdate, -) -from ucp_sdk.models.schemas.shopping.discount_create_req import ( - Checkout as DiscountCheckoutCreate, -) -from ucp_sdk.models.schemas.shopping.discount_resp import ( - Checkout as DiscountCheckoutResp, -) -from ucp_sdk.models.schemas.shopping.discount_update_req import ( - Checkout as DiscountCheckoutUpdate, -) -from ucp_sdk.models.schemas.shopping.fulfillment_create_req import ( - Checkout as FulfillmentCreateRequest, -) -from ucp_sdk.models.schemas.shopping.fulfillment_resp import ( - Checkout as FulfillmentCheckout, -) -from ucp_sdk.models.schemas.shopping.fulfillment_update_req import ( - Checkout as FulfillmentUpdateRequest, +from ucp_sdk.models.schemas.shopping.discount import ( + Checkout as DiscountCheckout, ) from ucp_sdk.models.schemas.shopping.order import Order -from ucp_sdk.models.schemas.shopping.order import PlatformConfig +from ucp_sdk.models.schemas.shopping.order import PlatformSchema as PlatformConfig class UnifiedOrder(Order): @@ -58,9 +37,8 @@ class UnifiedOrder(Order): class UnifiedCheckout( - BuyerConsentCheckoutResp, - FulfillmentCheckout, - DiscountCheckoutResp, + BuyerConsentCheckout, + DiscountCheckout, Ap2Checkout, ): """Checkout model supporting various extensions.""" @@ -69,13 +47,13 @@ class UnifiedCheckout( class UnifiedCheckoutCreateRequest( - FulfillmentCreateRequest, DiscountCheckoutCreate, BuyerConsentCheckoutCreate + BuyerConsentCheckout, DiscountCheckout ): """Create request model combining base fields and extensions.""" class UnifiedCheckoutUpdateRequest( - FulfillmentUpdateRequest, DiscountCheckoutUpdate, BuyerConsentCheckoutUpdate + BuyerConsentCheckout, DiscountCheckout ): """Update request model combining base fields and extensions.""" diff --git a/rest/python/server/pyproject.toml b/rest/python/server/pyproject.toml index 4358281..4949321 100644 --- a/rest/python/server/pyproject.toml +++ b/rest/python/server/pyproject.toml @@ -38,7 +38,7 @@ packages = ["."] [tool.uv.sources] # The relative path is stored here -ucp-sdk = { path = "../../../../sdk/python/", editable = true } +ucp-sdk = { path = "../../../../../sdk/python/", editable = true } [tool.ruff] line-length = 80 diff --git a/rest/python/server/routes/discovery.py b/rest/python/server/routes/discovery.py index 756ce97..c4dd259 100644 --- a/rest/python/server/routes/discovery.py +++ b/rest/python/server/routes/discovery.py @@ -19,8 +19,6 @@ import uuid from fastapi import APIRouter from fastapi import Request -from ucp_sdk.models.discovery.profile_schema import UcpDiscoveryProfile - router = APIRouter() PROFILE_TEMPLATE_PATH = pathlib.Path(__file__).parent / "discovery_profile.json" @@ -31,7 +29,7 @@ @router.get( "/.well-known/ucp", - response_model=UcpDiscoveryProfile, + response_model=dict, summary="Get Merchant Profile", ) async def get_merchant_profile(request: Request): @@ -45,4 +43,4 @@ async def get_merchant_profile(request: Request): "{{ENDPOINT}}", str(request.base_url).rstrip("/") ).replace("{{SHOP_ID}}", SHOP_ID) - return UcpDiscoveryProfile(**json.loads(profile_json)) + return json.loads(profile_json) diff --git a/rest/python/server/routes/ucp_implementation.py b/rest/python/server/routes/ucp_implementation.py index dd61490..3ccacc9 100644 --- a/rest/python/server/routes/ucp_implementation.py +++ b/rest/python/server/routes/ucp_implementation.py @@ -33,10 +33,10 @@ from pydantic import BaseModel from pydantic import HttpUrl from services.checkout_service import CheckoutService -from ucp_sdk.models.schemas.shopping.ap2_mandate import Ap2CompleteRequest +from ucp_sdk.models.schemas.shopping.ap2_mandate import Ap2 as Ap2CompleteRequest from ucp_sdk.models.schemas.shopping.order import Order -from ucp_sdk.models.schemas.shopping.order import PlatformConfig -from ucp_sdk.models.schemas.shopping.payment_create_req import ( +from ucp_sdk.models.schemas.shopping.order import PlatformSchema as PlatformConfig +from ucp_sdk.models.schemas.shopping.payment_create_request import ( PaymentCreateRequest, ) from ucp_sdk.models.schemas.shopping.types.payment_instrument import ( diff --git a/rest/python/server/services/checkout_service.py b/rest/python/server/services/checkout_service.py index 3769aef..ed3e45a 100644 --- a/rest/python/server/services/checkout_service.py +++ b/rest/python/server/services/checkout_service.py @@ -54,63 +54,77 @@ from pydantic import BaseModel from services.fulfillment_service import FulfillmentService from sqlalchemy.ext.asyncio import AsyncSession -from ucp_sdk.models._internal import Response -from ucp_sdk.models._internal import ResponseCheckout -from ucp_sdk.models._internal import ResponseOrder -from ucp_sdk.models._internal import Version -from ucp_sdk.models.schemas.shopping.ap2_mandate import Ap2CompleteRequest -from ucp_sdk.models.schemas.shopping.discount_resp import Allocation -from ucp_sdk.models.schemas.shopping.discount_resp import AppliedDiscount -from ucp_sdk.models.schemas.shopping.discount_resp import DiscountsObject -from ucp_sdk.models.schemas.shopping.fulfillment_resp import ( +from pydantic import ConfigDict +from ucp_sdk.models.schemas.shopping.ap2_mandate import Ap2 as Ap2CompleteRequest +from ucp_sdk.models.schemas.shopping.discount import Allocation +from ucp_sdk.models.schemas.shopping.discount import AppliedDiscount +from ucp_sdk.models.schemas.shopping.discount import DiscountsObject +from ucp_sdk.models.schemas.shopping.fulfillment.dev.ucp.shopping import ( Fulfillment as FulfillmentResp, ) from ucp_sdk.models.schemas.shopping.order import ( Fulfillment as OrderFulfillment, ) from ucp_sdk.models.schemas.shopping.order import Order -from ucp_sdk.models.schemas.shopping.order import PlatformConfig -from ucp_sdk.models.schemas.shopping.payment_create_req import ( +from ucp_sdk.models.schemas.shopping.order import PlatformSchema as PlatformConfig +from ucp_sdk.models.schemas.shopping.payment_create_request import ( PaymentCreateRequest, ) -from ucp_sdk.models.schemas.shopping.payment_resp import PaymentResponse +from ucp_sdk.models.schemas.shopping.payment import Payment as PaymentResponse from ucp_sdk.models.schemas.shopping.types import order_line_item -from ucp_sdk.models.schemas.shopping.types import total_resp from ucp_sdk.models.schemas.shopping.types.card_credential import CardCredential from ucp_sdk.models.schemas.shopping.types.expectation import Expectation from ucp_sdk.models.schemas.shopping.types.expectation import ( LineItem as ExpectationLineItem, ) -from ucp_sdk.models.schemas.shopping.types.fulfillment_destination_resp import ( - FulfillmentDestinationResponse, +from ucp_sdk.models.schemas.shopping.types.fulfillment_destination import ( + FulfillmentDestination as FulfillmentDestinationResponse, ) -from ucp_sdk.models.schemas.shopping.types.fulfillment_group_resp import ( - FulfillmentGroupResponse, +from ucp_sdk.models.schemas.shopping.types.fulfillment_group import ( + FulfillmentGroup as FulfillmentGroupResponse, ) -from ucp_sdk.models.schemas.shopping.types.fulfillment_method_resp import ( - FulfillmentMethodResponse, +from ucp_sdk.models.schemas.shopping.types.fulfillment_method import ( + FulfillmentMethod as FulfillmentMethodResponse, ) -from ucp_sdk.models.schemas.shopping.types.fulfillment_resp import ( - FulfillmentResponse, +from ucp_sdk.models.schemas.shopping.types.fulfillment import ( + Fulfillment as FulfillmentResponse, ) -from ucp_sdk.models.schemas.shopping.types.item_resp import ItemResponse -from ucp_sdk.models.schemas.shopping.types.line_item_resp import ( - LineItemResponse, +from ucp_sdk.models.schemas.shopping.types.item import Item as ItemResponse +from ucp_sdk.models.schemas.shopping.types.line_item import ( + LineItem as LineItemResponse, ) from ucp_sdk.models.schemas.shopping.types.order_confirmation import ( OrderConfirmation, ) from ucp_sdk.models.schemas.shopping.types.order_line_item import OrderLineItem from ucp_sdk.models.schemas.shopping.types.postal_address import PostalAddress -from ucp_sdk.models.schemas.shopping.types.shipping_destination_resp import ( - ShippingDestinationResponse, +from ucp_sdk.models.schemas.shopping.types.shipping_destination import ( + ShippingDestination as ShippingDestinationResponse, ) -from ucp_sdk.models.schemas.shopping.types.token_credential_resp import ( - TokenCredentialResponse, -) -from ucp_sdk.models.schemas.shopping.types.total_resp import ( - TotalResponse as Total, +from ucp_sdk.models.schemas.shopping.types.token_credential import ( + TokenCredential as TokenCredentialResponse, ) +from ucp_sdk.models.schemas.shopping.types.total import Total +from ucp_sdk.models.schemas.ucp import Version + + +# Compatibility shims for removed ucp_sdk.models._internal classes +class Response(BaseModel): + model_config = ConfigDict(extra="allow") + name: str | None = None + version: Any = None + + +class ResponseCheckout(BaseModel): + model_config = ConfigDict(extra="allow") + version: Any = None + capabilities: list[Any] | None = None + + +class ResponseOrder(BaseModel): + model_config = ConfigDict(extra="allow") + version: Any = None + capabilities: list[Any] | None = None logger = logging.getLogger(__name__) @@ -773,7 +787,7 @@ async def complete_checkout( permalink_url=checkout.order.permalink_url, line_items=order_line_items, totals=[ - total_resp.TotalResponse(**t.model_dump()) for t in checkout.totals + Total(**t.model_dump()) for t in checkout.totals ], fulfillment=OrderFulfillment(expectations=expectations, events=[]), ) diff --git a/rest/python/server/services/fulfillment_service.py b/rest/python/server/services/fulfillment_service.py index 7e2fdc5..52464b9 100644 --- a/rest/python/server/services/fulfillment_service.py +++ b/rest/python/server/services/fulfillment_service.py @@ -20,12 +20,11 @@ import db from sqlalchemy.ext.asyncio import AsyncSession -from ucp_sdk.models.schemas.shopping.fulfillment_resp import FulfillmentOption -from ucp_sdk.models.schemas.shopping.types.fulfillment_option_resp import ( - FulfillmentOptionResponse, +from ucp_sdk.models.schemas.shopping.types.fulfillment_option import ( + FulfillmentOption, ) from ucp_sdk.models.schemas.shopping.types.postal_address import PostalAddress -from ucp_sdk.models.schemas.shopping.types.total_resp import TotalResponse +from ucp_sdk.models.schemas.shopping.types.total import Total as TotalResponse class FulfillmentService: @@ -110,14 +109,12 @@ async def calculate_options( options.append( FulfillmentOption( - root=FulfillmentOptionResponse( - id=rate.id, - title=title, - totals=[ - TotalResponse(type="subtotal", amount=price), - TotalResponse(type="total", amount=price), - ], - ) + id=rate.id, + title=title, + totals=[ + TotalResponse(type="subtotal", amount=price), + TotalResponse(type="total", amount=price), + ], ) )