40 lines
1.7 KiB
Python
40 lines
1.7 KiB
Python
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
|