Exemplo n.º 1
0
    def newsletter(cls, *args, **kwargs):
        cls.organization()
        options = {
            "name": cls.rand_tree(),
            "internal_name": "%s%s" % (cls.rand_tree().lower(), cls.rand_str()),
            "description": cls.rand_text(),
            "from_name": "%s %s" % (cls.rand_name(), cls.rand_name()),
            "from_email": cls.rand_email(),
            "confirm_message": cls.message(
                subject="Please confirm your subscription! %s" % cls.rand_text(),
                body_text_unrendered="Please confirm your subscription! Click here: {{ opt_in_link }}\n%s" % cls.rand_paragraph(),
                transactional=True,
                transactional_no_unsubscribe_reason="send opt-in messages to people who fill out the form %s" % cls.rand_text(),
                transactional_send_reason="someone (hopefully you) entered your email on my website %s" % cls.rand_text(),
            ),
            "welcome_message": cls.message(
                subject="Welcome aboard! %s" % cls.rand_text(),
                body_text_unrendered="Welcome aboard!\n %s" % cls.rand_paragraph(),
            ),
            "unsubscribe_footer": "%s [Click here to unsubscribe]({{ unsubscribe_link }}). \n ExampleCo, Inc is based at {{ organization_address }}" % cls.rand_text(),  # noqa
        }
        options.update(kwargs)
        Organization.get()

        n = Newsletter.objects.create(**options)

        return n
Exemplo n.º 2
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, )))
Exemplo n.º 3
0
def organization(request):
    o = Organization.get()
    page_name = "organization"
    o = Organization.get()
    if request.method == "POST":
        form = OrganizationForm(request.POST, request.FILES, instance=o)
        if form.is_valid():
            form.save()
            saved = True
            o = Organization.get()
            form = OrganizationForm(instance=o)
    else:
        form = OrganizationForm(instance=o)

    return locals()
Exemplo n.º 4
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())
Exemplo n.º 5
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())
Exemplo n.º 6
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
Exemplo n.º 7
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()
Exemplo n.º 8
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()
Exemplo n.º 9
0
def transfer_subscription(request, transfer_code):
    o = Organization.get()
    # This is a special link for users to opt-in from an existing newsletter.
    s = None
    if "e" in request.GET:
        hashed_email = lookup_hash(request.GET["e"].replace(" ", "+"))
        if Newsletter.objects.filter(hashid=transfer_code).count():
            n = Newsletter.objects.get(hashid=transfer_code)

            if Person.objects.filter(hashed_email=hashed_email).count() > 0:
                p = Person.objects.get(hashed_email=hashed_email)
                if "f" in request.GET:
                    p.first_name = request.GET["f"]
            else:
                p = Person.objects.create(hashed_email=hashed_email, )
                p.email = request.GET["e"].replace(" ", "+")
                if "f" in request.GET:
                    p.first_name = request.GET["f"]
            p.save()

            s, created = Subscription.objects.get_or_create(
                person=p,
                newsletter=n,
            )
            if created or s.unsubscribed:
                s.subscribed_at = timezone.now()
                s.unsubscribed = False
                s.unsubscribed_at = None

                s.subscription_url = "transfer-subscription"
                s.subscribed_from_ip, _ = get_client_ip(request)
                s.save()

            already_double_opted_in = True
            if not s.double_opted_in:
                already_double_opted_in = False
                s.double_opted_in = True
                s.double_opted_in_at = timezone.now()
                s.save()

            p = s.person
            p.email_verified = True
            p.save()
            email_confirmed = True

        if not already_double_opted_in:
            send_subscription_welcome.delay(s.pk)

    if s is not None:
        s = Subscription.objects.get(pk=s.pk)
        HistoricalEvent.log(
            person=p,
            event_type="transfer-subscription",
            subscription=s,
            newsletter=s.newsletter,
        )
    else:
        return HttpResponse(status=422)

    return locals()
Exemplo n.º 10
0
    def rendered(self):
        t = get_template(self.template.name)

        o = Organization.get()
        context = self.template.context.copy()
        context.update(**{
            "organization": o,
            "organization_address": o.address,
            "organization_name": o.name,
            "name": self.name,
            "page_name": self.slug,
            "section": self.section,
            "raw_markdown": self.raw_markdown,
            "slug": self.slug,
            "title": self.title,
            "description": self.description,
            "publish_date": self.publish_date,
            "published": self.published,
            "private": self.private,
            "context": self.context,
            "links": Link.objects.all().order_by("-publish_date", "-created_at"),
            "pages": Page.objects.all().order_by("-created_at"),
            "posts": Post.objects.all().order_by("-publish_date", "-created_at"),
            "RESOURCES_URL": settings.RESOURCES_URL
        })

        c = Context(context)
        rendered_string = mistune.html(self.raw_markdown)
        rendered_string = rendered_string.replace(u"’", '’').replace(u"“", '“')
        rendered_string = rendered_string.replace(u"”", '”').replace(u"’", "’")

        content_template = DjangoTemplate(rendered_string)
        context["rendered_post_html"] = mark_safe(content_template.render(c).encode("utf-8").decode())

        return t.render(context)
Exemplo n.º 11
0
def confirm_email(request, email_key):
    o = Organization.get()
    u = Person.objects.get(email_confirm_key=email_key)
    u.email_verified = True
    u.save()
    email_confirmed = True
    return locals()
Exemplo n.º 12
0
def scheduled_newsletter_message_queued(request, hashid):
    o = Organization.get()
    page_name = "scheduled_newsletter_messages"
    snm = ScheduledNewsletterMessage.objects.get(hashid=hashid)
    queue_newsletter_message.delay(snm.hashid)

    return locals()
Exemplo n.º 13
0
def confirm_subscription(request, opt_in_key):
    o = Organization.get()
    s = Subscription.objects.get(opt_in_key=opt_in_key)
    already_double_opted_in = True
    if not s.double_opted_in:
        already_double_opted_in = False
        s.double_opted_in = True
        s.double_opted_in_at = timezone.now()
        s.save()

    p = s.person
    p.email_verified = True
    p.save()
    email_confirmed = True

    if not already_double_opted_in:
        send_subscription_welcome.delay(s.pk)

    s = Subscription.objects.get(pk=s.pk)
    HistoricalEvent.log(
        person=p,
        event_type="double-opt-in",
        subscription=s,
        newsletter=s.newsletter,
    )

    return locals()
Exemplo n.º 14
0
    def rendered(self,):
        t = get_template(self.template.name)

        o = Organization.get()
        context = self.template.context.copy()
        context.update(**{
            "organization": o,
            "organization_address": o.address,
            "organization_name": o.name,
            "name": self.name,
            "page_name": self.slug,
            "section": self.section,
            "source_text": self.source_text,
            "slug": self.slug,
            "title": self.title,
            "description": self.description,
            "keywords": self.keywords,
            "links": Link.objects.all().order_by("-publish_date", "-created_at"),
            "pages": Page.objects.all().order_by("-created_at"),
            "posts": Post.objects.all().order_by("-publish_date", "-created_at"),
            "RESOURCES_URL": settings.RESOURCES_URL
        })

        c = Context(context)
        content_template = DjangoTemplate(self.source_text)
        context["rendered_page_html"] = mark_safe(content_template.render(c).encode("utf-8").decode())

        return t.render(context)
Exemplo n.º 15
0
def delete_productday(request, hashid):
    o = Organization.get()
    productday = ProductDay.objects.get(hashid=hashid)
    if request.method == "POST" and "delete" in request.POST and request.POST["delete"] == "DO_DELETE":
        productday.delete()

        return redirect(reverse('clubhouse:productdays', host='clubhouse'))
    return locals()
Exemplo n.º 16
0
def delete_journey(request, hashid):
    o = Organization.get()
    journey = Journey.objects.get(hashid=hashid)
    if request.method == "POST" and "delete" in request.POST and request.POST["delete"] == "DO_DELETE":
        journey.delete()

        return redirect(reverse('clubhouse:journeys', host='clubhouse'))
    return locals()
Exemplo n.º 17
0
def delete_link(request, hashid):
    o = Organization.get()
    link = Link.objects.get(hashid=hashid)
    if request.method == "POST" and "delete" in request.POST and request.POST["delete"] == "DO_DELETE":
        link.delete()

        return redirect(reverse('clubhouse:links', host='clubhouse'))
    return locals()
Exemplo n.º 18
0
def delete_bestimator_choice(request, hashid):
    o = Organization.get()
    bestimator_choice = BestimatorExperimentChoice.objects.get(hashid=hashid)
    if request.method == "POST" and "delete" in request.POST and request.POST["delete"] == "DO_DELETE":
        bestimator_choice.delete()

        return redirect(reverse('clubhouse:bestimator_choices', host='clubhouse'))
    return locals()
Exemplo n.º 19
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()
Exemplo n.º 20
0
def delete_purchase(request, hashid):
    o = Organization.get()
    purchase = Purchase.objects.get(hashid=hashid)
    if request.method == "POST" and "delete" in request.POST and request.POST["delete"] == "DO_DELETE":
        purchase.delete()

        return redirect(reverse('clubhouse:purchases', host='clubhouse'))
    return locals()
Exemplo n.º 21
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()
Exemplo n.º 22
0
def people(request):
    o = Organization.get()
    page_name = "people"
    if request.method == "GET" and "q" in request.GET:
        hashed_email = lookup_hash(request.GET["q"])
        people = Person.objects.filter(hashed_email=lookup_hash)
    else:
        people = Person.objects.all()[:30]
    return locals()
Exemplo n.º 23
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()
Exemplo n.º 24
0
def checkout_cancelled(request, course_slug):
    o = Organization.get()
    product = Product.get_from_slug(course_slug)
    # pp = ProductPurchase.objects.get(hashid=hashid)
    # me = get_me(request)
    # if pp.purchase.person != me:
    #     return redirect(reverse('logout'))

    return TemplateResponse(
        request, 'products/%s/checkout_cancelled.html' % (product.slug, ),
        locals())
Exemplo n.º 25
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()
Exemplo n.º 26
0
def resubscribe(request, resubscribe_key):
    o = Organization.get()
    om = OutgoingMessage.objects.get(unsubscribe_hash=resubscribe_key)
    if om.subscription:
        om.subscription.resubscribe()
        HistoricalEvent.log(
            person=om.person,
            event_type="resubscribe",
            subscription=om.subscription,
            outgoingmessage=om,
        )
    return locals()
Exemplo n.º 27
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())
Exemplo n.º 28
0
def delete_account(request, delete_key):
    o = Organization.get()
    om = OutgoingMessage.objects.get(delete_hash=delete_key)
    # if om.subscription:
    #     om.subscription.unsubscribe()
    om.person.delete()
    HistoricalEvent.log(
        person=om.person,
        event_type="delete_account",
        subscription=om.subscription,
        outgoingmessage=om,
    )

    return locals()
Exemplo n.º 29
0
 def organization(cls):
     changed = False
     o = Organization.get()
     if not o.name:
         o.name = "%s Inc" % cls.rand_plant_name()
         changed = True
     if not o.address:
         o.address = fake.address()
         changed = True
     if not o.transactional_footer:
         o.transactional_footer = "%s You're receiving this email because {{ transactional_send_reason }}.   Normally, there's an unsubscribe link down here, but to be able to {{ transactional_no_unsubscribe_reason }}, there isn't a way to unsubscribe.\n\n However, if you want to completely delete your account, you can do that by [going here]({{ delete_account_link }}).\n\nThis email was sent by me, Jill Example, of {{ organization_address }}." % cls.rand_text()  # noqa
     if changed:
         o.save()
     return o
Exemplo n.º 30
0
    def handle(self, *args, **options):
        with open("initial_data.yml", encoding='utf8') as f:
            data = yaml.safe_load(f)
            print(data)

            if "organization" in data:
                o = Organization.get()
                for k, v in data["organization"].items():
                    setattr(o, k, v)
                o.save()

            if "newsletters" in data:
                for name, info in data["newsletters"].items():
                    n, _ = Newsletter.objects.get_or_create(
                        internal_name=info["internal_name"])
                    for k, v in info.items():
                        if k not in MESSAGE_FIELDS:
                            setattr(n, k, v)

                    if "confirm_subject" in info and "confirm_body" in info:
                        m, _ = Message.objects.get_or_create(
                            name="%s-confirm" % name)
                        m.subject = info["confirm_subject"]
                        m.body_text_unrendered = info["confirm_body"]
                        m.save()

                        n.confirm_message = m

                    if "welcome_subject" in info and "welcome_body" in info:
                        m, _ = Message.objects.get_or_create(
                            name="%s-welcome" % name)
                        m.subject = info["welcome_subject"]
                        m.body_text_unrendered = info["welcome_body"]
                        m.save()

                        n.welcome_message = m
                    n.save()

            if "troll_emails" in data:
                for e in data["troll_emails"]:
                    ee = lookup_hash(e)
                    p, _ = Person.objects.get_or_create(hashed_email=ee)
                    p.mark_troll()

            if "banned_emails" in data:
                for e in data["banned_emails"]:
                    ee = lookup_hash(e)
                    p, _ = Person.objects.get_or_create(hashed_email=ee)
                    p.ban()