2017-07-26 3 views
1

mon problème est que j'ai une fonction qui s'exécute tous les 3 jours au moyen de apply_async de céleri. J'ai mis une commande en attente d'annulation si elle n'est pas approuvée dans 2 jours. Le problème est, si l'administrateur le reconsidère et change le statut en attente, le temporisateur devrait redémarrer, l'expiration ne se termine pas. Je ne sais pas si .revoke() de céleri annulera spécifiquement un seul appel .expire(). Je ne veux pas que tous s'arrêtent juste un spécifique. Quelqu'un peut-il aider?Existe-t-il un moyen spécifique d'annuler des tâches dans le céleri django

tasks.py

@app.task(name="expire") 

def expire(order_id): 
    print(order_id) 
    print("this works") 
    try: 
     order = Order.objects.get(id=order_id) 
     print(order) 
    except: 
     print(f"Failed retrieving order object of id {order_id}") 
     return 

    if order.status != "P": 
     return 

    # Place products back to inventory 
    line_items = order.orderlineitems_set.all() 

    for line_item in line_items: 
     product = line_item.product 
     quantity = line_item.quantity 

     product.quantity += quantity 
     product.save() 

    # Cancel order 
    order.status = "C" 
    print(order.status) 
    order.save() 

views.py

class PurchaseView(View): 
    @staticmethod 
    @login_required 
    @customer_required 
    def get(request): 
     cart = Cart(request=request) 

     if not cart.is_approved: 
      print("Cart is not approved") 
      return redirect("/checkout/cart/") 

     customer = Customer.objects.get(user=request.user) 
     order = cart.convert_to_order(customer=customer) 
     cart.reset_cart() 
     print(order.status) 
     expire.apply_async(args=(order.id,), eta=datetime.utcnow() + timedelta(days=3)) 

     context = make_context(request) 
     context["total_price"] = order.total_price 

     return render(request, 'purchase.html', context) 

Répondre

0

Je résolu ce problème en ajoutant une liaison = True et en utilisant l'auto pour obtenir l'ID de tâche

@app.task(bind=True, name="expire") 
def expire(self,order_id): 
    print(f"the task queue id is {self.request.id}") 
    try: 
     order = Order.objects.get(id=order_id) 
     print(f"the order status is {order.status}") 
    except: 
     print(f"Failed retrieving order object of id {order_id}") 
     return 


    if order.status == "C": 
     print(f"this process terminated, order status:{order.status}") 
     app.control.revoke(self.request.id, terminate = True)