Можно ли настроить способы оплаты в зависимости от категории или продукта в Satchmo? - PullRequest
1 голос
/ 15 июля 2011

У меня есть магазин с питанием от Satchmo, в котором должна быть специальная категория товаров, доступная только пользователям, которые оплачивают товар наложенным платежом.

Если не считать жесткого кода процесса оформления заказа, есть ли какой-нибудь простой способ, которым я могу ограничить варианты оплаты для определенной категории продуктов только наложенным платежом?

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Решение состоит в том, что Satchmo излучает сигналы практически для каждого действия, поэтому при построении формы методов оплаты вы должны прослушать определенный сигнал и затем переопределить методов переменная kwarg, которая передается слушателю:

from payment.signals import payment_methods_query

def on_payment_methods_query(sender, methods=None, cart=None, order=None, contact=None, **kwargs):
    if not cart.is_empty:
        for item in cart.cartitem_set.all():
            special_products = settings.SPECIAL_PRODUCTS #(1, 15, 25, 75)
            if item.product_id in special_products:
                # methods is a list of (option_value, option_label) tuples
                methods = [m for m in methods if m[0] in ('COD',)]
                return
payment_methods_query.connect(on_payment_methods_query)
0 голосов
/ 26 ноября 2014

В предыдущем ответе есть одна проблема (я знаю, потому что я только что попробовал себя), в следующей строке:

methods = [m for m in methods if m[0] in ('COD',)] # won't have the desired effect

Проблема в том, что из исходного списка методов создается совершенно новый список, который хранится под тем же именем переменной. Это не повлияет на первоначальный список, который передал Satchmo, поэтому Satchmo даже не узнает. То, что вам нужно сделать, это на самом деле изменить переданный объект списка, используя такие методы, как 'method.remove (...)'.

В конкретном примере это должно быть примерно так:

disallowed_methods = [m for m in methods if m[0] not in ('COD',)]
for m in disallowed_methods:
    methods.remove(m)

Может быть, мой код не самый элегантный; возможно, кто-то может улучшить его, и, возможно, интегрировать его с первоначальным ответом

...