Beispiel #1
0
 def add_event(self, obj):
     updates = dict([('Msg %d' % i, msg)
                     for i, msg in enumerate(self.updates)])
     add_event.delay(customer_id=obj.customer_id,
                     event='changed-order-preferences',
                     data=updates,
                     order_id=obj.id)
    def add_event(self):
        """Fire Intercom event about processed order."""
        if self.is_gear:
            event_name = 'gear-order-processed'
            extra_event_data = {'gear-order': self.order.id}
            order_id = None
        else:
            event_name = 'order-processed'
            extra_event_data = {}
            order_id = self.order.id

        charge = self.result.get('charge', {})
        event_data = {
            'old_status': self.original_status,
            'new_status': self.order.get_status_display(),
            'stripe_charge': charge.get('id'),
            'error': self.result.get('error'),
        }
        event_data.update(extra_event_data)

        add_event.delay(
            customer_id=self.customer.id,
            event=event_name,
            data=event_data,
            order_id=order_id,
        )
Beispiel #3
0
def logged_out(sender, request, user, **kwargs):
    # FIXME: How and why an user haven't relation to customer?
    if user:
        try:
            customer_id = user.customer.id
        except Customer.DoesNotExist:
            pass
        else:
            add_event.delay(customer_id=customer_id, event='logged-out')
Beispiel #4
0
 def add_event(self, obj):
     add_event.delay(customer_id=obj.order.customer_id,
                     event='leave_coffee_review',
                     data={
                         'rating': obj.rating,
                         'comment': obj.comment,
                         'used brew': obj.brew.name
                     },
                     order_id=obj.order_id)
Beispiel #5
0
 def add_event(self, obj):
     add_event.delay(
         customer_id=obj.user.customer.id,
         event='redeemed-reward',
         data={
             'redem': {
                 'value':
                 obj.item.name,
                 'url': ('https://hookcoffee.com.sg/admin/loyale/redemitem'
                         '/%d/' % obj.id)
             }
         })
Beispiel #6
0
 def add_event(self, obj):
     add_event.delay(
         customer_id=obj.customer_id,
         event='created_address',
         data={
             'address': {
                 'value':
                 str(obj),
                 'url': ('https://hookcoffee.com.sg/admin/customers/address'
                         '/%d/' % obj.id)
             }
         })
Beispiel #7
0
 def add_event(self, obj):
     # will not be called if it's base address (address_id == -1)
     add_event.delay(
         customer_id=obj.customer_id,
         event='changed_primary_address',
         data={
             'primary_address': {
                 'value':
                 str(obj),
                 'url': ('https://hookcoffee.com.sg/admin/customers/address'
                         '/%d/' % obj.id)
             }
         })
Beispiel #8
0
def logged_in(sender, request, user, **kwargs):
    # FIXME: How and why an user haven't relation to customer?
    try:
        customer_id = user.customer.id
    except Customer.DoesNotExist:
        pass
    else:
        add_event.delay(customer_id=customer_id, event='logged-in')

        try:
            cart = ShoppingCart.objects.get(customer=user.customer)
            request.session['shopping-cart'] = json.loads(cart.content)
        except ShoppingCart.DoesNotExist:
            pass
Beispiel #9
0
    def get(self, request, *args, **kwargs):
        now = CTZ.normalize(timezone.now())
        self.token = self.kwargs.get('token')
        self.object = self.get_object(request)
        if self.object:
            f = self.form_class(request.GET, instance=self.object.order)

            if self.form_valid(f):
                if type(f) == SkipDeliveryForm:
                    f.save()

                    # self.object.order.shipping_date = self.object.order.get_next_shipping_date(
                        # after=self.object.order.shipping_date)
                    # self.object.order.save()

                    if self.object.order.interval >= 7:
                        rsd = ReminderSkipDelivery(
                            username=self.object.order.customer.first_name,
                            order=self.object.order,
                            email=self.object.order.customer.get_email(),
                            from_email='Hook Coffee Roastery <*****@*****.**>',
                            subject='Your upcoming Hook Coffee Order',
                            template_name=OrderProcessing.EMAIL_REMINDING_TEMPLATE_SKIP_LINK,
                            created=now,
                            # TODO: check scheduled date
                            scheduled=self.object.order.shipping_date - timedelta(days=4),
                        )
                        rsd.save()

                    messages.add_message(request, messages.INFO, "Your subscription shipping date has been changed successfuly", extra_tags="skip")

                    add_event.delay(
                        customer_id=self.object.customer.id,
                        event='skipped',
                        data={
                            'order-id': self.object.order.id,
                            'shipping-date': self.object.order.shipping_date,
                            }
                        )

                    self.object.active = False
                    self.object.save()

        return redirect('profile')
Beispiel #10
0
    def send_invites(self):
        user = self.request.user
        customer = user.customer
        contacts = self.cleaned_data.get('contacts', [])

        ref, created = Referral.objects.get_or_create(
            user=user,
            defaults={'code': Referral.get_random_code(customer=customer)})
        ref_link = self.request.build_absolute_uri(ref.get_absolute_url())

        total_invited = customer.get_friends_invited()

        for email, name in contacts:
            try:
                with transaction.atomic():
                    # Send invitation email
                    self._send_email(customer=customer,
                                     recipient_name=name,
                                     recipient_email=email,
                                     ref_link=ref_link)
                    # Grant beanie points for invited friend
                    # ernest asked not to grant points anymore
                    # point_mixin.grant_points(
                    #     user=user, points=POINTS_FOR_INVITED_FRIEND)
                    # Give special surprise for every 20 friends
                    # if (total_invited + 1) % 20 == 0:
                    #     point_mixin.redem_item(user=user, item=self.reward)
            except Exception:
                logger.error('Send ref email. From: %s To: %s',
                             customer,
                             email,
                             exc_info=True)
            else:
                total_invited += 1
                # self.result['points_earned'] += POINTS_FOR_INVITED_FRIEND
                self.result['friends_invited'] += 1

        if self.result['friends_invited']:
            self.result['success'] = True
        add_event.delay(customer_id=customer.id,
                        event='referral-friends',
                        data=self.result)
        return self.result
Beispiel #11
0
    def post(self, request, *args, **kwargs):
        customer = request.user.customer
        already_answered = customer.extra.get('answered_exp_survey', False)
        if already_answered:
            logger.info(
                'User %s trying to submit the exp survey more than once.' %
                customer)
            return HttpResponse(status=200)

        customer.extra['answered_exp_survey'] = True
        customer.save()

        # Give beanie points in 24h, when the system get his answers
        give_points_for_exp_survey.apply_async(
            (customer.id, ), countdown=180)  # run in 2 minutes

        # Fire intercom event
        add_event.delay(customer_id=customer.id,
                        event='answered-the-exp-survey')
        return HttpResponse(status=200)
Beispiel #12
0
 def add_event(self, obj):
     if isinstance(obj, Order):
         event = ('canceled-subscription'
                  if obj.recurrent else 'cancel-one-off')
         add_event.delay(customer_id=obj.customer.id,
                         event=event,
                         order_id=obj.id)
     else:
         event = 'cancel-gear-order'
         add_event.delay(
             customer_id=obj.customer.id,
             event=event,
             data={
                 'gear': {
                     'value':
                     obj.gear.name,
                     'url':
                     ('https://hookcoffee.com.sg/admin/customers/gearorder'
                      '/%d/' % obj.id)
                 }
             })
Beispiel #13
0
def process_global_orders(request):
    ctz = timezone.get_current_timezone()
    now = ctz.normalize(timezone.now())
    day = now.isoweekday()

    # today = now.replace(
    #     hour=12, minute=0, second=0, microsecond=0)
    tomorrow = now.replace(hour=12, minute=0, second=0,
                           microsecond=0) + timedelta(days=1)
    two_days_later = now.replace(hour=12, minute=0, second=0,
                                 microsecond=0) + timedelta(days=2)
    three_days_later = now.replace(hour=12, minute=0, second=0,
                                   microsecond=0) + timedelta(days=3)

    my_shipping_date = tomorrow
    if day == 5:
        my_shipping_date = three_days_later
    elif day == 6:
        my_shipping_date = two_days_later

    customer = Customer.objects.select_related('user').get(
        id=int(request.POST.get('customer')))

    orders = Order.objects.filter(
        customer=customer,
        shipping_date__lte=my_shipping_date,
        status__in=[Order.ACTIVE, Order.PAUSED, Order.ERROR])

    event_name = 'global-order-processed'

    for order in orders:
        order_orig_status = order.get_status_display()

        order.status = Order.SHIPPED
        order.save()
        logger.debug(
            'PROCESS GLOBAL ORDER: order id: {}, customer: {}, country: {}'.
            format(order.id, order.customer, order.customer.country))

        if order.coffee.brew_method.name == 'Nespresso':
            points = OrderPoints.objects.latest('id').one_pod
        elif order.coffee.special:
            points = OrderPoints.objects.latest('id').one_special
        else:
            points = OrderPoints.objects.latest('id').one_regular

        point_mixin.grant_points(user=order.customer.user, points=points)
        logger.debug(
            'GRANT BEANIE POINTS: order id: {}, customer: {}, points: {}'.
            format(order.id, order.customer, points))

        event_data = {
            'old_status': order_orig_status,
            'new_status': order.get_status_display(),
        }

        add_event.delay(
            customer_id=customer.id,
            event=event_name,
            data=event_data,
            order_id=order.id,
        )

    messages.add_message(request, messages.INFO, "activate worldwide tab")

    return redirect('dashboard')
Beispiel #14
0
    else:
        event_name = 'order-processed'
        extra_event_data = {}
        order_id = order.id

    event_data = {
        'old_status': order_orig_status,
        'new_status': order.get_status_display(),
        'stripe_charge': charge.get('id'),
        'error': context.get('error'),
    }
    event_data.update(extra_event_data)

    add_event.delay(
        customer_id=customer.id,
        event=event_name,
        data=event_data,
        order_id=order_id,
    )

    return order


def process_global_orders(request):
    ctz = timezone.get_current_timezone()
    now = ctz.normalize(timezone.now())
    day = now.isoweekday()

    # today = now.replace(
    #     hour=12, minute=0, second=0, microsecond=0)
    tomorrow = now.replace(hour=12, minute=0, second=0,
                           microsecond=0) + timedelta(days=1)
Beispiel #15
0
def do_registration(request, is_nespresso):
    now = CTZ.normalize(timezone.now())

    result = context = {}

    isBottled = request.session.get('isBottled')

    if request.method == "POST":
        email = request.session.get('email')

        if 'one-password1' in request.POST:
            rf = CustomRegistrationForm(request.POST, prefix='one')
            if rf.is_valid():
                result['success'] = True

                details = json.loads(request.POST.get('array'))

                logger.debug('Registration: first step: %s; details: %s',
                             email, details)

                request.session['email'] = rf.cleaned_data['email']
                request.session['password'] = generate_securerandompass(64) if 'accesstoken' in request.session \
                    else request.POST['one-password1']
                request.session['brew'] = details['brew']
                request.session['package'] = details['package']
                request.session['interval'] = details['interval']
                request.session['different'] = details['different']

                mailchimp_subscribe.delay(email=request.session.get('email'))
            else:
                return HttpResponse(json.dumps(rf.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['country'] = request.POST.get(
                    'two-country', 'SG')
                request.session['line1'] = request.POST['two-line1']
                request.session['line2'] = request.POST['two-line2']
                request.session['postcode'] = request.POST['two-postcode']
                request.session['phone'] = request.POST['two-phone']

                mailchimp_subscribe.delay(
                    email=request.session.get('email'),
                    merge_vars={
                        'FNAME': request.session.get('first_name'),
                        'LNAME': request.session.get('last_name'),
                    },
                )
            else:
                return HttpResponse(json.dumps(cf.errors))

        if 'voucher' in request.POST:
            try:
                user = MyUser(email=request.session['email'])
                user.set_password(request.session['password'])
                user.save()
                logger.debug('User created: %s', user)
            except Exception:
                logger.error('User not created: %s', email, exc_info=True)

            try:
                customer = Customer.objects.create(
                    user=user,
                    first_name=request.session['first_name'],
                    last_name=request.session['last_name'],
                    amount=request.session.get('credits', 0),
                    country=request.session['country'],
                    line1=request.session['line1'],
                    line2=request.session['line2'],
                    postcode=request.session['postcode'],
                    phone=request.session['phone'],
                    stripe_id=request.session['stripe_id'],
                    card_details='{}{}{}'.format(
                        request.session.get('last4'),
                        '{:0>2}'.format(request.session.get('exp_month')),
                        request.session.get('exp_year')))
                logger.debug('Customer created: %s', customer)
                # Add newly created customauth as a Foreign Key reference to FacebookCustomer
                try:
                    facebook_customer = FacebookCustomer.objects.filter(
                        email=email).update(customer=user)
                    if facebook_customer:
                        add_tag.delay(customer_id=customer.id, tag='Facebook')
                except Exception:
                    logger.error('Cannot update FacebookCustomer: %s',
                                 email,
                                 exc_info=True)
            except Exception:
                logger.error('Customer not created: %s', email, exc_info=True)

            try:
                if request.session.get('from_preregister'):
                    response = None
                    preferences = Preferences(customer=customer)
                    preferences.coffee = coffee = CoffeeType.objects.get(
                        id=request.session.get('coffee'))
                else:
                    response = GetStartedResponse.objects.filter(
                        email=user.email).latest('created')

                    flavor_ids = []
                    for ch in response.form_details['flavour']:
                        if ch.isdigit():
                            flavor_ids.append(int(ch))

                    flavors = []
                    for flav in flavor_ids:
                        flavors.append(Flavor.objects.get(id=flav))

                    preferences = Preferences(customer=customer)
                    preferences.coffee = coffee = CoffeeType.objects.get(
                        id=request.session.get('coffee', response.ct))
                    preferences.save()

                    preferences.intense = response.form_details['intensity']
                    preferences.flavor = flavors
            except Exception:
                preferences = Preferences(customer=customer)
                preferences.coffee = coffee = CoffeeType.objects.get(
                    id=request.session.get('coffee'))

            if request.session.get('alacarte'):
                price = coffee.amount_one_off
            else:
                price = coffee.amount

            preferences.interval = int(request.session['interval'])
            preferences.interval_pods = int(request.session['interval'])
            preferences.different = True if request.session[
                'different'] else False
            preferences.different_pods = True if request.session[
                'different'] else False
            if is_nespresso:
                preferences.brew = BrewMethod.objects.get(name_en='None')
                preferences.package = Preferences.DRIP_BAGS
            else:
                try:
                    if response:
                        brew = BrewMethod.objects.get(
                            id=response.form_details['method'])
                    else:
                        brew_id = request.session.get('brew')
                        if brew_id:
                            brew = BrewMethod.objects.get(id=brew_id)
                        else:
                            brew_title = request.session.get(
                                'brew_title') or _('None')
                            brew = BrewMethod.objects.get(name=brew_title)
                    preferences.brew = brew
                except Exception:
                    brew_title = request.session.get('brew_title') or _('None')
                    brew = BrewMethod.objects.get(name=brew_title)
                    preferences.brew = brew
                preferences.package = request.session['package']
            preferences.save()

            # common voucher
            try:
                voucher = Voucher.objects.get(
                    name=request.session.get('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()
            except:
                voucher = None

            try:
                # referral voucher
                referral_voucher = ReferralVoucher.objects.get(
                    code=request.session.get('referral_voucher'))
                price -= price * referral_voucher.discount_percent / 100 + referral_voucher.discount_sgd

                referral_voucher.used = True
                referral_voucher.save()
            except Exception:
                referral_voucher = None

            if request.session.get('alacarte') or \
                    request.session.get('gift'):
                is_recurrent = False
            else:
                is_recurrent = True

            if START_DATE <= now <= END_DATE:
                shipping_date = NEW_DATE
            else:
                shipping_date = get_shipping_date()

            if isBottled:
                brew_method = BrewMethod.objects.get(name_en='Cold Brew')
                preferences.brew = brew_method
                preferences.package = Preferences.BOTTLED
                preferences.different = False
                preferences.save()
            elif is_nespresso:
                brew_method = BrewMethod.objects.get(name_en='Nespresso')
            else:
                try:
                    brew_method = BrewMethod.objects.get(
                        id=request.session['brew'])
                    preferences.brew = brew_method
                    preferences.save()
                except Exception:
                    brew_method = preferences.brew
            try:
                order = createOrder(p_customer=customer,
                                    p_coffee=coffee,
                                    p_shipping_date=shipping_date,
                                    p_price=price,
                                    p_preferences=preferences,
                                    p_is_recurrent=is_recurrent,
                                    p_brew_method=brew_method,
                                    p_voucher=voucher,
                                    p_package=preferences.package,
                                    is_nespresso=is_nespresso)
                order.save()

                if voucher:
                    if voucher.name in settings.GIFT_VOUCHERS:
                        order.details[voucher.name] = True
                        order.save()

                if referral_voucher:
                    order.details['referred_by'] = '{} {}'.format( \
                        referral_voucher.sender.first_name, referral_voucher.sender.last_name)
                    order.save()

                add_event.delay(customer_id=customer.id,
                                event='signed-up',
                                data={'credits': round(customer.amount, 2)})
                add_event.delay(customer_id=customer.id,
                                event='created-subscription'
                                if is_recurrent else 'created-one-off',
                                order_id=order.id)

            except Exception:
                order = None

            if not request.session.get('active_tab') and is_nespresso:
                request.session['active_tab'] = 'active_subscriptions_pods'

            # Create referral code for new user
            Referral.objects.create(
                user=user, code=Referral.get_random_code(customer=customer))

            # Use referral link
            ref = request.session.get('ref')
            if ref or referral_voucher:
                referrer = user
                if ref:
                    referred = Referral.objects.get(code=ref).user
                else:
                    referred = referral_voucher.sender.user
                Reference.objects.create(referrer=referrer, referred=referred)
                logger.debug('Reference created: %s <-- %s', referred,
                             referrer)

                current_customer = referred.customer
                add_event.delay(customer_id=current_customer.id,
                                event='reference-created',
                                data={
                                    'referred': referred.email,
                                    'referrer': referrer.email
                                })
                referrer_customer = Customer.objects.get(user_id=referrer.id)
                add_event.delay(customer_id=referrer_customer.id,
                                event='reference-created',
                                data={
                                    'referred': referred.email,
                                    'referrer': referrer.email
                                })

                # add %50 discount to customer's available discounts
                referrals = json.loads(referred.customer.discounts['referral'])
                new_discount = (50,
                                timezone.now().strftime('%Y-%m-%dT%H:%M:%S%z'))
                referrals.append(new_discount)
                referred.customer.discounts['referral'] = referrals
                referred.customer.save()

                add_event.delay(customer_id=current_customer.id,
                                event='give-$50-to-referrer',
                                data={
                                    'discount': new_discount[0],
                                    'date': new_discount[1]
                                })

                cnt = Reference.objects.filter(referred=referred).count()
                if cnt == 2:
                    try:
                        current_order = Order.objects \
                            .filter(customer=current_customer) \
                            .filter(status__in=['AC', 'PA']) \
                            .latest('date')
                        current_order.details['KeepCup'] = True
                        current_order.save()
                    except Order.DoesNotExist:
                        pass

            Reminder.objects.filter(email=user.email).update(completed=True)
            for reminder in Reminder.objects.filter(email__iexact=user.email):
                reminder.disable_voucher()

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

            context = {
                'coffee': coffee.name,
                'image': coffee.img.url,
                'order_price': order.amount if order else coffee.amount,
            }

            Reminder.objects.create(
                username="******".format(customer.first_name.title(),
                                        customer.last_name.title()),
                email=customer.user.email,
                order=order,
                from_email='Ernest from Hook Coffee <*****@*****.**>',
                subject="Ahoy, {}!".format(customer.first_name.title()),
                template_name='EJ1',
                # scheduled=now + timedelta(hours=1),
                scheduled=now + timedelta(minutes=1),  # TODO: remove
                voucher=voucher)

            ReminderSMS.objects.create(
                customer=customer,
                # WARNING: actual message generated in tasks module
                message=ReminderSMS.MESSAGE % customer.first_name.title(),
                # will be replaced with sms schedule date on save
                scheduled=shipping_date,
            )

            # update campaign status to subscribed if from a campaign
            mailing_list.update_mailchimp_tracking(
                request, order, MailchimpCampaignStats.PURCHASED)

            request.session['voucher'] = ""

            new_purchase_amount = float(price)
            request.session['new_purchase_amount'] = new_purchase_amount

            return render(request, 'get_started/thankyou.html', context)
        return result

    else:
        username = email = coffee = default_pack = brew_title = voucher_name = ''
        price = 0
        data = {}
        render_data = {}
        logger.debug('Registration:init:%s:%s', get_client_ip(request),
                     get_session_data(request))

        if not request.session.get('from_shopping_cart'):
            try:
                data['username'] = request.session.get('name')
                data['email'] = request.session.get('email')
                default_pack = request.session.get('default_pack') \
                               or Preferences.WHOLEBEANS
                if request.session.get('V60STARTER'):
                    default_pack = Preferences.GRINDED
                brew_title = request.session.get('brew_title') or _('Espresso')

            except Exception:
                logger.error('Registration:init:%s:%s',
                             get_client_ip(request),
                             get_session_data(request),
                             exc_info=True)

            # Check if it's registration by ref link without ReferralVoucher
            # for example by FB or [copy ref link and share your own way]
            ref_code = request.session.get('ref')
            if ref_code:
                try:
                    referral = Referral.objects.get(code=ref_code)
                except Referral.DoesNotExist:
                    pass
                else:
                    # If referral voucher doesn't exists - create and use it
                    ref_voucher, created = ReferralVoucher.objects.get_or_create(
                        sender=referral.user.customer,
                        recipient_email=request.session.get('email', ''),
                        defaults={
                            # 'discount_percent': 50,
                            'discount_sgd': 12,
                            'code': ReferralVoucher.get_random_code(size=8),
                        })
                    # If referral voucher created right now it means that
                    # customer didn't get points for inviting the friend
                    # (one of the methods above).
                    if created:
                        point_mixin.grant_points(
                            user=referral.user,
                            points=POINTS_FOR_INVITED_FRIEND)
                    request.session['chosen_voucher'] = ref_voucher.code

            try:
                coffee = CoffeeType.objects.get(
                    id=request.session.get('coffee'))
                if request.session.get('alacarte'):
                    price = coffee.amount_one_off
                else:
                    price = coffee.amount
            except Exception:
                coffee = None

            try:
                voucher = Voucher.objects.get(name=request.session['voucher'])
                if voucher:
                    price -= price * voucher.discount / 100 + voucher.discount2
            except:
                pass

            try:
                referral_voucher = ReferralVoucher.objects.get(
                    code=request.session.get('referral_voucher'))
                if referral_voucher:
                    price -= price * referral_voucher.discount_percent / 100 + referral_voucher.discount_sgd
            except:
                pass

        brew_methods = BrewMethod.objects.sorted(~Q(name_en='Nespresso'))
        rf = CustomRegistrationForm(prefix='one', initial=data)
        cf = GS_CustomerForm(prefix='two')
        pf = GS_PreferencesForm(prefix='tri')
        af = AuthenticationForm(prefix='four')
        naf = AddressForm()

    show_login_form = request.session.get(
        'from_preregister') and not request.user.is_authenticated
    show_active_subs = False
    show_subscription_form = False
    show_sub_details = False
    active_subscriptions = []
    if request.user.is_authenticated:
        customer = request.user.customer
        try:
            coffee = CoffeeType.objects.get(id=request.session.get('coffee'))
        except CoffeeType.DoesNotExist:
            coffee = None

        nespresso = BrewMethod.objects.get(name='Nespresso')
        is_pods = False
        if coffee != None:
            if nespresso in coffee.brew_method.all():
                is_pods = True

        all_active_subscriptions = Order.objects.filter(customer=customer,
                                                        status=Order.ACTIVE,
                                                        recurrent=True)
        active_subscriptions = [[x.id, x.coffee.name, x.coffee.img.url, x.address.name if x.address else 'Base address']\
            for x in all_active_subscriptions
            if ((nespresso in x.coffee.brew_method.all()) == is_pods and x.is_editable)]
        if len(active_subscriptions):
            show_active_subs = True
        else:
            show_sub_details = not (show_login_form and show_subscription_form
                                    and show_active_subs)

        # get available addresses
        addresses = Address.objects.filter(customer=customer)
        addresses = [{
            'id':
            x.id,
            'name':
            x.name,
            'country':
            str(x.country),
            'line1':
            x.line1,
            'line2':
            x.line2,
            'postcode':
            x.postcode,
            'customer_name':
            '{} {}'.format(customer.first_name, customer.last_name),
        } for x in addresses]

        render_data['base_address'] = json.dumps({
            'id':
            -1,
            'country':
            str(customer.country),
            'line1':
            customer.line1,
            'line2':
            customer.line2,
            'postcode':
            customer.postcode,
            'customer_name':
            '{} {}'.format(customer.first_name, customer.last_name),
        })
        render_data['addresses'] = json.dumps(addresses)
    else:
        show_subscription_form = not show_login_form
        render_data['addresses'] = []
        render_data['base_address'] = {}

    active_subscriptions = json.dumps(active_subscriptions)

    render_data['reg_form'] = rf
    render_data['cus_form'] = cf
    render_data['pre_form'] = pf
    render_data['auth_form'] = af
    render_data['new_address_form'] = naf
    render_data['coffee'] = coffee
    render_data['isNespresso'] = is_nespresso
    render_data['price'] = "{0:.0f}".format(price)
    render_data['brew_title'] = brew_title
    render_data['brew_methods'] = brew_methods
    render_data['alacarte'] = request.session.get('alacarte')
    render_data['isBottled'] = isBottled
    render_data['default_pack'] = default_pack
    render_data['shipping_date'] = get_shipping_date()
    render_data['stripe_key'] = settings.PUBLISHABLE_KEY
    render_data['show_login_form'] = show_login_form
    render_data['show_subscription_form'] = show_subscription_form
    render_data['show_active_subs'] = show_active_subs
    render_data['show_sub_details'] = show_sub_details
    render_data['active_subscriptions'] = active_subscriptions
    render_data['estimated_date'] = get_estimated_date

    return render(request, 'get_started/registration.html', render_data)
Beispiel #16
0
 def add_event(self, obj):
     add_event.delay(customer_id=obj.customer_id,
                     event=('created-subscription'
                            if obj.recurrent else 'created-one-off'),
                     order_id=obj.id)
Beispiel #17
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 #18
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)
Beispiel #19
0
 def add_event(self, obj):
     add_event.delay(customer_id=obj.customer_id,
                     event='deleted_address',
                     data={'address': str(obj)})
Beispiel #20
0
 def add_event(self, obj):
     add_event.delay(customer_id=obj.customer_id,
                     event='changed_order_shipping_address',
                     order_id=obj.id)
Beispiel #21
0
 def add_event(self, obj):
     add_event.delay(customer_id=obj.customer_id,
                     event='update-subscription',
                     order_id=obj.id)