def cart_pay_success(request): '''Logics after a successful payment was made ''' items = [] order = None cart = get_object_or_404(Cart, owner=request.user) cart_items = CartItem.objects.filter(cart=cart) d_result = CartItem.objects.filter(cart_id=cart.cart_id).aggregate( Sum('quantity'), Sum('price')) # This is also to prevent resubmit when user refreshes the payment sucessful page if (not d_result['quantity__sum']) or (not d_result['price__sum']): return HttpResponseRedirect(reverse("shop:shop_home")) #with transaction.Atomic(): # Create a payment record payment = Payment.objects.create( description="Credit payment", amount=d_result['price__sum'] if d_result['price__sum'] else 0, comment="stripe payment") # Create an order order = Order(owner=request.user) order.description = "Online purchase" order.quantity = d_result['quantity__sum'] if d_result[ 'quantity__sum'] else 0 order.total = d_result['price__sum'] if d_result['price__sum'] else 0 order.payment = payment order.comment = "paid by stripe" order.save() # Populate order items to OrderItem table (?? using map()) for item in cart_items: OrderItem.objects.create(order_id=order.order_id, product_id=item.product.id, quantity=item.quantity, price=item.price) # Remove all items from the cart CartItem.objects.filter(cart=cart).delete() # codeset 2 is Product Category categories = CodeValue.objects.filter( code_set_id=2).order_by('display_sequence') items = OrderItem.objects.filter(order=order) o_result = OrderItem.objects.filter(order=order).aggregate(Sum('price')) context = { 'items': items, 'categories': categories, 'page_title': "Payment Successful", 'order_total': o_result['price__sum'] if o_result['price__sum'] else 0, } return render(request, "shop/cart_pay_success.html", context)