def _create_from_draft(
            self,
            draft: types.ShippingMethodDraft,
            id: typing.Optional[str] = None) -> types.ShippingMethod:
        object_id = str(uuid.UUID(id) if id is not None else uuid.uuid4())

        zone_rates: typing.List[types.ZoneRate] = []
        for rate_draft in draft.zone_rates or []:
            shipping_rates: typing.List[types.ShippingRate] = []
            for shipping_rate_draft in rate_draft.shipping_rates or []:
                shipping_rate = types.ShippingRate(
                    price=utils._money_to_typed(shipping_rate_draft.price),
                    free_above=utils._money_to_typed(
                        shipping_rate_draft.free_above),
                    tiers=copy.deepcopy(shipping_rate_draft.tiers),
                )
                shipping_rates.append(shipping_rate)

            zone_rate = types.ZoneRate(zone=rate_draft.zone,
                                       shipping_rates=shipping_rates)
            zone_rates.append(zone_rate)

        return types.ShippingMethod(
            id=str(object_id),
            key=draft.key,
            version=1,
            created_at=datetime.datetime.now(datetime.timezone.utc),
            last_modified_at=datetime.datetime.now(datetime.timezone.utc),
            name=draft.name,
            description=draft.description,
            tax_category=draft.tax_category,
            zone_rates=zone_rates,
            is_default=draft.is_default,
            predicate=draft.predicate,
        )
def add_shipping_rate(backend: "ShippingMethodsBackend", obj: dict,
                      action: types.ShippingMethodAddShippingRateAction):
    new = copy.deepcopy(obj)
    draft = action.shipping_rate
    shipping_rate = create_shipping_rate_from_draft(draft)
    target_zone_rate = None
    for zone_rate in new["zoneRates"]:
        if zone_rate["zone"]["id"] == action.zone.id:
            target_zone_rate = zone_rate
            break
    if not target_zone_rate:
        new["zoneRates"].append(
            schemas.ZoneRateSchema().dump(types.ZoneRate(
                zone=action.zone,
                shipping_rates=[shipping_rate]
            ))
        )
    else:
        if not target_zone_rate.get("shippingRates"):
            target_zone_rate["shippingRates"] = []
        target_zone_rate["shippingRates"].append(
            schemas.ShippingRateSchema().dump(shipping_rate)
        )

    return new
def add_shipping_zone(backend: "ShippingMethodsBackend", obj: dict,
                      action: types.ShippingMethodAddZoneAction):
    new = copy.deepcopy(obj)
    if not new.get("zoneRates"):
        new["zoneRates"] = []
    for zone_rate in new["zoneRates"]:
        if zone_rate["zone"]["id"] == action.zone.id:
            raise InternalUpdateError("Zone already exists")
    new["zoneRates"].append(schemas.ZoneRateSchema().dump(
        types.ZoneRate(zone=action.zone, )))
    return new
Exemplo n.º 4
0
 def post_load(self, data, **kwargs):
     return types.ZoneRate(**data)
Exemplo n.º 5
0
 def post_load(self, data):
     return types.ZoneRate(**data)