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
def post_load(self, data, **kwargs): return types.ZoneRate(**data)
def post_load(self, data): return types.ZoneRate(**data)