0

I have model Order

class Order(models.Model):
STATUS = (
    ('Pending', 'Pending'),
    ('Out for delivery', 'Out for delivery'),
    ('Delivered', 'Delivered'),
)
shop = models.ForeignKey(Shop, models.CASCADE, null=True)
customer = models.ForeignKey(Customer, models.CASCADE, null=True)
product = models.ForeignKey(Product, models.CASCADE, null=True)
quantity = models.CharField(max_length=30, null=True, )
date_created = models.DateTimeField(auto_now_add=True, null=True)
status = models.CharField(max_length=200, null=True, choices=STATUS, default='Pending')
note = models.CharField(max_length=1000, null=True)

how I can send SMS to shop when order insert by the customer then shop receive SMS that You have new order by customer.name. the product.name in the quantity

customer model

class Customer(models.Model):
      user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
      name = models.CharField(max_length=100, null=True, default='customer')
     Phone = models.CharField(null=True, max_length=10)

shop model

 class Shop(models.Model):
      user = models.OneToOneField(User, null=True, related_name='shop', blank=True, on_delete=models.CASCADE)
      name = models.CharField(max_length=70, null=True, default='shop', )
      address = models.CharField(max_length=200, null=True)
      Phone = models.CharField(null=True, max_length=10)

and my order views.py

def CreateOrder(request, shop_id, product_id):
    customer = request.user.customer
    shop = Shop.objects.get(id=shop_id)
    product = Product.objects.get(id=product_id)
    form = OrderForm()
    quantity = request.POST.get('quantity')
    note = request.POST.get('note')
    if request.method == 'POST':
        order = Order.objects.create(customer=customer, shop=shop,
                                   product=product, quantity=quantity, note=note)
        return redirect('CustomerOrder')
  • 1
    Don't use `drf` tag, if you are not using it. I have seen many questions from you which follows the same pattern. – neferpitou Jul 01 '20 at 20:51
  • 3
    I've noticed, by the way, that all of your questions are left open. Have you seen [What should I do when someone answers my question?](https://stackoverflow.com/help/someone-answers)? It helps signify that your problems have been solved. It's possible that you really didn't get a satisfactory answer to any; I just want to be sure you're aware of this feature – roganjosh Jul 01 '20 at 21:09

1 Answers1

1

You can use signals in Django for that. Essentially your application will be notified when certain events occur. In your case you can use post_save, signal will be triggered after a model’s save() method is called. In Django docs you can check whole list of different types of signals available.

from .models import Order, Shop, Customer
from django.dispatch import Signal, receiver
from django.db.models.signals import post_save


@receiver(post_save, sender=Order)
def send_msg_to_shop_owners(sender, instance, **kwargs):
    # YOUR CODE HERE 
    pass
    

Inside receiver, you can use requests to send API call to whatever message service you want to use.

NOTE: post_save signal will be triggered whenever save() method for your Order model is called. Which will include updating your model. So depending on your use case you can even create your own custom signals.

Custom signals in Django

from django.dispatch import Signal, receiver

# DEFINE SIGNAL NAME WITH REQUIRED ARGUMENTS; FOR NOW JUST order_id, user_name
send_message_to_shop_owner = Signal(providing_args=["order_id","user_name"])

@receiver(send_message_to_shop_owner)
def send_message_to_shop_owner_receiver(sender, **kwargs):
    # access the parameters passed
    # order_id = kwargs["order_id"]
    # user_name = kwargs["user_name"]
    # REST OF YOUR CODE GOES HERE
    pass

Now you have defined your signal you need to trigger it whenever you want to send message. In drf I generally place it inside serializers.py but you can do it inside your views. Here is how you will trigger the signal.

views.py

from .signals import send_message_to_shop_owner

def CreateOrder(request, shop_id, product_id):
    customer = request.user.customer
    shop = Shop.objects.get(id=shop_id)
    product = Product.objects.get(id=product_id)
    form = OrderForm()
    quantity = request.POST.get('quantity')
    note = request.POST.get('note')
    if request.method == 'POST':
        order = Order.objects.create(customer=customer, shop=shop,
                                   product=product, quantity=quantity, note=note)
        # Ignore my custom parameters, instead of that you can send yours
        send_message_to_shop_owner.send(Sender=Order, order_id=order_id,user_name=user_name)
        return redirect('CustomerOrder')

NOTE: For custom signals you need to trigger it whenever you want to use it.

neferpitou
  • 415
  • 7
  • 14