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