Пример #1
0
def save_shipping_address(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        if not hasattr(request.user, 'profile'):
            up = Profile()
            up.user = request.user
            up.save()
        up = request.user.profile
        for sh in up.shippingaddress_set.filter(primary=True):
            sh.primary = False
            sh.save()
        sh = ShippingAddress()
        sh.profile = up
        sh.first_name = data.get('first_name', sh.first_name or "")
        sh.last_name = data.get('last_name', sh.last_name or "")
        sh.street1 = data.get('street1', sh.street1)
        sh.street2 = data.get('street2', sh.street2 or "")
        sh.city = data.get('city', sh.city)
        sh.state = data.get('state', sh.state)
        sh.zipcode = data.get('zip', sh.zipcode)
        sh.phone_number = data.get('phone', sh.phone_number)
        sh.phone_number = ''.join(
            [s for s in list(sh.phone_number) if s.isdigit()])
        sh.primary = True
        sh.save()
        json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #2
0
def update_quantity(request):
    json_response = { 'success': False }
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        cart_id = int(data['cart_id'])
        val = data['operation']
        c = Cart.objects.get(pk=cart_id)
        if c.type == "buy":
            if val == "up":
                c.quantity += 1
            if val == "down":
                c.quantity -= 1
            c.item.price = c.item.price_single
        elif c.type == "subscribe":
            if val == "regular":
                c.subtype = "regular"
                c.item.price = c.item.price_regular
                c.item.save()
            elif val == "intense":
                c.subtype = "intense"
                c.item.price = c.item.price_intense
                c.item.save()
        c.save()
        json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #3
0
def delete_review_pic(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        ri_id = data.get('ri_id', None)
        if ri_id and ReviewImage.objects.filter(id=ri_id).count() > 0:
            ri = ReviewImage.objects.get(pk=ri_id)
            ri.delete()
            json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #4
0
def delete_paymenttype(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        cc_id = data.get('id', None)
        if user.paymenttype_set.filter(pk=cc_id).count() == 1:
            cc = user.paymenttype_set.get(pk=cc_id)
            cc.delete()
            json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #5
0
def delete_shipping_address(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        sh_id = data.get('id', None)
        if sh_id and hasattr(request.user, 'profile'):
            up = request.user.profile
            if up.shippingaddress_set.filter(pk=sh_id).count() == 1:
                sh = up.shippingaddress_set.get(pk=sh_id)
                sh.delete()
                json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #6
0
def delete_review(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        fp_id = data.get('fp_id', None)
        review_id = data.get('review_id', None)
        if review_id and len(Review.objects.filter(id=review_id)) > 0:
            review = Review.objects.get(pk=review_id)
            if review.ph.user == user:
                review.delete()
                json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #7
0
def get_review(request, review_id):
    json_response = {'success': False}
    if request.method == 'GET':
        init_user_login(request)
        user = request.user
        if review_id and len(Review.objects.filter(id=review_id)) > 0:
            review = Review.objects.get(pk=review_id)
            if review.ph.user == user:
                json_response['success'] = True
                json_response['title'] = review.headline
                json_response['details'] = review.details
                json_response['rating'] = review.rating
                json_response['pics'] = [{'id': i.id,
                                          'url': i.image.url} \
                                        for i in review.reviewimage_set.all() if i]
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #8
0
def photo_upload(request):
    json_response = {'success': False}
    if request.method == 'POST':
        pic = request.FILES['pic']
        if pic and pic.content_type.startswith('image/'):
            init_user_login(request)
            user = request.user
            if not hasattr(user, 'profile'):
                up = Profile()
                up.user = user
                up.save()
            up = user.profile
            up.picture = pic
            up.save()
            json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #9
0
def review_photo_upload(request):
    json_response = {'success': False}
    if request.method == 'POST':
        data = request.POST
        pic = request.FILES['pic']
        if pic and pic.content_type.startswith('image/'):
            init_user_login(request)
            user = request.user
            if user:
                ri = ReviewImage()
                ri.image = pic
                ri.user = user
                ri.save()
                json_response['pic_url'] = ri.image.url
                json_response['ri_id'] = ri.id
                json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #10
0
def review_uploaded_photo_associate(request):
    json_response = {'success': False}
    if request.method == 'POST':
        data = request.POST
        pic = request.FILES['pic']
        review_id = data.get('review_id', None)
        if pic and pic.content_type.startswith('image/'):
            init_user_login(request)
            user = request.user
            if Review.objects.filter(pk=review_id).count() > 0:
                r = Review.objects.get(pk=review_id)
                ri = ReviewImage()
                ri.image = pic
                ri.review = r
                ri.save()
                json_response['pic_url'] = ri.image.url
                json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #11
0
def post_remove_cart(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        facepack_id = int(data['facepack_id'])
        facepack = FacePack.objects.get(id=facepack_id)
        # If Prepack, then no point comparing users instead just remove item from cart.
        if PrePack.objects.filter(facepack=facepack).count() > 0:
            user.cart_set.filter(item__id=facepack_id).delete()
            json_response['success'] = True
        # Check if indeed cart item remove operation is done by intended user
        elif facepack.cart_set.all()[0].user == user:
            facepack.delete()
            json_response['success'] = True
        json_response['cart_size'] = user.cart_set.count()
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #12
0
def update_ph(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        ph_id = data.get('ph_id', None)
        ph_ship_date = data.get('ph_date', None)
        if hasattr(user, 'payment_set'):
            for i, py in enumerate(
                    user.payment_set.all().order_by('createdte')):
                for j, ph in enumerate(py.purchasehistory_set.all()):
                    if ph.type == "subscribe" and ph.id == int(ph_id):
                        ph.quantity = data.get('ph_qty', None) or ph.quantity
                        ph.ship_date = validate_date(
                            ph_ship_date) or ph.ship_date
                        ph.save()
                        json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #13
0
def save_review(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        fp_id = data.get('fp_id', None)
        review_id = data.get('review_id', None)
        review_pic_ids = data.get('ri_ids', [])
        review_title = data.get('title', "")
        review_details = data.get('details', None)
        review_rating = data.get('rating', None)
        review = Review()
        if review_id and len(Review.objects.filter(id=review_id)) > 0:
            review = Review.objects.get(pk=review_id)
        fp = None
        ph = None
        if fp_id and hasattr(user, 'payment_set'):
            for i, py in enumerate(
                    user.payment_set.all().order_by('createdte')):
                for j, ph_ in enumerate(py.purchasehistory_set.all()):
                    if len(FacePack.objects.filter(pk=ph_.item.id)) == 1:
                        fp = FacePack.objects.get(pk=fp_id)
                        ph = ph_
                        break
        # If facepack is associated to valid user and purchase history, then save.
        if fp and ph:
            review.ph = ph
            review.fp = fp
            review.details = review_details
            review.headline = review_title
            review.rating = int(review_rating) if review_rating else 0
            review.save()
            for ri_id in review_pic_ids:
                if ReviewImage.objects.filter(pk=ri_id).count() > 0:
                    ri = ReviewImage.objects.get(pk=ri_id)
                    ri.review = review
                    ri.save()
            json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #14
0
def save_myaccount_details(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        if not hasattr(request.user, 'profile'):
            up = Profile()
            up.user = request.user
            up.save()
        up = request.user.profile
        if 'name' in data:
            names = data['name'].split()
            if len(names) >= 2:
                first, last = " ".join(names[0:-1]), names[-1]
                user.first_name = first
                user.last_name = last
            elif len(names) == 1:
                user.first_name = data['name'].strip()
                user.last_name = ""
        if 'birthday' in data:
            birth_date = validate_date(data['birthday'])
            if birth_date:
                up.birth_date = birth_date
        if 'email' in data and re.match("([^@|\s]+@[^@]+\.[^@|\s]+)",
                                        data['email']):
            user.email = data['email']
            user.username = data['email']
        if 'gender' in data:
            if data['gender'].lower == "male" or data['gender'].lower == "female" or\
                data['gender'].strip().lower == "":
                up.gender = data['gender']
        if 'subscription' in data:
            if data['subscription'].lower(
            ) == "yes" or data['subscription'].lower() == "no":
                up.subscription = data['subscription']
        user.save()
        up.save()
        json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #15
0
def update_type(request):
    json_response = { 'success': False }
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        cart_id = int(data['cart_id'])
        c = Cart.objects.get(pk=cart_id)
        c.type = data.get('type', c.type)
        if c.type == 'buy':
            c.subtype = None
            c.item.price = c.item.price_single
            c.item.save()
            c.quantity=1
        if c.type == 'subscribe':
            #c.quantity=4
            c.subtype="regular"
            c.item.price = c.item.price_regular
            c.item.save()
        c.save()
        json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #16
0
def save_paymenttype(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        cc_id = data.get('id', None)
        if data.get('primary', None):
            for c in user.paymenttype_set.filter(primary=True):
                c.primary = False
                c.save()
        if cc_id:
            cc = CreditCard()
            cc.primary = True
            if int(cc_id) > 0 and user.paymenttype_set.filter(
                    pk=cc_id).count() == 1:
                pt = user.paymenttype_set.get(pk=cc_id)
                cc = CreditCard.objects.get(pk=cc_id)
            cc.user = user
            cc.street1 = data.get('street1', "")
            cc.street2 = data.get('street2', "")
            cc.street = str(cc.street1 + " " + cc.street2).strip() or cc.street
            cc.city = data.get('city', cc.city)
            cc.state = data.get('state', cc.state)
            cc.zipcode = data.get('zip', cc.zipcode)
            cc.primary = data.get('primary', cc.primary)
            cc.type = data.get('type', 'visa')
            cc.first = data.get('first_name', "")
            cc.last = data.get('last_name', "")
            cc.owner_name = str(cc.first + " " +
                                cc.last).strip() or cc.owner_name
            cc.number = data.get('number', cc.number)
            cc.cvv = data.get('cvv', cc.cvv)
            cc.expiry = validate_cc_date(data.get('expiry', "")) or cc.expiry
            cc.primary = data.get('primary', cc.primary)
            cc.save()
            json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #17
0
def post_add_cart(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        user = request.user
        data = json.loads(request.POST['data'])
        fp_id = data.get('fp_id', None)
        fp_type = data.get('fp_type', None)
        cart_type = data.get('type', None)
        qd_id = data.get('qd_id', None)
        fp = None
        if fp_id and user.cart_set.filter(item_id=fp_id).count() > 0:
            # Cart / FP already exists. Just save new cart type state
            c = user.cart_set.get(item_id=fp_id)
            c.type = cart_type
            c.quantity = 1
            if c.type == 'subscribe':
                c.subtype = 'regular'
            c.save()
        else:
            if fp_type == "prepack":
                # Prepack
                fp = PrePack.objects.get(facepack_id=fp_id).facepack
            else:
                # Custom Facepack
                fp = FacePack()

                recipe1_id = int(data['r1_id'])
                recipe2_id = int(data['r2_id'])
                recipe3_id = int(data['r3_id'])
                base_id = int(data['b_id'])
                mixing_agent_id = int(data['m_id'])
                o1_id = int(data['o1_id']) if 'o1_id' in data and len(
                    data['o1_id']) > 0 else None
                o2_id = int(data['o2_id']) if 'o2_id' in data and len(
                    data['o2_id']) > 0 else None
                o3_id = int(data['o3_id']) if 'o3_id' in data and len(
                    data['o3_id']) > 0 else None

                # Create FP name
                fp_name = "CFP_%03d%03d%03d" % (recipe1_id, recipe2_id,
                                                recipe3_id)
                if o1_id and o2_id and o3_id:
                    fp_name += "111"
                else:
                    fp_name += "000"

                fp.base = Base.objects.get(pk=base_id)
                fp.mixing_agent = MixingAgent.objects.get(pk=mixing_agent_id)
                #fp.price = str(random.randrange(13,30)+0.99)
                fp_name += "%03d" % fp.base.id
                fp_name += "%03d" % fp.mixing_agent.id
                fp.name = fp_name

                fp.save()

                qd = QuestionnaireUserData.objects.get(pk=qd_id)

                cfp1 = CustomFacePack()
                cfp1.recipe = Recipe.objects.get(pk=recipe1_id)
                cfp1.optional_ingredient = Ingredient.objects.get(
                    pk=o1_id) if o1_id else None
                cfp1.facepack = fp
                cfp1.user = user
                cfp1.questionnaire = qd
                cfp1.save()

                cfp2 = CustomFacePack()
                cfp2.recipe = Recipe.objects.get(pk=recipe2_id)
                cfp2.optional_ingredient = Ingredient.objects.get(
                    pk=o2_id) if o2_id else None
                cfp2.facepack = fp
                cfp2.user = user
                cfp2.questionnaire = qd
                cfp2.save()

                cfp3 = CustomFacePack()
                cfp3.recipe = Recipe.objects.get(pk=recipe3_id)
                cfp3.optional_ingredient = Ingredient.objects.get(
                    pk=o3_id) if o3_id else None
                cfp3.facepack = fp
                cfp3.user = user
                cfp3.questionnaire = qd
                cfp3.save()

            c = Cart()
            c.item = fp
            c.user = user
            c.type = cart_type
            if c.type == 'buy':
                fp.price = fp.price_single
                fp.save()
            elif c.type == 'subscribe':
                c.subtype = 'regular'
                fp.price = fp.price_regular
                fp.save()
            c.save()
        json_response['success'] = True
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #18
0
def wizard_submit(request):
    json_response = {'success': False}
    if request.method == 'POST':
        init_user_login(request)
        data = json.loads(request.POST['data'])
        user = request.user
        skinType = None
        skinConcerns = None
        wz = QuestionnaireUserData()
        wz.user = user
        wz.save()
        for d in data:
            for o in d['options']:
                qe = QuestionnaireEntry()
                qe.question = Question.objects.get(pk=d['id'])
                qe.option = Option.objects.get(pk=o)
                qe.wizard = wz
                qe.save()
            if d['id'] == '7':
                skinType = SkinType.objects.get(pk=d['options'][0])
            if d['id'] == '8':
                skinConcerns = SkinConcern.objects.filter(id__in=d['options'])
        recipes = Recipe.objects.filter(skin_type=skinType,
                                        skin_concern__in=skinConcerns)
        recipes_ing = [r.mandatory_ingredient for r in recipes]
        skin_type_ingredients = Ingredient.objects.filter(
            id__in=SkinTypeIngredient.objects.filter(
                skin_type=skinType).values('ingredient'))
        o_ids = []
        for r in recipes:
            ri = random.choice(SkinTypeConcernIngredient.objects\
                 .filter(skin_type=r.skin_type, skin_concern=r.skin_concern)\
                 .filter(~Q(ingredient=r.mandatory_ingredient), ~Q(ingredient_id__in=o_ids))).ingredient
            o_ids.append(ri)
        base = random.choice(Base.objects.filter(skin_type=skinType))
        """
        Base conditions:
        1. French green clay cannot be used for people with skin concern "Sensitive
           and irritated by harsh ingredients"
        2. For skin combination oily and skin concern " sensitive and irritated by
           harsh ingredients" :  always use white kaolin clay
        3. For skin combination dry and skin concern " sensitive and irritated by 
           harsh ingredients" :  always use white goat milk powder
        """
        if SkinConcern.objects.get(name__contains="Sensitive") in skinConcerns:
            if skinType.name == 'Oily':
                base = Base.objects.get(name__contains='White Kaolin Clay')
            elif skinType.name == 'Dry':
                base = Base.objects.get(name__contains='Goat Milk')
            else:
                base = random.choice(Base.objects.filter(skin_type=skinType)\
                             .filter(~Q(pk=Base.objects.get(name__contains='French').id)))
        mixing_agent = random.choice(
            MixingAgent.objects.filter(skin_type=skinType))
        json_response = {
            'base': str(base.id),
            'mixing_agent': str(mixing_agent.id),
            'recipes': [str(r.id) for r in recipes],
            'optional': [str(o.id) for o in o_ids],
            'qd': str(wz.id),
        }
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))
Пример #19
0
def results(request):
    if request and request.method == 'GET':
        init_user_login(request)
        user = request.user
        recipe_ids = [int(x) for x in request.GET.getlist('recipes[]')]
        o_ids = [int(x) for x in request.GET.getlist('optional[]')]
        recipes = Recipe.objects.filter(id__in=recipe_ids)
        secondary_ings = Ingredient.objects.filter(id__in=o_ids)
        qd_id = request.GET.get('qd')
        skin_type = request.GET.get('skin_type', None)
        base = Base.objects.get(pk=request.GET.get('base'))
        mixing_agent = MixingAgent.objects.get(
            pk=request.GET.get('mixing_agent'))
        #secondary_ings = [random.choice(SkinTypeConcernIngredient.objects\
        #.filter(skin_type=r.skin_type, skin_concern=r.skin_concern)\
        #.filter(~Q(ingredient=r.mandatory_ingredient))).ingredient\
        #for r in recipes]
        essential_oils = Ingredient.objects.get(
            name__contains="Essential Oils")
        r1 = recipes[0]
        r2 = recipes[1]
        r3 = recipes[2]
        o1 = secondary_ings[0]
        o2 = secondary_ings[1]
        o3 = secondary_ings[2]
        o_ids = [i.id for i in secondary_ings]

        data = {
            'first': {
                'type':
                'primary',
                'base': {
                    'id': base.id,
                    'name': base.name,
                    'image': base.image,
                    'helper': base.helper,
                    'description': base.description,
                },
                'mixing_agent': {
                    'id': mixing_agent.id,
                    'name': mixing_agent.name,
                    'image': mixing_agent.image,
                    'helper': mixing_agent.helper,
                    'description': mixing_agent.description,
                },
                'essential_oils': {
                    'id': essential_oils.id,
                    'name': essential_oils.name,
                    'image': essential_oils.image,
                    'helper': essential_oils.helper,
                    'description': essential_oils.description,
                },
                'recipes': [{
                    'id':
                    r.id,
                    'i_id':
                    r.mandatory_ingredient.id,
                    'i_name':
                    r.mandatory_ingredient.name,
                    'i_image':
                    r.mandatory_ingredient.image,
                    'i_helper':
                    r.mandatory_ingredient.helper,
                    'i_description':
                    r.mandatory_ingredient.description,
                } for r in recipes],
                'b_id':
                base.id,
                'm_id':
                mixing_agent.id,
                'r1_id':
                r1.id,
                'r2_id':
                r2.id,
                'r3_id':
                r3.id,
                'o_ids': [],
                'qd_id':
                qd_id,
            },
            'second': {
                'type':
                'secondary',
                'base': {
                    'id': base.id,
                    'name': base.name,
                    'image': base.image,
                    'helper': base.helper,
                    'description': base.description,
                },
                'mixing_agent': {
                    'id': mixing_agent.id,
                    'name': mixing_agent.name,
                    'image': mixing_agent.image,
                    'helper': mixing_agent.helper,
                    'description': mixing_agent.description,
                },
                'essential_oils': {
                    'id': essential_oils.id,
                    'name': essential_oils.name,
                    'image': essential_oils.image,
                    'helper': essential_oils.helper,
                    'description': essential_oils.description,
                },
                #'recipes': [{
                #'id': r.id,
                #'i_id': r.mandatory_ingredient.id,
                #'i_name': r.mandatory_ingredient.name,
                #'i_image': r.mandatory_ingredient.image,
                #'i_helper': r.mandatory_ingredient.helper,
                #'i_description': r.mandatory_ingredient.description,
                #} for r in recipes],
                'recipes': [{
                    'id': i.id,
                    'i_id': i.id,
                    'i_name': i.name,
                    'i_image': i.image,
                    'i_helper': i.helper,
                    'i_description': i.description,
                } for i in secondary_ings],
                'b_id':
                base.id,
                'm_id':
                mixing_agent.id,
                'r1_id':
                r1.id,
                'r2_id':
                r2.id,
                'r3_id':
                r3.id,
                'o1_id':
                o1.id,
                'o2_id':
                o2.id,
                'o3_id':
                o3.id,
                'o_ids':
                o_ids,
                'qd_id':
                qd_id,
            },
            'qd_id': qd_id,
            'skin_type': skin_type,
        }
        data['cart_size'] = cart_size(request)
        data['valid_user'] = get_valid_user_data(request)
        return render(request, "results.html", data)
Пример #20
0
def checkout(request):
    json_response = { 'success': False }
    if request.method == 'POST':
        try:
            init_user_login(request)
            user = request.user
            data = json.loads(request.POST['data'])
            shipping_id = data['shipping_id']
            token_id = data['token_id']
            #token_id = "tok_visa"
            shipping = Shipping.objects.get(pk=shipping_id)
            # Check for valid payment option
            if hasattr(user, 'cart_set') and shipping:
                total = Decimal('0.00');
                subtotal = Decimal('0.00');
                for c in user.cart_set.all():
                    subtotal += c.item.price*c.quantity     
                promo_discount = sum([p.discount for p in Promo.objects.filter(active=True)])
                total = subtotal + shipping.cost - promo_discount
                # 1. make payment
                # Stripe charge code
                ch = None
                payment_type = None
                stripe.api_key = settings.STRIPE_API_KEY
                if hasattr(user, 'paymenttype_set') and user.paymenttype_set.count() > 0:
                    # Stripe customer already registered.
                    customer_id = user.paymenttype_set.last().stripe.customer_id
                    ch = stripe.Charge.create(
                        amount=int(total*100),
                        currency="usd",
                        description="Charge for "+user.email,
                        receipt_email=user.email,
                        customer=customer_id,
                    )
                    payment_type = user.paymenttype_set.last().stripe
                    exp_date = datetime.datetime.strptime(str(ch.source.exp_year)+\
                                "-"+str(ch.source.exp_month), '%Y-%m')
                    if ch.source.last4 != payment_type.number or exp_date != payment_type.expiry or data.get('b_zip', "") != payment_type.zipcode or data.get('b_state', "") != payment_type.state or data.get('b_city', "") != payment_type.city or data.get('b_name', "") != payment_type.owner_name or ch.source.brand != payment_type.type or data.get('b_addr1', "") != payment_type.street:
    
                        # Add a local stripe payment type object
                        s = Stripe() 
                        s.customer_id = customer_id
                        s.user = user
                        s.street = data.get('b_addr1', "")
                        s.city = data.get('b_city', "")
                        s.state = data.get('b_state', "")
                        s.country = data.get('b_country', "")
                        s.zipcode = data.get('b_zip', "")
                        s.primary = True
                        s.type = ch.source.brand
                        s.created = ch.created
                        s.owner_name = data.get('b_name', "")
                        s.number = ch.source.last4
                        s.expiry = exp_date
                        # wtf?? user.paymenttype_set.all().delete()
                        s.save()
                        payment_type = s
                else:
                    # Create Stripe customer object
                    cu = stripe.Customer.create(
                        description="Customer "+user.email,
                        email=user.email,
                        source = token_id
                    ) 
                    customer_id = cu.id
                    # New Stripe account, create charge
                    ch = stripe.Charge.create(
                        amount=int(total*100),
                        currency="usd",
                        description="Charge for "+user.email,
                        receipt_email=user.email,
                        customer=customer_id
                    )

                    exp_date = datetime.datetime.strptime(str(ch.source.exp_year)+\
                                "-"+str(ch.source.exp_month), '%Y-%m')
    
                    # Add a local stripe payment type object
                    s = Stripe() 
                    s.customer_id = cu.id
                    s.user = user
                    s.street = data.get('b_addr1', "")
                    s.city = data.get('b_city', "")
                    s.state = data.get('b_state', "")
                    s.country = data.get('b_country', "")
                    s.zipcode = data.get('b_zip', "")
                    s.primary = True
                    s.type = ch.source.brand
                    s.created = ch.created
                    s.owner_name = data.get('b_name', "")
                    s.number = ch.source.last4
                    s.expiry = exp_date
                    # wtf?? user.paymenttype_set.all().delete()
                    s.save()
                    payment_type = s
                    
                # Don't forget, good idea to instantiate user first/last name from stripe
                # form for cases where user created a new login and forgot to add details
                # This is a better approach than creating a default generic user profile
                # during user signup (aka 'New User' if you know what I mean)

                names = data.get('b_name', "").split()
                first, last = " ".join(names[0:-1]), names[-1]

                if not hasattr(user, 'profile'):
                    up = Profile()
                    up.user = user
                    up.save()
                user.first_name = user.first_name or first
                user.last_name = user.last_name or last
                user.save()

                # make a local ShippingAddress object
                sh = ShippingAddress()
                sh.profile = user.profile
                sh.first_name = first
                sh.last_name = last
                sh.street1 = data.get('s_addr1', "") 
                sh.city = data.get('s_city', "") 
                sh.state = data.get('s_state', "") 
                sh.country = data.get('s_country', "") 
                sh.zipcode = data.get('s_zip', "") 
                ShippingAddress.objects.filter(profile=user.profile).delete()
                sh.primary = True
                sh.save()

                # Make local payment object based on above charge
                payment = Payment()
                payment.user = user
                payment.type = payment_type
                payment.total = total
                payment.save()
                # 2. record purchase history, while (re)moving entry from cart
                for c in user.cart_set.all():
                    ph = PurchaseHistory()
                    ph.user = user
                    ph.payment = payment
                    ph.item = c.item
                    ph.shipping = shipping
                    ph.type = c.type
                    ph.subtype = c.subtype
                    ph.quantity = c.quantity
                    ph.save()
                    c.delete()
                to_email = ph.user.email
                from_email = '*****@*****.**'
                text_content = "Order Received"
                html_content = "<h2>Order Summary:</h2>"
                ind = 1
                url = request.get_raw_uri().replace(request.get_full_path(),'')
                url = "https://www.farms2face.com"
                for ph in payment.purchasehistory_set.all():
                    html_content += "<hr>"+render_to_string('facepack_mail.html', facepack_display_abs(url, ph.item.id))
                    html_content += "<p>Type: <b>%s</b></p>" % "A-LA-CARTE" if ph.type == "buy" else "NEVER RUN OUT"
                    html_content += "<p>Qty: <b>%d</b></p>" % ph.quantity
                    html_content += "<p>Price: <b>$%0.2f</b></p>" % ph.item.price
                    html_content += "<a href='%s/admin/payments/purchasehistory/%d'>Admin link</a>" % (url, ph.id)
                    ind += 1
                html_content += "<hr><p>Order Total: <b>$%0.2f</b></p>" % payment.total
                sh = None
                if ShippingAddress.objects.filter(profile=ph.user.profile, primary=True).count() == 1:
                    sh = ShippingAddress.objects.get(profile=ph.user.profile, primary=True)
                html_content += "<hr><h3>Shipping:</h3>"
                html_content += "<p>%s %s<br>" % (sh.first_name, sh.last_name)
                html_content += "%s<br>" % sh.street1
                html_content += "%s<br>" % sh.city
                html_content += "%s<br>" % sh.state
                html_content += "%s<br></p>" % sh.zipcode
                html_content += "<hr><h3>Ordered by: %s</h3>" % user.email
                html_content += "<hr><h3>You will receive an update with tracking info in the next few days</h3>"
                html_content_admin = html_content
                html_content = re.sub('<a.*a>','', html_content)
                msg = EmailMultiAlternatives('Order Confirmation #%d - Farms2Face' % ph.id, text_content, from_email, [to_email])
                msg.attach_alternative(html_content, "text/html")
                msg.send()
               
                # Send email to admin with links 
                msg = EmailMultiAlternatives('Admin - Order Confirmation #%d - Farms2Face' % ph.id, text_content, from_email, 
                      [i['email'] for i in User.objects.filter(is_superuser=True).values('email')])
                msg.attach_alternative(html_content_admin, "text/html")
                msg.send()
                json_response['success'] = True
        except Exception as e:
                json_response['error'] = str(e)
                print(str(e))
                print(json.loads(request.POST['data']))
    return HttpResponse(json.dumps(json_response, ensure_ascii=False))