Beispiel #1
0
 def save(self, commit=True):
     coffee = self.cleaned_data['coffee']
     self.instance.recurrent = True
     self.instance.amount = coffee.amount
     self.instance.shipping_date = get_shipping_date()
     if self.instance.coffee.is_pods:
         self.request.session['active_tab'] = "active_subscriptions_pods"
     elif self.instance.coffee.is_bottled():
         self.request.session['active_tab'] = "active_subscriptions_bottled"
     else:
         self.request.session['active_tab'] = "active_subscriptions"
     return super(CreateOrderForm, self).save(commit)
Beispiel #2
0
 def get_form_kwargs(self):
     kwargs = super(PauseOrResumeOrder, self).get_form_kwargs()
     if self.object.is_paused:
         new_status = self.model.ACTIVE
         shipping_date = get_shipping_date()
     else:
         new_status = self.model.PAUSED
         shipping_date = self.object.shipping_date + timedelta(days=28)
     kwargs.update(
         {'data': {
             'status': new_status,
             'shipping_date': shipping_date,
         }})
     return kwargs
Beispiel #3
0
    def redem_item(self, user, item):
        """Redem item"""

        point = Point.objects.get(user=user)
        print 'User has had ', point.points, ' points'

        redem_item = RedemItem(user=user,
                               item=item,
                               points=item.points,
                               shipping_date=get_shipping_date())
        redem_item.save()
        print 'Redeem item is ', redem_item.item

        point.points -= item.points
        point.save()

        RedemPointLog.objects.create(user=user,
                                     item=item,
                                     points=redem_item.points)

        return redem_item
Beispiel #4
0
def taster5x(request):
    result = context = {}

    if request.method == "POST":

        if 'one-password1' in request.POST:
            rf = CustomRegistrationForm(request.POST, prefix='one')

            if rf.is_valid():
                result['success'] = True

                request.session['email'] = rf.cleaned_data['email']
                request.session['password'] = request.POST['one-password1']

                mailchimp_subscribe.delay(email=request.session.get('email'))
            else:
                errors = rf.errors
                return HttpResponse(json.dumps(errors))

        if 'two-first_name' in request.POST:
            cf = GS_CustomerForm(request.POST, prefix='two')
            pf = GS_PreferencesForm(request.POST, prefix='tri')

            if cf.is_valid():
                result['success'] = True

                request.session['first_name'] = request.POST['two-first_name']
                request.session['last_name'] = request.POST['two-last_name']
                request.session['line1'] = request.POST['two-line1']
                request.session['line2'] = request.POST['two-line2']
                request.session['postcode'] = request.POST['two-postcode']

                mailchimp_subscribe.delay(
                    email=request.session.get('email'),
                    merge_vars={
                        'FNAME': request.session.get('first_name'),
                        'LNAME': request.session.get('last_name'),
                    },
                )

            else:
                errors = cf.errors
                return HttpResponse(json.dumps(errors))

        if 'stripeToken' in request.POST:
            try:
                user = MyUser(email=request.session['email'])
                user.set_password(request.session['password'])
                user.save()
            except Exception as e:
                print e

            try:
                customer = Customer(
                    user=user,
                    first_name=request.session['first_name'],
                    last_name=request.session['last_name'],
                    line1=request.session['line1'],
                    line2=request.session['line2'],
                    postcode=request.session['postcode'],
                    stripe_id=request.session['stripe_id']
                    )
                customer.save()
                add_event.delay(
                    customer_id=customer.id,
                    event='signed-up',
                    data={'taster5x': True})

            except Exception as e:
                print e

            random_coffee = CoffeeType.objects.bags().filter(
                special=False).first()
            preferences = Preferences(
                customer=customer,
                coffee=random_coffee,
                brew=BrewMethod.objects.get(name_en='None'),
                package=Preferences.DRIP_BAGS
                )
            preferences.save()

            taster5x = CoffeeType.objects.get(name='Taster 5x')

            try:
                voucher = Voucher.objects.get(name='Taster 5x')
                voucher.count += 1
                voucher.save()
            except:
                voucher = Voucher(
                    name='Taster 5x',
                    discount=0,
                    count=1
                    )
                voucher.save()

            try:
                order = Order.objects.create(
                    customer=customer,
                    coffee=taster5x,
                    date=timezone.now(),
                    shipping_date=get_shipping_date(),
                    amount=taster5x.amount,
                    status=Order.ACTIVE,
                    brew=preferences.brew,
                    package=preferences.package,
                    interval=0,
                    voucher=voucher
                )
                add_event.delay(
                    customer_id=customer.id,
                    event='created-taster5x',
                    order_id=order.id)
            except Exception as e:
                print e

            new_user = authenticate(email=user.email,
                password=request.session['password'])
            login(request, new_user)

            context = {
                'coffee': taster5x.name,
                'image': taster5x.img.url,
            }

            # Send reminding email in a week
            ctz = timezone.get_current_timezone()
            now = ctz.normalize(timezone.now())

            # If there are other reminders (for example from Gets Started)
            # mark they as completed
            Reminder.objects.filter(email=user.email).update(completed=True)
            # Send email in a week if taster pack
            Reminder.objects.create(
                username=customer.first_name,
                email=customer.user.email,
                from_email='Hook Coffee <*****@*****.**>',
                subject='Which was your favourite?',
                template_name='Which was your favourite?',
                scheduled=now + timedelta(days=7),
            )

            # Send summary email
            send_email_async.delay(
                subject='Welcome on board!',
                template='O1 - First order on a subscription (done)',
                to_email=customer.get_email(),
                from_email='Ernest from Hook Coffee <*****@*****.**>',
                merge_vars={
                    'USERNAME': customer.first_name,
                    'DOMAIN_NAME': request.META.get('HTTP_HOST'),
                }
            )
            return render(request, 'get_started/thankyou-trial.html', context)

        return result

    else:
        rf = CustomRegistrationForm(prefix='one')
        cf = GS_CustomerForm(prefix='two')
        pf = GS_PreferencesForm(prefix='tri')

        context['reg_form'] = rf
        context['cus_form'] = cf
        context['pre_form'] = pf
        context['stripe_key'] = settings.PUBLISHABLE_KEY

    return render(request, 'taster/taster5x.html', context)
Beispiel #5
0
def buy_gear(request, is_worldwide):
    gear_id = request.POST.get('gear-id')
    address_id = request.POST.get('address-id')
    note = request.POST.get('note')
    chosen_date = request.POST.get('chosen_date')
    chosen_date = datetime.strptime(chosen_date, '%d/%m/%Y')

    gear_color_id = request.POST.get('gear-color-id', 0)
    quantity = request.POST.get('quantity', 1)
    packaging = request.POST.get('packaging', 0)
    brew_method_id = request.POST.get('brew-method-id', 0)
    voucher_name = (request.session.get('voucher-name')
                    or request.POST.get('voucher-name'))

    f = forms.IntegerField()
    fch = forms.CharField()

    gear_id = f.clean(gear_id)
    gear_color_id = f.clean(gear_color_id)
    quantity = f.clean(quantity)
    packaging = f.clean(packaging)
    brew_method_id = f.clean(brew_method_id)
    voucher = None
    if voucher_name:
        voucher_name = fch.clean(voucher_name)
        voucher_name = voucher_name.strip().upper()
        try:
            voucher = (Voucher.objects.filter(
                mode=True, category__name='GiftSets').get(name=voucher_name))
        except Voucher.DoesNotExist:
            pass
        else:
            request.session['gear_voucher'] = voucher.name

    details = {}
    if gear_color_id:
        color = CoffeeGearColor.objects.get(id=gear_color_id)
        details['Colour'] = color.name

    if quantity < 1:  # shit happens, right?
        quantity = 1
    details['Quantity'] = str(quantity)

    if packaging:
        packaging = 'Wholebeans' if packaging == 1 else 'Ground'
        request.session['gear_packaging'] = details['packaging'] = packaging

    if brew_method_id:
        brew_method = BrewMethod.objects.get(id=brew_method_id)
        request.session['gear_brew_method'] = details[
            'brew_method'] = brew_method.name_en

    if not request.user.is_authenticated:
        return redirect(
            'preregister_gear',
            gear_id=gear_id,
            gear_qty=quantity,
            gear_color_id=gear_color_id,
        )

    customer = Customer.objects.get(user=request.user)
    gear = CoffeeGear.objects.get(id=gear_id)

    # now = timezone.now()
    # if (now.month == 1 and now.day < 9):
    #     details['Pre-Order'] = 'True'
    #     shipping_date = datetime(
    #         2017, 1, 9,
    #         hour=12, minute=0, second=0, microsecond=0,
    #         tzinfo=timezone.get_current_timezone())
    # else:
    #     shipping_date = get_shipping_date()

    price = gear.price * quantity
    if voucher:
        price -= price * voucher.discount / 100 + voucher.discount2
        # Mark voucher as used for current customer
        customer.vouchers.add(voucher)
        customer.save()
        voucher.count += 1
        voucher.save()

    # charge global users immediately
    # context = {}
    # if is_worldwide:
    #     get_shipping_rates(request, cid=customer.country.code, gear_id=gear.id, qty=quantity)
    #     shipping_cost = request.session.get('shipping_cost', 0)
    #     total_price = float(price) + shipping_cost
    #     context = charge_client(request, customer.stripe_id, total_price)

    context = charge_client(request, customer.stripe_id, price)
    if not context.get('error'):
        order = GearOrder.objects.create(
            customer=customer,
            gear=gear,
            shipping_date=chosen_date or get_shipping_date(),
            price=price,
            details=details,
            voucher=voucher,
        )

        try:
            address = Address.objects.get(id=address_id)
        except Address.DoesNotExist:
            pass
        else:
            order.address = address
            order.save()

        if note:
            order.details['gift_note'] = note
            order.save()

        request.session['new_purchase_amount'] = float(order.price)
    else:
        # TODO: show error to user
        pass

    request.session['active_tab'] = 'active_one_offs'

    return redirect('profile')
Beispiel #6
0
def detail(request, coffee_id):
    if request.method == 'POST':
        print 'detail, POST =', request.POST.items()
        coffee_id = request.POST.get('coffee-id')

        try:
            coffee = CoffeeType.objects.get(id=coffee_id)
            customer = request.user.customer
            preferences = customer.preferences
        except:
            coffee = customer = preferences = None

        if 'one-off' in request.POST:
            if coffee:

                if not request.POST.get('isNespresso'):
                    selected_brew = BrewMethod.objects.get(
                        id=request.POST.get('brew-method'))
                    selected_package = request.POST.get('package-method', )
                else:
                    selected_brew = BrewMethod.objects.get(name_en='Nespresso')
                    selected_package = Preferences.DRIP_BAGS

                order = Order.objects.create(
                    customer=customer,
                    coffee=coffee,
                    date=timezone.now(),
                    shipping_date=get_shipping_date(),
                    amount=coffee.amount_one_off,
                    interval=0,
                    recurrent=False,
                    status=Order.ACTIVE,
                    brew=selected_brew,
                    package=selected_package,
                )

                mailing_list.update_mailchimp_tracking(
                    request, order, MailchimpCampaignStats.PURCHASED)

                request.session['active_tab'] = 'active_one_offs'

                new_purchase_amount = float(order.amount)
                request.session['new_purchase_amount'] = new_purchase_amount

                add_event.delay(customer_id=order.customer.id,
                                event='created-one-off',
                                order_id=order.id)

        if 'subscription' in request.POST:
            if preferences and coffee:
                if request.POST.get('isNespresso') == 'False':
                    request.session['active_tab'] = 'active_subscriptions'
                    brew = preferences.brew or BrewMethod.objects.get(
                        name_en='Espresso')
                else:
                    request.session['active_tab'] = 'active_subscriptions_pods'
                    brew = BrewMethod.objects.get(name_en='Nespresso')

                order = Order.objects.create(
                    customer=customer,
                    coffee=coffee,
                    date=timezone.now(),
                    shipping_date=get_shipping_date(),
                    amount=coffee.amount,
                    interval=get_interval(preferences.interval),
                    recurrent=True,
                    status=Order.ACTIVE,
                    brew=brew,
                    package=preferences.package,
                    different=preferences.different,
                )

                mailing_list.update_mailchimp_tracking(
                    request, order, MailchimpCampaignStats.PURCHASED)

                add_event.delay(customer_id=order.customer.id,
                                event='created-subscription',
                                order_id=order.id)

                Reminder.objects.filter(email=customer.user.email,
                                        resumed=None).update(completed=True)

        return redirect('profile')

    else:
        customer = Customer.objects.get(user=request.user)
        preferences = customer.preferences

        subscribe = True
        if request.GET.get('subscribe'):
            if request.GET['subscribe'] == '0':
                subscribe = False

        isNespresso = True
        if request.GET.get('isNespresso'):
            if request.GET['isNespresso'] == '0':
                isNespresso = False

        context = {
            'key': settings.PUBLISHABLE_KEY,
            'coffee': CoffeeType.objects.get(id=coffee_id),
            'subscribe': subscribe,
            'isNespresso': isNespresso,
        }

        context['brew_methods'] = BrewMethod.objects.sorted(~Q(
            name_en='Nespresso'))
        context['preferences_form'] = PreferencesForm()

        # Need to clean up
        context['current_brew'] = preferences.brew or BrewMethod.objects.get(
            name_en="None")
        context['current_package'] = preferences.package

        return render(request, 'coffees/detail.html', context)