def _make_address_args(addr, email=None, company=None, name=None): ret = { "street1": addr.line1, "street2": addr.line2, "city": addr.city, "state": addr.state if addr.state else '', "zip": addr.postcode, "country": addr.country.iso_3166_1_a2, "email": email if email else '' } if addr.phone_number: if utils.is_domestic_delivery(ret['country']): ret['phone'] = addr.phone_number.as_national else: ret['phone'] = addr.phone_number.as_international if company: ret["company"] = company if name: ret["name"] = name else: ret["name"] = addr.name return ret
def apply_shipping_method_revenue(self, method): """ for domestic shipments we support only the USPS and we have different shipping method min revenue value """ if utils.is_domestic_delivery(self.to_country_code): self.shipping_method_min_revenue = self.domestic_shipping_method_min_revenue return super(USPSRevenueApplier, self).apply_shipping_method_revenue(method)
def domestic_shipping_filter(shipping_method, **kwargs): """ Return only USPS methods for domestic shipments """ domestic_delivery = is_domestic_delivery( kwargs['to_country'].iso_3166_1_a2) if domestic_delivery: return shipping_method.carrier == settings.EASYPOST_USPS return True
def create_shipping_work(input_kwargs, queue, flash_messages, **kwargs): tasks = [] partner = input_kwargs.get('partner') if partner is None: input_kwargs['partner'] = get_partner() if utils.is_domestic_delivery(input_kwargs['to_country'].iso_3166_1_a2): #We only ship domestic via the USPS tasks.append( calculate_domestic_shipping_rates.s(**input_kwargs).set( soft_timeout=10, queue=queue)) #domestic_predefined_parcels = get_domestic_predefined_parcels(**input_kwargs) #for domestic_predefined_parcel in domestic_predefined_parcels: # tasks.append(calculate_flat_rate_methods.s(predefined_parcel=domestic_predefined_parcel, # **input_kwargs).set(queue=queue)) kwargs.update(input_kwargs) work = group(*tasks) | collect_all_shipping_methods.s( flash_messages=flash_messages, **kwargs).set(soft_timeout=10, queue=queue) else: tasks.extend([ #calculate_usps_intl_rate.s(**input_kwargs).set(soft_timeout=10, queue=queue), calculate_intl_shipping_rates.s(**input_kwargs ).set(soft_timeout=10, queue=queue), #calculate_fedex_rates.s(**input_kwargs).set(soft_timeout=10, queue=queue), #calculate_ups_rates.s(**input_kwargs).set(soft_timeout=10, queue=queue), #calculate_aramex_rates.s(**input_kwargs).set(soft_timeout=10, queue=queue), #calculate_dhl_rates.s(**input_kwargs).set(soft_timeout=10, queue=queue) ]) work = group(*tasks) | process_intl_shipping_methods.s( flash_messages=flash_messages, queue=queue, to_country=input_kwargs['to_country'], value=input_kwargs['value'], weight=input_kwargs['weight'], customs_form=input_kwargs['customs_form'], partner=input_kwargs['partner'], **kwargs).set(soft_timeout=10, queue=queue) return work
def lithium_battery_filter(shipping_method, **kwargs): """ Shipping internationally lithium batteries regulations have changed in 2017 We have 3 cases: 1 - No battery - all carriers accepted 2 - Installed battery - USPS is excluded 3 - Loose battery - only FedEx accepted """ domestic_delivery = is_domestic_delivery( kwargs['to_country'].iso_3166_1_a2) battery_status = kwargs.get('battery_status', Product.NO_BATTERY) if domestic_delivery: #show only ground methods in case batteries exist in package if battery_status != Product.NO_BATTERY: return shipping_method.code in USPS_GROUND_METHOD_CODES return True if battery_status == Product.INSTALLED_BATTERY: return shipping_method.carrier != settings.EASYPOST_USPS if battery_status == Product.LOOSE_BATTERY: return False return True
def is_domestic(self): return utils.is_domestic_delivery(self.country_code)
def create_shipment(self, package_upc, shipping_addr, weight, length, width, height, customs_form, customer_name, service, carrier, customer_uuid, email, partner, itn_number, contents_explanation, **kwargs): ret = {"reference": package_upc, "carrier": carrier} is_domestic = utils.is_domestic_delivery( shipping_addr.country.iso_3166_1_a2) to_address = self._create_to_address(shipping_addr=shipping_addr, email=email) form_address_kwargs = { 'partner': partner, 'customer_uuid': customer_uuid, 'package_upc': package_upc } # special handling for Aramex shipments where we must include the partner name on # the label and commercial invoice if carrier == settings.EASYPOST_ARAMEX: form_address_kwargs[ 'partner_company'] = settings.ACTIVE_PARTNER_COMPANY_NAME from_address = self._create_from_address(**form_address_kwargs) tokens = service.split('-') service = tokens[0] try: predefined_package = tokens[1] except IndexError: predefined_package = None parcel = self._create_parcel(weight=weight, length=length, width=width, height=height, predefined_package=predefined_package) ret['to_address'] = to_address ret['from_address'] = from_address ret['parcel'] = parcel ret['service'] = service ret['options'] = { 'delivered_duty_paid': False } #,'label_format': 'PNG'} ret['carrier_accounts'] = self.partner_supported_carriers(partner) #special treatment for TNT - only native PDF works if carrier == settings.EASYPOST_TNTEXPRESS: ret['options']['label_format'] = 'PDF' if carrier == settings.EASYPOST_DHL: ret['options']['incoterm'] = 'DAP' #mark that shipment contains lithium batteries #if lithium_battery_exists: # ret['options']['hazmat'] = 'ORMD' #we take this option down for now as it costs $4 more #if carrier in settings.EASYPOST_EXPRESS_CARRIERS: # ret['options']['delivery_confirmation'] = 'ADULT_SIGNATURE' #only international shipment needs customs form declarations if not is_domestic: if not customs_form: #should not get there!!! logger.critical( "International shipment with no customs declaration, customer uuid %s" % customer_uuid) return None else: customs_info = self._create_customs_object( customs_form=customs_form, customer_name=customer_name, total_weight=weight, itn_number=itn_number, contents_explanation=contents_explanation) ret['customs_info'] = customs_info return ret