Beispiel #1
0
def start_journey(request, hashid):
    Organization.get()
    me = get_me(request)
    pp = ProductPurchase.objects.get(hashid=hashid)
    Journey.objects.create(productpurchase=pp, start_date=timezone.now())
    if pp.purchase.person != me:
        return redirect(reverse('logout'))

    me = get_me(request)
    return redirect(reverse("products:productpurchase", args=(pp.hashid, )))
Beispiel #2
0
def product_download(request, course_slug, resource_url):
    try:
        product = Product.get_from_slug(course_slug)
        me = get_me(request)

        if ProductPurchase.objects.filter(
                product=product,
                purchase__person=me,
                purchase__refunded=False,
        ).all().count() > 0:
            view_dir = os.path.abspath(
                os.path.dirname(os.path.dirname(__file__)))
            with open(
                    os.path.join(view_dir, "products", "downloads",
                                 course_slug, resource_url), "rb") as f:
                content = f.read()

            mime_type = magic.from_buffer(content, mime=True)
            response = HttpResponse(content, content_type=mime_type)
            response['Content-Type'] = mime_type
            response['Content-Length'] = len(content)
            return response

        return redirect(reverse('login'))
    except:
        import traceback
        traceback.print_exc()
        return redirect(reverse('login'))
Beispiel #3
0
def checkout_help_edition(request, course_slug):
    o = Organization.get()
    product = Product.get_from_slug(course_slug)
    try:
        me = get_me(request)
    except:
        return redirect(
            "%s?help_edition=1" %
            reverse("products:course_purchase", args=(product.slug, )))

    purchase, purchase_created = Purchase.objects.get_or_create(
        person=me,
        help_edition=True,
    )
    purchase.total = Decimal(0.00)
    purchase.save()
    pp, pp_created = ProductPurchase.objects.get_or_create(
        product=product,
        purchase=purchase,
    )
    pp.send_purchase_email()
    # pp = ProductPurchase.objects.get(hashid=hashid)
    # if pp.purchase.person != me:
    #     return redirect(reverse('logout'))

    return TemplateResponse(
        request, 'products/%s/checkout_success.html' % (product.slug, ),
        locals())
Beispiel #4
0
def checkout_success(request, course_slug):
    o = Organization.get()
    product = Product.get_from_slug(course_slug)
    p = Person.objects.get(hashid=request.GET['ci'])
    me = get_me(request)
    sess = stripe.checkout.Session.retrieve(request.GET['session_id'])
    # print(sess)
    assert p == me
    purchase, purchase_created = Purchase.objects.get_or_create(
        person=p,
        stripe_session_id=sess["id"],
        stripe_payment_intent_id=sess["payment_intent"],
    )
    purchase.total = Decimal(sess["amount_total"] / 100)
    purchase.save()
    pp, pp_created = ProductPurchase.objects.get_or_create(
        product=product,
        purchase=purchase,
    )
    pp.send_purchase_email()
    # pp = ProductPurchase.objects.get(hashid=hashid)
    # if pp.purchase.person != me:
    #     return redirect(reverse('logout'))

    return TemplateResponse(
        request, 'products/%s/checkout_success.html' % (product.slug, ),
        locals())
Beispiel #5
0
def course_purchase(request, course_slug):
    o = Organization.get()
    product = Product.get_from_slug(course_slug)
    purchased = False
    try:
        me = get_me(request)
        if me.products.filter(product=product).count() > 0:
            purchased = True
            pp = me.products.filter(product=product)[0]
            return redirect(
                reverse('products:productpurchase', args=(pp.hashid, )))
    except:
        pass
    # if not me and request.method == 'GET':
    #     cached_resp = cache.get("%s_purchase_not_logged_in%s" % (course_slug, request.META["QUERY_STRING"]))
    #     if cached_resp:
    #         return cached_resp
    #     else:
    #         resp = TemplateResponse(
    #             request, 'products/%s/purchase.html' % (
    #                 product.slug,
    #             ),
    #             locals()
    #         )
    #         resp.render()
    #         cache.set("%s_purchase_not_logged_in%s" % (course_slug, request.META["QUERY_STRING"]), resp)
    #         return resp

    resp = TemplateResponse(request,
                            'products/%s/purchase.html' % (product.slug, ),
                            locals())
    # resp.render()
    return resp
Beispiel #6
0
def refund_confirm(request, hashid):
    o = Organization.get()
    me = get_me(request)
    pp = ProductPurchase.objects.get(hashid=hashid)
    pp.purchase.refund(feedback=request.POST.get('feedback', None))

    return locals()
Beispiel #7
0
def account(request):
    o = Organization.get()
    me = get_me(request)
    products = Product.objects.filter()
    information_updated = False
    password_changed = False

    if request.method == "POST":
        if request.POST.get("type") == "information":
            # Process info update
            me.first_name = request.POST["first_name"]
            me.email = request.POST["email"]
            me.turned_off_product_emails = request.POST.get(
                "turned_off_product_emails", None) != "checked"
            me.save()
            information_updated = True

        elif request.POST.get("type") == "password":
            # Update password
            if request.POST.get("password"):
                password_message = "Password changed."
                me.set_password(request.POST["password"])
                me.save()
                update_session_auth_hash(request, me)
            else:
                password_message = "Password was blank."

    return locals()
Beispiel #8
0
def confirm_delete_journey(request, hashid):
    o = Organization.get()
    me = get_me(request)
    journey = Journey.objects.get(hashid=hashid)
    if journey.productpurchase.purchase.person != me:
        return redirect(reverse('logout'))

    return locals()
Beispiel #9
0
def home(request):
    o = Organization.get()
    me = get_me(request)
    products = Product.objects.filter()
    if me.products.count() == 1:
        return redirect(
            reverse("products:productpurchase",
                    args=(me.products.first().hashid, )))
    return locals()
Beispiel #10
0
def journey(request, hashid):
    o = Organization.get()
    me = get_me(request)
    journey = Journey.objects.get(hashid=hashid)

    if journey.productpurchase.purchase.person != me:
        return redirect(reverse('logout'))

    # TODO: Add auth assertion
    return locals()
Beispiel #11
0
def send_feedback(request, course_slug):
    product = Product.get_from_slug(course_slug)
    me = get_me(request)
    ProductFeedback.objects.create(
        product=product,
        person=me,
        raw_data=json.dumps(json.loads(request.body)),
    )
    return {
        "suceess": True,
    }
Beispiel #12
0
def confirm_delete_account(request):
    o = Organization.get()
    me = get_me(request)

    if request.POST.get("submit") == "yes":
        me.delete()
        user = request.user
        logout(request)
        user.delete()
        return redirect(reverse('products:account_deleted'))

    return locals()
Beispiel #13
0
def today(request):
    # TODO: Make this redirect to today's day.

    consumer_str = Factory.rand_str(length=20, include_emoji=False)
    if request.user.is_authenticated:
        me = get_me(request)
    else:
        return redirect(reverse('clubhouse:home'))

    date = datetime.datetime.today()

    return locals()
Beispiel #14
0
def course_beta_purchase(request, course_slug):
    o = Organization.get()
    product = Product.get_from_slug(course_slug)
    purchased = False
    try:
        me = get_me(request)
        if me.products.filter(product=product).count() > 0:
            purchased = True
            pp = me.products.filter(product=product)[0]
    except:
        pass
    return TemplateResponse(
        request, 'products/%s/purchase_beta.html' % (product.slug, ), locals())
Beispiel #15
0
def productpurchase(request, hashid):
    o = Organization.get()
    pp = ProductPurchase.objects.get(hashid=hashid)
    me = get_me(request)
    if pp.purchase.person != me:
        return redirect(reverse('logout'))

    purchase = pp.purchase
    product = pp.product
    post_purchase = True
    if product.is_downloadable:
        return TemplateResponse(
            request, 'products/%s/checkout_success.html' % (product.slug, ),
            locals())

    return locals()
Beispiel #16
0
def purchase_complete(request, course_slug):
    try:
        o = Organization.get()
        product = Product.get_from_slug(course_slug)
        me = get_me(request)

        pp = ProductPurchase.objects.filter(
            product=product,
            purchase__person=me,
            purchase__refunded=False,
        ).all().first()

        return TemplateResponse(
            request, 'products/%s/checkout_success.html' % (product.slug, ),
            locals())
    except:
        return redirect(reverse('login'))
Beispiel #17
0
def day(request, hashid):
    consumer_str = Factory.rand_str(length=20, include_emoji=False)
    o = Organization.get()
    day = JourneyDay.objects.get(hashid=hashid)
    me = get_me(request)
    if day.journey.productpurchase.purchase.person != me:
        return redirect(reverse('logout'))

    data_store_url = "/ws/journey/%s/%s" % (
        day.journey.hashid,
        day.hashid,
    )
    person_store_url = "/ws/p/%s" % (me.hashid, )

    return TemplateResponse(
        request, 'products/%s/day-%s.html' % (
            day.journey.productpurchase.product.slug,
            day.day_number,
        ), locals())
Beispiel #18
0
def delete_journey(request, hashid):
    o = Organization.get()
    me = get_me(request)
    try:
        journey = Journey.objects.get(hashid=hashid)
        pp_hashid = journey.productpurchase.hashid
        assert request.method == "POST"
        assert request.POST.get("do_delete") == "yes"
        if journey.productpurchase.purchase.person != me:
            return redirect(reverse('logout'))
        course_hashid = "%s" % journey.productpurchase.hashid
        journey.delete()
        return redirect(reverse('products:productpurchase',
                                args=(pp_hashid, )))
    except:
        return redirect(reverse('products:home'))
        pass

    return locals()
Beispiel #19
0
def data_export(request):
    me = get_me(request)

    return JsonResponse(me.gdpr_dump,
                        content_type='application/json',
                        json_dumps_params={'indent': 4})
Beispiel #20
0
def create_checkout_session(request, course_slug):
    product = Product.get_from_slug(course_slug)
    try:
        me = get_me(request)
        if request.method == 'GET':
            beta = request.GET.get('beta') == "yesplease"
            help_edition = request.GET.get('he') == "1"
            help_edition_price = request.GET.get('p')
            if help_edition and not help_edition_price:
                message = "%s" % (
                    "Please enter a price.  For no cost, put in 0.", )
                return {'error': message}
            test_price = request.GET.get('t')
            try:
                test_price = int(b64decode(test_price)[1:])
                if test_price <= 0:
                    test_price = None
            except:
                pass

            host = request.META["HTTP_HOST"]
            domain_url = 'https://%s%s' % (host,
                                           reverse('products:course_purchase',
                                                   args=(product.slug, )))

            price = product.stripe_price_id
            # mode = 'payment'
            price_data = None
            if beta:
                price = product.stripe_beta_price_id
            if test_price:
                price = "%s00" % test_price
                price_data = {
                    "unit_amount": price,
                    "currency": "usd",
                    "product": product.stripe_product_id,
                }
                line_items = [{
                    # 'name': '7-Day Sprint',
                    'quantity': 1,
                    # 'currency': 'usd',
                    # 'amount': '10000',
                    'price_data': price_data,
                }]
            elif help_edition:
                price = int(help_edition_price.replace(".", ""))
                price_data = {
                    "unit_amount": price,
                    "currency": "usd",
                    "product": product.stripe_product_id,
                }
                line_items = [{
                    # 'name': '7-Day Sprint',
                    'quantity': 1,
                    # 'currency': 'usd',
                    # 'amount': '10000',
                    'price_data': price_data,
                }]
            else:
                line_items = [{
                    # 'name': '7-Day Sprint',
                    'quantity': 1,
                    # 'currency': 'usd',
                    # 'amount': '10000',
                    'price': price,
                }]

                # mode = 'subscription'
            # print(price)

            try:
                # Create new Checkout Session for the order
                # Other optional params include:
                # [billing_address_collection] - to display billing address details on the page
                # [customer] - if you have an existing Stripe Customer ID
                # [payment_intent_data] - capture the payment later
                # [customer_email] - prefill the email input in the form
                # For full details see https://stripe.com/docs/api/checkout/sessions/create

                # ?session_id={CHECKOUT_SESSION_ID} means the redirect will have the session ID set as a query param
                client_reference_id = "%s.%s" % (me.hashid, product.hashid)
                checkout_session = stripe.checkout.Session.create(
                    # submit_type='donate',
                    client_reference_id=client_reference_id,
                    customer_email=me.email,
                    success_url=domain_url +
                    '/purchase/success?session_id={CHECKOUT_SESSION_ID}&ci=%s'
                    % me.hashid,
                    cancel_url=domain_url + '/purchase/cancelled',
                    payment_method_types=['card'],
                    mode='payment',
                    allow_promotion_codes=True,
                    line_items=line_items,
                )
                return {'sessionId': checkout_session['id']}
            except Exception as e:
                return {'error': str(e)}
    except:
        message = "%s%s%s" % (
            "Hm. We ran into an error creating your account.  Please check that you've entered a valid email above,",
            " and if it still doesn't work please email me at [email protected] so I can find this bug, and",
            " get you sorted out!")
        return {'error': message}
Beispiel #21
0
def refund(request, hashid):
    o = Organization.get()
    me = get_me(request)
    pp = ProductPurchase.objects.get(hashid=hashid)

    return locals()