2011-07-15 2 views
1

J'ai un magasin Satchmo qui doit avoir une catégorie d'articles spéciale disponible uniquement pour les utilisateurs qui paient par la méthode de livraison contre remboursement. À moins de coder en dur le processus de paiement, y a-t-il un moyen simple de restreindre les options de paiement pour une catégorie de produits donnée à l'argent comptant à la livraison seulement?Est-il possible de configurer des méthodes de paiement spécifiques à une catégorie ou à un produit dans Satchmo?

Répondre

1

Solution est que Satchmo émet des signaux presque pour chaque action, donc sur la construction des moyens de paiement forme vous devez écouter un signal spécifique, puis redéfinir méthodes variable kwarg qui se transmet à l'auditeur:

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

Il y a un problème dans la réponse précédente (je sais parce que je me suis essayé), dans la ligne suivante:

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

le problème est, de la liste des méthodes originales, une liste entièrement nouvelle est créé et stocké dans le même nom de variable. Cela n'affectera pas la liste originale que Satchmo a transmise, donc Satchmo ne le saura même pas. Ce que vous devez faire est en fait de modifier l'objet de la liste transmis, en utilisant des méthodes comme 'methods.remove (...)'.

Dans l'exemple particulier, il devrait y avoir quelque chose comme ceci:

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

Peut-être que mon code n'est pas le plus élégant; peut-être que quelqu'un peut l'améliorer, et peut-être l'intégrer avec la réponse originale.

Questions connexes