def checkout(request): stripe_public_key = settings.STRIPE_PUBLIC_KEY stripe_secret_key = settings.STRIPE_SECRET_KEY if request.method == 'POST': basket = request.session.get('basket', []) order_form = OrderForm(request.POST) if order_form.is_valid(): total = 0 order = order_form.save() for item_data in basket: try: course = Course.objects.get(id=item_data['course']) order_line_item = OrderLineItem( sub_total=item_data['sub_total'], order=order, course=course, quantity=item_data['quantity'], ) total += item_data['sub_total'] order_line_item.save() except Course.DoesNotExist: messages.error(request, ( "One of the products in your bag wasn't found in our database. " "Please call us for assistance!")) order.delete() return redirect(reverse('view_basket')) grand_total = total discount = 0 order.order_total = total order.grand_total = grand_total order.discount = discount order.save() request.session['save_info'] = 'save-info' in request.POST return redirect( reverse('checkout_success', args=[order.order_number])) else: messages.error( request, 'There was an error with your form. \ Please double check your information.') else: basket = request.session.get('basket', {}) if not basket: messages.error(request, "There's nothing here yet") return redirect(reverse('products')) current_basket = basket_contents(request) current_total = current_basket['total'] stripe_total = round(current_total * 100) stripe.api_key = stripe_secret_key intent = stripe.PaymentIntent.create( amount=stripe_total, currency=settings.STRIPE_CURRENCY, ) order_form = OrderForm() if not stripe_public_key: messages.warning( request, 'Stripe public key is missing. \ Did you forget to set it in your environment?') template = 'checkout/checkout.html' context = { 'order_form': order_form, 'stripe_public_key': stripe_public_key, 'client_secret': intent.client_secret, } return render(request, template, context)
def checkout(request): """ Function to show checkout page and process the payment """ stripe_public_key = settings.STRIPE_PUBLIC_KEY stripe_secret_key = settings.STRIPE_SECRET_KEY if request.method == 'POST': basket = request.session.get('basket', {}) form_data = { 'full_name': request.POST['full_name'], 'email': request.POST['email'], 'phone_number': request.POST['phone_number'], 'country': request.POST['country'], 'postcode': request.POST['postcode'], 'city': request.POST['city'], 'address1': request.POST['address1'], 'address2': request.POST['address2'], } order_form = OrderForm(form_data) if order_form.is_valid(): order = order_form.save() for product_id, item_data in basket.items(): try: product = Product.objects.get(id=product_id) if isinstance(item_data, int): order_line_item = OrderLineItem( order=order, product=product, quantity=item_data, ) order_line_item.save() else: for size, quantity in item_data[ 'products_by_size'].items(): order_line_item = OrderLineItem( order=order, product=product, quantity=quantity, product_size=size, ) order_line_item.save() except Product.DoesNotExist: messages.error(request, ( "One of the products in your basket wasn't found in our database. " "Please call us for assistance!")) order.delete() return redirect(reverse('view_basket')) request.session['save_info'] = 'save-info' in request.POST return redirect( reverse('checkout_success', args=[order.order_number])) else: messages.error( request, 'There was an error with your form. \ Please double check your information.') else: basket = request.session.get('basket', {}) if not basket: messages.error(request, "The basket is empty at the moment") return redirect(reverse('shop:all_products')) current_basket = basket_contents(request) total = current_basket['grand_total'] stripe_total = round(total * 100) stripe.api_key = stripe_secret_key intent = stripe.PaymentIntent.create( amount=stripe_total, currency=settings.STRIPE_CURRENCY, ) # Attempt to prefill the form with any info the user maintains in their profile if request.user.is_authenticated: try: profile = UserProfile.objects.get(user=request.user) order_form = OrderForm( initial={ 'full_name': profile.user.get_full_name(), 'email': profile.user.email, 'phone_number': profile.default_phone_number, 'country': profile.default_country, 'postcode': profile.default_postcode, 'city': profile.default_city, 'address1': profile.default_address1, 'address2': profile.default_address2, }) except UserProfile.DoesNotExist: order_form = OrderForm() else: order_form = OrderForm() if not stripe_public_key: messages.warning( request, 'Stripe public key is missing. \ Did you forget to set it in your environment?') context = { 'order_form': order_form, 'stripe_public_key': stripe_public_key, 'client_secret': intent.client_secret, } return render(request, 'checkout/checkout.html', context)
def checkout(request): """ Checkout view, pulling info from forms to post to Stripe """ stripe_public_key = settings.STRIPE_PUBLIC_KEY stripe_secret_key = settings.STRIPE_SECRET_KEY if request.method == "POST": basket = request.session.get("basket", {}) form_data = { "full_name": request.POST["full_name"], "email": request.POST["email"], "phone_number": request.POST["phone_number"], "country": request.POST["country"], "postcode": request.POST["postcode"], "post_town": request.POST["post_town"], "address_1": request.POST["address_1"], "address_2": request.POST["address_2"], "county": request.POST["county"], } order_form = OrderForm(form_data) if order_form.is_valid(): order = order_form.save(commit=False) pid = request.POST.get("client_secret").split("_secret")[0] order.stripe_pid = pid order.original_basket = json.dumps(basket) order.save() for item_id, item_data in basket.items(): try: product = Product.objects.get(id=item_id) order_line_item = OrderLineItem( order=order, product=product, quantity=item_data, ) order_line_item.save() except Product.DoesNotExist: messages.error( request, ("One of the products in your order was not \ found in our database." "Please call us for assitance"), ) order.delete() return redirect(reverse("view_basket")) request.session["save_info"] = "save-info" in request.POST return redirect( reverse("checkout_success", args=[order.order_number])) else: messages.error( request, "There was an error with your form. \ Please double check your information", ) else: basket = request.session.get("basket", {}) if not basket: messages.error(request, "Your basket is empty") return redirect(reverse("all_products")) current_basket = basket_contents(request) total = current_basket["grand_total"] stripe_total = round(total * 100) stripe.api_key = stripe_secret_key intent = stripe.PaymentIntent.create( amount=stripe_total, currency=settings.STRIPE_CURRENCY, payment_method_types=["card"], ) if request.user.is_authenticated: try: profile = UserProfile.objects.get(user=request.user) saved_info = { "full_name": profile.user.get_full_name(), "email": profile.user.email, "phone_number": profile.default_phone_number, "country": profile.default_country, "postcode": profile.default_postcode, "post_town": profile.default_post_town, "address_1": profile.default_address_1, "address_2": profile.default_address_2, "county": profile.default_county, } order_form = OrderForm(initial=saved_info) except UserProfile.DoesNotExist: order_form = OrderForm() else: order_form = OrderForm() if not stripe_public_key: messages.warning( request, "Stripe public key is missing. \ Did you forget to set it in your environment?", ) template = "checkout/checkout.html" context = { "order_form": order_form, "stripe_public_key": stripe_public_key, "client_secret": intent.client_secret, } return render(request, template, context)
def checkout(request): stripe_public_key = settings.STRIPE_PUBLIC_KEY stripe_secret_key = settings.STRIPE_SECRET_KEY if request.method == 'POST': basket = request.session.get('basket', {}) form_data = { 'full_name': request.POST['full_name'], 'email': request.POST['email'], 'phone_number': request.POST['phone_number'], 'country': request.POST['country'], 'postcode': request.POST['postcode'], 'town_or_city': request.POST['town_or_city'], 'street_address1': request.POST['street_address1'], 'street_address2': request.POST['street_address2'], 'county': request.POST['county'], } order_form = OrderForm(form_data) if order_form.is_valid(): order = order_form.save(commit=False) pid = request.POST.get('client_secret').split('_secret')[0] order.stripe_pid = pid order.original_basket = json.dumps(basket['items']) order.save() # This checks the delivery method. for item in basket['items']: if item['digital_download'] == 'on': digital_download = True else: digital_download = False try: product = get_object_or_404(Product, pk=item['item_id']) order_line_item = OrderLineItem( order=order, product=product, quantity=item["quantity"], digital_download=digital_download, ) order_line_item.save() except Product.DoesNotExist: messages.error(request, ( "One of the products in your basket wasn't found in our database. " "Please call us for assistance!")) order.delete() return redirect(reverse('view_basket')) request.session['save_info'] = 'save-info' in request.POST return redirect( reverse('checkout_success', args=[order.order_number])) else: messages.error( request, 'There was an error with your form. \ Please double check your information.') else: basket = request.session.get('basket', {}) if not basket: messages.error(request, "There's nothing in your basket at the moment") return redirect(reverse('products')) current_basket = basket_contents(request) total = current_basket['grand_total'] stripe_total = round(total * 100) stripe.api_key = stripe_secret_key intent = stripe.PaymentIntent.create( amount=stripe_total, currency=settings.STRIPE_CURRENCY, ) if request.user.is_authenticated: try: profile = UserProfile.objects.get(user=request.user) order_form = OrderForm( initial={ 'full_name': profile.user.get_full_name(), 'email': profile.user.email, 'phone_number': profile.default_phone_number, 'country': profile.default_country, 'postcode': profile.default_postcode, 'town_or_city': profile.default_town_or_city, 'street_address1': profile.default_street_address1, 'street_address2': profile.default_street_address2, 'county': profile.default_county, }) except UserProfile.DoesNotExist: order_form = OrderForm() else: order_form = OrderForm() if not stripe_public_key: messages.warning( request, 'Stripe public key is missing. \ Did you forget to set it in your environment?') template = 'checkout/checkout.html' context = { 'order_form': order_form, 'stripe_public_key': stripe_public_key, 'client_secret': intent.client_secret, } return render(request, template, context)
def checkout(request): stripe_public_key = settings.STRIPE_PUBLIC_KEY stripe_secret_key = settings.STRIPE_SECRET_KEY if request.method == 'POST': basket = request.session.get('basket', {}) form_data = { 'firstname': request.POST['firstname'], 'lastname': request.POST['lastname'], 'email': request.POST['email'], 'phone_number': request.POST['phone_number'], 'town': request.POST['town'], 'street_address1': request.POST['street_address1'], 'street_address2': request.POST['street_address2'], 'county': request.POST['county'], 'postcode': request.POST['postcode'], 'country': request.POST['country'], } order_form = orderform(form_data) if order_form.is_valid(): order = order_form.save() for item_id, quantity in basket.items(): product = Product.objects.get(id=item_id) order_line_item = orderlineitem( order=order, product=product, quantity=quantity, ) order_line_item.save() request.session['save-profile'] = 'save-profile' in request.POST return redirect( reverse('checkout_success', args=[order.order_number])) else: basket = request.session.get('basket', {}) current_basket = basket_contents(request) total = current_basket['grand_total'] stripe_total = round(total * 100) stripe.api_key = stripe_secret_key intent = stripe.PaymentIntent.create( amount=stripe_total, currency=settings.STRIPE_CURRENCY, ) if request.user.is_authenticated: profile = UserProfile.objects.get(user=request.user) order_form = orderform( initial={ 'email': profile.user.email, 'phone_number': profile.default_phone_number, 'street_address1': profile.default_street_address1, 'street_address2': profile.default_street_address2, 'town': profile.default_town, 'postcode': profile.default_postcode, 'county': profile.default_county, 'country': profile.default_country, }) else: order_form = orderform() template = 'checkout/checkout.html' context = { 'order_form': order_form, 'stripe_public_key': stripe_public_key, 'client_secret': intent.client_secret, } return render(request, template, context)