def checkout_shipping(): form = AddressForm(request.form) user_address = None if request.method == "POST": if request.form["address_sel"] != "new": user_address = UserAddress.get_by_id(request.form["address_sel"]) elif request.form["address_sel"] == "new" and form.validate_on_submit( ): user_address = UserAddress.create( province=form.province.data, city=form.city.data, district=form.district.data, address=form.address.data, contact_name=form.contact_name.data, contact_phone=form.contact_phone.data, user_id=current_user.id, ) shipping_method = ShippingMethod.get_by_id( request.form["shipping_method"]) if user_address and shipping_method: cart = Cart.get_current_user_cart() cart.update( shipping_address_id=user_address.id, shipping_method_id=shipping_method.id, ) return redirect(url_for("checkout.checkout_note")) flash_errors(form) shipping_methods = ShippingMethod.query.all() return render_template("checkout/shipping.html", form=form, shipping_methods=shipping_methods)
def checkout_note(): form = NoteForm(request.form) voucher_form = VoucherForm(request.form) cart = Cart.get_current_user_cart() address = ( UserAddress.get_by_id(cart.shipping_address_id) if cart.shipping_address_id else None ) shipping_method = ( ShippingMethod.get_by_id(cart.shipping_method_id) if cart.shipping_method_id else None ) if form.validate_on_submit(): order, msg = Order.create_whole_order(cart, form.note.data) if order: return redirect(order.get_absolute_url()) else: flash(msg, "warning") return redirect(url_for("checkout.cart_index")) return render_template( "checkout/note.html", form=form, address=address, voucher_form=voucher_form, shipping_method=shipping_method, )
def address_edit(id): addr = UserAddress.get_by_id(id) form = UserAddressForm(obj=addr) if form.validate_on_submit(): form.populate_obj(addr) addr.save() return redirect(url_for("dashboard.user", user_id=addr.user_id)) return render_template("user/edit_addr.html", form=form)
def create_fake_address(user_id=None): address = UserAddress.create( contact_name=fake.name(), province=fake.state(), city=fake.city(), district=fake.city_suffix(), address=fake.street_address(), contact_phone=fake.phone_number(), user_id=user_id, ) return address
def create_whole_order(cls, cart, note=None): # Step1, certify stock, voucher to_update_variants = [] to_update_orderlines = [] total_net = 0 for line in cart.lines: variant = ProductVariant.get_by_id(line.variant.id) result, msg = variant.check_enough_stock(line.quantity) if result is False: return result, msg variant.quantity_allocated += line.quantity to_update_variants.append(variant) orderline = OrderLine( variant_id=variant.id, quantity=line.quantity, product_name=variant.display_product(), product_sku=variant.sku, product_id=variant.sku.split("-")[0], unit_price_net=variant.price, is_shipping_required=variant.is_shipping_required, ) to_update_orderlines.append(orderline) total_net += orderline.get_total() voucher = None if cart.voucher_code: voucher = Voucher.get_by_code(cart.voucher_code) try: voucher.check_available(cart) except Exception as e: return False, str(e) # Step2, create Order obj try: shipping_method_id = None shipping_method_title = None shipping_method_price = 0 shipping_address = None if cart.shipping_method_id: shipping_method = ShippingMethod.get_by_id( cart.shipping_method_id) shipping_method_id = shipping_method.id shipping_method_title = shipping_method.title shipping_method_price = shipping_method.price shipping_address = UserAddress.get_by_id( cart.shipping_address_id).full_address order = cls.create( user_id=current_user.id, token=str(uuid4()), shipping_method_id=shipping_method_id, shipping_method_name=shipping_method_title, shipping_price_net=shipping_method_price, shipping_address=shipping_address, status=OrderStatusKinds.unfulfilled.value, total_net=total_net, ) except Exception as e: return False, str(e) # Step3, process others if note: order_note = OrderNote(order_id=order.id, user_id=current_user.id, content=note) db.session.add(order_note) if voucher: order.voucher_id = voucher.id order.discount_amount = voucher.get_vouchered_price(cart) order.discount_name = voucher.title voucher.used += 1 db.session.add(order) db.session.add(voucher) for variant in to_update_variants: db.session.add(variant) for orderline in to_update_orderlines: orderline.order_id = order.id db.session.add(orderline) for line in cart.lines: db.session.delete(line) db.session.delete(cart) db.session.commit() return order, "success"