click_and_drop_api 3.0.2__tar.gz → 3.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {click_and_drop_api-3.0.2/click_and_drop_api.egg-info → click_and_drop_api-3.0.4}/PKG-INFO +1 -1
- click_and_drop_api-3.0.4/click_and_drop_api/examples/mock-label.pdf +0 -0
- click_and_drop_api-3.0.4/click_and_drop_api/examples/mock-manifest.pdf +0 -0
- click_and_drop_api-3.0.4/click_and_drop_api/examples/oba_full_workflow.py +138 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/examples/shipping_countries.py +6 -1
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/api.py +15 -42
- click_and_drop_api-3.0.4/click_and_drop_api/simple/base.py +505 -0
- click_and_drop_api-3.0.4/click_and_drop_api/simple/compatibility.py +8 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/mock.py +54 -17
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/package_shipping_option.py +40 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/types.py +13 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4/click_and_drop_api.egg-info}/PKG-INFO +1 -1
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api.egg-info/SOURCES.txt +6 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/pyproject.toml +4 -1
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_mock_api.py +58 -63
- click_and_drop_api-3.0.4/test/test_mock_api_manifest.py +51 -0
- click_and_drop_api-3.0.4/test/test_mock_api_update_orders.py +207 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_shipping_option_model.py +15 -0
- click_and_drop_api-3.0.2/click_and_drop_api/simple/base.py +0 -228
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/LICENSE +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/MANIFEST.in +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/README.md +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/__init__.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/api/__init__.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/api/labels_api.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/api/manifests_api.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/api/orders_api.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/api/version_api.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/api_client.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/api_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/configuration.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/examples/__init__.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/examples/__main__.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/examples/check_oba.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/examples/create_order.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/examples/generate_label.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/examples/package_size_and_cost.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/examples/view_order.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/examples/view_specific_orders.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/examples/view_version.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/exceptions.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/__init__.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/address_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/billing_details_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/create_order_error_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/create_order_label_error_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/create_order_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/create_order_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/create_orders_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/create_orders_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/create_packages_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/delete_orders_resource.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/deleted_order_info.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/dimensions_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/error_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/failed_order_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/get_order_details_resource.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/get_order_info_resource.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/get_order_line_result.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/get_orders_details_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/get_orders_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/get_postal_details_result.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/get_shipping_details_result.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/get_tag_details_result.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/get_version_resource.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/importer.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/label_generation_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/manifest_details_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/manifest_eligible_orders_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/manifest_errors_error_details_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/manifest_errors_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/manifest_orders_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/order_error_info.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/order_error_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/order_field_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/order_update_error.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/postage_details_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/product_item_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/recipient_details_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/sender_details_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/shipment_package_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/tag_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/update_order_status_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/update_order_status_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/update_orders_status_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/models/updated_order_info.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/py.typed +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/rest.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/__init__.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/addresses.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/errors.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/__init__.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/db.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/documents.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/format_dimensions.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/large_letter.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/large_parcel.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/letter.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/medium_parcel.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/non-oba codes/large_letter-DE.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/non-oba codes/large_letter-GB.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/non-oba codes/large_parcel-DE.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/non-oba codes/large_parcel-GB.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/non-oba codes/letter-DE.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/non-oba codes/letter-GB.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/non-oba codes/medium_parcel-DE.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/non-oba codes/medium_parcel-GB.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/non-oba codes/small_parcel-DE.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/non-oba codes/small_parcel-GB.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/oba-codes/documents-DE.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/oba-codes/large_letter-DE.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/oba-codes/large_letter-GB.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/oba-codes/letter-DE.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/oba-codes/letter-GB.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/oba-codes/parcel-DE.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/oba-codes/parcel-GB.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/oba_parser.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/parcel.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/parser.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping/small_parcel.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api/simple/shipping_test_result.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api.egg-info/dependency_links.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api.egg-info/requires.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/click_and_drop_api.egg-info/top_level.txt +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/setup.cfg +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/setup.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_address_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_billing_details_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_choose_size_by_weight.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_create_order_error_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_create_order_label_error_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_create_order_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_create_order_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_create_orders_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_create_orders_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_create_packages_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_delete_orders_resource.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_deleted_order_info.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_dimensions_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_error_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_failed_order_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_get_order_details_resource.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_get_order_info_resource.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_get_order_line_result.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_get_orders_details_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_get_orders_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_get_postal_details_result.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_get_shipping_details_result.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_get_tag_details_result.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_get_version_resource.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_importer.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_label_generation_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_labels_api.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_manifest_details_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_manifest_eligible_orders_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_manifest_errors_error_details_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_manifest_errors_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_manifest_orders_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_manifests_api.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_oba_parser.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_order_error_info.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_order_error_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_order_field_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_order_update_error.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_orders_api.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_parcel_constraints.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_parcel_weights.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_postage_details_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_product_item_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_recipient_details_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_sender_details_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_shipment_package_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_shipping_options.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_simple_create_api.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_tag_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_update_order_status_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_update_order_status_response.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_update_orders_status_request.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_updated_order_info.py +0 -0
- {click_and_drop_api-3.0.2 → click_and_drop_api-3.0.4}/test/test_version_api.py +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Full OBA workflow: create a cheap domestic order, generate a label,
|
|
3
|
+
apply postage via manifest, and mark the order as despatched.
|
|
4
|
+
|
|
5
|
+
Steps performed:
|
|
6
|
+
1. Verify the account is OBA (required for label generation and OBA services)
|
|
7
|
+
2. Pick the cheapest domestic OBA service
|
|
8
|
+
3. Create the order (with label generation requested at creation time)
|
|
9
|
+
4. Save the label PDF to disk
|
|
10
|
+
5. Manifest eligible orders (applies postage)
|
|
11
|
+
6. Set the order status to "despatched"
|
|
12
|
+
|
|
13
|
+
Note: Label generation is only available for OBA customers.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import os
|
|
17
|
+
import sys
|
|
18
|
+
from datetime import datetime, UTC
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
from click_and_drop_api.simple import (
|
|
22
|
+
ClickAndDrop,
|
|
23
|
+
CreateOrder,
|
|
24
|
+
LabelGeneration,
|
|
25
|
+
RecipientDetails,
|
|
26
|
+
Address,
|
|
27
|
+
db,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
# ---------------------------------------------------------------------------
|
|
31
|
+
# Configuration
|
|
32
|
+
# ---------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
API_KEY = os.environ["API_KEY"]
|
|
35
|
+
REFERENCE = "oba-workflow-{now}".format(now=datetime.now(UTC).strftime("%Y%m%d%H%M%S"))
|
|
36
|
+
WEIGHT_GRAMS = 100
|
|
37
|
+
|
|
38
|
+
api = ClickAndDrop(API_KEY)
|
|
39
|
+
|
|
40
|
+
# ---------------------------------------------------------------------------
|
|
41
|
+
# Step 1: verify OBA
|
|
42
|
+
# ---------------------------------------------------------------------------
|
|
43
|
+
|
|
44
|
+
print("Checking account type…")
|
|
45
|
+
if not api.is_oba():
|
|
46
|
+
print("ERROR: This account is not OBA. Label generation requires an OBA account.")
|
|
47
|
+
sys.exit(1)
|
|
48
|
+
print("Account is OBA.")
|
|
49
|
+
|
|
50
|
+
# ---------------------------------------------------------------------------
|
|
51
|
+
# Step 2: pick cheapest domestic OBA service
|
|
52
|
+
# ---------------------------------------------------------------------------
|
|
53
|
+
|
|
54
|
+
cheapest = db.filter(is_oba=True, international=False).any_or_none
|
|
55
|
+
if cheapest is None:
|
|
56
|
+
print("ERROR: No domestic OBA service found in the shipping database.")
|
|
57
|
+
sys.exit(1)
|
|
58
|
+
|
|
59
|
+
print(
|
|
60
|
+
f"Using service: {cheapest.brand} {cheapest.service_code}"
|
|
61
|
+
f" ({cheapest.delivery_speed}) — £{cheapest.gross}"
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
# ---------------------------------------------------------------------------
|
|
65
|
+
# Step 3: create the order, requesting a label in the response
|
|
66
|
+
# ---------------------------------------------------------------------------
|
|
67
|
+
|
|
68
|
+
order = CreateOrder(
|
|
69
|
+
order_reference=REFERENCE,
|
|
70
|
+
recipient=RecipientDetails(
|
|
71
|
+
address=Address(
|
|
72
|
+
full_name="Nicco Kunzmann",
|
|
73
|
+
address_line1="1 Test Street",
|
|
74
|
+
city="London",
|
|
75
|
+
postcode="SW1A 1AA",
|
|
76
|
+
country_code="GB",
|
|
77
|
+
)
|
|
78
|
+
),
|
|
79
|
+
order_date=datetime.now(UTC),
|
|
80
|
+
subtotal=1.00,
|
|
81
|
+
shipping_cost_charged=float(cheapest.gross),
|
|
82
|
+
total=1.00 + float(cheapest.gross),
|
|
83
|
+
currency_code="GBP",
|
|
84
|
+
postage_details=cheapest.as_postage_details(),
|
|
85
|
+
packages=[cheapest.as_package_request(weight_in_grams=WEIGHT_GRAMS)],
|
|
86
|
+
label=LabelGeneration(
|
|
87
|
+
include_label_in_response=True,
|
|
88
|
+
include_cn=False,
|
|
89
|
+
include_returns_label=False,
|
|
90
|
+
),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
print(f"Creating order {REFERENCE!r}…")
|
|
94
|
+
response = api.create_order(order)
|
|
95
|
+
|
|
96
|
+
if response.errors_count or not response.created_orders:
|
|
97
|
+
print(f"ERROR: Order creation failed: {response.failed_orders}")
|
|
98
|
+
sys.exit(1)
|
|
99
|
+
|
|
100
|
+
created = response.created_orders[0]
|
|
101
|
+
order_id = created.order_identifier
|
|
102
|
+
print(f"Order created: id={order_id}, reference={created.order_reference}")
|
|
103
|
+
|
|
104
|
+
# ---------------------------------------------------------------------------
|
|
105
|
+
# Step 4: save label PDF
|
|
106
|
+
# ---------------------------------------------------------------------------
|
|
107
|
+
|
|
108
|
+
print("Fetching label…")
|
|
109
|
+
label_pdf = api.get_label(order_id, "postageLabel", include_returns_label=False)
|
|
110
|
+
label_path = Path(__file__).parent / "label.pdf"
|
|
111
|
+
label_path.write_bytes(label_pdf)
|
|
112
|
+
print(f"Label saved to {label_path}")
|
|
113
|
+
|
|
114
|
+
# ---------------------------------------------------------------------------
|
|
115
|
+
# Step 5: manifest (applies postage)
|
|
116
|
+
# ---------------------------------------------------------------------------
|
|
117
|
+
|
|
118
|
+
print("Manifesting eligible orders…")
|
|
119
|
+
manifest = api.manifest_orders()
|
|
120
|
+
print(f"Manifest number: {manifest.manifest_number}")
|
|
121
|
+
if manifest.pdf is not None:
|
|
122
|
+
manifest_path = Path(__file__).parent / "manifest.pdf"
|
|
123
|
+
manifest_path.write_bytes(manifest.pdf)
|
|
124
|
+
print(f"Manifest PDF saved to {manifest_path}")
|
|
125
|
+
|
|
126
|
+
# ---------------------------------------------------------------------------
|
|
127
|
+
# Step 6: mark as despatched
|
|
128
|
+
# ---------------------------------------------------------------------------
|
|
129
|
+
|
|
130
|
+
print(f"Setting order {order_id} to 'despatched'…")
|
|
131
|
+
update = api.update_orders([order_id], status="despatched")
|
|
132
|
+
|
|
133
|
+
if update.errors:
|
|
134
|
+
print(f"WARNING: status update errors: {update.errors}")
|
|
135
|
+
else:
|
|
136
|
+
print("Order marked as despatched.")
|
|
137
|
+
|
|
138
|
+
print("Done.")
|
|
@@ -3,9 +3,14 @@
|
|
|
3
3
|
|
|
4
4
|
Uses test_shipping internally: a test order is created and immediately deleted
|
|
5
5
|
for each country, so no real shipments are made.
|
|
6
|
+
|
|
7
|
+
Arguments:
|
|
8
|
+
|
|
9
|
+
- service code (optional, defaults to OLP1)
|
|
6
10
|
"""
|
|
7
11
|
|
|
8
12
|
import os
|
|
13
|
+
import sys
|
|
9
14
|
|
|
10
15
|
from click_and_drop_api.simple import ClickAndDrop
|
|
11
16
|
|
|
@@ -14,7 +19,7 @@ API_KEY = os.environ["API_KEY"]
|
|
|
14
19
|
api = ClickAndDrop(API_KEY)
|
|
15
20
|
|
|
16
21
|
PACKAGE_SIZE = "letter"
|
|
17
|
-
SERVICE_CODE = "OLP1"
|
|
22
|
+
SERVICE_CODE = "OLP1" if len(sys.argv) == 1 else sys.argv[1]
|
|
18
23
|
|
|
19
24
|
countries = api.get_countries_for_shipping(
|
|
20
25
|
package_size=PACKAGE_SIZE,
|
|
@@ -101,60 +101,23 @@ class ClickAndDrop(AbstractClickAndDrop):
|
|
|
101
101
|
"""The API key in use."""
|
|
102
102
|
return self._key
|
|
103
103
|
|
|
104
|
-
def
|
|
105
|
-
self, order_identifiers: Union[list[Union[str, int]]
|
|
104
|
+
def _get_orders(
|
|
105
|
+
self, order_identifiers: Union[list[Union[str, int]]]
|
|
106
106
|
) -> list[click_and_drop_api.GetOrderInfoResource]:
|
|
107
|
-
"""Get specific orders.
|
|
108
|
-
|
|
109
|
-
Parameters:
|
|
110
|
-
order_identifiers:
|
|
111
|
-
One or several Order Identifiers or Order References.
|
|
112
|
-
Order Identifiers are integer numbers.
|
|
113
|
-
Order References are strings.
|
|
114
|
-
The maximum number of identifiers is 100.
|
|
115
|
-
|
|
116
|
-
Returns:
|
|
117
|
-
A list of orders
|
|
118
|
-
|
|
119
|
-
Raises:
|
|
120
|
-
click_and_drop_api.exceptions.BadRequestException if an order with the same reference already exists
|
|
121
|
-
|
|
122
|
-
https://api.parcel.royalmail.com/#tag/Orders/operation/GetSpecificOrdersAsync
|
|
123
|
-
"""
|
|
124
107
|
return self._orders_api.get_specific_orders_async(
|
|
125
108
|
order_identifiers=order_identifiers_to_string(order_identifiers)
|
|
126
109
|
)
|
|
127
110
|
|
|
128
|
-
def
|
|
129
|
-
self, order_identifiers:
|
|
111
|
+
def _delete_orders(
|
|
112
|
+
self, order_identifiers: list[Union[str, int]]
|
|
130
113
|
) -> click_and_drop_api.DeleteOrdersResource:
|
|
131
|
-
"""Delete specific orders.
|
|
132
|
-
|
|
133
|
-
Please be aware labels generated on orders which are deleted are no longer valid and must be destroyed.
|
|
134
|
-
Cancelled label information is automatically shared with Royal Mail Revenue Protection,
|
|
135
|
-
and should a cancelled label be identified on an item in the Royal Mail Network,
|
|
136
|
-
you will be charged on your account and an additional handling fee applied.
|
|
137
|
-
|
|
138
|
-
Parameters:
|
|
139
|
-
order_identifiers:
|
|
140
|
-
One or several Order Identifiers or Order References.
|
|
141
|
-
Order Identifiers are integer numbers.
|
|
142
|
-
Order References are strings.
|
|
143
|
-
The maximum number of identifiers is 100.
|
|
144
|
-
|
|
145
|
-
https://api.parcel.royalmail.com/#tag/Orders/operation/DeleteOrdersAsync
|
|
146
|
-
"""
|
|
147
114
|
return self._orders_api.delete_orders_async(
|
|
148
115
|
order_identifiers=order_identifiers_to_string(order_identifiers)
|
|
149
116
|
)
|
|
150
117
|
|
|
151
|
-
def
|
|
118
|
+
def _create_orders(
|
|
152
119
|
self, orders: Union[list[CreateOrder], CreateOrder]
|
|
153
120
|
) -> click_and_drop_api.CreateOrdersResponse:
|
|
154
|
-
"""Create a new order.
|
|
155
|
-
|
|
156
|
-
https://api.parcel.royalmail.com/#tag/Orders/operation/CreateOrdersAsync
|
|
157
|
-
"""
|
|
158
121
|
if not isinstance(orders, list):
|
|
159
122
|
orders = [orders]
|
|
160
123
|
request = click_and_drop_api.CreateOrdersRequest(items=orders)
|
|
@@ -207,5 +170,15 @@ class ClickAndDrop(AbstractClickAndDrop):
|
|
|
207
170
|
include_cn=include_cn,
|
|
208
171
|
)
|
|
209
172
|
|
|
173
|
+
def _set_order_status(
|
|
174
|
+
self, request: click_and_drop_api.UpdateOrdersStatusRequest
|
|
175
|
+
) -> click_and_drop_api.UpdateOrderStatusResponse:
|
|
176
|
+
return self._orders_api.update_orders_status_async(request)
|
|
177
|
+
|
|
178
|
+
def _manifest_orders(
|
|
179
|
+
self, request: click_and_drop_api.ManifestEligibleOrdersRequest
|
|
180
|
+
) -> click_and_drop_api.ManifestOrdersResponse:
|
|
181
|
+
return self._manifests_api.manifest_eligible_async(request)
|
|
182
|
+
|
|
210
183
|
|
|
211
184
|
__all__ = ["ClickAndDrop"]
|