Exemple #1
0
    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
Exemple #2
0
 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)
Exemple #3
0
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
Exemple #4
0
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
Exemple #5
0
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
Exemple #6
0
 def is_domestic(self):
     return utils.is_domestic_delivery(self.country_code)
Exemple #7
0
    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