first commit
This commit is contained in:
39
cart/signals.py
Normal file
39
cart/signals.py
Normal file
@@ -0,0 +1,39 @@
|
||||
from django.contrib.auth.signals import user_logged_in
|
||||
from django.dispatch import receiver
|
||||
from django.conf import settings
|
||||
from .models import Cart, CartItem
|
||||
from product.models import Product
|
||||
|
||||
@receiver(user_logged_in)
|
||||
def merge_cart_on_login(sender, user, request, **kwargs):
|
||||
"""
|
||||
Kullanıcı giriş yaptığında session sepetini veritabanı sepetiyle birleştirir.
|
||||
"""
|
||||
session_cart = request.session.get(settings.CART_SESSION_ID)
|
||||
|
||||
if session_cart:
|
||||
# Kullanıcının DB sepetini al veya oluştur
|
||||
db_cart, created = Cart.objects.get_or_create(user=user)
|
||||
|
||||
for product_id, item_data in session_cart.items():
|
||||
quantity = item_data['quantity']
|
||||
product = Product.objects.get(id=product_id)
|
||||
|
||||
# Ürün zaten DB sepetinde var mı?
|
||||
cart_item, item_created = CartItem.objects.get_or_create(cart=db_cart, product=product)
|
||||
|
||||
if not item_created:
|
||||
# Varsa miktarı artır
|
||||
cart_item.quantity += quantity
|
||||
else:
|
||||
# Yoksa miktarı ayarla (default 1 olduğu için üzerine eklemiyoruz, direkt atıyoruz ama get_or_create default ile oluşturduysa quantity 1 olabilir, o yüzden dikkat)
|
||||
# get_or_create default=1 ile oluşturur. Biz session'dan geleni kullanmalıyız.
|
||||
# Ancak item_created True ise yeni oluştu demektir ve default değeri almıştır.
|
||||
# Bizim session'daki quantity'yi atamamız lazım.
|
||||
cart_item.quantity = quantity
|
||||
|
||||
cart_item.save()
|
||||
|
||||
# Session sepetini temizle
|
||||
del request.session[settings.CART_SESSION_ID]
|
||||
request.session.modified = True
|
||||
Reference in New Issue
Block a user