def add_to_basket(request, id): uproduct = get_object_or_404(UniqueProduct, pk=id) basket = _get_basket(request) try: item = get_object_or_404(BasketItem, basket=basket, item=uproduct, monthly_order=False) item.quantity += 1 except: item = BasketItem.objects.create(item=uproduct, quantity=1, basket=basket) item.save() # UPDATE THE USER'S SESSION VARIABLES if 'BASKET_QUANTITY' in request.session: request.session['BASKET_QUANTITY'] = ( request.session['BASKET_QUANTITY'] + 1) else: request.session['BASKET_QUANTITY'] = 1 if 'BASKET_AMOUNT' in request.session: request.session['BASKET_AMOUNT'] = ( float(request.session['BASKET_AMOUNT']) + float(item.item.get_price())) else: request.session['BASKET_AMOUNT'] = item.item.get_price() if request.is_ajax(): message = render_to_string( 'shop/snippets/added_to_basket.html', { 'item': item.item.parent_product, 'weight': item.item.weight, 'weight_unit': RequestContext(request)['weight_unit'], 'url': reverse('basket'), }) basket_amount = '%.2f' % float( _get_basket_value(request)['total_price']) basket_quantity = '%.2f' % float( _get_basket_value(request)['basket_quantity']) data = { 'message': message, 'basket_quantity': basket_quantity, 'basket_amount': basket_amount } json = simplejson.dumps(data, cls=DjangoJSONEncoder) return HttpResponse(json) url = request.META.get('HTTP_REFERER', '/') request.session['ADDED'] = item.id return HttpResponseRedirect(url)
def add_to_basket_multiple(request): if request.method == 'POST': form = AddMultipleItemsToBasket(request.POST) if form.is_valid(): for i in form.cleaned_data['items']: uproduct = i basket = _get_basket(request) try: item = get_object_or_404(BasketItem, basket=basket, item=uproduct, monthly_order=False) item.quantity += 1 except: item = BasketItem.objects.create(item=uproduct, quantity=1, basket=basket) item.save() # UPDATE THE USER'S SESSION VARIABLES try: request.session['BASKET_QUANTITY'] += 1 request.session['BASKET_AMOUNT'] += item.item.get_price() except: request.session['BASKET_QUANTITY'] = 0 request.session['BASKET_AMOUNT'] += item.item.get_price() if request.is_ajax(): message = render_to_string( 'shop/snippets/added_to_basket.html', { 'item': item.item.parent_product, 'weight': item.item.weight, 'weight_unit': RequestContext(request)['weight_unit'], 'url': reverse('basket'), }) basket_amount = '%.2f' % float( _get_basket_value(request)['total_price']) basket_quantity = '%.2f' % float( _get_basket_value(request)['basket_quantity']) data = { 'message': message, 'basket_quantity': basket_quantity, 'basket_amount': basket_amount } json = simplejson.dumps(data, cls=DjangoJSONEncoder) return HttpResponse(json) url = request.META.get('HTTP_REFERER', '/') return HttpResponseRedirect(url)
def add_to_basket_multiple(request): if request.method == "POST": form = AddMultipleItemsToBasket(request.POST) if form.is_valid(): for i in form.cleaned_data["items"]: uproduct = i basket = _get_basket(request) try: item = get_object_or_404(BasketItem, basket=basket, item=uproduct, monthly_order=False) item.quantity += 1 except: item = BasketItem.objects.create(item=uproduct, quantity=1, basket=basket) item.save() # UPDATE THE USER'S SESSION VARIABLES try: request.session["BASKET_QUANTITY"] += 1 request.session["BASKET_AMOUNT"] += item.item.get_price() except: request.session["BASKET_QUANTITY"] = 0 request.session["BASKET_AMOUNT"] += item.item.get_price() if request.is_ajax(): message = render_to_string( "shop/snippets/added_to_basket.html", { "item": item.item.parent_product, "weight": item.item.weight, "weight_unit": RequestContext(request)["weight_unit"], "url": reverse("basket"), }, ) basket_amount = "%.2f" % float(_get_basket_value(request)["total_price"]) basket_quantity = "%.2f" % float(_get_basket_value(request)["basket_quantity"]) data = {"message": message, "basket_quantity": basket_quantity, "basket_amount": basket_amount} json = simplejson.dumps(data, cls=DjangoJSONEncoder) return HttpResponse(json) url = request.META.get("HTTP_REFERER", "/") return HttpResponseRedirect(url)
def order_confirm(request): try: order = get_object_or_404(Order, id=request.session['ORDER_ID']) except: problem = _( "You don't have any items in your basket, so you can't process an order!" ) return _render(request, 'shop/order-problem.html', locals()) shopper = order.owner order.basket = Basket.objects.get(id=request.session['BASKET_ID']) order.save() basket = _get_basket_value(request) amount_in_cents = int(float(basket['total_price']) * 100) # for stupid stripe... # THIS HANDLES STRIPE if request.method == 'POST': stripe.api_key = settings.STRIPE_SECRET_KEY token = request.POST['stripeToken'] try: charge = stripe.Charge.create( amount=amount_in_cents, currency=basket['currency'].code.lower(), card=token, description=order.owner.user.email) # UPDATE THE ORDER DETAILS order.status = Order.STATUS_PAID order.date_paid = datetime.now() order.save() # IF THERE WAS A SINGLE USE DISCOUNT, UPDATE IT if order.discount: if order.discount.single_use == True: order.discount.is_active = False order.discount.save() from emailer.views import _payment_success _payment_success(order) # NOW CREATE A CUSTOMER PACKAGE from logistics.views import _create_customer_package _create_customer_package(order) return HttpResponseRedirect( reverse('order_complete', args=[order.hashkey])) except stripe.CardError, e: # do we need to do something here like show an error message?! pass
def order_confirm(request): try: order = get_object_or_404(Order, id=request.session["ORDER_ID"]) except: problem = _("You don't have any items in your basket, so you can't process an order!") return _render(request, "shop/order-problem.html", locals()) shopper = order.owner order.basket = Basket.objects.get(id=request.session["BASKET_ID"]) order.save() basket = _get_basket_value(request) amount_in_cents = int(float(basket["total_price"]) * 100) # for stupid stripe... # THIS HANDLES STRIPE if request.method == "POST": stripe.api_key = settings.STRIPE_SECRET_KEY token = request.POST["stripeToken"] try: charge = stripe.Charge.create( amount=amount_in_cents, currency=basket["currency"].code.lower(), card=token, description=order.owner.user.email, ) # UPDATE THE ORDER DETAILS order.status = Order.STATUS_PAID order.date_paid = datetime.now() order.save() # IF THERE WAS A SINGLE USE DISCOUNT, UPDATE IT if order.discount: if order.discount.single_use == True: order.discount.is_active = False order.discount.save() from emailer.views import _payment_success _payment_success(order) # NOW CREATE A CUSTOMER PACKAGE from logistics.views import _create_customer_package _create_customer_package(order) return HttpResponseRedirect(reverse("order_complete", args=[order.hashkey])) except stripe.CardError, e: # do we need to do something here like show an error message?! pass
def add_to_basket(request, id): uproduct = get_object_or_404(UniqueProduct, pk=id) basket = _get_basket(request) try: item = get_object_or_404(BasketItem, basket=basket, item=uproduct, monthly_order=False) item.quantity += 1 except: item = BasketItem.objects.create(item=uproduct, quantity=1, basket=basket) item.save() # UPDATE THE USER'S SESSION VARIABLES if "BASKET_QUANTITY" in request.session: request.session["BASKET_QUANTITY"] = request.session["BASKET_QUANTITY"] + 1 else: request.session["BASKET_QUANTITY"] = 1 if "BASKET_AMOUNT" in request.session: request.session["BASKET_AMOUNT"] = float(request.session["BASKET_AMOUNT"]) + float(item.item.get_price()) else: request.session["BASKET_AMOUNT"] = item.item.get_price() if request.is_ajax(): message = render_to_string( "shop/snippets/added_to_basket.html", { "item": item.item.parent_product, "weight": item.item.weight, "weight_unit": RequestContext(request)["weight_unit"], "url": reverse("basket"), }, ) basket_amount = "%.2f" % float(_get_basket_value(request)["total_price"]) basket_quantity = "%.2f" % float(_get_basket_value(request)["basket_quantity"]) data = {"message": message, "basket_quantity": basket_quantity, "basket_amount": basket_amount} json = simplejson.dumps(data, cls=DjangoJSONEncoder) return HttpResponse(json) url = request.META.get("HTTP_REFERER", "/") request.session["ADDED"] = item.id return HttpResponseRedirect(url)
def order_repeat(request, hash): # THE PREVIOUS ORDER ITEM old_order = get_object_or_404(Order, hashkey=hash) new_order = Order.objects.create( date_confirmed=datetime.now(), address=old_order.address, owner=old_order.owner, status=Order.STATUS_CREATED_NOT_PAID, invoice_id="TEMP", ) new_order.invoice_id = "TEA-00%s" % (new_order.id) new_order.save() # we'll also create a basket for them. # because IF they want to add something else to the order, # they'll need a basket. basket = Basket.objects.create( date_modified=datetime.now(), owner=new_order.owner, ) # now we'll check for replacements/substitutions currency = _get_currency(request) for item in old_order.items.all(): if item.item.is_active == False: # if it's not available, replace it with the closest matching UniqueProduct product = UniqueProduct.objects.filter( parent_product=item.item.parent_product, sale_price__isnull=True, currency=currency, is_active=True, ).order_by('-price')[0] basket_item = BasketItem.objects.create(item=product, quantity=item.quantity, basket=basket) new_order.items.add(basket_item) else: new_order.items.add(item) # for each item attached to the new order, reassign the basket to this new basket for item in new_order.items.all(): item.basket = basket item.save() request.session['BASKET_ID'] = basket.id request.session['ORDER_ID'] = new_order.id # FINALLY, GET THE VALUES ETC. basket = _get_basket_value(request, order=new_order) return _render(request, 'shop/forms/order_repeat.html', locals())
def _payment_success(order): """ Sends an email to a customer immediately after they successfully complete an order on the site. Also sends a confirmation email to the Admins """ # PREPARE THE EMAIL INFORMATION recipient = order.owner.email activate(order.owner.language) subject_line = _("Order Confirmed - %(id)s - %(site)s") % { 'id': order.invoice_id, 'site': settings.SITE_NAME, } template = 'shop/emails/order_confirm_customer.txt' # PREPARE THE ORDER if order.address.country == 'US': weight_unit = 'oz' else: weight_unit = 'g' basket = _get_basket_value(order=order) print basket for item in basket['basket_items']: if item.item.weight: if order.address.country == 'US': item.weight = weight_converter(item.item.weight) else: item.weight = item.item.weight else: item.weight = None extra_context = { 'order': order, 'items': basket['basket_items'], 'currency': basket['currency'], 'total_price': basket['total_price'], 'discount': basket['discount'], 'postage_discount': basket['postage_discount'], 'weight_unit': weight_unit, } _send_email(recipient, subject_line, template, extra_context) # ADMIN EMAIL (reset some of the values!!) recipient = settings.SITE_EMAIL lang = activate('en') template = 'shop/emails/order_confirm_admin.txt' _send_email(recipient, subject_line, template, extra_context, admin=True) return True
def _payment_success(order): """ Sends an email to a customer immediately after they successfully complete an order on the site. Also sends a confirmation email to the Admins """ # PREPARE THE EMAIL INFORMATION recipient = order.owner.email activate(order.owner.language) subject_line = _("Order Confirmed - %(id)s - %(site)s") % {"id": order.invoice_id, "site": settings.SITE_NAME} template = "shop/emails/order_confirm_customer.txt" # PREPARE THE ORDER if order.address.country == "US": weight_unit = "oz" else: weight_unit = "g" basket = _get_basket_value(order=order) print basket for item in basket["basket_items"]: if item.item.weight: if order.address.country == "US": item.weight = weight_converter(item.item.weight) else: item.weight = item.item.weight else: item.weight = None extra_context = { "order": order, "items": basket["basket_items"], "currency": basket["currency"], "total_price": basket["total_price"], "discount": basket["discount"], "postage_discount": basket["postage_discount"], "weight_unit": weight_unit, } _send_email(recipient, subject_line, template, extra_context) # ADMIN EMAIL (reset some of the values!!) recipient = settings.SITE_EMAIL lang = activate("en") template = "shop/emails/order_confirm_admin.txt" _send_email(recipient, subject_line, template, extra_context, admin=True) return True
def add_to_basket_monthly(request, productID, months): uproduct = get_object_or_404(UniqueProduct, id=productID) basket = _get_basket(request) try: item = get_object_or_404(BasketItem, basket=basket, item=uproduct, monthly_order=True, months=months) item.quantity += 1 except: item = BasketItem.objects.create(item=uproduct, quantity=1, basket=basket, monthly_order=True, months=months) item.save() if request.is_ajax(): basket = _get_basket_value(request) basket_quantity = '%.2f' % float(basket['basket_quantity']) monthly_price = '%.2f' % float(basket['monthly_price']) basket_value = '%.2f' % float(basket['total_price']) from shop.templatetags.convert_weights import convert_weights weight = convert_weights(request, item.item.weight) message = _( '<div class="message"><div class="text"><h3>%(months)s months of %(item)s added to your Monthly TeaBox! <a href="%(monthly_url)s">Add more</a> or <a href="%(url)s">Checkout now »</a></h3></div></div>' ) % { 'months': months, 'item': item.item.parent_product, 'url': reverse('basket'), 'monthly_url': reverse('monthly_tea_box'), } data = { 'basket_quantity': basket_quantity, 'monthly_price': monthly_price, 'message': message, 'basket_value': basket_value, } json = simplejson.dumps(data, cls=DjangoJSONEncoder) return HttpResponse(json) url = request.META.get('HTTP_REFERER', '/') return HttpResponseRedirect(url)
def order_repeat(request, hash): # THE PREVIOUS ORDER ITEM old_order = get_object_or_404(Order, hashkey=hash) new_order = Order.objects.create( date_confirmed=datetime.now(), address=old_order.address, owner=old_order.owner, status=Order.STATUS_CREATED_NOT_PAID, invoice_id="TEMP", ) new_order.invoice_id = "TEA-00%s" % (new_order.id) new_order.save() # we'll also create a basket for them. # because IF they want to add something else to the order, # they'll need a basket. basket = Basket.objects.create(date_modified=datetime.now(), owner=new_order.owner) # now we'll check for replacements/substitutions currency = _get_currency(request) for item in old_order.items.all(): if item.item.is_active == False: # if it's not available, replace it with the closest matching UniqueProduct product = UniqueProduct.objects.filter( parent_product=item.item.parent_product, sale_price__isnull=True, currency=currency, is_active=True ).order_by("-price")[0] basket_item = BasketItem.objects.create(item=product, quantity=item.quantity, basket=basket) new_order.items.add(basket_item) else: new_order.items.add(item) # for each item attached to the new order, reassign the basket to this new basket for item in new_order.items.all(): item.basket = basket item.save() request.session["BASKET_ID"] = basket.id request.session["ORDER_ID"] = new_order.id # FINALLY, GET THE VALUES ETC. basket = _get_basket_value(request, order=new_order) return _render(request, "shop/forms/order_repeat.html", locals())
def add_to_basket_monthly(request, productID, months): uproduct = get_object_or_404(UniqueProduct, id=productID) basket = _get_basket(request) try: item = get_object_or_404(BasketItem, basket=basket, item=uproduct, monthly_order=True, months=months) item.quantity += 1 except: item = BasketItem.objects.create(item=uproduct, quantity=1, basket=basket, monthly_order=True, months=months) item.save() if request.is_ajax(): basket = _get_basket_value(request) basket_quantity = "%.2f" % float(basket["basket_quantity"]) monthly_price = "%.2f" % float(basket["monthly_price"]) basket_value = "%.2f" % float(basket["total_price"]) from shop.templatetags.convert_weights import convert_weights weight = convert_weights(request, item.item.weight) message = _( '<div class="message"><div class="text"><h3>%(months)s months of %(item)s added to your Monthly TeaBox! <a href="%(monthly_url)s">Add more</a> or <a href="%(url)s">Checkout now »</a></h3></div></div>' ) % { "months": months, "item": item.item.parent_product, "url": reverse("basket"), "monthly_url": reverse("monthly_tea_box"), } data = { "basket_quantity": basket_quantity, "monthly_price": monthly_price, "message": message, "basket_value": basket_value, } json = simplejson.dumps(data, cls=DjangoJSONEncoder) return HttpResponse(json) url = request.META.get("HTTP_REFERER", "/") return HttpResponseRedirect(url)
def basket(request): discount = None if request.method == "POST": form = UpdateDiscountForm(request.POST) if form.is_valid(): try: discount = get_object_or_404(Discount, discount_code=form.cleaned_data["discount_code"], is_active=True) except: discount = None if discount: request.session["DISCOUNT_ID"] = discount.id else: discount_error_message = _("Sorry, that's not a valid discount code!") basket = _get_basket_value(request, discount=discount) form = UpdateDiscountForm() return _render(request, "shop/basket.html", locals())
def basket(request): discount = None if request.method == 'POST': form = UpdateDiscountForm(request.POST) if form.is_valid(): try: discount = get_object_or_404( Discount, discount_code=form.cleaned_data['discount_code'], is_active=True) except: discount = None if discount: request.session['DISCOUNT_ID'] = discount.id else: discount_error_message = _( "Sorry, that's not a valid discount code!") basket = _get_basket_value(request, discount=discount) form = UpdateDiscountForm() return _render(request, "shop/basket.html", locals())
def common(request): context = {} context['paypal_return_url'] = settings.PAYPAL_RETURN_URL context['paypal_notify_url'] = settings.PAYPAL_NOTIFY_URL context['paypal_business_name'] = settings.PAYPAL_BUSINESS_NAME context['paypal_receiver_email'] = settings.PAYPAL_RECEIVER_EMAIL context['paypal_submit_url'] = settings.PAYPAL_SUBMIT_URL context['stripe_public_key'] = settings.STRIPE_PUBLIC_KEY context['stripe_secret_key'] = settings.STRIPE_SECRET_KEY context['ga_is_on'] = settings.GA_IS_ON context['latestblogs'] = BlogEntry.objects.filter( is_draft=False, title__isnull=False).exclude( title__exact="None").order_by('-date_added')[:3] context['static_url'] = settings.STATIC_URL context['thumb_large'] = settings.THUMB_LARGE context['thumb_home_large'] = settings.THUMB_HOME_LARGE context['thumb_medium'] = settings.THUMB_MEDIUM context['thumb_small'] = settings.THUMB_SMALL context['date'] = datetime.now() # STUFF RELATED TO COUNTRY SPECIFIC SITES context['site_url'] = "http://www.minrivertea.com" context['analytics_id'] = settings.ANALYTICS_ID context['mailchimp_list_id'] = settings.MAILCHIMP_LIST_ID # TEA OF THE MONTH try: totm = Product.objects.filter(totm__month=datetime.now().month, is_active=True)[0] except IndexError: totm = None context['totm'] = totm if get_language() == 'de': context['mailchimp_list_id'] = settings.GERMAN_MAILCHIMP_LIST_ID context['site_name'] = settings.SITE_NAME # the loose non-techy name # GET THE NAVIGATIONS context['main_nav'] = Category.objects.filter( is_navigation_item=True).order_by('list_order') context['top_nav'] = Page.objects.filter( is_top_nav=True).order_by('list_order') # REGIONAL STUFF context['region'] = _get_region(request) if context['region'] == 'US': context['weight_unit'] = 'oz' else: context['weight_unit'] = 'g' # currency stuff context['currency'] = _get_currency(request) # AFFILIATE STUFF if settings.AFFILIATE_SESSION_KEY in request.session: context['affiliate_session'] = True if request.GET.get(settings.AFFILIATE_URL_VARIABLE): context[ 'landing_page'] = True # TODO we should change this to specify which landing page it shoudl show # CHANGE THE BASE TEMPLATE FOR ADMIN if '/admin-stuff/' in request.path: base_template = settings.BASE_TEMPLATE_ADMIN else: base_template = settings.BASE_TEMPLATE context['base_template'] = base_template # BASKET STUFF try: basket = Basket.objects.get(id=request.session['BASKET_ID']) except: basket = None try: context['basket_quantity'] = request.session['BASKET_QUANTITY'] context['basket_amount'] = request.session['BASKET_AMOUNT'] except: basket = _get_basket_value(request) context['basket_quantity'] = basket['basket_quantity'] context['basket_amount'] = basket['total_price'] return context
def order_url(request, hash, friend=None): order = get_object_or_404(Order, hashkey=hash) basket = _get_basket_value(request, order=order) return _render(request, "shop/forms/order_confirm.html", locals())
def common(request): context = {} context['paypal_return_url'] = settings.PAYPAL_RETURN_URL context['paypal_notify_url'] = settings.PAYPAL_NOTIFY_URL context['paypal_business_name'] = settings.PAYPAL_BUSINESS_NAME context['paypal_receiver_email'] = settings.PAYPAL_RECEIVER_EMAIL context['paypal_submit_url'] = settings.PAYPAL_SUBMIT_URL context['stripe_public_key'] = settings.STRIPE_PUBLIC_KEY context['stripe_secret_key'] = settings.STRIPE_SECRET_KEY context['ga_is_on'] = settings.GA_IS_ON context['latestblogs'] = BlogEntry.objects.filter(is_draft=False, title__isnull=False).exclude(title__exact="None").order_by('-date_added')[:3] context['static_url'] = settings.STATIC_URL context['thumb_large'] = settings.THUMB_LARGE context['thumb_home_large'] = settings.THUMB_HOME_LARGE context['thumb_medium'] = settings.THUMB_MEDIUM context['thumb_small'] = settings.THUMB_SMALL context['date'] = datetime.now() # STUFF RELATED TO COUNTRY SPECIFIC SITES context['site_url'] = "http://www.minrivertea.com" context['analytics_id'] = settings.ANALYTICS_ID context['mailchimp_list_id'] = settings.MAILCHIMP_LIST_ID # TEA OF THE MONTH try: totm = Product.objects.filter(totm__month=datetime.now().month, is_active=True)[0] except IndexError: totm = None context['totm'] = totm if get_language() == 'de': context['mailchimp_list_id'] = settings.GERMAN_MAILCHIMP_LIST_ID context['site_name'] = settings.SITE_NAME # the loose non-techy name # GET THE NAVIGATIONS context['main_nav'] = Category.objects.filter(is_navigation_item=True).order_by('list_order') context['top_nav'] = Page.objects.filter(is_top_nav=True).order_by('list_order') # REGIONAL STUFF context['region'] = _get_region(request) if context['region'] == 'US': context['weight_unit'] = 'oz' else: context['weight_unit'] = 'g' # currency stuff context['currency'] = _get_currency(request) # AFFILIATE STUFF if settings.AFFILIATE_SESSION_KEY in request.session: context['affiliate_session'] = True if request.GET.get(settings.AFFILIATE_URL_VARIABLE): context['landing_page'] = True # TODO we should change this to specify which landing page it shoudl show # CHANGE THE BASE TEMPLATE FOR ADMIN if '/admin-stuff/' in request.path: base_template = settings.BASE_TEMPLATE_ADMIN else: base_template = settings.BASE_TEMPLATE context['base_template'] = base_template # BASKET STUFF try: basket = Basket.objects.get(id=request.session['BASKET_ID']) except: basket = None try: context['basket_quantity'] = request.session['BASKET_QUANTITY'] context['basket_amount'] = request.session['BASKET_AMOUNT'] except: basket = _get_basket_value(request) context['basket_quantity'] = basket['basket_quantity'] context['basket_amount'] = basket['total_price'] return context
def order_url(request, hash, friend=None): order = get_object_or_404(Order, hashkey=hash) basket = _get_basket_value(request, order=order) return _render(request, 'shop/forms/order_confirm.html', locals())