<filename>dhl_ecommerce/dhl_ecommerce_lib/shipping_request_v1.py
import attr
from jstruct import JList, JStruct
from typing import Optional, List


@attr.s(auto_attribs=True)
class ConsigneeAddress:
    postalCode: Optional[int] = None
    address1: Optional[str] = None
    address2: Optional[str] = None
    city: Optional[str] = None
    companyName: Optional[str] = None
    country: Optional[str] = None
    email: Optional[str] = None
    idNumber: Optional[str] = None
    idType: Optional[str] = None
    name: Optional[str] = None
    phone: Optional[str] = None
    state: Optional[str] = None


@attr.s(auto_attribs=True)
class CustomsDetail:
    hsCode: Optional[int] = None
    itemDescription: Optional[str] = None
    countryOfOrigin: Optional[str] = None
    packagedQuantity: Optional[int] = None
    itemValue: Optional[float] = None
    skuNumber: Optional[str] = None


@attr.s(auto_attribs=True)
class PackageDetails:
    dgCategory: Optional[int] = None
    billingRef1: Optional[str] = None
    codAmount: Optional[float] = None
    currency: Optional[str] = None
    declaredValue: Optional[float] = None
    deliveryConfirmationNo: Optional[str] = None
    dimensionUom: Optional[str] = None
    dutiesPaid: Optional[str] = None
    insuredValue: Optional[float] = None
    mailType: Optional[int] = None
    orderedProduct: Optional[str] = None
    packageDesc: Optional[str] = None
    packageId: Optional[str] = None
    packageRefName: Optional[str] = None
    serviceEndorsement: Optional[int] = None
    weight: Optional[float] = None
    weightUom: Optional[str] = None
    height: Optional[float] = None
    length: Optional[float] = None
    width: Optional[float] = None


@attr.s(auto_attribs=True)
class ReturnAddress:
    address1: Optional[str] = None
    address2: Optional[str] = None
    city: Optional[str] = None
    companyName: Optional[str] = None
    country: Optional[str] = None
    name: Optional[str] = None
    postalCode: Optional[str] = None
    state: Optional[str] = None


@attr.s(auto_attribs=True)
class Package:
    consigneeAddress: Optional[ConsigneeAddress] = JStruct[ConsigneeAddress]
    packageDetails: Optional[PackageDetails] = JStruct[PackageDetails]
    returnAddress: Optional[ReturnAddress] = JStruct[ReturnAddress]
    customsDetails: Optional[List[CustomsDetail]] = JList[CustomsDetail]


@attr.s(auto_attribs=True)
class Shipment:
    consignmentNumber: Optional[int] = None
    pickupAccount: Optional[str] = None
    distributionCenter: Optional[str] = None
    packages: Optional[List[Package]] = JList[Package]


@attr.s(auto_attribs=True)
class ShippingRequest:
    shipments: Optional[List[Shipment]] = JList[Shipment]

<filename>dhl_ecommerce/dhl_ecommerce_lib/shipping_request_v1.py
import attr
from jstruct import JList, JStruct
from typing import Optional, List


@attr.s(auto_attribs=True)
class ConsigneeAddress:
    postalCode: Optional[int] = None
    address1: Optional[str] = None
    address2: Optional[str] = None
    city: Optional[str] = None
    companyName: Optional[str] = None
    country: Optional[str] = None
    email: Optional[str] = None
    idNumber: Optional[str] = None
    idType: Optional[str] = None
    name: Optional[str] = None
    phone: Optional[str] = None
    state: Optional[str] = None


@attr.s(auto_attribs=True)
class CustomsDetail:
    hsCode: Optional[int] = None
    itemDescription: Optional[str] = None
    countryOfOrigin: Optional[str] = None
    packagedQuantity: Optional[int] = None
    itemValue: Optional[float] = None
    skuNumber: Optional[str] = None


@attr.s(auto_attribs=True)
class PackageDetails:
    dgCategory: Optional[int] = None
    billingRef1: Optional[str] = None
    codAmount: Optional[float] = None
    currency: Optional[str] = None
    declaredValue: Optional[float] = None
    deliveryConfirmationNo: Optional[str] = None
    dimensionUom: Optional[str] = None
    dutiesPaid: Optional[str] = None
    insuredValue: Optional[float] = None
    mailType: Optional[int] = None
    orderedProduct: Optional[str] = None
    packageDesc: Optional[str] = None
    packageId: Optional[str] = None
    packageRefName: Optional[str] = None
    serviceEndorsement: Optional[int] = None
    weight: Optional[float] = None
    weightUom: Optional[str] = None
    height: Optional[float] = None
    length: Optional[float] = None
    width: Optional[float] = None


@attr.s(auto_attribs=True)
class ReturnAddress:
    address1: Optional[str] = None
    address2: Optional[str] = None
    city: Optional[str] = None
    companyName: Optional[str] = None
    country: Optional[str] = None
    name: Optional[str] = None
    postalCode: Optional[str] = None
    state: Optional[str] = None


@attr.s(auto_attribs=True)
class Package:
    consigneeAddress: Optional[ConsigneeAddress] = JStruct[ConsigneeAddress]
    packageDetails: Optional[PackageDetails] = JStruct[PackageDetails]
    returnAddress: Optional[ReturnAddress] = JStruct[ReturnAddress]
    customsDetails: Optional[List[CustomsDetail]] = JList[CustomsDetail]


@attr.s(auto_attribs=True)
class Shipment:
    consignmentNumber: Optional[int] = None
    pickupAccount: Optional[str] = None
    distributionCenter: Optional[str] = None
    packages: Optional[List[Package]] = JList[Package]


@attr.s(auto_attribs=True)
class ShippingRequest:
    shipments: Optional[List[Shipment]] = JList[Shipment]
