Доступ к корзине / адресу доставки в ценовой стратегии django Оскар - PullRequest
0 голосов
/ 12 марта 2020

Какова была бы лучшая практика, чтобы получить адрес доставки в ценовой стратегии? Исходя из выбранной страны, я хотел бы применять налог или нет.

У меня есть экземпляр CheckoutSessionData в моем Selector, а Selector наследуется от CheckoutSessionMixin. Но CheckoutSessionMixin нужна корзина для многих операций, особенно для получения адреса доставки. И BasketMiddleware сначала получает свою стратегию, и только затем устанавливает корзину на текущий запрос.

Итак, как получить адрес доставки, раньше? Любые лучшие практики?

Оскар версия 1.6.3

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Я думаю, что ваша проблема решена в этой части документации - как обращаться с налогами США . В основном вам необходимо:

  1. Использовать стратегию DeferredTax, которая возвращает цены без учета налогов.

  2. Переопределить и откорректировать виды проверки, чтобы применить налоги, как только они станут известны:

    def build_submission(self, **kwargs):
       submission = super().build_submission(**kwargs)
    
        if submission['shipping_address'] and submission['shipping_method']:
            tax.apply_to(submission)
    
            # Recalculate order total to ensure we have a tax-inclusive total
            submission['order_total'] = self.get_order_totals(
                submission['basket'],
                submission['shipping_charge'])
    
        return submission
    

Где tax.apply_to - это функция, которую вы определить, который определяет соответствующий налог для страны доставки (пример в документации).

0 голосов
/ 03 апреля 2020

сейчас я использую это решение, позволяющее мне применять налог или нет на всем моем сайте, где SwissStrategy включает налоги, а InternationalStrategy нет. Рад за любые отзывы.

class Selector(CheckoutSessionMixin):
    """
    Responsible for returning the appropriate strategy class for a given
    user/session.

    This can be called in three ways:

    #) Passing a request and user.  This is for determining
       prices/availability for a normal user browsing the site.

    #) Passing just the user.  This is for offline processes that don't
       have a request instance but do know which user to determine prices for.

    #) Passing nothing.  This is for offline processes that don't
       correspond to a specific user.  Eg, determining a price to store in
       a search index.

    """

    def strategy(self, request=None, user=None, **kwargs):

        # TODO: if request, decide based on location/geoip,
        # if to use swiss or international strategy
        country_id = request.session.get(
            'checkout_data', {}).get('shipping', {}).get('new_address_fields', {}).get('country_id', None)
        try:
            country = Country.objects.get(iso_3166_1_a2=country_id)
        except ObjectDoesNotExist:
            country = None
        if not country or country.iso_3166_1_a2 == 'CH':
            return SwissStrategy(request)
        else:
            return InternationalStrategy(request)
...